forked from aspnet/AspNetWebStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttpControllerDescriptorTracerTest.cs
More file actions
185 lines (153 loc) · 8.17 KB
/
Copy pathHttpControllerDescriptorTracerTest.cs
File metadata and controls
185 lines (153 loc) · 8.17 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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// 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.Collections.Concurrent;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Services;
using Microsoft.TestCommon;
using Moq;
namespace System.Web.Http.Tracing.Tracers
{
public class HttpControllerDescriptorTracerTest
{
private static readonly HttpControllerContext _controllerContext = ContextUtil.CreateControllerContext(instance: _controller);
private static readonly HttpRequestMessage _request = _controllerContext.Request;
private static readonly IHttpController _controller = new Mock<IHttpController>().Object;
private static readonly InvalidOperationException _exception = new InvalidOperationException("test");
[Fact]
public void Properties_Calls_Inner()
{
// Arrange
ConcurrentDictionary<object, object> properties = new ConcurrentDictionary<object, object>();
Mock<HttpControllerDescriptor> mockControllerDescriptor = new Mock<HttpControllerDescriptor>();
mockControllerDescriptor.Setup(d => d.Properties).Returns(properties).Verifiable();
HttpControllerDescriptorTracer tracer = GetHttpControllerDescriptorTracer(mockControllerDescriptor.Object, new TestTraceWriter());
// Act and Assert
Assert.Same(properties, tracer.Properties);
mockControllerDescriptor.Verify();
}
[Fact]
public void CreateController_Invokes_Inner_And_Traces()
{
// Arrange
Mock<HttpControllerDescriptor> mockControllerDescriptor = CreateMockControllerDescriptor();
mockControllerDescriptor.Setup(b => b.CreateController(It.IsAny<HttpRequestMessage>())).Returns(_controller);
TestTraceWriter traceWriter = new TestTraceWriter();
HttpControllerDescriptorTracer tracer = GetHttpControllerDescriptorTracer(mockControllerDescriptor.Object, traceWriter);
TraceRecord[] expectedTraces = new TraceRecord[]
{
new TraceRecord(_request, TraceCategories.ControllersCategory, TraceLevel.Info) { Kind = TraceKind.Begin, Operation = "CreateController" },
new TraceRecord(_request, TraceCategories.ControllersCategory, TraceLevel.Info) { Kind = TraceKind.End, Operation = "CreateController" }
};
// Act
IHttpController controller = tracer.CreateController(_request);
// Assert
Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
Assert.IsAssignableFrom<HttpControllerTracer>(controller);
}
[Fact]
public void CreateController_Throws_And_Traces_When_Inner_Throws()
{
// Arrange
Mock<HttpControllerDescriptor> mockControllerDescriptor = CreateMockControllerDescriptor();
mockControllerDescriptor.Setup(b => b.CreateController(It.IsAny<HttpRequestMessage>())).Throws(_exception);
TestTraceWriter traceWriter = new TestTraceWriter();
HttpControllerDescriptorTracer tracer = GetHttpControllerDescriptorTracer(mockControllerDescriptor.Object, traceWriter);
TraceRecord[] expectedTraces = new TraceRecord[]
{
new TraceRecord(_request, TraceCategories.ControllersCategory, TraceLevel.Info) { Kind = TraceKind.Begin, Operation = "CreateController" },
new TraceRecord(_request, TraceCategories.ControllersCategory, TraceLevel.Error) { Kind = TraceKind.End, Operation = "CreateController" }
};
// Act
Exception thrown = Assert.Throws<InvalidOperationException>(() => tracer.CreateController(_request));
// Assert
Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
Assert.Same(_exception, thrown);
Assert.Same(_exception, traceWriter.Traces[1].Exception);
}
[Fact]
public void Inner_Property_On_HttpControllerDescriptorTracer_Returns_HttpControllerDescriptor()
{
// Arrange
HttpControllerDescriptor expectedInner = BuildHttpControllerDescriptor(_controller);
HttpControllerDescriptorTracer productUnderTest = new HttpControllerDescriptorTracer(expectedInner, new TestTraceWriter());
// Act
HttpControllerDescriptor actualInner = productUnderTest.Inner;
// Assert
Assert.Same(expectedInner, actualInner);
}
[Fact]
public void Decorator_GetInner_On_HttpControllerDescriptorTracer_Returns_HttpControllerDescriptor()
{
// Arrange
HttpControllerDescriptor expectedInner = BuildHttpControllerDescriptor(_controller);
HttpControllerDescriptorTracer productUnderTest = new HttpControllerDescriptorTracer(expectedInner, new TestTraceWriter());
// Act
HttpControllerDescriptor actualInner = Decorator.GetInner(productUnderTest as HttpControllerDescriptor);
// Assert
Assert.Same(expectedInner, actualInner);
}
[Fact]
public void Decorator_DoesNotCauseControllerInitializationToHappenAgainAndAgain()
{
// Arrange
int raisedCount = 0;
RaiseWhenInitializedAttribute.Initialized += delegate { ++raisedCount; };
var descriptor = new HttpControllerDescriptor(new HttpConfiguration(), "my", typeof(MyController));
Assert.Equal(1, raisedCount);
// Act
new HttpControllerDescriptorTracer(descriptor, new TestTraceWriter());
new HttpControllerDescriptorTracer(descriptor, new TestTraceWriter());
new HttpControllerDescriptorTracer(descriptor, new TestTraceWriter());
// Assert
Assert.Equal(1, raisedCount);
}
private static HttpControllerDescriptor BuildHttpControllerDescriptor(IHttpController controller, string controllerName = "AnyController", HttpConfiguration httpConfiguration = null)
{
HttpControllerDescriptor expectedInner = new Mock<HttpControllerDescriptor>().Object;
expectedInner.ControllerName = controllerName;
expectedInner.ControllerType = controller.GetType();
expectedInner.Configuration = httpConfiguration ?? new HttpConfiguration();
return expectedInner;
}
private static HttpControllerDescriptorTracer GetHttpControllerDescriptorTracer(HttpControllerDescriptor controllerDescriptor, ITraceWriter traceWriter)
{
if (controllerDescriptor.Configuration == null)
{
controllerDescriptor.Configuration = new HttpConfiguration();
}
if (controllerDescriptor.ControllerName == null)
{
controllerDescriptor.ControllerName = "AnyController";
}
if (controllerDescriptor.ControllerType == null)
{
controllerDescriptor.ControllerType = _controller.GetType();
}
return new HttpControllerDescriptorTracer(
innerDescriptor: controllerDescriptor,
traceWriter: traceWriter);
}
private static Mock<HttpControllerDescriptor> CreateMockControllerDescriptor()
{
Mock<HttpControllerDescriptor> mockControllerDescriptor = new Mock<HttpControllerDescriptor>(_controllerContext.Configuration, "AnyController", _controller.GetType());
return mockControllerDescriptor;
}
private class RaiseWhenInitializedAttribute : Attribute, IControllerConfiguration
{
public static event EventHandler Initialized;
public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
{
Initialized(this, EventArgs.Empty);
}
}
[RaiseWhenInitialized]
private class MyController : ApiController
{
public string Foo()
{
return "bar";
}
}
}
}