forked from aspnet/AspNetWebStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSuppressHostPrincipalMessageHandlerTest.cs
More file actions
162 lines (142 loc) · 6.07 KB
/
Copy pathSuppressHostPrincipalMessageHandlerTest.cs
File metadata and controls
162 lines (142 loc) · 6.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Net.Http;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
using Microsoft.TestCommon;
using Moq;
namespace System.Web.Http.Hosting
{
public class SuppressHostPrincipalMessageHandlerTest
{
[Fact]
public async Task SendAsync_DelegatesToInnerHandler()
{
// Arrange
HttpRequestMessage request = null;
var cancellationToken = default(CancellationToken);
HttpMessageHandler innerHandler = new LambdaHttpMessageHandler((r, c) =>
{
request = r;
cancellationToken = c;
return Task.FromResult<HttpResponseMessage>(null);
});
HttpMessageHandler handler = CreateProductUnderTest(innerHandler);
var expectedCancellationToken = new CancellationToken(true);
using (var expectedRequest = CreateRequestWithContext())
{
// Act
var result = await handler.SendAsync(expectedRequest, expectedCancellationToken);
// Assert
Assert.Same(expectedRequest, request);
Assert.Equal(expectedCancellationToken, cancellationToken);
Assert.Null(result);
}
}
[Fact]
public async Task SendAsync_Throws_WhenRequestContextIsNull()
{
// Arrange
HttpMessageHandler innerHandler = CreateDummyHandler();
HttpMessageHandler handler = CreateProductUnderTest(innerHandler);
using (HttpRequestMessage request = new HttpRequestMessage())
{
// Act & Assert
await Assert.ThrowsArgumentAsync(
() => handler.SendAsync(request, CancellationToken.None),
"request",
"The request must have a request context.");
}
}
[Fact]
public async Task SendAsync_SetsCurrentPrincipalToAnonymous_BeforeCallingInnerHandler()
{
// Arrange
var requestContextMock = new Mock<HttpRequestContext>(MockBehavior.Strict);
var sequence = new MockSequence();
var initialPrincipal = new GenericPrincipal(new GenericIdentity("generic user"), new[] { "generic role" });
IPrincipal requestContextPrincipal = null;
requestContextMock
.InSequence(sequence)
.SetupGet(c => c.Principal)
.Returns(initialPrincipal);
requestContextMock
.InSequence(sequence)
.SetupSet(c => c.Principal = It.IsAny<IPrincipal>())
.Callback<IPrincipal>(value => requestContextPrincipal = value);
// SendAsync also restores the old principal.
requestContextMock
.InSequence(sequence)
.SetupGet(c => c.Principal)
.Returns(requestContextPrincipal);
requestContextMock
.InSequence(sequence)
.SetupSet(c => c.Principal = initialPrincipal);
IPrincipal principalBeforeInnerHandler = null;
HttpMessageHandler inner = new LambdaHttpMessageHandler((ignore1, ignore2) =>
{
principalBeforeInnerHandler = requestContextPrincipal;
return Task.FromResult<HttpResponseMessage>(null);
});
HttpMessageHandler handler = CreateProductUnderTest(inner);
using (var request = new HttpRequestMessage())
{
request.SetRequestContext(requestContextMock.Object);
// Act
await handler.SendAsync(request, CancellationToken.None);
}
// Assert
Assert.Equal(requestContextPrincipal, principalBeforeInnerHandler);
Assert.NotNull(principalBeforeInnerHandler);
var identity = principalBeforeInnerHandler.Identity;
Assert.NotNull(identity);
Assert.False(identity.IsAuthenticated);
Assert.Null(identity.Name);
Assert.Null(identity.AuthenticationType);
}
private static HttpMessageHandler CreateDummyHandler()
{
return new DummyHttpMessageHandler();
}
private static SuppressHostPrincipalMessageHandler CreateProductUnderTest(HttpMessageHandler innerHandler)
{
SuppressHostPrincipalMessageHandler handler = new SuppressHostPrincipalMessageHandler();
handler.InnerHandler = innerHandler;
return handler;
}
private static HttpRequestMessage CreateRequestWithContext()
{
HttpRequestMessage request = new HttpRequestMessage();
request.SetRequestContext(new HttpRequestContext());
return request;
}
private class DummyHttpMessageHandler : HttpMessageHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
private class LambdaHttpMessageHandler : HttpMessageHandler
{
private readonly Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> _sendAsync;
public LambdaHttpMessageHandler(Func<HttpRequestMessage, CancellationToken,
Task<HttpResponseMessage>> sendAsync)
{
if (sendAsync == null)
{
throw new ArgumentNullException("sendAsync");
}
_sendAsync = sendAsync;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
return _sendAsync.Invoke(request, cancellationToken);
}
}
}
}