예제 #1
0
        public void WriteMessage_ShouldWriteTopic()
        {
            //TODO: Test topic with non UTF8 characters

            // Arrange
            var writer  = new MessageReaderWriter();
            var message = new Message
            {
                Topic = "foo"
            };
            var buffer = new ArrayBufferWriter <byte>();

            // Act
            writer.WriteMessage(message, buffer);

            // Assert
            var lengthBytes = buffer.WrittenSpan.Slice(IdBytesCount + MessageTypeBytesCount, LengthBytesCount);
            var length      = BinaryPrimitives.ReadInt32LittleEndian(lengthBytes);

            Assert.Equal(3, length);

            var topicBytes = buffer.WrittenSpan.Slice(
                IdBytesCount + MessageTypeBytesCount + LengthBytesCount,
                length);
            var topic = Encoding.UTF8.GetString(topicBytes);

            Assert.Equal("foo", topic);
        }
예제 #2
0
        public void WriteMessage_ShouldWritePayload()
        {
            // Arrange
            var writer          = new MessageReaderWriter();
            var expectedPayload = new byte[] { 1, 2, 42 };
            var message         = new Message
            {
                Topic   = string.Empty,
                Payload = new ReadOnlyMemory <byte>(expectedPayload)
            };
            var buffer = new ArrayBufferWriter <byte>();

            // Act
            writer.WriteMessage(message, buffer);

            // Assert
            var lengthBytes = buffer.WrittenSpan.Slice(
                IdBytesCount + MessageTypeBytesCount + LengthBytesCount,
                LengthBytesCount);
            var length = BinaryPrimitives.ReadInt32LittleEndian(lengthBytes);

            Assert.Equal(3, length);

            var payload = buffer.WrittenSpan.Slice(
                IdBytesCount + MessageTypeBytesCount + LengthBytesCount + LengthBytesCount,
                length);

            Assert.Equal(expectedPayload, payload.ToArray());
        }
예제 #3
0
        public void TryParseMessage_ShouldFail_AndNotAdvance_ForAPartialMessage(string _, byte[] buffer)
        {
            // Arrange
            var reader = new MessageReaderWriter();
            var input  = new ReadOnlySequence <byte>(buffer);

            // Act & Assert
            Assert.False(reader.TryParseMessage(in input, out var consumed, out var examined, out var _));
            Assert.Equal(input.Start, consumed);
            Assert.Equal(input.End, examined);
        }
예제 #4
0
        public void TryParseMessage_ShouldParseMessageType(byte messageTypeByte, MessageType expectedMessageType)
        {
            // Arrange
            var reader = new MessageReaderWriter();
            var buffer = new byte[IdBytesCount + MessageTypeBytesCount + LengthBytesCount + LengthBytesCount];

            buffer[IdBytesCount] = messageTypeByte;
            var input = new ReadOnlySequence <byte>(buffer);

            // Act & Assert
            Assert.True(reader.TryParseMessage(in input, out var _, out var _, out var message));
            Assert.Equal(expectedMessageType, message.MessageType);
        }
예제 #5
0
        public void TryParseMessage_ShouldParseId(long id)
        {
            // Arrange
            var reader = new MessageReaderWriter();
            var buffer = new byte[IdBytesCount + MessageTypeBytesCount + LengthBytesCount + LengthBytesCount];

            BinaryPrimitives.WriteInt64LittleEndian(buffer.AsSpan(0, IdBytesCount), id);
            var input = new ReadOnlySequence <byte>(buffer);

            // Act & Assert
            Assert.True(reader.TryParseMessage(in input, out var _, out var _, out var message));
            Assert.Equal(id, message.Id);
        }
예제 #6
0
        public void TryParseMessage_OnSuccess_ShouldAdvanceConsumedAndExamined(string _, byte[] buffer, int expectedConsumedInteger, bool examinedUpToEnd = false)
        {
            // Arrange
            var reader           = new MessageReaderWriter();
            var input            = new ReadOnlySequence <byte>(buffer);
            var expectedConsumed = new SequencePosition(buffer, expectedConsumedInteger);
            var expectedExamined = examinedUpToEnd ? input.End : expectedConsumed;

            // Act & Assert
            Assert.True(reader.TryParseMessage(in input, out var consumed, out var examined, out var _));
            Assert.Equal(expectedConsumed, consumed);
            Assert.Equal(expectedExamined, examined);
        }
