Skip to content

Commit

Permalink
Added tests to verify that 401 and 403 status code responses from the…
Browse files Browse the repository at this point in the history
… server on pings will stop the connection.

- This involved creating a StatusCodeConnection that will change the response status code based on a query string variable AND will respond with a specified status code.

#2360
  • Loading branch information
NTaylorMullen committed Jul 29, 2013
1 parent 4a7dcc0 commit ce7c00c
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
var buildRedirectConnection = function (redirectWhen, end, assert, testName, wrapStart) {
var connection = testUtilities.createConnection("redirectionConnection", end, assert, testName, wrapStart);
var buildStatusCodeConnection = function (alterWhen, statusCode, end, assert, testName, wrapStart) {
var connection = testUtilities.createConnection("statusCodeConnection", end, assert, testName, wrapStart);

connection.qs = {
redirectWhen: redirectWhen
alterWhen: alterWhen,
statusCode: statusCode
};

return connection;
Expand All @@ -12,6 +13,48 @@ QUnit.module("Connection Facts");

testUtilities.runWithAllTransports(function (transport) {

QUnit.asyncTimeoutTest(transport + ": Ping interval stops the connection on 401's.", testUtilities.defaultTestTimeout, function (end, assert, testName) {
var connection = buildStatusCodeConnection("ping", 401, end, assert, testName, false);

connection.error(function (error) {
assert.equal(error.message, $.signalR._.format($.signalR.resources.failedToPingServerStatusCode, 401), "Failed to ping server due to 401.");

setTimeout(function () {
assert.equal(connection.state, $.signalR.connectionState.disconnected, "Connection was stopped.");
end();
}, 500);
});

// Start the connection and ping the server every 1 second
connection.start({ transport: transport, pingInterval: 1000 });

// Cleanup
return function () {
connection.stop();
};
});

QUnit.asyncTimeoutTest(transport + ": Ping interval stops the connection on 403's.", testUtilities.defaultTestTimeout, function (end, assert, testName) {
var connection = buildStatusCodeConnection("ping", 403, end, assert, testName, false);

connection.error(function (error) {
assert.equal(error.message, $.signalR._.format($.signalR.resources.failedToPingServerStatusCode, 403), "Failed to ping server due to 403.");

setTimeout(function () {
assert.equal(connection.state, $.signalR.connectionState.disconnected, "Connection was stopped.");
end();
}, 500);
});

// Start the connection and ping the server every 1 second
connection.start({ transport: transport, pingInterval: 1000 });

// Cleanup
return function () {
connection.stop();
};
});

QUnit.asyncTimeoutTest(transport + ": Ping interval behaves appropriately.", testUtilities.defaultTestTimeout * 2, function (end, assert, testName) {
var connection = testUtilities.createHubConnection(end, assert, testName, undefined, false),
savedPingServer = $.signalR.transports._logic.pingServer,
Expand Down Expand Up @@ -49,8 +92,8 @@ testUtilities.runWithAllTransports(function (transport) {
connection.stop();
};
});
QUnit.asyncTimeoutTest(transport + ": Connection data flows with all requests to server.", testUtilities.defaultTestTimeout*2, function (end, assert, testName) {

QUnit.asyncTimeoutTest(transport + ": Connection data flows with all requests to server.", testUtilities.defaultTestTimeout * 2, function (end, assert, testName) {
var connection = testUtilities.createHubConnection(end, assert, testName, undefined, false),
connectionDataVerifierHub = connection.createHubProxies().connectionDataVerifierHub,
savedAjax = $.ajax,
Expand Down Expand Up @@ -95,7 +138,7 @@ testUtilities.runWithAllTransports(function (transport) {
connection.start(transportSettings).done(function () {
// Test disconnected
connection.stop();

setTimeout(function () {
connection.start(transportSettings).done(function () {
// Delay the network disconnect so that transports can be 100% conneted with disconnect is triggered
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@ public static void ConfigureRoutes(IAppBuilder app, IDependencyResolver resolver
map.RunSignalR<RedirectionConnection>(config);
});

app.Map("/statusCodeConnection", map =>
{
map.UseCors(CorsOptions.AllowAll);
map.RunSignalR<StatusCodeConnection>(config);
});

app.Map("/jsonp", map =>
{
var jsonpConfig = new ConnectionConfiguration
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Hosting;
using Microsoft.Owin;

namespace Microsoft.AspNet.SignalR.Tests.Common.Connections
{
public class StatusCodeConnection : PersistentConnection
{
public override Task ProcessRequest(HostContext context)
{
string alterWhen = "____Never____";
int statusCode = 200;

if (!String.IsNullOrEmpty(context.Request.QueryString["alterWhen"]))
{
alterWhen = context.Request.QueryString["alterWhen"];
}

if (!String.IsNullOrEmpty(context.Request.QueryString["statusCode"]))
{
statusCode = Int32.Parse(context.Request.QueryString["statusCode"]);
}

var owinRequest = new OwinRequest(context.Environment);

if (owinRequest.Path.Contains("/" + alterWhen))
{
var response = new OwinResponse(context.Environment);

// Alter status code
response.StatusCode = statusCode;

return TaskAsyncHelper.Empty;
}

return base.ProcessRequest(context);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
<Compile Include="Connections\ExamineReconnectPath.cs" />
<Compile Include="Connections\PreserializedJsonConnection.cs" />
<Compile Include="Connections\RedirectionConnection.cs" />
<Compile Include="Connections\StatusCodeConnection.cs" />
<Compile Include="Handlers\GCHandler.cs" />
<Compile Include="Handlers\PingHandler.cs" />
<Compile Include="Build\StartIISTask.cs" />
Expand Down

0 comments on commit ce7c00c

Please sign in to comment.