@@ -87,7 +87,6 @@ class ClientInterceptorTest : GrpcProtoTest() {
87
87
val error = assertFailsWith<StatusException > {
88
88
val interceptor = interceptor {
89
89
cancel(" Canceling in interceptor" , IllegalStateException (" Cancellation cause" ))
90
- proceed(it)
91
90
}
92
91
runGrpcTest(clientInterceptors = interceptor, test = ::unaryCall)
93
92
}
@@ -98,6 +97,85 @@ class ClientInterceptorTest : GrpcProtoTest() {
98
97
assertEquals(" Cancellation cause" , error.cause?.message)
99
98
}
100
99
100
+ @Test
101
+ fun `cancel in request flow - should fail with cancellation` () {
102
+ val error = assertFailsWith<StatusException > {
103
+ val interceptor = interceptor {
104
+ proceed(it.map {
105
+ val msg = it as EchoRequest
106
+ if (msg.message == " Echo-3" ) {
107
+ cancel(" Canceling in request flow" , IllegalStateException (" Cancellation cause" ))
108
+ }
109
+ it
110
+ })
111
+ }
112
+ runGrpcTest(clientInterceptors = interceptor, test = ::bidiStream)
113
+ }
114
+
115
+ assertEquals(StatusCode .CANCELLED , error.getStatus().statusCode)
116
+ assertContains(error.message!! , " Canceling in request flow" )
117
+ assertIs<IllegalStateException >(error.cause)
118
+ assertEquals(" Cancellation cause" , error.cause?.message)
119
+ }
120
+
121
+ @Test
122
+ fun `cancel in response flow - should fail with cancellation` () {
123
+ val error = assertFailsWith<StatusException > {
124
+ val interceptor = interceptor {
125
+ flow {
126
+ proceed(it).collect { resp ->
127
+ val msg = resp as EchoResponse
128
+ if (msg.message == " Echo-3" ) {
129
+ cancel(" Canceling in response flow" , IllegalStateException (" Cancellation cause" ))
130
+ }
131
+ emit(resp)
132
+ }
133
+ }
134
+ }
135
+ runGrpcTest(clientInterceptors = interceptor, test = ::bidiStream)
136
+ }
137
+
138
+ assertEquals(StatusCode .CANCELLED , error.getStatus().statusCode)
139
+ assertContains(error.message!! , " Canceling in response flow" )
140
+ assertIs<IllegalStateException >(error.cause)
141
+ assertEquals(" Cancellation cause" , error.cause?.message)
142
+ }
143
+
144
+ @Test
145
+ fun `cancel onHeaders - should fail with cancellation` () {
146
+ val error = assertFailsWith<StatusException > {
147
+ val interceptor = interceptor {
148
+ this .onHeaders {
149
+ cancel(" Canceling in headers" , IllegalStateException (" Cancellation cause" ))
150
+ }
151
+ proceed(it)
152
+ }
153
+ runGrpcTest(clientInterceptors = interceptor, test = ::bidiStream)
154
+ }
155
+
156
+ assertEquals(StatusCode .CANCELLED , error.getStatus().statusCode)
157
+ assertContains(error.message!! , " Canceling in headers" )
158
+ assertIs<IllegalStateException >(error.cause)
159
+ assertEquals(" Cancellation cause" , error.cause?.message)
160
+ }
161
+
162
+ @Test
163
+ fun `cancel onClose - should fail with cancellation` () {
164
+ val error = assertFailsWith<StatusException > {
165
+ val interceptor = interceptor {
166
+ this .onClose { _, _ ->
167
+ cancel(" Canceling in onClose" , IllegalStateException (" Cancellation cause" ))
168
+ }
169
+ proceed(it)
170
+ }
171
+ runGrpcTest(clientInterceptors = interceptor, test = ::bidiStream)
172
+ }
173
+ assertEquals(StatusCode .CANCELLED , error.getStatus().statusCode)
174
+ assertContains(error.message!! , " Canceling in onClose" )
175
+ assertIs<IllegalStateException >(error.cause)
176
+ assertEquals(" Cancellation cause" , error.cause?.message)
177
+ }
178
+
101
179
@Test
102
180
fun `modify request message - should return modified message` () {
103
181
val interceptor = interceptor {
@@ -156,6 +234,19 @@ class ClientInterceptorTest : GrpcProtoTest() {
156
234
assertEquals(" Hello" , response.message)
157
235
}
158
236
237
+ private suspend fun bidiStream (grpcClient : GrpcClient ) {
238
+ val service = grpcClient.withService<EchoService >()
239
+ val responses = service.BidirectionalStreamingEcho (flow {
240
+ repeat(5 ) {
241
+ emit(EchoRequest { message = " Echo-$it " })
242
+ }
243
+ }).toList()
244
+ assertEquals(5 , responses.size)
245
+ repeat(5 ) {
246
+ assertEquals(" Echo-$it " , responses[it].message)
247
+ }
248
+ }
249
+
159
250
}
160
251
161
252
private fun interceptor (
0 commit comments