public async Task RunShouldWaitUntilTheWebSocketIsOpen( int sequenceNumber, [Substitute] IClientWebSocket clientWebSocket, [Frozen, Substitute] IGatewayService gateway, [Frozen, Substitute] IChannel <GatewayMessage> channel, [Frozen, Substitute] IGatewayUtilsFactory factory, [Target] DefaultGatewayTxWorker worker ) { var tries = 0; var message = new GatewayMessage { SequenceNumber = sequenceNumber }; var cancellationToken = new CancellationToken(false); clientWebSocket.State.Returns(WebSocketState.Connecting); channel.Read(Any <CancellationToken>()).Returns(new ValueTask <GatewayMessage>(message)); channel.WaitToRead(Any <CancellationToken>()).Returns(true); factory.CreateDelay(Any <uint>(), Any <CancellationToken>()).Returns(async x => { if (++tries == 2) { clientWebSocket.State.Returns(WebSocketState.Open); } await Task.CompletedTask; }); await worker.Start(gateway, clientWebSocket); await worker.Run(cancellationToken); await factory.Received(2).CreateDelay(100, Is(cancellationToken)); }
/// <summary> /// Runs the Gateway TX Worker. /// </summary> /// <param name="cancellationToken">Token used to cancel the operation.</param> /// <returns>The resulting task.</returns> public async Task Run(CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfNotRunning(); while (webSocket?.State != WebSocketState.Open) { await gatewayUtilsFactory.CreateDelay(100, cancellationToken); } if (!await channel.WaitToRead(cancellationToken)) { return; } var message = await channel.Read(cancellationToken); var serializedMessage = serializer.SerializeToBytes(message); logger.LogInformation("Sending Message: {@message}", message); await webSocket !.Send(serializedMessage, WebSocketMessageType.Text, true, cancellationToken); }