Example #1
0
        public async Task GetResponseMessage_returns_an_HttpResponseMessage_when_given_OnPremiseTargetResponse_is_null()
        {
            IHttpResponseMessageBuilder sut = new HttpResponseMessageBuilder();
            var onPremiseTargetRequest      = new OnPremiseTargetReponse
            {
                StatusCode  = HttpStatusCode.NotFound,
                Body        = new byte[] { 0, 0, 0, 0 },
                HttpHeaders = new Dictionary <string, string>
                {
                    { "Content-Length", "4" },
                    { "X-Foo", "X-Bar" }
                }
            };
            var link = new Link();
            HttpResponseMessage result;

            result = sut.BuildFrom(onPremiseTargetRequest, link);

            var content = await result.Content.ReadAsByteArrayAsync();

            result.StatusCode.Should().Be(HttpStatusCode.NotFound);
            content.LongLength.Should().Be(4L);
            result.Content.Headers.ContentLength.Should().Be(4L);
            result.Content.Headers.GetValues("X-Foo").Single().Should().Be("X-Bar");
        }
Example #2
0
        public void Trace_logs_exception()
        {
            var traceFileWriterMock  = new Mock <ITraceFileWriter>();
            var loggerMock           = new Mock <ILogger>();
            var traceConfigurationId = Guid.NewGuid();
            var clientRequest        = new OnPremiseConnectorRequest
            {
                HttpHeaders = new Dictionary <string, string>
                {
                    { "Content-Type", "text/plain" },
                    { "Content-Length", "700" }
                },
                Body = new byte[] { 65, 66, 67 }
            };
            var onPremiseTargetResponse = new OnPremiseTargetReponse
            {
                HttpHeaders = new Dictionary <string, string>
                {
                    { "Content-Type", "image/png" },
                    { "Content-Length", "7500" }
                },
                Body = new byte[] { 66, 67, 68 }
            };
            ITraceManager sut = new TraceManager(null, traceFileWriterMock.Object, null, new Configuration(), loggerMock.Object);

            var exception = new Exception();

            traceFileWriterMock.Setup(t => t.WriteContentFile(It.IsAny <string>(), clientRequest.Body)).Throws(exception);
            loggerMock.Setup(l => l.Warn(It.IsAny <string>(), exception));

            sut.Trace(clientRequest, onPremiseTargetResponse, traceConfigurationId);

            traceFileWriterMock.VerifyAll();
        }
