diff --git a/test/Microsoft.AspNetCore.WebSockets.Test/IWebHostPortExtensions.cs b/test/Microsoft.AspNetCore.WebSockets.Test/IWebHostPortExtensions.cs new file mode 100644 index 0000000000..d3b53681f4 --- /dev/null +++ b/test/Microsoft.AspNetCore.WebSockets.Test/IWebHostPortExtensions.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. 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.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Hosting.Server.Features; + +namespace Microsoft.AspNetCore.Hosting +{ + public static class IWebHostPortExtensions + { + public static int GetPort(this IWebHost host) + { + return host.GetPorts().First(); + } + + public static IEnumerable GetPorts(this IWebHost host) + { + return host.GetUris() + .Select(u => u.Port); + } + + public static IEnumerable GetUris(this IWebHost host) + { + return host.ServerFeatures.Get().Addresses + .Select(a => new Uri(a)); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebSockets.Test/KestrelWebSocketHelpers.cs b/test/Microsoft.AspNetCore.WebSockets.Test/KestrelWebSocketHelpers.cs index 5a1b988d0a..9b2d31f125 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Test/KestrelWebSocketHelpers.cs +++ b/test/Microsoft.AspNetCore.WebSockets.Test/KestrelWebSocketHelpers.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test { public class KestrelWebSocketHelpers { - public static IDisposable CreateServer(ILoggerFactory loggerFactory, Func app, int port) + public static IDisposable CreateServer(ILoggerFactory loggerFactory, out int port, Func app) { Action startup = builder => { @@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test var configBuilder = new ConfigurationBuilder(); configBuilder.AddInMemoryCollection(); var config = configBuilder.Build(); - config["server.urls"] = $"http://localhost:{port}"; + config["server.urls"] = $"http://127.0.0.1:0"; var host = new WebHostBuilder() .ConfigureServices(s => s.AddSingleton(loggerFactory)) @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test .Build(); host.Start(); + port = host.GetPort(); return host; } diff --git a/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs b/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs index c976a69cec..9cf3445ab6 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs @@ -24,30 +24,22 @@ namespace Microsoft.AspNetCore.WebSockets.Test #endif public class WebSocketMiddlewareTests : LoggedTest { - private readonly int Port; - private readonly string Address; - - public WebSocketMiddlewareTests(ITestOutputHelper output) : base(output) - { - Port = TestUriHelper.GetNextPort(); - Address = $"ws://localhost:{Port}/"; - } + public WebSocketMiddlewareTests(ITestOutputHelper output) : base(output) { } [ConditionalFact] public async Task Connect_Success() { using (StartLog(out var loggerFactory)) { - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); } } } @@ -58,20 +50,19 @@ namespace Microsoft.AspNetCore.WebSockets.Test { using (StartLog(out var loggerFactory)) { - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); Assert.Equal("alpha, bravo, charlie", context.Request.Headers["Sec-WebSocket-Protocol"]); var webSocket = await context.WebSockets.AcceptWebSocketAsync("Bravo"); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { client.Options.AddSubProtocol("alpha"); client.Options.AddSubProtocol("bravo"); client.Options.AddSubProtocol("charlie"); - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); // The Windows version of ClientWebSocket uses the casing from the header (Bravo) // However, the Managed version seems match the header against the list generated by @@ -90,7 +81,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test { using (StartLog(out var loggerFactory)) { - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -100,12 +91,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.True(result.EndOfMessage); Assert.Equal(0, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); var orriginalData = new byte[0]; await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); } @@ -119,7 +109,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -130,12 +120,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(orriginalData.Length, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); } } @@ -148,7 +137,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -159,12 +148,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(orriginalData.Length, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); } } @@ -177,7 +165,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -200,12 +188,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(WebSocketMessageType.Text, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); } } @@ -218,7 +205,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -245,12 +232,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(WebSocketMessageType.Binary, result.MessageType); Assert.Equal(orriginalData, serverBuffer); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); await client.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); await client.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); await client.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); @@ -265,18 +251,17 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); var clientBuffer = new byte[orriginalData.Length]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); @@ -294,18 +279,17 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); var clientBuffer = new byte[orriginalData.Length]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); @@ -323,18 +307,17 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); var clientBuffer = new byte[orriginalData.Length]; WebSocketReceiveResult result; int receivedCount = 0; @@ -360,7 +343,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -368,12 +351,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test 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); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); var clientBuffer = new byte[orriginalData.Length]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.False(result.EndOfMessage); @@ -407,7 +389,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -419,12 +401,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(WebSocketMessageType.Close, result.MessageType); Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); Assert.Equal(closeDescription, result.CloseStatusDescription); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); Assert.Equal(WebSocketState.CloseSent, client.State); @@ -439,18 +420,17 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); var clientBuffer = new byte[1024]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); @@ -471,7 +451,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -485,12 +465,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(closeDescription, result.CloseStatusDescription); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); await client.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); Assert.Equal(WebSocketState.Closed, client.State); @@ -505,7 +484,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -519,12 +498,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(closeDescription, result.CloseStatusDescription); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); Assert.Equal(WebSocketState.CloseSent, client.State); @@ -541,7 +519,7 @@ namespace Microsoft.AspNetCore.WebSockets.Test using (StartLog(out var loggerFactory)) { string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, async context => + using (var server = KestrelWebSocketHelpers.CreateServer(loggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); @@ -555,12 +533,11 @@ namespace Microsoft.AspNetCore.WebSockets.Test Assert.Equal(WebSocketMessageType.Close, result.MessageType); Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); Assert.Equal(closeDescription, result.CloseStatusDescription); - }, - Port)) + })) { using (var client = new ClientWebSocket()) { - await client.ConnectAsync(new Uri(Address), CancellationToken.None); + await client.ConnectAsync(new Uri($"ws://localhost:{port}/"), CancellationToken.None); var clientBuffer = new byte[1024]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.True(result.EndOfMessage);