public async Task AuthenticateAsync_Traces_ErrorResult()
        {
            // Arrange
            IHttpActionResult            result            = new AuthenticationFailureResult();
            CancellationToken            cancellationToken = CreateCancellationToken();
            Mock <IAuthenticationFilter> filterMock        = new Mock <IAuthenticationFilter>();

            filterMock
            .Setup(
                f =>
                f.AuthenticateAsync(
                    It.IsAny <HttpAuthenticationContext>(),
                    It.IsAny <CancellationToken>()
                    )
                )
            .Callback(
                (HttpAuthenticationContext context, CancellationToken token) =>
                context.ErrorResult = result
                )
            .Returns(Task.FromResult <object>(null));
            TraceRecord  record = null;
            ITraceWriter tracer = CreateTracer(
                (r) =>
            {
                record = r;
            }
                );
            IAuthenticationFilter product         = CreateProductUnderTest(filterMock.Object, tracer);
            const string          expectedMessage =
                "The authentication filter encountered an error. ErrorResult="
                + "'System.Web.Http.Tracing.Tracers.AuthenticationFilterTracerTests+AuthenticationFailureResult'.";

            using (HttpRequestMessage expectedRequest = CreateRequest())
            {
                HttpAuthenticationContext authenticationContext = CreateAuthenticationContext(
                    expectedRequest
                    );

                // Act
                await product.AuthenticateAsync(authenticationContext, cancellationToken);

                // Assert
                Assert.NotNull(record);
                Assert.Same(expectedRequest, record.Request);
                Assert.Same(TraceCategories.FiltersCategory, record.Category);
                Assert.Equal(TraceLevel.Info, record.Level);
                Assert.Equal(TraceKind.End, record.Kind);
                Assert.Equal(filterMock.Object.GetType().Name, record.Operator);
                Assert.Equal("AuthenticateAsync", record.Operation);
                Assert.Null(record.Exception);
                Assert.Equal(expectedMessage, record.Message);
            }
        }
        public void CreateAndCheckProperties()
        {
            var result = new AuthenticationFailureResult("my reason", new HttpRequestMessage(HttpMethod.Get, "http://localhost"));

            Assert.That(result, Is.Not.Null);
            Assert.That(result.ReasonPhrase, Is.Not.Null);
            Assert.That(result.ReasonPhrase, Is.EqualTo("my reason"));
            Assert.That(result.Request, Is.Not.Null);

            var response = result.ExecuteAsync(new CancellationToken()).Result;

            Assert.That(response, Is.Not.Null);
            Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized));
        }
        public void AuthenticateAsync_Traces_ErrorResult()
        {
            // Arrange
            IHttpActionResult result = new AuthenticationFailureResult();
            CancellationToken cancellationToken = CreateCancellationToken();
            Mock<IAuthenticationFilter> filterMock = new Mock<IAuthenticationFilter>();
            filterMock.Setup(f => f.AuthenticateAsync(It.IsAny<HttpAuthenticationContext>(),
                                                      It.IsAny<CancellationToken>()))
                .Callback((HttpAuthenticationContext context,
                           CancellationToken token) => context.ErrorResult = result)
                .Returns(Task.FromResult<object>(null));
            TraceRecord record = null;
            ITraceWriter tracer = CreateTracer((r) => { record = r; });
            IAuthenticationFilter product = CreateProductUnderTest(filterMock.Object, tracer);
            const string expectedMessage = "The authentication filter encountered an error. ErrorResult="
                + "'System.Web.Http.Tracing.Tracers.AuthenticationFilterTracerTests+AuthenticationFailureResult'.";

            using (HttpRequestMessage expectedRequest = CreateRequest())
            {
                HttpAuthenticationContext authenticationContext = CreateAuthenticationContext(expectedRequest);

                // Act
                Task task = product.AuthenticateAsync(authenticationContext, cancellationToken);

                // Assert
                Assert.NotNull(task);
                task.Wait();
                Assert.NotNull(record);
                Assert.Same(expectedRequest, record.Request);
                Assert.Same(TraceCategories.FiltersCategory, record.Category);
                Assert.Equal(TraceLevel.Info, record.Level);
                Assert.Equal(TraceKind.End, record.Kind);
                Assert.Equal(filterMock.Object.GetType().Name, record.Operator);
                Assert.Equal("AuthenticateAsync", record.Operation);
                Assert.Null(record.Exception);
                Assert.Equal(expectedMessage, record.Message);
            }
        }