Example #3
0
        public async Task Relay_delegates_information_and_returns_valid_httpResponseMessage_when_entered_a_valid_path()
        {
            var startTime  = DateTime.UtcNow;
            var loggerMock = new Mock <ILogger>();
            var backendCommunicationMock       = new Mock <IBackendCommunication>();
            var relayRepositoryMock            = new Mock <ILinkRepository>();
            var pathSplitterMock               = new Mock <IPathSplitter>();
            var clientRequestBuilderMock       = new Mock <IOnPremiseRequestBuilder>();
            var httpResponseMessageBuilderMock = new Mock <IHttpResponseMessageBuilder>();
            var requestLoggerMock              = new Mock <IRequestLogger>();
            var traceManagerMock               = new Mock <ITraceManager>();
            var sut = new ClientController(backendCommunicationMock.Object, loggerMock.Object, relayRepositoryMock.Object, requestLoggerMock.Object, httpResponseMessageBuilderMock.Object, clientRequestBuilderMock.Object, pathSplitterMock.Object, traceManagerMock.Object)
            {
                ControllerContext = new HttpControllerContext {
                    Request = new HttpRequestMessage {
                        Method = HttpMethod.Post
                    }
                },
                Request = new HttpRequestMessage()
            };
            HttpResponseMessage result;

            var linkFake = new Link {
                Id = Guid.Parse("fb35e2fb-5fb6-4475-baa0-e0b06f5fdeda")
            };
            var clientRequestFake = new OnPremiseConnectorRequest {
                RequestId = "239b6e03-9795-450d-bdd1-ab72900f1a98"
            };
            var onPremiseTargetReponseFake = new OnPremiseTargetReponse();
            var httpResponseMessageFake    = new HttpResponseMessage {
                StatusCode = HttpStatusCode.Found
            };
            var localConfigurationGuid = Guid.NewGuid();

            loggerMock.Setup(l => l.Trace(It.IsAny <string>));
            backendCommunicationMock.SetupGet(b => b.OriginId).Returns("c9208bdb-c195-460d-b84e-6c146bb252e5");
            relayRepositoryMock.Setup(l => l.GetLink(It.IsAny <string>())).Returns(linkFake);
            pathSplitterMock.Setup(p => p.Split(It.IsAny <string>())).Returns(new PathInformation {
                PathWithoutUserName = "******"
            });
            clientRequestBuilderMock.Setup(c => c.BuildFrom(sut.Request, "c9208bdb-c195-460d-b84e-6c146bb252e5", "Bar/Baz")).ReturnsAsync(clientRequestFake);
            backendCommunicationMock.Setup(b => b.SendOnPremiseConnectorRequest("fb35e2fb-5fb6-4475-baa0-e0b06f5fdeda", clientRequestFake)).Returns(Task.FromResult(0));
            backendCommunicationMock.Setup(b => b.GetResponseAsync("239b6e03-9795-450d-bdd1-ab72900f1a98")).ReturnsAsync(onPremiseTargetReponseFake);
            httpResponseMessageBuilderMock.Setup(h => h.BuildFrom(onPremiseTargetReponseFake, linkFake)).Returns(httpResponseMessageFake);
            traceManagerMock.Setup(t => t.GetCurrentTraceConfigurationId(linkFake.Id)).Returns(localConfigurationGuid);
            traceManagerMock.Setup(t => t.Trace(clientRequestFake, onPremiseTargetReponseFake, localConfigurationGuid));
            requestLoggerMock.Setup(r => r.LogRequest(clientRequestFake, onPremiseTargetReponseFake, HttpStatusCode.Found, Guid.Parse("fb35e2fb-5fb6-4475-baa0-e0b06f5fdeda"), "c9208bdb-c195-460d-b84e-6c146bb252e5", "Foo/Bar/Baz"));

            result = await sut.Relay("Foo/Bar/Baz");

            relayRepositoryMock.VerifyAll();
            pathSplitterMock.VerifyAll();
            backendCommunicationMock.VerifyAll();
            clientRequestBuilderMock.VerifyAll();
            httpResponseMessageBuilderMock.VerifyAll();
            requestLoggerMock.VerifyAll();
            traceManagerMock.VerifyAll();
            clientRequestFake.RequestFinished.Should().BeAfter(startTime).And.BeOnOrBefore(DateTime.UtcNow);
            result.Should().BeSameAs(httpResponseMessageFake);
        }
Example #4
0
        public void GetResponseContentForOnPremiseTargetResponse_does_not_disclose_content_when_InternalServerError_occurred_and_ForwardOnPremiseTargetErrorResponse_is_turned_off()
        {
            var sut = new HttpResponseMessageBuilder();
            var onPremiseTargetResponse = new OnPremiseTargetReponse {
                StatusCode = HttpStatusCode.InternalServerError
            };
            var         link = new Link();
            HttpContent result;

            result = sut.GetResponseContentForOnPremiseTargetResponse(onPremiseTargetResponse, link);

            result.Should().BeNull();
        }
