public void RequestMessage_Uri_Determined_By_To_Header()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            innerRequest.RequestUri = new Uri("http://notThisUri.org");
            Message innerMessage = new HttpMessage(innerRequest);
            HttpRequestMessageProperty property = new HttpRequestMessageProperty();
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, property);
            innerMessage.Headers.To = new Uri("http://thisUri.org");

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;

            HttpRequestMessage request = message.ToHttpRequestMessage();
            Assert.AreEqual(new Uri("http://thisUri.org").ToString(), request.RequestUri.ToString(), "HttpRequestMessage.Uri should have been set to the 'To' header value of the inner RequestContext message.");
        }
        public void RequestMessage_Throws_If_HttpRequestMessageProperty_Not_Present()
        {
            Message innerMessage = Message.CreateMessage(MessageVersion.None, string.Empty);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);

            ExceptionAssert.Throws(
                typeof(InvalidOperationException),
                "HttpMessageEncodingRequestContext.RequestMessage should have thrown since there was no HttpRequestMessageProperty.",
                () =>
                {
                    Message message = requestContext.RequestMessage;
                });
        }
        public void RequestMessage_Throws_If_To_Header_Not_Present()
        {
            Message innerMessage = Message.CreateMessage(MessageVersion.None, string.Empty);
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);

            ExceptionAssert.Throws(
                typeof(InvalidOperationException),
                "HttpMessageEncodingRequestContext.RequestMessage should have thrown since there was no To header.",
                () =>
                {
                    Message message = requestContext.RequestMessage;
                });
        }
        public void RequestMessage_Returns_Same_HttpMessage_Sans_HttpRequestMessageProperty_Instance_When_Inner_Request_Is_HttpMessage()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            Message innerMessage = new HttpMessage(innerRequest);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;

            Assert.IsFalse(message.Properties.Keys.Contains(HttpResponseMessageProperty.Name), "The HttpMessage instance should not have had an HttpRequestMessageProperty.");
        }
        public void RequestMessage_Returns_Same_Instance_Everytime()
        {
            Message innerMessage = Message.CreateMessage(MessageVersion.None, string.Empty);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;
            Message message2 = requestContext.RequestMessage;

            Assert.AreSame(message, message2, "HttpMessageEncodingRequestContext.RequestMessage should have returned the same instance everytime.");
        }
        public void RequestMessage_Returns_Same_HttpContent_Instance_When_Inner_Request_Is_HttpMessage()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            innerRequest.Content = new ByteArrayContent(new byte[5] { 1, 2, 3, 4, 5 });
            Message innerMessage = new HttpMessage(innerRequest);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();

            Assert.AreSame(innerRequest.Content, request.Content, "The HttpRequestMessage.Content should not have been changed by the HttpMessageEncodingRequestContext.");
        }
        public void RequestMessage_Returns_Same_HttpMessage_Instance_When_Inner_Request_Is_HttpMessage()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            Message innerMessage = new HttpMessage(innerRequest);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();

            Assert.IsNotNull(message, "HttpMessageEncodingRequestContext.RequestMessage should not have returned null.");
            Assert.IsInstanceOfType(message, typeof(HttpMessage), "HttpMessageEncodingRequestContext.RequestMessage should not returned an HttpMessage instance.");
            Assert.AreSame(innerMessage, message, "HttpMessageEncodingRequestContext.RequestMessage should have returned the same instance as the inner context's RequestMessage.");
            Assert.IsNotNull(request, "ToHttpRequestMessage should have returned an HttpRequestMessage instance.");
            Assert.AreSame(innerRequest, request, "HttpMessageEncodingRequestContext.RequestMessage should have returned the same HttpRequestMessage instance as the inner context.");
        }
        public void RequestMessage_Returns_HttpMessage_With_HttpRequestHeaders_Only_From_The_HttpRequestMessageProperty()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            innerRequest.Content = new ByteArrayContent(new byte[] { 0, 1, 2, 3, 4 });
            innerRequest.Content.Headers.ContentType = new MediaTypeHeaderValue("notThisType/notThisSubType");
            Message innerMessage = new HttpMessage(innerRequest);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            HttpRequestMessageProperty property = new HttpRequestMessageProperty();
            property.Headers.Add(HttpRequestHeader.UserAgent, "SomeUserAgent");
            property.Headers.Add(HttpRequestHeader.ContentType, "someType/someSubType");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, property);

            MessageState originalState = innerMessage.State;

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();

            Assert.AreEqual(1, request.Headers.Count(), "HttpRequestMessage.Headers.Count should have been one.");
            Assert.AreEqual(1, request.Content.Headers.Count(), "Content.Headers.Count should have been one");
            Assert.AreEqual("SomeUserAgent", request.Headers.UserAgent.First().Product.ToString(), "The user agent header should have been 'SomeUserAgent'.");
            Assert.AreEqual("someType/someSubType", request.Content.Headers.ContentType.MediaType, "The content type header should have been 'someType/someSubType'.");
        }
        public void RequestMessage_Returns_HttpMessage_With_Only_To_Header()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            innerRequest.Content = new ByteArrayContent(new byte[] { 0, 1, 2, 3, 4 });
            Message innerMessage = new HttpMessage(innerRequest);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            HttpRequestMessageProperty property = new HttpRequestMessageProperty();
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, property);

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();

            Assert.AreEqual(1, message.Headers.Count, "HttpMessage.Headers.Count should have been 1.");
            Assert.AreEqual(new Uri("http://someHost.org/someService"), message.Headers.To, "HttpMessage.Headers.To should have been 'http://someHost.org/someService'.");
        }
        public void RequestMessage_Returns_HttpMessage_With_Empty_Content_When_Inner_Request_Is_Not_HttpMessage()
        {
            Message innerMessage = Message.CreateMessage(MessageVersion.None, string.Empty);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();

            Assert.IsNotNull(request.Content, "HttpRequestMessage.Content should not have been null.");
            Assert.AreEqual(0, request.Content.Headers.ContentLength, "HttpRequestMessage.Content length should have been zero.");
        }
        public void RequestMessage_Returns_HttpMessage_When_Inner_Request_Is_Not_HttpMessage()
        {
            Message innerMessage = Message.CreateMessage(MessageVersion.None, string.Empty);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();

            Assert.IsNotNull(message, "HttpMessageEncodingRequestContext.RequestMessage should not have returned null.");
            Assert.IsInstanceOfType(message, typeof(HttpMessage), "HttpMessageEncodingRequestContext.RequestMessage should not returned an HttpMessage instance.");
            Assert.IsNotNull(request, "ToHttpRequestMessage should have returned an HttpRequestMessage instance.");
        }
        public void RequestMessage_Returns_HttpMessage_In_Created_State_When_Inner_Request_Is_Not_HttpMessage()
        {
            Message innerMessage = Message.CreateMessage(MessageVersion.None, string.Empty);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;

            Assert.AreEqual(MessageState.Created, message.State, "HttpMessage.State should have been MessageState.Created.");
        }
        public void RequestMessage_Method_Determined_By_HttpRequestMessageProperty()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            innerRequest.Method = HttpMethod.Get;
            Message innerMessage = new HttpMessage(innerRequest);
            HttpRequestMessageProperty property = new HttpRequestMessageProperty();
            property.Method = "PUT";
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, property);
            innerMessage.Headers.To = new Uri("http://thisUri.org");

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;

            HttpRequestMessage request = message.ToHttpRequestMessage();
            Assert.AreEqual("PUT", request.Method.Method, "HttpRequestMessage.Method should have been set to the the value of the HttpRequestMessageProperty.Method.");
        }
        public void RequestMessage_Does_Not_Change_The_Message_State_When_Inner_Request_Is_HttpMessage()
        {
            HttpRequestMessage innerRequest = new HttpRequestMessage();
            Message innerMessage = new HttpMessage(innerRequest);
            innerMessage.Headers.To = new Uri("http://someHost.org/someService");
            innerMessage.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());

            MessageState originalState = innerMessage.State;

            MockRequestContext innerRequestContext = new MockRequestContext();
            innerRequestContext.SetRequestMessage(innerMessage);

            HttpMessageEncodingRequestContext requestContext = new HttpMessageEncodingRequestContext(innerRequestContext);
            Message message = requestContext.RequestMessage;

            Assert.AreEqual(originalState, message.State, "The state of the message should not have been changed by the HttpMessageEncodingRequestContext.");
        }