Exemple #1
0
            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);
        }