Example #5
0
        public void Trace_uses_correct_file_names_build_from_Trace_ID_and_DateTime_ticks()
        {
            var traceFileWriterMock  = new Mock <ITraceFileWriter>();
            var loggerMock           = new Mock <ILogger>();
            var traceConfigurationId = Guid.NewGuid();
            var clientRequest        = new OnPremiseConnectorRequest
            {
                HttpHeaders = new Dictionary <string, string>
                {
                    { "Content-Type", "text/plain" },
                    { "Content-Length", "700" }
                },
                Body = new byte[] { 65, 66, 67 }
            };
            var onPremiseTargetResponse = new OnPremiseTargetReponse
            {
                HttpHeaders = new Dictionary <string, string>
                {
                    { "Content-Type", "image/png" },
                    { "Content-Length", "7500" }
                },
                Body = new byte[] { 66, 67, 68 }
            };
            string        clientRequestBodyFileName              = null;
            string        clientRequestHeadersFileName           = null;
            string        onPremiseTargetResponseBodyFileName    = null;
            string        onPremiseTargetResponseHeadersFileName = null;
            DateTime      startTime;
            ITraceManager sut = new TraceManager(null, traceFileWriterMock.Object, null, new Configuration(), loggerMock.Object);

            startTime = DateTime.Now;

            traceFileWriterMock.Setup(t => t.WriteContentFile(It.IsAny <string>(), clientRequest.Body)).Callback((string f, byte[] c) => clientRequestBodyFileName = f);
            traceFileWriterMock.Setup(t => t.WriteContentFile(It.IsAny <string>(), onPremiseTargetResponse.Body)).Callback((string f, byte[] c) => onPremiseTargetResponseBodyFileName            = f);;
            traceFileWriterMock.Setup(t => t.WriteHeaderFile(It.IsAny <string>(), clientRequest.HttpHeaders)).Callback((string f, IDictionary <string, string> c) => clientRequestHeadersFileName = f);;
            traceFileWriterMock.Setup(t => t.WriteHeaderFile(It.IsAny <string>(), onPremiseTargetResponse.HttpHeaders)).Callback((string f, IDictionary <string, string> c) => onPremiseTargetResponseHeadersFileName = f);;

            sut.Trace(clientRequest, onPremiseTargetResponse, traceConfigurationId);

            var ticks = new DateTime(long.Parse(clientRequestBodyFileName.Split('-').Skip(5).First().Split('.').First()));
            var expectedFileNamePrefix = Path.Combine("tracefiles", traceConfigurationId + "-" + ticks.Ticks);

            traceFileWriterMock.VerifyAll();
            ticks.Should().BeOnOrAfter(startTime).And.BeOnOrBefore(DateTime.Now);
            clientRequestBodyFileName.Should().Be(expectedFileNamePrefix + ".ct.content");
            onPremiseTargetResponseBodyFileName.Should().Be(expectedFileNamePrefix + ".optt.content");
            clientRequestHeadersFileName.Should().Be(expectedFileNamePrefix + ".ct.headers");
            onPremiseTargetResponseHeadersFileName.Should().Be(expectedFileNamePrefix + ".optt.headers");
        }
Example #6
0
        public async Task GetResponseContentForOnPremiseTargetResponse_sets_StatusCode_accordingly_and_discloses_content()
        {
            var sut = new HttpResponseMessageBuilder();
            var onPremiseTargetResponse = new OnPremiseTargetReponse {
                StatusCode = HttpStatusCode.OK, Body = new byte[] { 0, 0, 0, 0 }
            };
            var         link = new Link();
            HttpContent result;

            result = sut.GetResponseContentForOnPremiseTargetResponse(onPremiseTargetResponse, link);

            var body = await result.ReadAsByteArrayAsync();

            result.Should().NotBeNull();
            body.LongLength.Should().Be(4L);
        }
Example #7
0
        public void GetOnPremiseTargetInformation_returns_date_values_from_OnPremiseTargetResult_when_content_is_null()
        {
            var onPremiseTargetResponse = new OnPremiseTargetReponse
            {
                RequestStarted  = new DateTime(2014, 1, 1),
                RequestFinished = new DateTime(2014, 1, 2)
            };
            var sut = new RequestLogger(null, null);

            RequestLogger.OnPremiseTargetInformation result;

            result = sut.GetOnPremiseTargetInformation(onPremiseTargetResponse);

            result.ContentBytesOut.Should().Be(0L);
            result.OnPremiseTargetInDate.Should().Be(new DateTime(2014, 1, 1));
            result.OnPremiseTargetOutDate.Should().Be(new DateTime(2014, 1, 2));
        }
Example #8
0
        public async Task GetResponseContentForOnPremiseTargetResponse_discloses_content_when_InternalServerError_occurred_and_ForwardOnPremiseTargetErrorResponse_is_turned_on()
        {
            var sut = new HttpResponseMessageBuilder();
            var onPremiseTargetResponse = new OnPremiseTargetReponse {
                StatusCode = HttpStatusCode.InternalServerError, Body = new byte[] { 0, 0, 0 }
            };
            var link = new Link {
                ForwardOnPremiseTargetErrorResponse = true
            };
            HttpContent result;

            result = sut.GetResponseContentForOnPremiseTargetResponse(onPremiseTargetResponse, link);

            var body = await result.ReadAsByteArrayAsync();

            result.Should().NotBeNull();
            body.LongLength.Should().Be(3L);
        }
