|  | @@ -457,4 +457,99 @@
 | 
	
		
			
				|  |  |    [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- (void)testAlternateDispatchQueue {
 | 
	
		
			
				|  |  | +  XCTAssertNotNil(self.class.host);
 | 
	
		
			
				|  |  | +  __weak XCTestExpectation *expectation1 = [self expectationWithDescription:@"AlternateDispatchQueue1"];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  NSArray *requests = @[@27182, @8, @1828, @45904];
 | 
	
		
			
				|  |  | +  NSArray *responses = @[@31415, @9, @2653, @58979];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Set the default dispatch queue
 | 
	
		
			
				|  |  | +  NSString *queue1_label = @"test.queue1";
 | 
	
		
			
				|  |  | +  NSString *queue2_label = @"test.queue2";
 | 
	
		
			
				|  |  | +  dispatch_queue_t queue1 = dispatch_queue_create([queue1_label UTF8String], DISPATCH_QUEUE_SERIAL);
 | 
	
		
			
				|  |  | +  dispatch_queue_t queue2 = dispatch_queue_create([queue2_label UTF8String], DISPATCH_QUEUE_SERIAL);
 | 
	
		
			
				|  |  | +  [_service setDefaultResponseDispatchQueue:queue1];
 | 
	
		
			
				|  |  | +  GRXBufferedPipe *requestsBuffer1 = [[GRXBufferedPipe alloc] init];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  __block int index = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
 | 
	
		
			
				|  |  | +                                               requestedResponseSize:responses[index]];
 | 
	
		
			
				|  |  | +  [requestsBuffer1 writeValue:request];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  [_service fullDuplexCallWithRequestsWriter:requestsBuffer1
 | 
	
		
			
				|  |  | +                                eventHandler:^(BOOL done,
 | 
	
		
			
				|  |  | +                                               RMTStreamingOutputCallResponse *response,
 | 
	
		
			
				|  |  | +                                               NSError *error) {
 | 
	
		
			
				|  |  | +    XCTAssertNil(error, @"Finished with unexpected error: %@", error);
 | 
	
		
			
				|  |  | +    XCTAssertTrue(done || response, @"Event handler called without an event.");
 | 
	
		
			
				|  |  | +    NSString *label = [NSString stringWithUTF8String:dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];
 | 
	
		
			
				|  |  | +    XCTAssert([label isEqualToString:queue1_label]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (response) {
 | 
	
		
			
				|  |  | +      XCTAssertLessThan(index, 4, @"More than 4 responses received.");
 | 
	
		
			
				|  |  | +      id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:responses[index]];
 | 
	
		
			
				|  |  | +      XCTAssertEqualObjects(response, expected);
 | 
	
		
			
				|  |  | +      index += 1;
 | 
	
		
			
				|  |  | +      if (index < 4) {
 | 
	
		
			
				|  |  | +        id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
 | 
	
		
			
				|  |  | +                                                     requestedResponseSize:responses[index]];
 | 
	
		
			
				|  |  | +        [requestsBuffer1 writeValue:request];
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        [requestsBuffer1 writesFinishedWithError:nil];
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (done) {
 | 
	
		
			
				|  |  | +      XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index);
 | 
	
		
			
				|  |  | +      [expectation1 fulfill];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Test overriding default queue with another queue
 | 
	
		
			
				|  |  | +  __weak XCTestExpectation *expectation2 = [self expectationWithDescription:@"AlternateDispatchQueue2"];
 | 
	
		
			
				|  |  | +  GRXBufferedPipe *requestsBuffer2 = [[GRXBufferedPipe alloc] init];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  index = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  [requestsBuffer2 writeValue:request];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  GRPCProtoCall *rpc = [_service RPCToFullDuplexCallWithRequestsWriter:requestsBuffer2
 | 
	
		
			
				|  |  | +                                eventHandler:^(BOOL done,
 | 
	
		
			
				|  |  | +                                               RMTStreamingOutputCallResponse *response,
 | 
	
		
			
				|  |  | +                                               NSError *error) {
 | 
	
		
			
				|  |  | +    XCTAssertNil(error, @"Finished with unexpected error: %@", error);
 | 
	
		
			
				|  |  | +    XCTAssertTrue(done || response, @"Event handler called without an event.");
 | 
	
		
			
				|  |  | +    NSString *label = [NSString stringWithUTF8String:dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];
 | 
	
		
			
				|  |  | +    XCTAssert([label isEqualToString:queue2_label]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (response) {
 | 
	
		
			
				|  |  | +      XCTAssertLessThan(index, 4, @"More than 4 responses received.");
 | 
	
		
			
				|  |  | +      id expected = [RMTStreamingOutputCallResponse messageWithPayloadSize:responses[index]];
 | 
	
		
			
				|  |  | +      XCTAssertEqualObjects(response, expected);
 | 
	
		
			
				|  |  | +      index += 1;
 | 
	
		
			
				|  |  | +      if (index < 4) {
 | 
	
		
			
				|  |  | +        id request = [RMTStreamingOutputCallRequest messageWithPayloadSize:requests[index]
 | 
	
		
			
				|  |  | +                                                     requestedResponseSize:responses[index]];
 | 
	
		
			
				|  |  | +        [requestsBuffer2 writeValue:request];
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        [requestsBuffer2 writesFinishedWithError:nil];
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (done) {
 | 
	
		
			
				|  |  | +      XCTAssertEqual(index, 4, @"Received %i responses instead of 4.", index);
 | 
	
		
			
				|  |  | +      [expectation2 fulfill];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }];
 | 
	
		
			
				|  |  | +  [rpc setResponseDispatchQueue:queue2];
 | 
	
		
			
				|  |  | +  [rpc start];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil];
 | 
	
		
			
				|  |  | +  [_service setDefaultResponseDispatchQueue:dispatch_get_main_queue()];
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  @end
 |