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
|
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Http.Tracing.Tracers
{
public class HttpActionDescriptorTracerTest
{
// This test verifies only one kind of filter is wrapped, proving
// the static FilterTracer.CreateFilterTracer was called from GetFilterPipeline.
// Deeper testing of FilterTracer.CreateFilterTracer is in FilterTracerTest.
[Fact]
public void GetFilterPipeline_Returns_Wrapped_Filters()
{
// Arrange
Mock<IFilter> mockFilter = new Mock<IFilter>();
FilterInfo filter = new FilterInfo(mockFilter.Object, FilterScope.Global);
Collection<FilterInfo> filterCollection = new Collection<FilterInfo>(new FilterInfo[] { filter });
Mock<HttpActionDescriptor> mockActionDescriptor = new Mock<HttpActionDescriptor>() { CallBase = true };
mockActionDescriptor.Setup(a => a.ActionName).Returns("test");
mockActionDescriptor.Setup(a => a.GetFilterPipeline()).Returns(filterCollection);
HttpControllerContext controllerContext = ContextUtil.CreateControllerContext();
controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "test", typeof(ApiController));
HttpActionDescriptorTracer tracer = new HttpActionDescriptorTracer(controllerContext, mockActionDescriptor.Object, new TestTraceWriter());
// Act
Collection<FilterInfo> wrappedFilterCollection = tracer.GetFilterPipeline();
// Assert
Assert.IsType<FilterTracer>(wrappedFilterCollection[0].Instance);
}
// This test verifies only one kind of filter is wrapped, proving
// the static FilterTracer.CreateFilterTracer was called from GetFilterPipeline.
// Deeper testing of FilterTracer.CreateFilterTracer is in FilterTracerTest.
[Fact]
public void GetFilters_Returns_Wrapped_IFilters()
{
// Arrange
Mock<IFilter> mockFilter = new Mock<IFilter>();
Collection<IFilter> filters = new Collection<IFilter>(new IFilter[] { mockFilter.Object });
Mock<HttpActionDescriptor> mockActionDescriptor = new Mock<HttpActionDescriptor>() { CallBase = true };
mockActionDescriptor.Setup(a => a.ActionName).Returns("test");
mockActionDescriptor.Setup(a => a.GetFilters()).Returns(filters);
HttpControllerContext controllerContext = ContextUtil.CreateControllerContext();
controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "test", typeof(ApiController));
HttpActionDescriptorTracer tracer = new HttpActionDescriptorTracer(controllerContext, mockActionDescriptor.Object, new TestTraceWriter());
// Act
IFilter[] wrappedFilters = tracer.GetFilters().ToArray();
// Assert
Assert.IsType<FilterTracer>(wrappedFilters[0]);
}
[Fact]
public void ExecuteAsync_Invokes_Inner_ExecuteAsync()
{
// Arrange
bool executeCalled = false;
Mock<HttpActionDescriptor> mockActionDescriptor = new Mock<HttpActionDescriptor>() { CallBase = true };
mockActionDescriptor.Setup(a => a.ActionName).Returns("test");
mockActionDescriptor.Setup(
a => a.ExecuteAsync(It.IsAny<HttpControllerContext>(), It.IsAny<IDictionary<string, object>>())).Callback(() => executeCalled = true);
HttpControllerContext controllerContext = ContextUtil.CreateControllerContext();
controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "test", typeof(ApiController));
IDictionary<string, object> arguments = new Dictionary<string, object>();
HttpActionDescriptorTracer tracer = new HttpActionDescriptorTracer(controllerContext, mockActionDescriptor.Object, new TestTraceWriter());
// Act
tracer.ExecuteAsync(controllerContext, arguments);
// Assert
Assert.True(executeCalled);
}
[Fact]
public void ExecuteAsync_Traces()
{
// Arrange
Mock<HttpActionDescriptor> mockActionDescriptor = new Mock<HttpActionDescriptor>() { CallBase = true };
mockActionDescriptor.Setup(a => a.ActionName).Returns("test");
mockActionDescriptor.Setup(a => a.ExecuteAsync(It.IsAny<HttpControllerContext>(), It.IsAny<IDictionary<string, object>>()))
.Returns(TaskHelpers.FromResult<object>(null));
HttpControllerContext controllerContext = ContextUtil.CreateControllerContext();
controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "test", typeof(ApiController));
IDictionary<string, object> arguments = new Dictionary<string, object>();
TestTraceWriter traceWriter = new TestTraceWriter();
HttpActionDescriptorTracer tracer = new HttpActionDescriptorTracer(controllerContext, mockActionDescriptor.Object, traceWriter);
TraceRecord[] expectedTraces = new TraceRecord[]
{
new TraceRecord(controllerContext.Request, TraceCategories.ActionCategory, TraceLevel.Info) { Kind = TraceKind.Begin, Operation = "ExecuteAsync" },
new TraceRecord(controllerContext.Request, TraceCategories.ActionCategory, TraceLevel.Info) { Kind = TraceKind.End }
};
// Act
var result = tracer.ExecuteAsync(controllerContext, arguments);
// Assert
result.WaitUntilCompleted();
Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
}
[Fact]
public void ExecuteAsync_Throws_What_Inner_Throws_And_Traces()
{
// Arrange
Mock<HttpActionDescriptor> mockActionDescriptor = new Mock<HttpActionDescriptor>() { CallBase = true };
InvalidOperationException exception = new InvalidOperationException("test");
mockActionDescriptor.Setup(
a => a.ExecuteAsync(It.IsAny<HttpControllerContext>(), It.IsAny<IDictionary<string, object>>())).Throws(exception);
mockActionDescriptor.Setup(a => a.ActionName).Returns("test");
HttpControllerContext controllerContext = ContextUtil.CreateControllerContext();
controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "test", typeof(ApiController));
IDictionary<string, object> arguments = new Dictionary<string, object>();
TestTraceWriter traceWriter = new TestTraceWriter();
HttpActionDescriptorTracer tracer = new HttpActionDescriptorTracer(controllerContext, mockActionDescriptor.Object, traceWriter);
TraceRecord[] expectedTraces = new TraceRecord[]
{
new TraceRecord(controllerContext.Request, TraceCategories.ActionCategory, TraceLevel.Info) { Kind = TraceKind.Begin },
new TraceRecord(controllerContext.Request, TraceCategories.ActionCategory, TraceLevel.Error) { Kind = TraceKind.End }
};
// Act & Assert
Assert.Throws<InvalidOperationException>(() => tracer.ExecuteAsync(controllerContext, arguments));
// Assert
Assert.Equal<TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer());
Assert.Same(exception, traceWriter.Traces[1].Exception);
}
}
}
|