public void HttpMessageEncoder_Is_Nested_Private_Class()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            Type type = encoder.GetType();
            Assert.IsTrue(type.IsNestedPrivate, "HttpMessageEncoder should be nested and private.");
            Assert.IsFalse(type.IsVisible, "HttpMessageEncoder should not be visible.");
            Assert.IsFalse(type.IsAbstract, "HttpMessageEncoder should not be abstract.");
            Assert.IsTrue(type.IsClass, "HttpMessageEncoder should be a class.");
        }
        public void IsContentTypeSupported_Throws()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            ExceptionAssert.ThrowsArgumentNull(
                "HttpMessageEncoder.IsContentTypeSupported should have throw because the content type parameter was null.",
                "contentType",
                () =>
                {
                    encoder.IsContentTypeSupported(null);
                });
        }
        public void WriteMessage_That_Takes_A_Stream_Writes_Nothing_If_Message_Content_Is_Null()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            HttpMessage message = new HttpMessage(response);

            using (MemoryStream stream = new MemoryStream())
            {
                encoder.WriteMessage(message, stream);
                stream.Flush();
                stream.Seek(0, SeekOrigin.Begin);
                Assert.AreEqual(0, stream.Length, "HttpMessageEncoder.WriteMessage should not have written anything to the stream since the content was null.");
            }
        }
        public void ReadMessage_Returns_HttpMessage_With_HttpContent_Null_Content_Type()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);

            HttpMessage message = encoder.ReadMessage(buffer, new MockBufferManager(), null) as HttpMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();
            Assert.IsNull(request.Content.Headers.ContentType, "HttpMessageEncoder.ReadMessage should have returned an HttpMessage with a null content type.");
        }
        public void WriteMessage_That_Takes_A_Stream_Writes_Message_Content_To_The_Stream()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            response.Content = new ByteArrayContent(bytes);
            HttpMessage message = new HttpMessage(response);

            using (MemoryStream stream = new MemoryStream())
            {
                encoder.WriteMessage(message, stream);
                stream.Flush();
                stream.Seek(0, SeekOrigin.Begin);
                byte[] writtenBytes = new byte[stream.Length];
                stream.Read(writtenBytes, 0, writtenBytes.Length);
                CollectionAssert.AreEquivalent(bytes, writtenBytes, "HttpMessageEncoder.WriteMessage should have written the content to the stream.");
            }
        }
        public void WriteMessage_Throws_If_The_Message_State_Is_Not_Created()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            response.Content = new ByteArrayContent(new byte[5] { 0, 1, 2, 3, 4 });
            HttpMessage message = new HttpMessage(response);
            message.Close();

            ExceptionAssert.Throws(
                typeof(InvalidOperationException),
                "HttpMessageEncoder.WriteMessage should have thrown since the message state was not MessageState.Created.",
                () =>
                    {
                        encoder.WriteMessage(message, 5, new MockBufferManager());
                    });
        }
 public void MessageVersion_Is_None()
 {
     HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
     MessageEncoder encoder = factory.Encoder;
     Assert.AreEqual(MessageVersion.None, encoder.MessageVersion, "HttpMessageEncoder.MessageVersion should have returned MessageVersion.None.");
 }
        public void WriteMessage_Throws_If_HttpMessage_IsRequest_Is_Not_False()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost");
            request.Content = new ByteArrayContent(new byte[5] { 0, 1, 2, 3, 4 });
            HttpMessage message = new HttpMessage(request);

            ExceptionAssert.Throws(
                typeof(InvalidOperationException),
                "HttpMessageEncoder.WriteMessage should have thrown since HttpMessage.IsRequest was not 'false'.",
                () =>
                {
                    encoder.WriteMessage(message, 5, new MockBufferManager());
                });
        }
        public void ReadMessage_Returns_HttpMessage_With_No_Headers()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);

            HttpMessage message = encoder.ReadMessage(buffer, new MockBufferManager(), "someType/someSubType") as HttpMessage;
            Assert.AreEqual(0, message.Headers.Count, "HttpMessageEncoder.ReadMessage should have returned an HttpMessage with no headers.");
        }
        public void ReadMessage_With_Stream_Throws_If_Stream_Parameter_Is_Null()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            ExceptionAssert.ThrowsArgumentNull(
                "HttpMessageEncoder.ReadMessage should have thrown since the stream parameter was null.",
                "stream",
                () =>
                {
                    encoder.ReadMessage(null, 5, "someContentType");
                });
        }
        public void WriteMessage_Returns_An_ArraySegment_With_Size_Of_Content_Byte_Count()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            response.Content = new ByteArrayContent(bytes);
            response.Content.LoadIntoBuffer();
            HttpMessage message = new HttpMessage(response);

            ArraySegment<byte> buffer = encoder.WriteMessage(message, int.MaxValue, new MockBufferManager());
            Assert.AreEqual(5, buffer.Count, "HttpMessageEncoder.WriteMessage should have returned an ArraySegment with the size limited by the HttpContent byte count.");
        }
        public void ReadMessage_With_Stream_Returns_HttpMessage()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            using (MemoryStream stream = new MemoryStream(bytes))
            {
                Message message = encoder.ReadMessage(stream, 5, "type/subType");
                Assert.IsNotNull(message, "HttpMessageEncoder.ReadMessage should not have returned null.");
                Assert.IsInstanceOfType(message, typeof(HttpMessage), "HttpMessageEncoder.ReadMessage should have returned an HttpMessage.");
            }
        }
        public void ReadMessage_With_Stream_Returns_HttpMessage_With_IsRequest_True()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            using (MemoryStream stream = new MemoryStream(bytes))
            {
                HttpMessage message = encoder.ReadMessage(stream, 5, "type/subType") as HttpMessage;
                Assert.IsTrue(message.IsRequest, "HttpMessageEncoder.ReadMessage should have returned an HttpMessage with IsRequest set to 'true'.");
            }
        }
        public void ReadMessage_With_Stream_Does_Not_Advance_The_Stream()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            using (MemoryStream stream = new MemoryStream(bytes))
            {
                HttpMessage message = encoder.ReadMessage(stream, 5, "type/subType") as HttpMessage;
                Assert.AreEqual(0, stream.Position, "HttpMessageEncoder.ReadMessage should not have advanced the stream parameter.");
            }
        }
        public void ReadMessage_Throws_If_The_BufferManager_Parameter_Is_Null()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);

            ExceptionAssert.ThrowsArgumentNull(
                "HttpMessageEncoder.ReadMessage should have thrown since the bufferManager parameter was null.",
                "bufferManager",
                () =>
                {
                    encoder.ReadMessage(buffer, null, "someContentType");
                });
        }
        public void ReadMessage_Returns_The_Buffer_To_The_Buffer_Manager()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);

            MockBufferManager bufferManager = new MockBufferManager();
            HttpMessage message = encoder.ReadMessage(buffer, bufferManager, "someType/someSubType") as HttpMessage;
            Assert.IsTrue(bufferManager.ReturnBufferCalled, "HttpMessageEncoder.ReadMessage should have returned the buffer to the buffer manager.");
            Assert.AreSame(bytes, bufferManager.BufferReturned, "HttpMessageEncoder.ReadMessage should have returned the original buffer instance to the buffer manager.");
        }
        public void WriteMessage_Throws_If_BufferManager_Parameter_Is_Null()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            response.Content = new ByteArrayContent(new byte[5] { 0, 1, 2, 3, 4 });
            HttpMessage message = new HttpMessage(response);

            ExceptionAssert.ThrowsArgumentNull(
                "HttpMessageEncoder.WriteMessage should have thrown since bufferManager parameter was null.",
                "bufferManager",
                () =>
                {
                    encoder.WriteMessage(message, 5, null);
                });
        }
        public void WriteMessage_Throws_If_MessageOffsert_Parameter_Is_Negative()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            response.Content = new ByteArrayContent(new byte[5] { 0, 1, 2, 3, 4 });
            HttpMessage message = new HttpMessage(response);

            ExceptionAssert.Throws(
                typeof(ArgumentOutOfRangeException),
                "HttpMessageEncoder.WriteMessage should have thrown since messageOffset parameter was negative.",
                () =>
                {
                    encoder.WriteMessage(message, 5, new MockBufferManager(), -1);
                });
        }
 public void IsContentTypeSupported_Is_True()
 {
     HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
     MessageEncoder encoder = factory.Encoder;
     Assert.IsTrue(encoder.IsContentTypeSupported("someContentType"), "HttpMessageEncoder.IsContentTypeSupported should have returned 'true'.");
 }
        public void WriteMessage_Throws_If_MessageOffset_Is_Greater_Than_MaxMessageSize()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            response.Content = new ByteArrayContent(new byte[5] { 0, 1, 2, 3, 4 });
            HttpMessage message = new HttpMessage(response);

            ExceptionAssert.Throws(
                typeof(ArgumentException),
                "HttpMessageEncoder.WriteMessage should have thrown since messageOffset was greater than the maxMessageSize.",
                () =>
                {
                    encoder.WriteMessage(message, 5, new MockBufferManager(), 6);
                });
        }
        public void WriteMessage_Throws_If_MaxMessageSize_Is_Exceeded()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            response.Content = new ByteArrayContent(bytes);
            response.Content.LoadIntoBuffer();
            HttpMessage message = new HttpMessage(response);

            ExceptionAssert.Throws(
                typeof(QuotaExceededException),
                "HttpMessageEncoder.WriteMessage should have thrown because the content byte count was greater than the maxMessageSize parameter.",
                () =>
                {
                    ArraySegment<byte> buffer2 = encoder.WriteMessage(message, 2, new MockBufferManager());
                });
        }
        public void ReadMessage_Returns_HttpMessage_With_IsRequest_True()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4};
            ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);

            HttpMessage message = encoder.ReadMessage(buffer, new MockBufferManager(), "someType/someSubType") as HttpMessage;
            Assert.IsTrue(message.IsRequest, "HttpMessageEncoder.ReadMessage should have returned an HttpMessage with IsRequest set to 'true'.");
        }
        public void WriteMessage_Returns_An_ArraySegment_With_The_Content_From_The_HttpMessage()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            response.Content = new ByteArrayContent(bytes);
            HttpMessage message = new HttpMessage(response);

            ArraySegment<byte> buffer = encoder.WriteMessage(message, int.MaxValue, new MockBufferManager());
            Assert.IsNotNull(buffer, "HttpMessageEncoder.WriteMessage should not have returned null.");
            CollectionAssert.AreEquivalent(bytes, buffer.Array, "HttpMessageEncoder.WriteMessage should have returned the content of the HttpMessage.");
        }
        public void WriteMessage_Returns_Empty_ArraySegment_If_HttpMessage_Content_Is_Null()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            HttpMessage message = new HttpMessage(response);

            ArraySegment<byte> buffer = encoder.WriteMessage(message, int.MaxValue, new MockBufferManager());
            Assert.AreEqual(0, buffer.Count, "HttpMessageEncoder.WriteMessage should have returned an empty ArraySegment.");
        }
        public void WriteMessage_Throws_If_Message_Parameter_Is_Null()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            ExceptionAssert.ThrowsArgumentNull(
                "HttpMessageEncoder.WriteMessage should have thrown since message parameter was null.",
                "message",
                () =>
                {
                    encoder.WriteMessage(null, 5, new MockBufferManager());
                });
        }
        public void WriteMessage_Takes_A_Buffer_From_The_BufferManager()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            HttpResponseMessage response = new HttpResponseMessage();
            response.Content = new ByteArrayContent(new byte[5] { 0, 1, 2, 3, 4 });
            HttpMessage message = new HttpMessage(response);

            MockBufferManager bufferManager = new MockBufferManager();
            ArraySegment<byte> buffer = encoder.WriteMessage(message, int.MaxValue, bufferManager);
            Assert.IsTrue(bufferManager.TakeBufferCalled, "HttpMessageEncoder.WriteMessage should have taken a buffer from the bufferManager.");
            Assert.AreSame(buffer.Array, bufferManager.BufferTaken, "HttpMessageEncoder.WriteMessage should have returned the array taken from the bufferManager.");
        }
 public void MediaType_Is_Empty_String()
 {
     HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
     MessageEncoder encoder = factory.Encoder;
     Assert.AreEqual(string.Empty, encoder.MediaType, "HttpMessageEncoder.MediaType should have returned an empty string.");
 }
        public void WriteMessage_That_Takes_A_Stream_Throws_If_The_Message_Parameter_Is_Null()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            using (MemoryStream stream = new MemoryStream())
            {
                ExceptionAssert.ThrowsArgumentNull(
                    "HttpMessageEncoder.WriteMessage should have thrown since message parameter was null.",
                    "message",
                    () =>
                    {
                        encoder.WriteMessage(null, stream);
                    });
            }
        }
        public void ReadMessage_Returns_HttpMessage()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4};
            ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);

            Message message = encoder.ReadMessage(buffer, new MockBufferManager(), "someType/someSubType");
            Assert.IsNotNull(message, "HttpMessageEncoder.ReadMessage should not have returned null.");
            Assert.IsInstanceOfType(message, typeof(HttpMessage), "HttpMessageEncoder.ReadMessage should have returned an HttpMessage.");
        }
        public void ReadMessage_Returns_HttpMessage_With_HttpContent_Given_By_ContentType_Parameter()
        {
            HttpMessageEncoderFactory factory = new HttpMessageEncoderFactory();
            MessageEncoder encoder = factory.Encoder;

            byte[] bytes = new byte[5] { 0, 1, 2, 3, 4 };
            ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);

            HttpMessage message = encoder.ReadMessage(buffer, new MockBufferManager(), "someType/someSubType") as HttpMessage;
            HttpRequestMessage request = message.ToHttpRequestMessage();
            Assert.AreEqual("someType/someSubType", request.Content.Headers.ContentType.MediaType, "HttpMessageEncoder.ReadMessage should have returned an HttpMessage with a content type of 'someType/someSubType'.");
        }