public async Task InitTaskIsFailedIfFailureOccursAfterStartRequestStarted() { var mockTransportHelper = new Mock <TransportHelper>(); var mockConnection = new Mock <IConnection>(); mockConnection.Setup(p => p.TotalTransportConnectTimeout).Returns(TimeSpan.FromSeconds(0.5)); mockConnection.Setup(c => c.JsonSerializer).Returns(JsonSerializer.CreateDefault()); var initHandler = new TransportInitializationHandler(Mock.Of <IHttpClient>(), mockConnection.Object, string.Empty, "fakeTransport", CancellationToken.None, mockTransportHelper.Object); var onFailureInvoked = false; initHandler.OnFailure += () => onFailureInvoked = true; var exception = new Exception("test exception"); mockTransportHelper.Setup( h => h.GetStartResponse(It.IsAny <IHttpClient>(), It.IsAny <IConnection>(), It.IsAny <string>(), It.IsAny <string>())) .Returns <IHttpClient, IConnection, string, string>( (httpClient, connection, connectionData, transport) => { initHandler.Fail(exception); return(Task.FromResult("{ \"Response\" : \"started\" }")); }); initHandler.InitReceived(); var startException = await Assert.ThrowsAsync <StartException>(() => initHandler.Task); Assert.Same(exception, startException.InnerException); Assert.True(onFailureInvoked); }
public async Task FailIsNoOpAfterStartCompletedSuccessfully() { var mockTransportHelper = new Mock <TransportHelper>(); var mockConnection = new Mock <IConnection>(); mockConnection.Setup(p => p.TotalTransportConnectTimeout).Returns(TimeSpan.FromMilliseconds(200)); mockConnection.Setup(c => c.JsonSerializer).Returns(JsonSerializer.CreateDefault()); var initHandler = new TransportInitializationHandler(Mock.Of <IHttpClient>(), mockConnection.Object, string.Empty, "fakeTransport", CancellationToken.None, mockTransportHelper.Object); var onFailureInvoked = false; initHandler.OnFailure += () => onFailureInvoked = true; mockTransportHelper.Setup( h => h.GetStartResponse(It.IsAny <IHttpClient>(), It.IsAny <IConnection>(), It.IsAny <string>(), It.IsAny <string>())) .Returns <IHttpClient, IConnection, string, string>( (httpClient, connection, connectionData, transport) => Task.FromResult("{ \"Response\" : \"started\" }")); initHandler.InitReceived(); initHandler.Fail(); await initHandler.Task; Assert.False(onFailureInvoked); }
public void StartRequestNotCalledIfTransportAlreadyFailed() { var mockConnection = new Mock<IConnection>(); mockConnection.Setup(c => c.TotalTransportConnectTimeout).Returns(TimeSpan.FromSeconds(1)); var mockTransportHelper = new Mock<TransportHelper>(); var failureInvokedMre = new ManualResetEvent(false); var initHandler = new TransportInitializationHandler(Mock.Of<IHttpClient>(), mockConnection.Object, string.Empty, "fakeTransport", CancellationToken.None, mockTransportHelper.Object); initHandler.OnFailure += () => failureInvokedMre.Set(); initHandler.Fail(); Assert.True(failureInvokedMre.WaitOne(1000)); initHandler.InitReceived(); mockTransportHelper.Verify( h => h.GetStartResponse(It.IsAny<IHttpClient>(), It.IsAny<IConnection>(), It.IsAny<string>(), It.IsAny<string>()), Times.Never()); }
public async Task StartRequestNotCalledIfTransportAlreadyFailed() { var mockConnection = new Mock <IConnection>(); mockConnection.Setup(c => c.TotalTransportConnectTimeout).Returns(TimeSpan.FromSeconds(1)); var mockTransportHelper = new Mock <TransportHelper>(); var failureInvokedTcs = new TaskCompletionSource <object>(); var initHandler = new TransportInitializationHandler(Mock.Of <IHttpClient>(), mockConnection.Object, string.Empty, "fakeTransport", CancellationToken.None, mockTransportHelper.Object); initHandler.OnFailure += () => failureInvokedTcs.TrySetResult(null); initHandler.Fail(); await failureInvokedTcs.Task.OrTimeout(); initHandler.InitReceived(); mockTransportHelper.Verify( h => h.GetStartResponse(It.IsAny <IHttpClient>(), It.IsAny <IConnection>(), It.IsAny <string>(), It.IsAny <string>()), Times.Never()); }
public void StartRequestNotCalledIfTransportAlreadyFailed() { var mockConnection = new Mock <IConnection>(); mockConnection.Setup(c => c.TotalTransportConnectTimeout).Returns(TimeSpan.FromSeconds(1)); var mockTransportHelper = new Mock <TransportHelper>(); var failureInvokedMre = new ManualResetEvent(false); var initHandler = new TransportInitializationHandler(Mock.Of <IHttpClient>(), mockConnection.Object, string.Empty, "fakeTransport", CancellationToken.None, mockTransportHelper.Object); initHandler.OnFailure += () => failureInvokedMre.Set(); initHandler.Fail(); Assert.True(failureInvokedMre.WaitOne(1000)); initHandler.InitReceived(); mockTransportHelper.Verify( h => h.GetStartResponse(It.IsAny <IHttpClient>(), It.IsAny <IConnection>(), It.IsAny <string>(), It.IsAny <string>()), Times.Never()); }
public void InitTaskIsFailedIfFailureOccursAfterStartRequestStarted() { var mockTransportHelper = new Mock<TransportHelper>(); var mockConnection = new Mock<IConnection>(); mockConnection.Setup(p => p.TotalTransportConnectTimeout).Returns(TimeSpan.FromSeconds(0.5)); mockConnection.Setup(c => c.JsonSerializer).Returns(JsonSerializer.CreateDefault()); var initHandler = new TransportInitializationHandler(Mock.Of<IHttpClient>(), mockConnection.Object, string.Empty, "fakeTransport", CancellationToken.None, mockTransportHelper.Object); var onFailureInvoked = false; initHandler.OnFailure += () => onFailureInvoked = true; var exception = new Exception("test exception"); mockTransportHelper.Setup( h => h.GetStartResponse(It.IsAny<IHttpClient>(), It.IsAny<IConnection>(), It.IsAny<string>(), It.IsAny<string>())) .Returns<IHttpClient, IConnection, string, string>( (httpClient, connection, connectionData, transport) => { initHandler.Fail(exception); return Task.FromResult("{ \"Response\" : \"started\" }"); }); initHandler.InitReceived(); var startException = Assert.Throws<AggregateException>( () => Assert.True(initHandler.Task.Wait(TimeSpan.FromSeconds(1)))).InnerException; Assert.IsType<StartException>(startException); Assert.Same(exception, startException.InnerException); Assert.True(onFailureInvoked); }
public async Task FailIsNoOpAfterStartCompletedSuccessfully() { var mockTransportHelper = new Mock<TransportHelper>(); var mockConnection = new Mock<IConnection>(); mockConnection.Setup(p => p.TotalTransportConnectTimeout).Returns(TimeSpan.FromMilliseconds(200)); mockConnection.Setup(c => c.JsonSerializer).Returns(JsonSerializer.CreateDefault()); var initHandler = new TransportInitializationHandler(Mock.Of<IHttpClient>(), mockConnection.Object, string.Empty, "fakeTransport", CancellationToken.None, mockTransportHelper.Object); var onFailureInvoked = false; initHandler.OnFailure += () => onFailureInvoked = true; mockTransportHelper.Setup( h => h.GetStartResponse(It.IsAny<IHttpClient>(), It.IsAny<IConnection>(), It.IsAny<string>(), It.IsAny<string>())) .Returns<IHttpClient, IConnection, string, string>( (httpClient, connection, connectionData, transport) => Task.FromResult("{ \"Response\" : \"started\" }")); initHandler.InitReceived(); initHandler.Fail(); await initHandler.Task; Assert.False(onFailureInvoked); }
public virtual Task Start(IConnection connection, string connectionData, CancellationToken disconnectToken) { if (connection == null) { throw new ArgumentNullException("connection"); } _initializeHandler = new TransportInitializationHandler(connection.TransportConnectTimeout, disconnectToken); // Tie into the OnFailure event so that we can stop the transport silently. _initializeHandler.OnFailure += () => { Dispose(); }; _disconnectToken = disconnectToken; _connectionInfo = new WebSocketConnectionInfo(connection, connectionData); // We don't need to await this task PerformConnect().ContinueWith(task => { if (task.IsFaulted) { _initializeHandler.Fail(task.Exception); } else if (task.IsCanceled) { _initializeHandler.Fail(); } }, TaskContinuationOptions.NotOnRanToCompletion); return _initializeHandler.Task; }