Enabling tests which would have prevented a bug

This commit is contained in:
Pawel Kadluczka 2017-08-10 17:59:05 -07:00 committed by Pawel Kadluczka
parent e8a673248a
commit 9eabce1b02
3 changed files with 66 additions and 27 deletions

View File

@ -120,6 +120,14 @@ namespace Microsoft.AspNetCore.SignalR
? (IDataEncoder)Base64Encoder
: PassThroughEncoder;
var transferModeFeature = connection.Features.Get<ITransferModeFeature>() ??
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;

View File

@ -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<object[]> HubProtocolsXTransportsXHubPaths()
public static IEnumerable<object[]> 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<TransportType> 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;

View File

@ -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<ITransferModeFeature>(
new TransferModeFeature { TransferMode = TransferMode.Text });
new TransferModeFeature { TransferMode = requestedTransferMode });
try
{
var receiveTcs = new TaskCompletionSource<string>();
@ -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<ITransferModeFeature>().TransferMode == TransferMode.Text;
}
}
public static IEnumerable<object[]> MessageSizesData
@ -292,14 +310,29 @@ namespace Microsoft.AspNetCore.SignalR.Tests
}
}
public static IEnumerable<object[]> TransportTypes()
public static IEnumerable<object[]> 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<object[]> 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 };
}
}
}