Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion RestSharp.IntegrationTests/Helpers/Handlers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,17 @@ public static Action<HttpListenerContext> EchoValue(string value)
return ctx => ctx.Response.OutputStream.WriteStringUtf8(value);
}

/// <summary>
/// </summary>
public static Action<HttpListenerContext> Timeout()
{
return ctx =>
{
System.Threading.Thread.Sleep(10000);
ctx.Response.OutputStream.WriteStringUtf8("This should timeout");
};
}

/// <summary>
/// Response to a request like this: http://localhost:8080/assets/koala.jpg
/// by streaming the file located at "assets\koala.jpg" back to the client.
Expand Down Expand Up @@ -72,4 +83,4 @@ public static void FileHandler(HttpListenerContext context)
};
}
}
}
}
178 changes: 178 additions & 0 deletions RestSharp.IntegrationTests/TimeoutTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
using System;
using System.Threading;
using RestSharp.IntegrationTests.Helpers;
using Xunit;

namespace RestSharp.IntegrationTests
{
public class TimeoutTests
{
[Fact]
public void RestClient_Handles_Request_Timeout_Synchronously()
{
const string baseUrl = "http://localhost:8080/";
var resetEvent = new ManualResetEvent(false);

using (SimpleServer.Create(baseUrl, Handlers.Timeout()))
{
var client = new RestClient(baseUrl);
client.Timeout = 500;
var request = new RestRequest("");

var response = client.Execute(request);

Assert.Equal(ResponseStatus.TimedOut, response.ResponseStatus);
}
}

[Fact]
public void RestClient_Handles_Request_Timeout_Asynchronously()
{
const string baseUrl = "http://localhost:8080/";
var resetEvent = new ManualResetEvent(false);
RestResponse capturedResponse = null;

using (SimpleServer.Create(baseUrl, Handlers.Timeout()))
{
var client = new RestClient(baseUrl);
client.Timeout = 500;
var request = new RestRequest("");

client.ExecuteAsync(request, response =>
{
capturedResponse = response;
resetEvent.Set();
});

resetEvent.WaitOne(5000);

Assert.NotNull(capturedResponse);
Assert.Equal(ResponseStatus.TimedOut, capturedResponse.ResponseStatus);
}
}

[Fact]
public void RestClient_Respects_Request_Level_Timeout_Over_Client_Timeout()
{
const string baseUrl = "http://localhost:8080/";

using (SimpleServer.Create(baseUrl, Handlers.Timeout()))
{
var client = new RestClient(baseUrl);
client.Timeout = 5000;
var request = new RestRequest("");
request.Timeout = 500;

var response = client.Execute(request);

Assert.Equal(ResponseStatus.TimedOut, response.ResponseStatus);
}
}

[Fact]
public void RestClient_Returns_Error_Message_On_Timeout()
{
const string baseUrl = "http://localhost:8080/";

using (SimpleServer.Create(baseUrl, Handlers.Timeout()))
{
var client = new RestClient(baseUrl);
client.Timeout = 500;
var request = new RestRequest("");

var response = client.Execute(request);

Assert.Equal(ResponseStatus.TimedOut, response.ResponseStatus);
Assert.NotNull(response.ErrorException);
}
}

[Fact]
public void RestClient_Handles_Zero_Timeout_As_No_Timeout()
{
const string baseUrl = "http://localhost:8080/";
const string val = "No timeout test";

using (SimpleServer.Create(baseUrl, Handlers.EchoValue(val)))
{
var client = new RestClient(baseUrl);
client.Timeout = 0;
var request = new RestRequest("");

var response = client.Execute(request);

Assert.Equal(ResponseStatus.Completed, response.ResponseStatus);
Assert.Equal(val, response.Content);
}
}

[Fact]
public void RestClient_Completes_Request_Before_Timeout()
{
const string baseUrl = "http://localhost:8080/";
const string val = "Fast response";

using (SimpleServer.Create(baseUrl, Handlers.EchoValue(val)))
{
var client = new RestClient(baseUrl);
client.Timeout = 5000;
var request = new RestRequest("");

var response = client.Execute(request);

Assert.Equal(ResponseStatus.Completed, response.ResponseStatus);
Assert.Equal(val, response.Content);
}
}

[Fact]
public void RestClient_Handles_Timeout_With_Generic_Execute()
{
const string baseUrl = "http://localhost:8080/";

using (SimpleServer.Create(baseUrl, Handlers.Timeout()))
{
var client = new RestClient(baseUrl);
client.Timeout = 500;
var request = new RestRequest("");

var response = client.Execute<TestResponse>(request);

Assert.Equal(ResponseStatus.TimedOut, response.ResponseStatus);
Assert.Null(response.Data);
}
}

[Fact]
public void RestClient_Handles_Timeout_Async_With_Generic_Execute()
{
const string baseUrl = "http://localhost:8080/";
var resetEvent = new ManualResetEvent(false);
RestResponse<TestResponse> capturedResponse = null;

using (SimpleServer.Create(baseUrl, Handlers.Timeout()))
{
var client = new RestClient(baseUrl);
client.Timeout = 500;
var request = new RestRequest("");

client.ExecuteAsync<TestResponse>(request, response =>
{
capturedResponse = response;
resetEvent.Set();
});

resetEvent.WaitOne(5000);

Assert.NotNull(capturedResponse);
Assert.Equal(ResponseStatus.TimedOut, capturedResponse.ResponseStatus);
Assert.Null(capturedResponse.Data);
}
}

public class TestResponse
{
public string Message { get; set; }
}
}
}
Loading