|
|
|
@ -31,6 +31,8 @@ |
|
|
|
|
#import <RxLibrary/GRXWriter+Immediate.h> |
|
|
|
|
#import <RxLibrary/GRXBufferedPipe.h> |
|
|
|
|
|
|
|
|
|
#include <netinet/in.h> |
|
|
|
|
|
|
|
|
|
#import "version.h" |
|
|
|
|
|
|
|
|
|
#define TEST_TIMEOUT 16 |
|
|
|
@ -482,4 +484,40 @@ static GRPCProtoMethod *kFullDuplexCallMethod; |
|
|
|
|
[self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
- (int)findFreePort { |
|
|
|
|
struct sockaddr_in addr; |
|
|
|
|
unsigned int addr_len = sizeof(addr); |
|
|
|
|
memset(&addr, 0, sizeof(addr)); |
|
|
|
|
addr.sin_family = AF_INET; |
|
|
|
|
int fd = socket(AF_INET, SOCK_STREAM, 0); |
|
|
|
|
XCTAssertEqual(bind(fd, (struct sockaddr*)&addr, sizeof(addr)), 0); |
|
|
|
|
XCTAssertEqual(getsockname(fd, (struct sockaddr*)&addr, &addr_len), 0); |
|
|
|
|
XCTAssertEqual(addr_len, sizeof(addr)); |
|
|
|
|
close(fd); |
|
|
|
|
return addr.sin_port; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
- (void)testErrorCode { |
|
|
|
|
int port = [self findFreePort]; |
|
|
|
|
NSString * const kDummyAddress = [NSString stringWithFormat:@"localhost:%d", port]; |
|
|
|
|
__weak XCTestExpectation *completion = [self expectationWithDescription:@"Empty RPC completed."]; |
|
|
|
|
|
|
|
|
|
GRPCCall *call = [[GRPCCall alloc] initWithHost:kDummyAddress |
|
|
|
|
path:kEmptyCallMethod.HTTPPath |
|
|
|
|
requestsWriter:[GRXWriter writerWithValue:[NSData data]]]; |
|
|
|
|
|
|
|
|
|
id<GRXWriteable> responsesWriteable = [[GRXWriteable alloc] initWithValueHandler:^(NSData *value) { |
|
|
|
|
// Should not reach here |
|
|
|
|
XCTAssert(NO); |
|
|
|
|
} completionHandler:^(NSError *errorOrNil) { |
|
|
|
|
XCTAssertNotNil(errorOrNil, @"Finished with no error"); |
|
|
|
|
XCTAssertEqual(errorOrNil.code, GRPC_STATUS_UNAVAILABLE); |
|
|
|
|
[completion fulfill]; |
|
|
|
|
}]; |
|
|
|
|
|
|
|
|
|
[call startWithWriteable:responsesWriteable]; |
|
|
|
|
|
|
|
|
|
[self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@end |
|
|
|
|