Skip to content

Commit 73bcbfd

Browse files
author
Alex Billingsley
committed
Transition connection to disconnected on negotiate or start transport failure #254
1 parent 068679e commit 73bcbfd

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

SignalR.Client/SRConnection.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ - (void)negotiate:(id<SRClientTransportInterface>)transport {
153153
} else {
154154
SRLogConnectionError(@"negotiation failed %@", error);
155155
[strongSelf didReceiveError:error];
156-
[strongSelf didClose];
156+
[strongSelf stopButDoNotCallServer];
157157
}
158158
}];
159159
}
@@ -182,7 +182,7 @@ - (void)startTransport {
182182
} else {
183183
SRLogConnectionError(@"start transport failed %@",error);
184184
[strongSelf didReceiveError:error];
185-
[strongSelf didClose];
185+
[strongSelf stopButDoNotCallServer];
186186
}
187187
}];
188188
}

Tests/Tests/SRConnectionTests.m

+40
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,44 @@ - (void) testTransportNegotiateCausesClosed
116116
}];
117117
}
118118

119+
- (void)testConnectionCanRestartAfterNegotiateError {
120+
id failingTransport = [OCMockObject niceMockForProtocol:@protocol(SRClientTransportInterface)];
121+
[SRMockClientTransport negotiateForMockTransport:failingTransport statusCode:@400 error:[NSError errorWithDomain:@"UNIT TEST" code:NSURLErrorTimedOut userInfo:nil]];
122+
123+
id successTransport = [OCMockObject niceMockForProtocol:@protocol(SRClientTransportInterface)];
124+
[[successTransport expect] negotiate:[OCMArg any] connectionData:[OCMArg any] completionHandler:[OCMArg any]];
125+
126+
SRConnection* connection = [[SRConnection alloc] initWithURLString:@"http://localhost:0000"];
127+
[connection start: failingTransport];
128+
XCTAssertEqual(connection.state, disconnected);
129+
[connection start: successTransport];
130+
XCTAssertEqual(connection.state, connecting);
131+
[successTransport verify];
132+
133+
}
134+
135+
- (void)testConnectionCanRestartAfterStartError {
136+
id failingTransport = [OCMockObject niceMockForProtocol:@protocol(SRClientTransportInterface)];
137+
[SRMockClientTransport startForMockTransport:failingTransport statusCode:@400 error:[[NSError alloc]initWithDomain:@"Expected" code:42 userInfo:nil]];
138+
id json = @{
139+
@"ConnectionId": @"10101",
140+
@"ConnectionToken": @"10101010101",
141+
@"DisconnectTimeout": @30,
142+
@"ProtocolVersion": @"1.3.0.0"
143+
};
144+
[SRMockClientTransport negotiateForMockTransport:failingTransport statusCode:@200 json:json];
145+
146+
id successTransport = [OCMockObject niceMockForProtocol:@protocol(SRClientTransportInterface)];
147+
[SRMockClientTransport negotiateForMockTransport:successTransport statusCode:@200 json:json];
148+
[[successTransport expect] start:[OCMArg any] connectionData:[OCMArg any] completionHandler:[OCMArg any]];
149+
150+
SRConnection* connection = [[SRConnection alloc] initWithURLString:@"http://localhost:0000"];
151+
[connection start: failingTransport];
152+
XCTAssertEqual(connection.state, disconnected);
153+
[connection start: successTransport];
154+
XCTAssertEqual(connection.state, connecting);
155+
[successTransport verify];
156+
157+
}
158+
119159
@end

0 commit comments

Comments
 (0)