Esempio n. 1
0
        public void BasicInfoLogger_LogBasicInfo_WritesErrorPostRequestDetails()
        {
            // Arrange
            Mock <ILogger>    loggerMock    = CreateFor(LogLevel.Trace);
            Mock <IStopwatch> stopwatchMock = new();

            stopwatchMock.SetupGet(stopwatch => stopwatch.Elapsed).Returns(TimeSpan.FromSeconds(3));

            HttpContext context = new FakeHttpContextBuilder()
                                  .SetMethod(HttpMethod.Post)
                                  .SetScheme(HttpScheme.Http)
                                  .SetHost(new("example.com"))
                                  .SetPathBase("/primary")
                                  .SetPath("/secondary")
                                  .SetQuery(new() { { "cats", "1" } })
                                  .SetStatus(HttpStatusCode.InternalServerError)
                                  .Create();

            var             request  = RequestDetails.From(context.Request);
            var             response = ResponseDetails.From(context.Response, stopwatchMock.Object);
            BasicInfoLogger sut      = new();

            // Act
            sut.LogBasicInfo(loggerMock.Object, request, response);

            // Assert
            loggerMock.VerifyLogging(
                "POST http://example.com/primary/secondary?cats=1 at 00:00:03:000 with 500 InternalServerError",
                LogLevel.Information);
        }
        public async Task RequestLogger_LogRequest_TraceWritesStatusAndHeadersAndBody()
        {
            // Arrange
            Mock <ILogger> loggerMock = CreateFor(LogLevel.Trace);
            HttpContext    context    = new FakeHttpContextBuilder()
                                        .SetResponseBody("conflict response content")
                                        .SetResponseHeaders(new() { { "foo", new(new[] { "bar", "baz" }) } })
                                        .SetStatus(HttpStatusCode.Conflict)
                                        .Create();
            Mock <IStopwatch> stopwatchMock = new();
            var            request          = RequestDetails.From(context.Request);
            var            response         = ResponseDetails.From(context.Response, stopwatchMock.Object);
            ResponseLogger sut = new(new(null), new(null));

            // Act
            await sut.LogResponse(loggerMock.Object, request, response);

            // Assert
            loggerMock.VerifyLogging(
                $"HTTP/1.1 409 Conflict{Environment.NewLine}" +
                $"foo: bar,baz{Environment.NewLine}" +
                $"{Environment.NewLine}" +
                $"conflict response content{Environment.NewLine}",
                LogLevel.Trace);
        }