Example #9
0
        public void Trace_creates_tracefiles_directory()
        {
            var traceFileWriterMock  = new Mock <ITraceFileWriter>();
            var loggerMock           = new Mock <ILogger>();
            var traceConfigurationId = Guid.NewGuid();
            var clientRequest        = new OnPremiseConnectorRequest
            {
                HttpHeaders = new Dictionary <string, string>
                {
                    { "Content-Type", "text/plain" },
                    { "Content-Length", "700" }
                },
                Body = new byte[] { 65, 66, 67 }
            };
            var onPremiseTargetResponse = new OnPremiseTargetReponse
            {
                HttpHeaders = new Dictionary <string, string>
                {
                    { "Content-Type", "image/png" },
                    { "Content-Length", "7500" }
                },
                Body = new byte[] { 66, 67, 68 }
            };
            ITraceManager sut = new TraceManager(null, traceFileWriterMock.Object, null, new Configuration(), loggerMock.Object);

            Directory.CreateDirectory("tracefiles");
            Directory.Delete("tracefiles");

            traceFileWriterMock.Setup(t => t.WriteContentFile(It.IsAny <string>(), clientRequest.Body));
            traceFileWriterMock.Setup(t => t.WriteContentFile(It.IsAny <string>(), onPremiseTargetResponse.Body));
            traceFileWriterMock.Setup(t => t.WriteHeaderFile(It.IsAny <string>(), clientRequest.HttpHeaders));
            traceFileWriterMock.Setup(t => t.WriteHeaderFile(It.IsAny <string>(), onPremiseTargetResponse.HttpHeaders));

            sut.Trace(clientRequest, onPremiseTargetResponse, traceConfigurationId);

            traceFileWriterMock.VerifyAll();
            Directory.Exists("tracefiles").Should().BeTrue();

            Directory.Delete("tracefiles");
        }
Example #10
0
        public void LogRequest_writes_correctly_composed_log_entry_to_the_RelayRepository_with_OnPremiseTargetResult_set()
        {
            var            logRepositoryMock = new Mock <ILogRepository>();
            var            pathSplitterMock  = new Mock <IPathSplitter>();
            IRequestLogger sut           = new RequestLogger(logRepositoryMock.Object, pathSplitterMock.Object);
            var            clientRequest = new OnPremiseConnectorRequest
            {
                Body            = new byte[] { 0, 0, 0 },
                RequestStarted  = new DateTime(2014, 1, 1),
                RequestFinished = new DateTime(2014, 1, 2)
            };
            var onPremiseTargetResponse = new OnPremiseTargetReponse
            {
                RequestStarted  = new DateTime(2014, 1, 3),
                RequestFinished = new DateTime(2014, 1, 4),
                Body            = new byte[] { 0, 0 }
            };
            RequestLogEntry result = null;

            logRepositoryMock.Setup(r => r.LogRequest(It.IsAny <RequestLogEntry>())).Callback <RequestLogEntry>(r => result = r);
            pathSplitterMock.Setup(p => p.Split(It.IsAny <string>())).Returns(new PathInformation {
                OnPremiseTargetKey = "that", LocalUrl = "/file.html"
            });

            sut.LogRequest(clientRequest, onPremiseTargetResponse, HttpStatusCode.PaymentRequired, Guid.Parse("4bb4ff98-ba03-49ee-bd83-5a229f63fade"), "35eff886-2d7c-4265-a6a4-f3f471ab93e8", "gimme/that/file.html");

            logRepositoryMock.Verify(r => r.LogRequest(It.IsAny <RequestLogEntry>()));
            result.HttpStatusCode.Should().Be(HttpStatusCode.PaymentRequired);
            result.OriginId.Should().Be(Guid.Parse("35eff886-2d7c-4265-a6a4-f3f471ab93e8"));
            result.LocalUrl.Should().Be("/file.html");
            result.OnPremiseTargetKey.Should().Be("that");
            result.OnPremiseConnectorInDate.Should().Be(new DateTime(2014, 1, 1));
            result.OnPremiseConnectorOutDate.Should().Be(new DateTime(2014, 1, 2));
            result.OnPremiseTargetInDate.Should().Be(new DateTime(2014, 1, 3));
            result.OnPremiseTargetOutDate.Should().Be(new DateTime(2014, 1, 4));
            result.ContentBytesIn.Should().Be(3L);
            result.ContentBytesOut.Should().Be(2L);
            result.LinkId.Should().Be(Guid.Parse("4bb4ff98-ba03-49ee-bd83-5a229f63fade"));
        }