blob: 9804734d6aea330d826ac0e4019e8982942d2e7d [file] [log] [blame]
Jorge Canizales73076842015-05-30 12:04:43 -07001/*
2 *
3 * Copyright 2015, Google Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Jorge Canizales91952332015-07-31 17:50:49 -070034#import "InteropTests.h"
Jorge Canizales73076842015-05-30 12:04:43 -070035
Jorge Canizales91952332015-07-31 17:50:49 -070036#include <grpc/status.h>
Jorge Canizales73076842015-05-30 12:04:43 -070037
Makarand Dharmapurikarde733bd2016-05-25 10:38:56 -070038#import <Cronet/Cronet.h>
Jorge Canizalesfa70dac2016-04-29 19:58:52 -070039#import <GRPCClient/GRPCCall+ChannelArg.h>
Jorge Canizalesb2bd0672015-08-01 23:19:11 -070040#import <GRPCClient/GRPCCall+Tests.h>
Makarand Dharmapurikar9b5f6402016-05-20 15:57:34 -070041#import <GRPCClient/GRPCCall+Cronet.h>
Jorge Canizalesc42a38e2015-06-21 14:44:25 -070042#import <ProtoRPC/ProtoRPC.h>
Jorge Canizales73076842015-05-30 12:04:43 -070043#import <RemoteTest/Messages.pbobjc.h>
44#import <RemoteTest/Test.pbobjc.h>
45#import <RemoteTest/Test.pbrpc.h>
Jorge Canizalesc42a38e2015-06-21 14:44:25 -070046#import <RxLibrary/GRXBufferedPipe.h>
47#import <RxLibrary/GRXWriter+Immediate.h>
Jorge Canizales73076842015-05-30 12:04:43 -070048
49// Convenience constructors for the generated proto messages:
50
51@interface RMTStreamingOutputCallRequest (Constructors)
52+ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize
53 requestedResponseSize:(NSNumber *)responseSize;
54@end
55
56@implementation RMTStreamingOutputCallRequest (Constructors)
57+ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize
58 requestedResponseSize:(NSNumber *)responseSize {
59 RMTStreamingOutputCallRequest *request = [self message];
60 RMTResponseParameters *parameters = [RMTResponseParameters message];
Yuchen Zengafb62f82016-06-24 19:11:08 -070061 parameters.size = responseSize.intValue;
Jorge Canizales73076842015-05-30 12:04:43 -070062 [request.responseParametersArray addObject:parameters];
63 request.payload.body = [NSMutableData dataWithLength:payloadSize.unsignedIntegerValue];
64 return request;
65}
66@end
67
68@interface RMTStreamingOutputCallResponse (Constructors)
69+ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize;
70@end
71
72@implementation RMTStreamingOutputCallResponse (Constructors)
73+ (instancetype)messageWithPayloadSize:(NSNumber *)payloadSize {
74 RMTStreamingOutputCallResponse * response = [self message];
75 response.payload.type = RMTPayloadType_Compressable;
76 response.payload.body = [NSMutableData dataWithLength:payloadSize.unsignedIntegerValue];
77 return response;
78}
79@end
80
Jorge Canizalesb2bd0672015-08-01 23:19:11 -070081#pragma mark Tests
82
Jorge Canizales73076842015-05-30 12:04:43 -070083@implementation InteropTests {
84 RMTTestService *_service;
85}
86
Jorge Canizales945f72c2015-07-31 17:40:59 -070087+ (NSString *)host {
Jorge Canizales91db5ac2015-10-28 14:53:38 -070088 return nil;
Jorge Canizales945f72c2015-07-31 17:40:59 -070089}
Jorge Canizalesce8ee612015-07-24 20:52:49 -070090
Jorge Canizales9e83d7e2016-08-01 12:51:31 -070091- (int32_t)encodingOverhead {
92 return 0;
93}
94
Muxi Yanbe4fcc42016-10-13 14:33:08 -070095+ (void)setUp {
96#ifdef GRPC_COMPILE_WITH_CRONET
97 // Cronet setup
98 [Cronet setHttp2Enabled:YES];
99 [Cronet start];
100 [GRPCCall useCronetWithEngine:[Cronet getGlobalEngine]];
101#endif
102}
103
Jorge Canizales73076842015-05-30 12:04:43 -0700104- (void)setUp {
Jorge Canizales6af4add2016-07-28 23:05:18 -0700105 self.continueAfterFailure = NO;
106
Jorge Canizales32fde7a2016-07-29 17:31:07 -0700107 [GRPCCall resetHostSettings];
Jorge Canizales6af4add2016-07-28 23:05:18 -0700108
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700109 _service = self.class.host ? [RMTTestService serviceWithHost:self.class.host] : nil;
Jorge Canizales73076842015-05-30 12:04:43 -0700110}
111
Jorge Canizales73076842015-05-30 12:04:43 -0700112- (void)testEmptyUnaryRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700113 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700114 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"EmptyUnary"];
115
Makarand Dharmapurikar2b220f82016-07-08 10:47:57 -0700116 GPBEmpty *request = [GPBEmpty message];
Jorge Canizales73076842015-05-30 12:04:43 -0700117
Makarand Dharmapurikar2b220f82016-07-08 10:47:57 -0700118 [_service emptyCallWithRequest:request handler:^(GPBEmpty *response, NSError *error) {
Jorge Canizales73076842015-05-30 12:04:43 -0700119 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
120
Makarand Dharmapurikar2b220f82016-07-08 10:47:57 -0700121 id expectedResponse = [GPBEmpty message];
Jorge Canizales73076842015-05-30 12:04:43 -0700122 XCTAssertEqualObjects(response, expectedResponse);
123
124 [expectation fulfill];
125 }];
126
Jorge Canizales5580e5d2015-07-15 23:35:48 -0700127 [self waitForExpectationsWithTimeout:4 handler:nil];
Jorge Canizales73076842015-05-30 12:04:43 -0700128}
129
130- (void)testLargeUnaryRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700131 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700132 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"LargeUnary"];
133
134 RMTSimpleRequest *request = [RMTSimpleRequest message];
135 request.responseType = RMTPayloadType_Compressable;
136 request.responseSize = 314159;
137 request.payload.body = [NSMutableData dataWithLength:271828];
138
139 [_service unaryCallWithRequest:request handler:^(RMTSimpleResponse *response, NSError *error) {
140 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
141
142 RMTSimpleResponse *expectedResponse = [RMTSimpleResponse message];
143 expectedResponse.payload.type = RMTPayloadType_Compressable;
144 expectedResponse.payload.body = [NSMutableData dataWithLength:314159];
145 XCTAssertEqualObjects(response, expectedResponse);
146
147 [expectation fulfill];
148 }];
149
Jorge Canizales83c57cb2015-08-09 16:36:49 -0700150 [self waitForExpectationsWithTimeout:16 handler:nil];
Jorge Canizales73076842015-05-30 12:04:43 -0700151}
152
Jorge Canizales6af4add2016-07-28 23:05:18 -0700153- (void)test4MBResponsesAreAccepted {
154 XCTAssertNotNil(self.class.host);
155 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"MaxResponseSize"];
156
157 RMTSimpleRequest *request = [RMTSimpleRequest message];
Jorge Canizales9e83d7e2016-08-01 12:51:31 -0700158 const int32_t kPayloadSize = 4 * 1024 * 1024 - self.encodingOverhead; // 4MB - encoding overhead
Jorge Canizales6af4add2016-07-28 23:05:18 -0700159 request.responseSize = kPayloadSize;
160
161 [_service unaryCallWithRequest:request handler:^(RMTSimpleResponse *response, NSError *error) {
162 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
163 XCTAssertEqual(response.payload.body.length, kPayloadSize);
164 [expectation fulfill];
165 }];
166
167 [self waitForExpectationsWithTimeout:16 handler:nil];
168}
169
170- (void)testResponsesOverMaxSizeFailWithActionableMessage {
171 XCTAssertNotNil(self.class.host);
172 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"ResponseOverMaxSize"];
173
174 RMTSimpleRequest *request = [RMTSimpleRequest message];
Jorge Canizales9e83d7e2016-08-01 12:51:31 -0700175 const int32_t kPayloadSize = 4 * 1024 * 1024 - self.encodingOverhead + 1; // 1B over max size
Jorge Canizales6af4add2016-07-28 23:05:18 -0700176 request.responseSize = kPayloadSize;
177
178 [_service unaryCallWithRequest:request handler:^(RMTSimpleResponse *response, NSError *error) {
Jorge Canizalesec0743e2016-07-29 01:50:06 -0700179 // TODO(jcanizales): Catch the error and rethrow it with an actionable message:
180 // - Use +[GRPCCall setResponseSizeLimit:forHost:] to set a higher limit.
181 // - If you're developing the server, consider using response streaming, or let clients filter
182 // responses by setting a google.protobuf.FieldMask in the request:
183 // https://github.com/google/protobuf/blob/master/src/google/protobuf/field_mask.proto
Mark D. Rotha4d9ee22016-08-31 13:17:26 -0700184 XCTAssertEqualObjects(error.localizedDescription, @"Received message larger than max (4194305 vs. 4194304)");
Jorge Canizales6af4add2016-07-28 23:05:18 -0700185 [expectation fulfill];
186 }];
187
188 [self waitForExpectationsWithTimeout:16 handler:nil];
189}
190
191- (void)testResponsesOver4MBAreAcceptedIfOptedIn {
192 XCTAssertNotNil(self.class.host);
193 __weak XCTestExpectation *expectation =
194 [self expectationWithDescription:@"HigherResponseSizeLimit"];
195
196 RMTSimpleRequest *request = [RMTSimpleRequest message];
197 const size_t kPayloadSize = 5 * 1024 * 1024; // 5MB
198 request.responseSize = kPayloadSize;
199
200 [GRPCCall setResponseSizeLimit:6 * 1024 * 1024 forHost:self.class.host];
201
202 [_service unaryCallWithRequest:request handler:^(RMTSimpleResponse *response, NSError *error) {
203 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
204 XCTAssertEqual(response.payload.body.length, kPayloadSize);
205 [expectation fulfill];
206 }];
207
208 [self waitForExpectationsWithTimeout:16 handler:nil];
209}
210
Jorge Canizales73076842015-05-30 12:04:43 -0700211- (void)testClientStreamingRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700212 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700213 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"ClientStreaming"];
214
215 RMTStreamingInputCallRequest *request1 = [RMTStreamingInputCallRequest message];
216 request1.payload.body = [NSMutableData dataWithLength:27182];
217
218 RMTStreamingInputCallRequest *request2 = [RMTStreamingInputCallRequest message];
219 request2.payload.body = [NSMutableData dataWithLength:8];
220
221 RMTStreamingInputCallRequest *request3 = [RMTStreamingInputCallRequest message];
222 request3.payload.body = [NSMutableData dataWithLength:1828];
223
224 RMTStreamingInputCallRequest *request4 = [RMTStreamingInputCallRequest message];
225 request4.payload.body = [NSMutableData dataWithLength:45904];
226
Jorge Canizalesa8c5d962015-07-16 18:55:31 -0700227 GRXWriter *writer = [GRXWriter writerWithContainer:@[request1, request2, request3, request4]];
Jorge Canizales73076842015-05-30 12:04:43 -0700228
229 [_service streamingInputCallWithRequestsWriter:writer
230 handler:^(RMTStreamingInputCallResponse *response,
231 NSError *error) {
232 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
233
234 RMTStreamingInputCallResponse *expectedResponse = [RMTStreamingInputCallResponse message];
235 expectedResponse.aggregatedPayloadSize = 74922;
236 XCTAssertEqualObjects(response, expectedResponse);
237
238 [expectation fulfill];
239 }];
240
Jorge Canizales5580e5d2015-07-15 23:35:48 -0700241 [self waitForExpectationsWithTimeout:8 handler:nil];
Jorge Canizales73076842015-05-30 12:04:43 -0700242}
243
244- (void)testServerStreamingRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700245 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700246 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"ServerStreaming"];
247
248 NSArray *expectedSizes = @[@31415, @9, @2653, @58979];
249
250 RMTStreamingOutputCallRequest *request = [RMTStreamingOutputCallRequest message];
251 for (NSNumber *size in expectedSizes) {
252 RMTResponseParameters *parameters = [RMTResponseParameters message];
Yuchen Zengafb62f82016-06-24 19:11:08 -0700253 parameters.size = [size intValue];
Jorge Canizales73076842015-05-30 12:04:43 -0700254 [request.responseParametersArray addObject:parameters];
255 }
256
257 __block int index = 0;
258 [_service streamingOutputCallWithRequest:request
murgatroid9925a26612015-06-25 11:22:23 -0700259 eventHandler:^(BOOL done,
Jorge Canizales73076842015-05-30 12:04:43 -0700260 RMTStreamingOutputCallResponse *response,
261 NSError *error){
262 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
263 XCTAssertTrue(done || response, @"Event handler called without an event.");
264
265 if (response) {
266 XCTAssertLessThan(index, 4, @"More than 4 responses received.");
267 id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:expectedSizes[index]];
268 XCTAssertEqualObjects(response, expected);
269 index += 1;
270 }
271
272 if (done) {
273 XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index);
274 [expectation fulfill];
275 }
276 }];
277
Jorge Canizales5580e5d2015-07-15 23:35:48 -0700278 [self waitForExpectationsWithTimeout:8 handler:nil];
Jorge Canizales73076842015-05-30 12:04:43 -0700279}
280
281- (void)testPingPongRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700282 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700283 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"PingPong"];
284
285 NSArray *requests = @[@27182, @8, @1828, @45904];
286 NSArray *responses = @[@31415, @9, @2653, @58979];
287
288 GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init];
289
290 __block int index = 0;
291
292 id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
293 requestedResponseSize:responses[index]];
294 [requestsBuffer writeValue:request];
295
296 [_service fullDuplexCallWithRequestsWriter:requestsBuffer
murgatroid9925a26612015-06-25 11:22:23 -0700297 eventHandler:^(BOOL done,
Jorge Canizales73076842015-05-30 12:04:43 -0700298 RMTStreamingOutputCallResponse *response,
299 NSError *error) {
300 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
301 XCTAssertTrue(done || response, @"Event handler called without an event.");
302
303 if (response) {
304 XCTAssertLessThan(index, 4, @"More than 4 responses received.");
305 id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:responses[index]];
306 XCTAssertEqualObjects(response, expected);
307 index += 1;
308 if (index < 4) {
309 id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
310 requestedResponseSize:responses[index]];
311 [requestsBuffer writeValue:request];
312 } else {
313 [requestsBuffer writesFinishedWithError:nil];
314 }
315 }
316
317 if (done) {
318 XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index);
319 [expectation fulfill];
320 }
321 }];
Jorge Canizales5580e5d2015-07-15 23:35:48 -0700322 [self waitForExpectationsWithTimeout:4 handler:nil];
Jorge Canizales73076842015-05-30 12:04:43 -0700323}
324
Makarand Dharmapurikar9b5f6402016-05-20 15:57:34 -0700325#ifndef GRPC_COMPILE_WITH_CRONET
326// TODO(makdharma@): Fix this test
Jorge Canizales73076842015-05-30 12:04:43 -0700327- (void)testEmptyStreamRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700328 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700329 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"EmptyStream"];
330 [_service fullDuplexCallWithRequestsWriter:[GRXWriter emptyWriter]
murgatroid9925a26612015-06-25 11:22:23 -0700331 eventHandler:^(BOOL done,
Jorge Canizales73076842015-05-30 12:04:43 -0700332 RMTStreamingOutputCallResponse *response,
333 NSError *error) {
334 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
335 XCTAssert(done, @"Unexpected response: %@", response);
336 [expectation fulfill];
337 }];
338 [self waitForExpectationsWithTimeout:2 handler:nil];
339}
Makarand Dharmapurikar9b5f6402016-05-20 15:57:34 -0700340#endif
Jorge Canizales73076842015-05-30 12:04:43 -0700341
342- (void)testCancelAfterBeginRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700343 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700344 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"CancelAfterBegin"];
345
346 // A buffered pipe to which we never write any value acts as a writer that just hangs.
347 GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init];
348
Yuchen Zeng3d399cb2016-06-21 11:57:46 -0700349 GRPCProtoCall *call =
350 [_service RPCToStreamingInputCallWithRequestsWriter:requestsBuffer
351 handler:^(RMTStreamingInputCallResponse *response,
352 NSError *error) {
Jorge Canizales73076842015-05-30 12:04:43 -0700353 XCTAssertEqual(error.code, GRPC_STATUS_CANCELLED);
354 [expectation fulfill];
355 }];
Jorge Canizales47b80bc2016-04-30 10:32:49 -0700356 XCTAssertEqual(call.state, GRXWriterStateNotStarted);
357
Jorge Canizales73076842015-05-30 12:04:43 -0700358 [call start];
Jorge Canizales47b80bc2016-04-30 10:32:49 -0700359 XCTAssertEqual(call.state, GRXWriterStateStarted);
360
Jorge Canizales73076842015-05-30 12:04:43 -0700361 [call cancel];
Jorge Canizales47b80bc2016-04-30 10:32:49 -0700362 XCTAssertEqual(call.state, GRXWriterStateFinished);
363
Jorge Canizales73076842015-05-30 12:04:43 -0700364 [self waitForExpectationsWithTimeout:1 handler:nil];
365}
366
367- (void)testCancelAfterFirstResponseRPC {
Jorge Canizales91db5ac2015-10-28 14:53:38 -0700368 XCTAssertNotNil(self.class.host);
Jorge Canizales73076842015-05-30 12:04:43 -0700369 __weak XCTestExpectation *expectation = [self expectationWithDescription:@"CancelAfterFirstResponse"];
Nate Kibler2d327712015-09-25 11:56:05 -0700370
Jorge Canizales73076842015-05-30 12:04:43 -0700371 // A buffered pipe to which we write a single value but never close
372 GRXBufferedPipe *requestsBuffer = [[GRXBufferedPipe alloc] init];
Nate Kibler2d327712015-09-25 11:56:05 -0700373
Jorge Canizales73076842015-05-30 12:04:43 -0700374 __block BOOL receivedResponse = NO;
Nate Kibler2d327712015-09-25 11:56:05 -0700375
Jorge Canizales73076842015-05-30 12:04:43 -0700376 id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:@21782
377 requestedResponseSize:@31415];
Nate Kibler2d327712015-09-25 11:56:05 -0700378
Jorge Canizales73076842015-05-30 12:04:43 -0700379 [requestsBuffer writeValue:request];
Nate Kibler2d327712015-09-25 11:56:05 -0700380
Yuchen Zengdbe2b9e2016-06-15 20:23:04 -0700381 __block GRPCProtoCall *call =
Jorge Canizales5580e5d2015-07-15 23:35:48 -0700382 [_service RPCToFullDuplexCallWithRequestsWriter:requestsBuffer
383 eventHandler:^(BOOL done,
384 RMTStreamingOutputCallResponse *response,
385 NSError *error) {
Jorge Canizales73076842015-05-30 12:04:43 -0700386 if (receivedResponse) {
387 XCTAssert(done, @"Unexpected extra response %@", response);
388 XCTAssertEqual(error.code, GRPC_STATUS_CANCELLED);
389 [expectation fulfill];
390 } else {
391 XCTAssertNil(error, @"Finished with unexpected error: %@", error);
392 XCTAssertFalse(done, @"Finished without response");
393 XCTAssertNotNil(response);
394 receivedResponse = YES;
395 [call cancel];
396 }
397 }];
398 [call start];
Jorge Canizales5580e5d2015-07-15 23:35:48 -0700399 [self waitForExpectationsWithTimeout:8 handler:nil];
Jorge Canizales73076842015-05-30 12:04:43 -0700400}
401
Jorge Canizalesfa70dac2016-04-29 19:58:52 -0700402- (void)testRPCAfterClosingOpenConnections {
403 XCTAssertNotNil(self.class.host);
404 __weak XCTestExpectation *expectation =
405 [self expectationWithDescription:@"RPC after closing connection"];
406
Makarand Dharmapurikar2b220f82016-07-08 10:47:57 -0700407 GPBEmpty *request = [GPBEmpty message];
Jorge Canizalesfa70dac2016-04-29 19:58:52 -0700408
Makarand Dharmapurikar2b220f82016-07-08 10:47:57 -0700409 [_service emptyCallWithRequest:request handler:^(GPBEmpty *response, NSError *error) {
Jorge Canizalesfa70dac2016-04-29 19:58:52 -0700410 XCTAssertNil(error, @"First RPC finished with unexpected error: %@", error);
411
Jorge Canizales00ca8ea2016-06-24 16:02:56 -0700412#pragma clang diagnostic push
413#pragma clang diagnostic ignored "-Wdeprecated-declarations"
Jorge Canizalesfa70dac2016-04-29 19:58:52 -0700414 [GRPCCall closeOpenConnections];
Jorge Canizales00ca8ea2016-06-24 16:02:56 -0700415#pragma clang diagnostic pop
Jorge Canizalesfa70dac2016-04-29 19:58:52 -0700416
Makarand Dharmapurikar2b220f82016-07-08 10:47:57 -0700417 [_service emptyCallWithRequest:request handler:^(GPBEmpty *response, NSError *error) {
Jorge Canizalesfa70dac2016-04-29 19:58:52 -0700418 XCTAssertNil(error, @"Second RPC finished with unexpected error: %@", error);
419 [expectation fulfill];
420 }];
421 }];
422
423 [self waitForExpectationsWithTimeout:4 handler:nil];
424}
425
Jorge Canizales73076842015-05-30 12:04:43 -0700426@end