public async Task Integration_Interop_LegacyClient() { // TODO: Transform this test into a theory and do multi-message, multi-thread, multi-client, etc. var logger = XUnitLogger.CreateLogger(_outputHelper); using (var webSocketFeature = new TestWebSocketConnectionFeature()) { // Bot / server setup var botRequestHandler = new Mock <RequestHandler>(); botRequestHandler .Setup(r => r.ProcessRequestAsync(It.IsAny <ReceiveRequest>(), null, null, CancellationToken.None)) .ReturnsAsync(() => new StreamingResponse() { StatusCode = 200 }); var socket = await webSocketFeature.AcceptAsync().ConfigureAwait(false); var connection = new WebSocketStreamingConnection(socket, logger); var serverTask = Task.Run(() => connection.ListenAsync(botRequestHandler.Object)); // Client / channel setup var clientRequestHandler = new Mock <RequestHandler>(); clientRequestHandler .Setup(r => r.ProcessRequestAsync(It.IsAny <ReceiveRequest>(), null, null, CancellationToken.None)) .ReturnsAsync(() => new StreamingResponse() { StatusCode = 200 }); using (var client = new Microsoft.Bot.Streaming.Transport.WebSockets.WebSocketClient("wss://test", clientRequestHandler.Object)) { await client.ConnectInternalAsync(webSocketFeature.Client).ConfigureAwait(false); // Send request bot (server) -> channel (client) const string path = "api/version"; const string botToClientPayload = "Hello human, I'm Bender!"; var request = StreamingRequest.CreatePost(path, new StringContent(botToClientPayload)); var responseFromClient = await connection.SendStreamingRequestAsync(request).ConfigureAwait(false); Assert.Equal(200, responseFromClient.StatusCode); const string clientToBotPayload = "Hello bot, I'm Calculon!"; var clientRequest = StreamingRequest.CreatePost(path, new StringContent(clientToBotPayload)); // Send request bot channel (client) -> (server) var clientToBotResult = await client.SendAsync(clientRequest).ConfigureAwait(false); Assert.Equal(200, clientToBotResult.StatusCode); client.Disconnect(); } await serverTask.ConfigureAwait(false); } }
public async Task Integration_Interop_LegacyClient_MiniLoad(int threadCount, int messageCount) { var logger = XUnitLogger.CreateLogger(_outputHelper); using (var webSocketFeature = new TestWebSocketConnectionFeature()) { var botRequestHandler = new Mock <RequestHandler>(); botRequestHandler .Setup(r => r.ProcessRequestAsync(It.IsAny <ReceiveRequest>(), null, null, CancellationToken.None)) .ReturnsAsync(() => new StreamingResponse() { StatusCode = 200 }); var socket = await webSocketFeature.AcceptAsync().ConfigureAwait(false); var connection = new WebSocketStreamingConnection(socket, logger); var serverTask = Task.Run(() => connection.ListenAsync(botRequestHandler.Object)); await Task.Delay(TimeSpan.FromSeconds(1)); var clients = new List <Microsoft.Bot.Streaming.Transport.WebSockets.WebSocketClient>(); var clientRequestHandler = new Mock <RequestHandler>(); clientRequestHandler .Setup(r => r.ProcessRequestAsync(It.IsAny <ReceiveRequest>(), null, null, CancellationToken.None)) .ReturnsAsync(() => new StreamingResponse() { StatusCode = 200 }); using (var client = new Microsoft.Bot.Streaming.Transport.WebSockets.WebSocketClient( "wss://test", clientRequestHandler.Object)) { await client.ConnectInternalAsync(webSocketFeature.Client).ConfigureAwait(false); clients.Add(client); // Send request bot (server) -> channel (client) const string path = "api/version"; const string botToClientPayload = "Hello human, I'm Bender!"; Func <int, Task> testFlow = async(i) => { var request = StreamingRequest.CreatePost(path, new StringContent(botToClientPayload)); var stopwatch = Stopwatch.StartNew(); var responseFromClient = await connection.SendStreamingRequestAsync(request).ConfigureAwait(false); stopwatch.Stop(); Assert.Equal(200, responseFromClient.StatusCode); logger.LogInformation( $"Server->Client {i} latency: {stopwatch.ElapsedMilliseconds}. Status code: {responseFromClient.StatusCode}"); const string clientToBotPayload = "Hello bot, I'm Calculon!"; var clientRequest = StreamingRequest.CreatePost(path, new StringContent(clientToBotPayload)); stopwatch = Stopwatch.StartNew(); // Send request bot channel (client) -> (server) var clientToBotResult = await client.SendAsync(clientRequest).ConfigureAwait(false); stopwatch.Stop(); Assert.Equal(200, clientToBotResult.StatusCode); logger.LogInformation( $"Client->Server {i} latency: {stopwatch.ElapsedMilliseconds}. Status code: {responseFromClient.StatusCode}"); }; await testFlow(-1).ConfigureAwait(false); var tasks = new List <Task>(); using (var throttler = new SemaphoreSlim(threadCount)) { for (int j = 0; j < messageCount; j++) { await throttler.WaitAsync().ConfigureAwait(false); // using Task.Run(...) to run the lambda in its own parallel // flow on the threadpool tasks.Add( Task.Run(async() => { try { await testFlow(j).ConfigureAwait(false); } finally { throttler.Release(); } })); } await Task.WhenAll(tasks).ConfigureAwait(false); } client.Disconnect(); } await serverTask.ConfigureAwait(false); } }