From 9eabce1b029bf3df49973dac088ebdfd8f8a56ea Mon Sep 17 00:00:00 2001 From: Pawel Kadluczka Date: Thu, 10 Aug 2017 17:59:05 -0700 Subject: [PATCH] Enabling tests which would have prevented a bug --- .../HubEndPoint.cs | 8 +++ .../HubConnectionTests.cs | 32 ++++++----- .../EndToEndTests.cs | 53 +++++++++++++++---- 3 files changed, 66 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNetCore.SignalR/HubEndPoint.cs b/src/Microsoft.AspNetCore.SignalR/HubEndPoint.cs index 4d68cb6699..d2db3c01de 100644 --- a/src/Microsoft.AspNetCore.SignalR/HubEndPoint.cs +++ b/src/Microsoft.AspNetCore.SignalR/HubEndPoint.cs @@ -120,6 +120,14 @@ namespace Microsoft.AspNetCore.SignalR ? (IDataEncoder)Base64Encoder : PassThroughEncoder; + var transferModeFeature = connection.Features.Get() ?? + throw new InvalidOperationException("Unable to read transfer mode."); + + transferModeFeature.TransferMode = + (protocol.Type == ProtocolType.Binary && (transportCapabilities & TransferMode.Binary) != 0) + ? TransferMode.Binary + : TransferMode.Text; + connection.ProtocolReaderWriter = new HubProtocolReaderWriter(protocol, dataEncoder); return; diff --git a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs index 29b57b4acb..03e656a849 100644 --- a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } [Theory] - [MemberData(nameof(HubProtocolsXTransportsXHubPaths))] + [MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))] public async Task CheckFixedMessage(IHubProtocol protocol, TransportType transportType, string path) { using (StartLog(out var loggerFactory)) @@ -67,7 +67,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } [Theory] - [MemberData(nameof(HubProtocolsXTransportsXHubPaths))] + [MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))] public async Task CanSendAndReceiveMessage(IHubProtocol protocol, TransportType transportType, string path) { using (StartLog(out var loggerFactory)) @@ -96,7 +96,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } [Theory] - [MemberData(nameof(HubProtocolsXTransportsXHubPaths))] + [MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))] public async Task MethodsAreCaseInsensitive(IHubProtocol protocol, TransportType transportType, string path) { using (StartLog(out var loggerFactory)) @@ -126,7 +126,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } [Theory] - [MemberData(nameof(HubProtocolsXTransportsXHubPaths))] + [MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))] public async Task CanInvokeClientMethodFromServer(IHubProtocol protocol, TransportType transportType, string path) { using (StartLog(out var loggerFactory)) @@ -159,7 +159,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } [Theory] - [MemberData(nameof(HubProtocolsXTransportsXHubPaths))] + [MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))] public async Task CanStreamClientMethodFromServer(IHubProtocol protocol, TransportType transportType, string path) { using (StartLog(out var loggerFactory)) @@ -189,7 +189,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } [Theory] - [MemberData(nameof(HubProtocolsXTransportsXHubPaths))] + [MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))] public async Task ServerClosesConnectionIfHubMethodCannotBeResolved(IHubProtocol hubProtocol, TransportType transportType, string hubPath) { using (StartLog(out var loggerFactory)) @@ -217,15 +217,18 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests } } - public static IEnumerable HubProtocolsXTransportsXHubPaths() + public static IEnumerable HubProtocolsAndTransportsAndHubPaths { - foreach (var protocol in HubProtocols) + get { - foreach (var transport in TransportTypes()) + foreach (var protocol in HubProtocols) { - foreach (var hubPath in HubPaths) + foreach (var transport in TransportTypes()) { - yield return new object[] { protocol, transport, hubPath }; + foreach (var hubPath in HubPaths) + { + yield return new object[] { protocol, transport, hubPath }; + } } } } @@ -240,16 +243,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests new MessagePackHubProtocol(), }; - public static IEnumerable TransportTypes() { if (TestHelpers.IsWebSocketsSupported()) { - // TODO: Currently we are always sending Text messages over websockets which does not work - // with binary protocols. It is getting fixed separately. - // The tests are also failing on full framework when using WebSockets transport - // due to: https://github.com/aspnet/SignalR/issues/568 - // yield return TransportType.WebSockets; + yield return TransportType.WebSockets; } yield return TransportType.ServerSentEvents; yield return TransportType.LongPolling; diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs index c23c7d1160..37240d13f0 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs @@ -97,10 +97,9 @@ namespace Microsoft.AspNetCore.SignalR.Tests } } - [ConditionalTheory] - [MemberData(nameof(TransportTypes))] - // TODO: transfer types - public async Task ConnectionCanSendAndReceiveMessages(TransportType transportType) + [Theory] + [MemberData(nameof(TransportTypesAndTransferModes))] + public async Task ConnectionCanSendAndReceiveMessages(TransportType transportType, TransferMode requestedTransferMode) { using (StartLog(out var loggerFactory, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}")) { @@ -112,7 +111,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests var connection = new HttpConnection(new Uri(url), transportType, loggerFactory); connection.Features.Set( - new TransferModeFeature { TransferMode = TransferMode.Text }); + new TransferModeFeature { TransferMode = requestedTransferMode }); try { var receiveTcs = new TaskCompletionSource(); @@ -120,6 +119,12 @@ namespace Microsoft.AspNetCore.SignalR.Tests connection.Received += data => { logger.LogInformation("Received {length} byte message", data.Length); + + if (IsBase64Encoded(requestedTransferMode, connection)) + { + data = Convert.FromBase64String(Encoding.UTF8.GetString(data)); + } + receiveTcs.TrySetResult(Encoding.UTF8.GetString(data)); return Task.CompletedTask; }; @@ -144,6 +149,13 @@ namespace Microsoft.AspNetCore.SignalR.Tests logger.LogInformation("Started connection to {url}", url); var bytes = Encoding.UTF8.GetBytes(message); + + // Need to encode binary payloads sent over text transports + if (IsBase64Encoded(requestedTransferMode, connection)) + { + bytes = Encoding.UTF8.GetBytes(Convert.ToBase64String(bytes)); + } + logger.LogInformation("Sending {length} byte message", bytes.Length); await connection.SendAsync(bytes).OrTimeout(); logger.LogInformation("Sent message", bytes.Length); @@ -166,6 +178,12 @@ namespace Microsoft.AspNetCore.SignalR.Tests logger.LogInformation("Disposed Connection"); } } + + bool IsBase64Encoded(TransferMode transferMode, IConnection connection) + { + return requestedTransferMode == TransferMode.Binary && + connection.Features.Get().TransferMode == TransferMode.Text; + } } public static IEnumerable MessageSizesData @@ -292,14 +310,29 @@ namespace Microsoft.AspNetCore.SignalR.Tests } } - public static IEnumerable TransportTypes() + public static IEnumerable TransportTypes { - if (TestHelpers.IsWebSocketsSupported()) + get { - yield return new object[] { TransportType.WebSockets }; + if (TestHelpers.IsWebSocketsSupported()) + { + yield return new object[] { TransportType.WebSockets }; + } + yield return new object[] { TransportType.ServerSentEvents }; + yield return new object[] { TransportType.LongPolling }; + } + } + + public static IEnumerable TransportTypesAndTransferModes + { + get + { + foreach (var transport in TransportTypes) + { + yield return new object[] { transport[0], TransferMode.Text }; + yield return new object[] { transport[0], TransferMode.Binary }; + } } - yield return new object[] { TransportType.ServerSentEvents }; - yield return new object[] { TransportType.LongPolling }; } } }