From 04fbb076b25ead17cedae9cbfd0490ee01476ada Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 15 Dec 2014 14:18:58 -0800 Subject: [PATCH] #22 - Update client tests to use Kestrel so they can run on Win7. --- .../KestrelWebSocketHelpers.cs | 64 ++ .../WebSocketClientTests.cs | 728 ++++++++---------- .../project.json | 4 +- 3 files changed, 370 insertions(+), 426 deletions(-) create mode 100644 test/Microsoft.AspNet.WebSockets.Client.Test/KestrelWebSocketHelpers.cs diff --git a/test/Microsoft.AspNet.WebSockets.Client.Test/KestrelWebSocketHelpers.cs b/test/Microsoft.AspNet.WebSockets.Client.Test/KestrelWebSocketHelpers.cs new file mode 100644 index 0000000000..5e54941ae4 --- /dev/null +++ b/test/Microsoft.AspNet.WebSockets.Client.Test/KestrelWebSocketHelpers.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Http; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.Runtime.Infrastructure; + +namespace Microsoft.AspNet.WebSockets.Client.Test +{ + public class KestrelWebSocketHelpers + { + public static IDisposable CreateServer(Func app) + { + Action startup = builder => + { + builder.Use(async (ct, next) => + { + try + { + // Kestrel does not return proper error responses: + // https://github.com/aspnet/KestrelHttpServer/issues/43 + await next(); + } + catch (Exception ex) + { + if (ct.Response.HeadersSent) + { + throw; + } + + ct.Response.StatusCode = 500; + ct.Response.Headers.Clear(); + await ct.Response.WriteAsync(ex.ToString()); + } + }); + builder.UseWebSockets(); + builder.Run(c => app(c)); + }; + + var config = new Configuration(); + config.Add(new MemoryConfigurationSource()); + config.Set("server.urls", "http://localhost:54321"); + var services = HostingServices.Create(CallContextServiceLocator.Locator?.ServiceProvider, config) + .BuildServiceProvider(); + + var context = new HostingContext() + { + Services = services, + Configuration = config, + ServerName = "Kestrel", + ApplicationStartup = startup, + }; + + var engine = services.GetRequiredService(); + return engine.Start(context); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebSockets.Client.Test/WebSocketClientTests.cs b/test/Microsoft.AspNet.WebSockets.Client.Test/WebSocketClientTests.cs index 23cf33bee0..2b5bd7d5de 100644 --- a/test/Microsoft.AspNet.WebSockets.Client.Test/WebSocketClientTests.cs +++ b/test/Microsoft.AspNet.WebSockets.Client.Test/WebSocketClientTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Net; using System.Net.WebSockets; using System.Text; using System.Threading; @@ -13,235 +12,180 @@ namespace Microsoft.AspNet.WebSockets.Client.Test { public class WebSocketClientTests { - private static string ClientAddress = "ws://localhost:8080/"; - private static string ServerAddress = "http://localhost:8080/"; + private static string ClientAddress = "ws://localhost:54321/"; [Fact] public async Task Connect_Success() { - using (HttpListener listener = new HttpListener()) + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); - - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - clientSocket.Dispose(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + } } } [Fact] public async Task NegotiateSubProtocol_Success() { - using (HttpListener listener = new HttpListener()) + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); - - WebSocketClient client = new WebSocketClient(); + Assert.True(context.IsWebSocketRequest); + Assert.Equal("alpha, bravo, charlie", context.Request.Headers["Sec-WebSocket-Protocol"]); + var webSocket = await context.AcceptWebSocketAsync("Bravo"); + })) + { + var client = new WebSocketClient(); client.SubProtocols.Add("alpha"); client.SubProtocols.Add("bravo"); client.SubProtocols.Add("charlie"); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - Assert.Equal("alpha, bravo, charlie", serverContext.Request.Headers["Sec-WebSocket-Protocol"]); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync("Bravo"); - - WebSocket clientSocket = await clientConnect; - Assert.Equal("Bravo", clientSocket.SubProtocol); - clientSocket.Dispose(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + Assert.Equal("Bravo", clientSocket.SubProtocol); + } } } [Fact] public async Task SendEmptyData_Success() { - using (HttpListener listener = new HttpListener()) + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = new byte[0]; - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] serverBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[0]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(0, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, serverBuffer); - - clientSocket.Dispose(); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var orriginalData = new byte[0]; + await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } } } [Fact] public async Task SendShortData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes("Hello World"); - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] serverBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(orriginalData.Length, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - - clientSocket.Dispose(); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } } } [Fact] public async Task SendMediumData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Text, true, CancellationToken.None); - - byte[] serverBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Text, result.MessageType); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - - clientSocket.Dispose(); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } } } [Fact] public async Task SendLongData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null, 0xFFFF, TimeSpan.FromMinutes(100)); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Text, true, CancellationToken.None); - - byte[] serverBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); int intermediateCount = result.Count; Assert.False(result.EndOfMessage); Assert.Equal(WebSocketMessageType.Text, result.MessageType); - result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); + result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); intermediateCount += result.Count; Assert.False(result.EndOfMessage); Assert.Equal(WebSocketMessageType.Text, result.MessageType); - result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); + result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); intermediateCount += result.Count; Assert.True(result.EndOfMessage); Assert.Equal(orriginalData.Length, intermediateCount); Assert.Equal(WebSocketMessageType.Text, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - - clientSocket.Dispose(); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } } } [Fact] public async Task SendFragmentedData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - WebSocket serverSocket = serverWebSocketContext.WebSocket; - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes("Hello World"); - await clientSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await clientSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await clientSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] serverBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await serverSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.False(result.EndOfMessage); Assert.Equal(2, result.Count); int totalReceived = result.Count; Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - result = await serverSocket.ReceiveAsync( + result = await webSocket.ReceiveAsync( new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); Assert.False(result.EndOfMessage); Assert.Equal(2, result.Count); totalReceived += result.Count; Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - result = await serverSocket.ReceiveAsync( + result = await webSocket.ReceiveAsync( new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(7, result.Count); @@ -249,414 +193,348 @@ namespace Microsoft.AspNet.WebSockets.Client.Test Assert.Equal(WebSocketMessageType.Binary, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - - clientSocket.Dispose(); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + await clientSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await clientSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await clientSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); + } } } [Fact] public async Task ReceiveEmptyData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes("Hello World"); - await serverWebSocketContext.WebSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] clientBuffer = new byte[0]; - WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - clientSocket.Dispose(); + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var clientBuffer = new byte[0]; + var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + } } } [Fact] public async Task ReceiveShortData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes("Hello World"); - await serverWebSocketContext.WebSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] clientBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); - - clientSocket.Dispose(); + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var clientBuffer = new byte[orriginalData.Length]; + var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, clientBuffer); + } } } [Fact] public async Task ReceiveMediumData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); - await serverWebSocketContext.WebSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] clientBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); - - clientSocket.Dispose(); + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var clientBuffer = new byte[orriginalData.Length]; + var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, clientBuffer); + } } } [Fact] public async Task ReceiveLongDataInSmallBuffer_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); - await serverWebSocketContext.WebSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] clientBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result; - int receivedCount = 0; - do + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) { - result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer, receivedCount, clientBuffer.Length - receivedCount), CancellationToken.None); - receivedCount += result.Count; + var clientBuffer = new byte[orriginalData.Length]; + WebSocketReceiveResult result; + int receivedCount = 0; + do + { + result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer, receivedCount, clientBuffer.Length - receivedCount), CancellationToken.None); + receivedCount += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + } + while (!result.EndOfMessage); + + Assert.Equal(orriginalData.Length, receivedCount); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, clientBuffer); } - while (!result.EndOfMessage); - - Assert.Equal(orriginalData.Length, receivedCount); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); - - clientSocket.Dispose(); } } [Fact] public async Task ReceiveLongDataInLargeBuffer_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient() { ReceiveBufferSize = 0xFFFFFF }; - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - byte[] orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); - await serverWebSocketContext.WebSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] clientBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); - - clientSocket.Dispose(); + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + var client = new WebSocketClient() { ReceiveBufferSize = 0xFFFFFF }; + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var clientBuffer = new byte[orriginalData.Length]; + var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, clientBuffer); + } } } [Fact] public async Task ReceiveFragmentedData_Success() { - using (HttpListener listener = new HttpListener()) + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var clientBuffer = new byte[orriginalData.Length]; + var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(2, result.Count); + int totalReceived = result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - WebSocket serverSocket = serverWebSocketContext.WebSocket; + result = await clientSocket.ReceiveAsync( + new ArraySegment(clientBuffer, totalReceived, clientBuffer.Length - totalReceived), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(2, result.Count); + totalReceived += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - WebSocket clientSocket = await clientConnect; + result = await clientSocket.ReceiveAsync( + new ArraySegment(clientBuffer, totalReceived, clientBuffer.Length - totalReceived), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(7, result.Count); + totalReceived += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - byte[] orriginalData = Encoding.UTF8.GetBytes("Hello World"); - await serverSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await serverSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await serverSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); - - byte[] serverBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(2, result.Count); - int totalReceived = result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - result = await clientSocket.ReceiveAsync( - new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(2, result.Count); - totalReceived += result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - result = await clientSocket.ReceiveAsync( - new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(7, result.Count); - totalReceived += result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - Assert.Equal(orriginalData, serverBuffer); - - clientSocket.Dispose(); + Assert.Equal(orriginalData, clientBuffer); + } } } [Fact] public async Task SendClose_Success() { - using (HttpListener listener = new HttpListener()) + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - string closeDescription = "Test Closed"; - await clientSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - byte[] serverBuffer = new byte[1024]; - WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(0, result.Count); Assert.Equal(WebSocketMessageType.Close, result.MessageType); Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); Assert.Equal(closeDescription, result.CloseStatusDescription); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + await clientSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - Assert.Equal(WebSocketState.CloseSent, clientSocket.State); - - clientSocket.Dispose(); + Assert.Equal(WebSocketState.CloseSent, clientSocket.State); + } } } [Fact] public async Task ReceiveClose_Success() { - using (HttpListener listener = new HttpListener()) + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var clientBuffer = new byte[1024]; + var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - string closeDescription = "Test Closed"; - await serverWebSocketContext.WebSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - byte[] serverBuffer = new byte[1024]; - WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Close, result.MessageType); - Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); - Assert.Equal(closeDescription, result.CloseStatusDescription); - - Assert.Equal(WebSocketState.CloseReceived, clientSocket.State); - - clientSocket.Dispose(); + Assert.Equal(WebSocketState.CloseReceived, clientSocket.State); + } } } [Fact] public async Task CloseFromOpen_Success() { - using (HttpListener listener = new HttpListener()) + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - string closeDescription = "Test Closed"; - Task closeTask = clientSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - byte[] serverBuffer = new byte[1024]; - WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(0, result.Count); Assert.Equal(WebSocketMessageType.Close, result.MessageType); Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); Assert.Equal(closeDescription, result.CloseStatusDescription); - await serverWebSocketContext.WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + await clientSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - await closeTask; - - Assert.Equal(WebSocketState.Closed, clientSocket.State); - - clientSocket.Dispose(); + Assert.Equal(WebSocketState.Closed, clientSocket.State); + } } } [Fact] public async Task CloseFromCloseSent_Success() { - using (HttpListener listener = new HttpListener()) + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); - - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - string closeDescription = "Test Closed"; - await clientSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - Assert.Equal(WebSocketState.CloseSent, clientSocket.State); - - byte[] serverBuffer = new byte[1024]; - WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(0, result.Count); Assert.Equal(WebSocketMessageType.Close, result.MessageType); Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); Assert.Equal(closeDescription, result.CloseStatusDescription); - await serverWebSocketContext.WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + await clientSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + Assert.Equal(WebSocketState.CloseSent, clientSocket.State); - await clientSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - Assert.Equal(WebSocketState.Closed, clientSocket.State); - - clientSocket.Dispose(); + await clientSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + Assert.Equal(WebSocketState.Closed, clientSocket.State); + } } } [Fact] public async Task CloseFromCloseReceived_Success() { - using (HttpListener listener = new HttpListener()) + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => { - listener.Prefixes.Add(ServerAddress); - listener.Start(); - Task serverAccept = listener.GetContextAsync(); + Assert.True(context.IsWebSocketRequest); + var webSocket = await context.AcceptWebSocketAsync(); - WebSocketClient client = new WebSocketClient(); - Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - HttpListenerContext serverContext = await serverAccept; - Assert.True(serverContext.Request.IsWebSocketRequest); - HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); - - WebSocket clientSocket = await clientConnect; - - string closeDescription = "Test Closed"; - await serverWebSocketContext.WebSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - byte[] serverBuffer = new byte[1024]; - WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(0, result.Count); Assert.Equal(WebSocketMessageType.Close, result.MessageType); Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); Assert.Equal(closeDescription, result.CloseStatusDescription); + })) + { + var client = new WebSocketClient(); + using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) + { + var clientBuffer = new byte[1024]; + var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); - Assert.Equal(WebSocketState.CloseReceived, clientSocket.State); + Assert.Equal(WebSocketState.CloseReceived, clientSocket.State); - await clientSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + await clientSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - Assert.Equal(WebSocketState.Closed, clientSocket.State); - - clientSocket.Dispose(); + Assert.Equal(WebSocketState.Closed, clientSocket.State); + } } } } diff --git a/test/Microsoft.AspNet.WebSockets.Client.Test/project.json b/test/Microsoft.AspNet.WebSockets.Client.Test/project.json index 2513189d82..8dc76e0d68 100644 --- a/test/Microsoft.AspNet.WebSockets.Client.Test/project.json +++ b/test/Microsoft.AspNet.WebSockets.Client.Test/project.json @@ -2,7 +2,9 @@ "dependencies": { "Microsoft.AspNet.WebSockets.Protocol": "1.0.0-*", "Microsoft.AspNet.WebSockets.Client": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "Microsoft.AspNet.WebSockets.Server": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*", + "Kestrel": "1.0.0-*" }, "frameworks": { "aspnet50": { }