public async Task MessagesExchanged_CorrectNumberReported(int read, int written, int messageSize)
        {
            var telemetry = await TestAsync(
                async uri =>
            {
                using var client = new ClientWebSocket();
                await client.ConnectAsync(uri, CancellationToken.None);
                var webSocket = new WebSocketAdapter(client);

                await Task.WhenAll(
                    SendMessagesAndCloseAsync(webSocket, read, messageSize),
                    ReceiveAllMessagesAsync(webSocket));
            },
                async (context, webSocket) =>
            {
                await Task.WhenAll(
                    SendMessagesAndCloseAsync(webSocket, written, messageSize),
                    ReceiveAllMessagesAsync(webSocket));
            },
                new ManualClock(new TimeSpan(42)));

            Assert.NotNull(telemetry);
            Assert.Equal(42, telemetry !.EstablishedTime.Ticks);
            Assert.Contains(telemetry.CloseReason, new[] { WebSocketCloseReason.ClientGracefulClose, WebSocketCloseReason.ServerGracefulClose });
            Assert.Equal(read, telemetry !.MessagesRead);
            Assert.Equal(written, telemetry.MessagesWritten);
        }
            static async Task ProcessAsync(WebSocketAdapter webSocket, Behavior behavior, ClientWebSocket?client = null, HttpContext?context = null)
            {
                if (behavior == Behavior.SendsClose_WaitsForClose ||
                    behavior == Behavior.SendsClose_ClosesConnection)
                {
                    await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Bye");
                }

                if (behavior == Behavior.SendsClose_WaitsForClose ||
                    behavior == Behavior.WaitsForClose_SendsClose ||
                    behavior == Behavior.WaitsForClose_ClosesConnection)
                {
                    await ReceiveAllMessagesAsync(webSocket);
                }

                if (behavior == Behavior.WaitsForClose_SendsClose)
                {
                    await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Bye");
                }

                if (behavior.HasFlag(Behavior.ClosesConnection))
                {
                    client?.Abort();

                    if (context is not null)
                    {
                        await context.Response.Body.FlushAsync();

                        context.Abort();
                    }
                }
            }
예제 #3
0
        /// <summary>
        /// Build a new socket with conditional compilation on the adapter.
        /// </summary>
        /// <param name="client">The client object.</param>
        /// <returns>A new socket.</returns>
        public static ISocket NewSocket(this IClient client)
        {
#if UNITY_WEBGL && !UNITY_EDITOR
            ISocketAdapter adapter = new JsWebSocketAdapter();
#else
            ISocketAdapter adapter = new WebSocketAdapter();
#endif
            return(Socket.From(client, adapter));
        }
예제 #4
0
        public async Task <WebSocketAdapter> GetExchangeClient()
        {
            var baseClient = new ClientWebSocket();
            var factory    = new LoggerFactory();
            var client     = new WebSocketAdapter(factory.CreateLogger <WebSocketAdapter>(), baseClient);

            baseClient.Options.KeepAliveInterval = new TimeSpan(0, 0, 5);
            await baseClient.ConnectAsync(new Uri(BitstampApi), CancellationToken.None);

            return(client);
        }
예제 #5
0
        public async Task <WebSocketAdapter> CreateExchangeClientAsync()
        {
            var client  = new ClientWebSocket();
            var factory = new LoggerFactory();
            var adapter = new WebSocketAdapter(factory.CreateLogger <WebSocketAdapter>(), client);

            client.Options.KeepAliveInterval = new TimeSpan(0, 0, 5);
            await client.ConnectAsync(new Uri(SocketClientApi), CancellationToken.None);

            adapter.TimeStarted = DateTime.UtcNow;
            adapter.Markets     = new List <IOrderbook>();
            Client = adapter;
            Exchange.ActiveClients.Add(Client);
            return(adapter);
        }
예제 #6
0
        public async Task <WebSocketAdapter> CreateExchangeClientAsync()
        {
            var client  = new ClientWebSocket();
            var factory = new LoggerFactory();
            var adapter = new WebSocketAdapter(factory.CreateLogger <WebSocketAdapter>(), client);

            client.Options.KeepAliveInterval = new TimeSpan(0, 0, 5);
            await client.ConnectAsync(new Uri(SocketClientApi), CancellationToken.None);

            adapter.TimeStarted = DateTime.UtcNow;
            adapter.Markets     = new List <IOrderbook>();
            Client = adapter;
            Exchange.ActiveClients.Add(Client);
            await Task.Delay(250); // clients with zero subscriptions are being aborted; give 1/4 second to ensure connection is complete

            return(adapter);
        }
        public async Task ConnectionClosed_BlameAttributedCorrectly(Behavior clientBehavior, Behavior serverBehavior, params WebSocketCloseReason[] expectedReasons)
        {
            var telemetry = await TestAsync(
                async uri =>
            {
                using var client = new ClientWebSocket();

                // Keep sending messages from the client in order to observe a server disconnect sooner
                client.Options.KeepAliveInterval = TimeSpan.FromMilliseconds(10);

                await client.ConnectAsync(uri, CancellationToken.None);
                var webSocket = new WebSocketAdapter(client);

                try
                {
                    await ProcessAsync(webSocket, clientBehavior, client: client);
                }
                catch
                {
                    Assert.True(serverBehavior.HasFlag(Behavior.ClosesConnection));
                }
            },
                async (context, webSocket) =>
            {
                try
                {
                    await ProcessAsync(webSocket, serverBehavior, context: context);
                }
                catch
                {
                    Assert.True(clientBehavior.HasFlag(Behavior.ClosesConnection));
                }
            });

            Assert.NotNull(telemetry);
            Assert.Contains(telemetry !.CloseReason, expectedReasons);