Esempio n. 3
0
        public void BasicInfoLogger_LogBasicInfo_WritesSuccessfulPostRequestDetails()
        {
            // Arrange
            Mock <ILogger>    loggerMock    = CreateFor(LogLevel.Trace);
            Mock <IStopwatch> stopwatchMock = new();

            stopwatchMock.SetupGet(stopwatch => stopwatch.Elapsed).Returns(TimeSpan.FromSeconds(2));

            HttpContext context = new FakeHttpContextBuilder()
                                  .SetRequest(
                HttpMethod.Post,
                HttpScheme.Https,
                new() { { "cat", "221" } })
                                  .Create();

            var             request  = RequestDetails.From(context.Request);
            var             response = ResponseDetails.From(context.Response, stopwatchMock.Object);
            BasicInfoLogger sut      = new();

            // Act
            sut.LogBasicInfo(loggerMock.Object, request, response);

            // Assert
            loggerMock.VerifyLogging(
                "POST https://localhost/master/slave?cat=221 at 00:00:02:000 with 200 OK",
                LogLevel.Information);
        }
        public async Task RequestLogger_LogRequest_DebugWritesOnlyStatusAndHeaders()
        {
            // Arrange
            Mock <ILogger> loggerMock = CreateFor(LogLevel.Debug);
            HttpContext    context    = new FakeHttpContextBuilder()
                                        .SetResponseHeaders(new() { { "foo", new(new[] { "bar", "baz" }) } })
                                        .Create();
            Mock <IStopwatch> stopwatchMock = new();
            var            request          = RequestDetails.From(context.Request);
            var            response         = ResponseDetails.From(context.Response, stopwatchMock.Object);
            ResponseLogger sut = new(new(null), new(null));

            // Act
            await sut.LogResponse(loggerMock.Object, request, response);

            // Assert
            loggerMock.VerifyLogging(
                $"HTTP/1.1 200 OK{Environment.NewLine}" +
                $"foo: bar,baz{Environment.NewLine}",
                LogLevel.Debug);
        }
        public async Task RequestLogger_LogRequest_AppliesContentMiddleware()
        {
            // Arrange
            Mock <ILogger> loggerMock = CreateFor(LogLevel.Trace);
            Mock <IRequestContentLogMiddleware> contentMiddleware = new();
            var contentMiddlewares = new List <IRequestContentLogMiddleware> {
                contentMiddleware.Object
            };
            HttpContext context = new FakeHttpContextBuilder()
                                  .SetResponseBody("response")
                                  .SetResponseContentType("text/plain")
                                  .Create();
            Mock <IStopwatch> stopwatchMock = new();
            var request  = RequestDetails.From(context.Request);
            var response = ResponseDetails.From(context.Response, stopwatchMock.Object);
            LogContentFactory contentFactory  = new(contentMiddlewares);
            Stream            modifiedContent = new MemoryStream(Encoding.UTF8.GetBytes("*modified*"));
            ResponseLogger    sut             = new(contentFactory, new(null));

            // Mock
            contentMiddleware
            .SetupGet(middleware => middleware.ContentType)
            .Returns("text/plain");

            contentMiddleware
            .Setup(middleware => middleware.Modify(It.IsAny <Stream>(), It.IsAny <Stream>()))
            .Callback <Stream, Stream>((input, output) => modifiedContent.CopyTo(output));

            // Act
            await sut.LogResponse(loggerMock.Object, request, response);

            // Assert
            loggerMock.VerifyLogging(
                $"HTTP/1.1 200 OK{Environment.NewLine}" +
                $"Content-Type: text/plain{Environment.NewLine}" +
                $"{Environment.NewLine}" +
                $"*modified*{Environment.NewLine}",
                LogLevel.Trace);
        }
        public async Task ResponseLogger_LogResponse_WritesLogIfLevelIsSufficient(LogLevel level)
        {
            // Arrange
            Mock <ILogger>    loggerMock    = CreateFor(level);
            HttpContext       context       = new FakeHttpContextBuilder().Create();
            Mock <IStopwatch> stopwatchMock = new();
            var            request          = RequestDetails.From(context.Request);
            var            response         = ResponseDetails.From(context.Response, stopwatchMock.Object);
            ResponseLogger sut = new(new(null), new(null));

            // Act
            await sut.LogResponse(loggerMock.Object, request, response);

            // Assert
            loggerMock.Verify(
                logger => logger.Log(
                    It.IsAny <LogLevel>(),
                    It.IsAny <EventId>(),
                    It.Is <It.IsAnyType>((v, t) => true),
                    It.IsAny <Exception>(),
                    It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)),
                Times.Once);
        }
Esempio n. 7
0
        public void BasicInfoLogger_LogBasicInfo_DoesNotWritesLogIfLevelIsNotSufficient(LogLevel level)
        {
            // Arrange
            Mock <ILogger>    loggerMock    = CreateFor(level);
            Mock <IStopwatch> stopwatchMock = new();
            HttpContext       context       = new FakeHttpContextBuilder().Create();
            var             request         = RequestDetails.From(context.Request);
            var             response        = ResponseDetails.From(context.Response, stopwatchMock.Object);
            BasicInfoLogger sut             = new();

            // Act
            sut.LogBasicInfo(loggerMock.Object, request, response);

            // Assert
            loggerMock.Verify(
                logger => logger.Log(
                    level,
                    It.IsAny <EventId>(),
                    It.Is <It.IsAnyType>((v, t) => true),
                    It.IsAny <Exception>(),
                    It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)),
                Times.Never());
        }