public async Task StartShouldStartTheRxWorker(
                [Frozen, Substitute] IGatewayRxWorker rxWorker,
                [Target] DefaultGatewayService gateway
                )
            {
                await gateway.StartAsync();

                await rxWorker.Received().Start(Is(gateway));
            }
            public async Task RunShouldReceiveChunksFromTheWebSocket(
                [Frozen, Options] IOptions <GatewayOptions> options,
                [Frozen, Substitute] IClientWebSocket webSocket,
                [Frozen, Substitute] IGatewayRxWorker rxWorker,
                [Target] DefaultGatewayService gateway
                )
            {
                var cancellationToken = new CancellationToken(false);

                webSocket.Receive(Any <Memory <byte> >(), Any <CancellationToken>()).Returns(x => new ValueWebSocketReceiveResult(0, WebSocketMessageType.Text, true));

                await gateway.StartAsync();

                await gateway.Run(cancellationToken);

                await webSocket.Received().Receive(Any <Memory <byte> >(), Is(cancellationToken));
            }
            public async Task RunShouldNotConnectToTheWebSocketServerIfAlreadyConnected(
                [Frozen, Options] IOptions <GatewayOptions> options,
                [Frozen, Substitute] IClientWebSocket webSocket,
                [Frozen, Substitute] IGatewayRxWorker rxWorker,
                [Target] DefaultGatewayService gateway
                )
            {
                var cancellationToken = new CancellationToken(false);

                webSocket.State.Returns(WebSocketState.Open);
                webSocket.Receive(Any <Memory <byte> >(), Any <CancellationToken>()).Returns(x => new ValueWebSocketReceiveResult(0, WebSocketMessageType.Text, true));

                await gateway.StartAsync();

                await gateway.Run(cancellationToken);

                await webSocket.DidNotReceive().Connect(Is(options.Value.Uri), Is(cancellationToken));
            }
 /// <summary>
 /// Initializes a new instance of the <see cref="DefaultGatewayService" /> class.
 /// </summary>
 /// <param name="rxWorker">The worker to use for receiving message chunks and parsing messages.</param>
 /// <param name="txWorker">The worker to use for sending messages to the gateway.</param>
 /// <param name="timerFactory">Factory to create timers with.</param>
 /// <param name="restartService">Service used to restart the gateway.</param>
 /// <param name="gatewayUtilsFactory">Factory to create various utils with.</param>
 /// <param name="options">Options to use for interacting with the gateway.</param>
 /// <param name="logger">Logger used to log information to some destination(s).</param>
 public DefaultGatewayService(
     IGatewayRxWorker rxWorker,
     IGatewayTxWorker txWorker,
     ITimerFactory timerFactory,
     IGatewayRestartService restartService,
     IGatewayUtilsFactory gatewayUtilsFactory,
     IOptions <GatewayOptions> options,
     ILogger <DefaultGatewayService> logger
     )
 {
     this.rxWorker            = rxWorker;
     this.txWorker            = txWorker;
     this.timerFactory        = timerFactory;
     this.restartService      = restartService;
     this.gatewayUtilsFactory = gatewayUtilsFactory;
     this.options             = options.Value;
     this.logger  = logger;
     buffer       = new byte[this.options.BufferSize];
     memoryBuffer = new Memory <byte>(buffer);
 }
            public async Task RunShouldEmitMessageChunksToTheRxWorker(
                string messageChunk,
                [Frozen] CancellationTokenSource cancellationTokenSource,
                [Frozen, Options] IOptions <GatewayOptions> options,
                [Frozen, Substitute] IClientWebSocket webSocket,
                [Frozen, Substitute] IGatewayRxWorker rxWorker,
                [Target] DefaultGatewayService gateway
                )
            {
                var buffer            = new byte[messageChunk.Length];
                var memoryBuffer      = new Memory <byte>(buffer);
                var cancellationToken = new CancellationToken(false);

                gateway.SetPrivateField("buffer", buffer);
                gateway.SetPrivateField("memoryBuffer", memoryBuffer);

                webSocket.Receive(Any <Memory <byte> >(), Any <CancellationToken>()).Returns(x =>
                {
                    var buffer = x.ArgAt <Memory <byte> >(0);
                    ((Memory <byte>)Encoding.UTF8.GetBytes(messageChunk)).CopyTo(buffer);
                    return(new ValueWebSocketReceiveResult(messageChunk.Length, WebSocketMessageType.Text, true));
                });

                await gateway.StartAsync();

                await gateway.Run(cancellationToken);

                await rxWorker.Received().Emit(
                    Is <GatewayMessageChunk>(chunk =>
                                             Encoding.UTF8.GetString(chunk.Bytes.ToArray()) == messageChunk &&
                                             chunk.Count == messageChunk.Length &&
                                             chunk.EndOfMessage
                                             ),
                    Is(cancellationToken)
                    );
            }