Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
namespace Boxed.AspNetCore.Test.Middleware;

using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Boxed.AspNetCore.Middleware;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging;
using Moq;
using Xunit;
Expand All @@ -21,12 +24,11 @@ public RequestCanceledMiddlewareTest()
}

[Fact]
public void InvokeAsync_NullContext_ThrowsArgumentNullException() =>
Assert.ThrowsAsync<ArgumentNullException>(() => new ServerTimingMiddleware().InvokeAsync(null!, this.next));

[Fact]
public void InvokeAsync_NullNext_ThrowsArgumentNullException() =>
Assert.ThrowsAsync<ArgumentNullException>(() => new ServerTimingMiddleware().InvokeAsync(this.context, null!));
public async Task InvokeAsync_NullContext_ThrowsArgumentNullExceptionAsync() =>
await Assert.ThrowsAsync<ArgumentNullException>(() =>
new RequestCanceledMiddleware(this.next, new RequestCanceledMiddlewareOptions(), new Mock<ILogger<RequestCanceledMiddleware>>().Object)
.InvokeAsync(null!))
.ConfigureAwait(false);

[Fact]
public async Task InvokeAsync_RequestNotCanceled_RunsNextMiddlewareAsync()
Expand Down Expand Up @@ -60,21 +62,56 @@ await Assert
.ConfigureAwait(false);
}

[Fact]
public async Task InvokeAsync_TaskCanceledExceptionThrownNotCanceled_RunsNextMiddlewareAsync()
{
// Arrange
using var cancellationTokenSource1 = new CancellationTokenSource();
using var cancellationTokenSource2 = new CancellationTokenSource();

cancellationTokenSource2.Cancel();

this.context.RequestAborted = cancellationTokenSource1.Token;
this.next = x => Task.FromException(new TaskCanceledException(Task.FromCanceled(cancellationTokenSource2.Token)));

// Act & Assert
await Assert.ThrowsAsync<TaskCanceledException>(() =>
new RequestCanceledMiddleware(this.next, new RequestCanceledMiddlewareOptions(), new Mock<ILogger<RequestCanceledMiddleware>>().Object)
.InvokeAsync(this.context))
.ConfigureAwait(false);
}

[Fact]
public async Task InvokeAsync_RequestCanceled_Returns499ClientClosedRequestAsync()
{
using var cancellationTokenSource = new CancellationTokenSource();
var activityFeature = new TestActivityFeature(new Activity("test"));

activityFeature.Activity.Start();
cancellationTokenSource.Cancel();

this.context.Features.Set<IHttpActivityFeature>(activityFeature);
this.context.RequestAborted = cancellationTokenSource.Token;
this.next = x => Task.FromCanceled(cancellationTokenSource.Token);

await new RequestCanceledMiddleware(
this.next,
new RequestCanceledMiddlewareOptions(),
new Mock<ILogger<RequestCanceledMiddleware>>().Object)
.InvokeAsync(this.context)
.ConfigureAwait(false);
.InvokeAsync(this.context)
.ConfigureAwait(false);

Assert.Single(Activity.Current!.Events);
Assert.Equal("Client cancelled the request.", Activity.Current!.Events.SingleOrDefault().Name);
Assert.Equal(RequestCanceledMiddlewareOptions.ClientClosedRequest, this.context.Response.StatusCode);

activityFeature.Activity.Dispose();
}

private class TestActivityFeature : IHttpActivityFeature
{
public TestActivityFeature(Activity activity) => this.Activity = activity;

public Activity Activity { get; set; }
}
}