Skip to content

Commit f669f0c

Browse files
committed
test: Add test case for IncludeFailureMessage in Response handling
1 parent 25f178c commit f669f0c

5 files changed

Lines changed: 54 additions & 6 deletions

File tree

src/LocalPortFiltering.AspNetCore/LocalPortFiltering.AspNetCore.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,8 @@
3333
<None Include="..\..\LICENSE" Pack="true" PackagePath=""/>
3434
</ItemGroup>
3535

36+
<ItemGroup>
37+
<InternalsVisibleTo Include="LocalPortFiltering.AspNetCore.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f5f2a2ae57a4ea4e4d38024fcb6522b42690b4354163433d56f4037839e752e66fbe6ebf7b44d7e9b52e53f8e463b5d92225805e77dbd9632d627908bcac7d2bb1827db14242de07271e3423346a467336840c0593c8a9c79826d767d34185830c6a0ba925f9f79799dcbe1d9c4b25d93679e22199bf0f00052a4ca9758b6dc7" />
38+
</ItemGroup>
39+
3640
</Project>

src/LocalPortFiltering.AspNetCore/LocalPortFilteringMiddleware.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace LocalPortFiltering.AspNetCore;
1111
public class LocalPortFilteringMiddleware
1212
{
1313
// Matches Http.Sys.
14-
private static readonly byte[] DefaultResponse = Encoding.ASCII.GetBytes(
14+
internal static readonly byte[] DefaultResponse = Encoding.ASCII.GetBytes(
1515
"{\"message\":\"Access to the requested port is not allowed.\"}"
1616
);
1717

@@ -69,5 +69,4 @@ private Task HostValidationFailed(HttpContext context)
6969
}
7070
return Task.CompletedTask;
7171
}
72-
7372
}

test/LocalPortFiltering.AspNetCore.Tests/LocalPortFiltering.AspNetCore.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
<IsPackable>false</IsPackable>
99
<IsTestProject>true</IsTestProject>
10+
11+
<SignAssembly>true</SignAssembly>
12+
<AssemblyOriginatorKeyFile>..\..\src\LocalPortFiltering.AspNetCore\opensource.snk</AssemblyOriginatorKeyFile>
1013
</PropertyGroup>
1114

1215
<ItemGroup>

test/LocalPortFiltering.AspNetCore.Tests/LocalPortFilteringConventionBuilderExtensionsTests.cs renamed to test/LocalPortFiltering.AspNetCore.Tests/LocalPortFilteringEndpointConventionBuilderExtensionsTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
using Microsoft.AspNetCore.Http;
33

44
namespace LocalPortFiltering.AspNetCore.Tests;
5-
public class LocalPortFilteringConventionBuilderExtensionsTests
5+
public class LocalPortFilteringEndpointConventionBuilderExtensionsTests
66
{
77
[Fact]
8-
public void RequireLocalPort_AllowPort_MetadataAdded()
8+
public void RequireLocalPort_AllowPorts_MetadataAdded()
99
{
1010
// Arrange
1111
var testConventionBuilder = new TestEndpointConventionBuilder();

test/LocalPortFiltering.AspNetCore.Tests/LocalPortFilteringMiddlewareTests.cs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace LocalPortFiltering.AspNetCore.Tests;
1313
public class LocalPortFilteringMiddlewareTests
1414
{
1515
[Fact]
16-
public async Task TestLocalPortFiltering_DefaultBehavior()
16+
public async Task LocalPortFiltering_DefaultBehavior()
1717
{
1818
// Arrange
1919
using var host = new HostBuilder()
@@ -48,7 +48,7 @@ public async Task TestLocalPortFiltering_DefaultBehavior()
4848
[InlineData(403, 4000, new int[] { 3000, 3001 })]
4949
[InlineData(200, 1005, new int[] { 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010 })]
5050
[InlineData(403, 1500, new int[] { 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010 })]
51-
public async Task TestLocalPortFiltering_RejectsBlockedPort(int status, int localPort, int[] allowPort)
51+
public async Task LocalPortFiltering_RejectsBlockedPort(int status, int localPort, int[] allowPort)
5252
{
5353
// Arrange
5454
var options = new LocalPortFilteringOptions();
@@ -68,4 +68,46 @@ public async Task TestLocalPortFiltering_RejectsBlockedPort(int status, int loca
6868
// Assert
6969
Assert.Equal(status, (int)httpContext.Response.StatusCode);
7070
}
71+
72+
[Theory]
73+
[InlineData(true)]
74+
[InlineData(false)]
75+
public async Task LocalPortFiltering_Response(bool includeFailureMessage)
76+
{
77+
// Arrange
78+
var options = new LocalPortFilteringOptions()
79+
{
80+
IncludeFailureMessage = includeFailureMessage
81+
};
82+
var optionsMonitor = new Mock<IOptionsMonitor<LocalPortFilteringOptions>>();
83+
optionsMonitor.Setup(o => o.CurrentValue)
84+
.Returns(options)
85+
.Verifiable();
86+
var middleware = new LocalPortFilteringMiddleware(Mock.Of<RequestDelegate>(), optionsMonitor.Object);
87+
88+
var httpContext = new DefaultHttpContext();
89+
httpContext.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new LocalPortFilteringAttribute(80)), "Test endpoint"));
90+
httpContext.Connection.LocalPort = 443;
91+
using var responseBody = new MemoryStream();
92+
httpContext.Response.Body = responseBody;
93+
94+
// Act
95+
await middleware.Invoke(httpContext);
96+
responseBody.Seek(0, SeekOrigin.Begin);
97+
var responseContent = responseBody.ToArray();
98+
99+
// Assert
100+
Assert.Equal(403, httpContext.Response.StatusCode);
101+
if (includeFailureMessage)
102+
{
103+
Assert.Equal(LocalPortFilteringMiddleware.DefaultResponse.Length, httpContext.Response.ContentLength);
104+
Assert.Equal("application/json", httpContext.Response.ContentType);
105+
Assert.Equal(LocalPortFilteringMiddleware.DefaultResponse, responseContent);
106+
}
107+
else
108+
{
109+
Assert.Null(httpContext.Response.ContentLength);
110+
Assert.Empty(responseContent);
111+
}
112+
}
71113
}

0 commit comments

Comments
 (0)