예제 #7
0
        public void WriteMessage_ShouldThrowArgumentNullException_WhenTopicIsNull()
        {
            //TODO: Improve handling of null Topic

            // Arrange
            var writer  = new MessageReaderWriter();
            var message = new Message();
            var buffer  = new ArrayBufferWriter <byte>();

            // Act & Assert
            var exception = Assert.Throws <ArgumentNullException>(() => writer.WriteMessage(message, buffer));

            Assert.Equal("chars", exception.ParamName);
        }
예제 #8
0
        public void TryParseMessage_WithInvalidMessageType_ShouldNotFail()
        {
            //TODO: Should the parsing fail for an invalid MessageType?

            // Arrange
            var       reader             = new MessageReaderWriter();
            var       buffer             = new byte[IdBytesCount + MessageTypeBytesCount + LengthBytesCount + LengthBytesCount];
            const int invalidMessageType = 6;

            buffer[IdBytesCount] = invalidMessageType;
            var input = new ReadOnlySequence <byte>(buffer);

            // Act & Assert
            Assert.True(reader.TryParseMessage(in input, out var _, out var _, out var message));
            Assert.Equal(invalidMessageType, (int)message.MessageType);
        }
예제 #9
0
        public void WriteMessage_ShouldWriteMessageType(byte expectedByte, MessageType messageType)
        {
            // Arrange
            var writer  = new MessageReaderWriter();
            var message = new Message
            {
                MessageType = messageType,
                Topic       = string.Empty
            };
            var buffer = new ArrayBufferWriter <byte>();

            // Act
            writer.WriteMessage(message, buffer);

            // Assert
            var typeByte = buffer.WrittenSpan[IdBytesCount];

            Assert.Equal(expectedByte, typeByte);
        }
예제 #10
0
        public void TryParseMessage_ShouldParsePayload(byte[] payload)
        {
            // Arrange
            var reader = new MessageReaderWriter();
            var buffer = new byte[IdBytesCount + MessageTypeBytesCount + LengthBytesCount + LengthBytesCount + payload.Length];

            BinaryPrimitives.WriteInt32LittleEndian(
                buffer.AsSpan(IdBytesCount + MessageTypeBytesCount + LengthBytesCount, LengthBytesCount),
                payload.Length);
            Array.Copy(
                payload, 0,
                buffer, IdBytesCount + MessageTypeBytesCount + LengthBytesCount + LengthBytesCount,
                payload.Length);

            var input = new ReadOnlySequence <byte>(buffer);

            // Act & Assert
            Assert.True(reader.TryParseMessage(in input, out var _, out var _, out var message));
            Assert.Equal <byte>(payload, message.Payload.ToArray());
        }
예제 #11
0
        public void TryParseMessage_ShouldParseTopic(string topic)
        {
            // Arrange
            var topicLength = Encoding.UTF8.GetByteCount(topic);
            var reader      = new MessageReaderWriter();
            var buffer      = new byte[IdBytesCount + MessageTypeBytesCount + LengthBytesCount + topicLength + LengthBytesCount];

            BinaryPrimitives.WriteInt32LittleEndian(
                buffer.AsSpan(IdBytesCount + MessageTypeBytesCount, LengthBytesCount),
                topicLength);
            Encoding.UTF8.GetBytes(
                topic,
                buffer.AsSpan(IdBytesCount + MessageTypeBytesCount + LengthBytesCount, topicLength));

            var input = new ReadOnlySequence <byte>(buffer);

            // Act & Assert
            Assert.True(reader.TryParseMessage(in input, out var _, out var _, out var message));
            Assert.Equal(topic, message.Topic);
        }
예제 #12
0
        public void WriteMessage_ShouldWriteId()
        {
            // Arrange
            var writer  = new MessageReaderWriter();
            var message = new Message
            {
                Id    = 1,
                Topic = string.Empty
            };
            var buffer = new ArrayBufferWriter <byte>();

            // Act
            writer.WriteMessage(message, buffer);

            // Assert
            var idBytes = buffer.WrittenSpan.Slice(0, IdBytesCount);
            var id      = BinaryPrimitives.ReadInt64LittleEndian(idBytes);

            Assert.Equal(1, id);
        }
예제 #13
0
        public void WriteMessage_ShouldNotWriteExtraBytes()
        {
            // Arrange
            var writer  = new MessageReaderWriter();
            var topic   = "foo";
            var payload = new byte[3];

            var message = new Message
            {
                Id      = 1,
                Topic   = topic,
                Payload = new ReadOnlyMemory <byte>(payload)
            };
            var buffer = new ArrayBufferWriter <byte>();

            // Act
            writer.WriteMessage(message, buffer);

            // Assert
            Assert.Equal(
                IdBytesCount + MessageTypeBytesCount + LengthBytesCount + topic.Length + LengthBytesCount + payload.Length,
                buffer.WrittenCount);
        }