///<inheritdoc />
        public Task Publish <TMessage>(TMessage message, CancellationToken token)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            var topic = _typeTopicMap.Get(message.GetType());

            if (topic == null)
            {
                throw new InvalidOperationException(
                          $"Message type {message.GetType()} is not registered with: {_typeTopicMap.GetType()}.");
            }

            var serialized = _serializer.Serialize(message);

            if (serialized == null)
            {
                throw new InvalidOperationException(
                          $"Serializer {_serializer.GetType()} returned null for message of type {message.GetType()}.");
            }

            return(_rawMessagePublisher.Publish(topic, serialized, token));
        }
Example #2
0
        ///<inheritdoc />
        public Task Handle(string topic, byte[] message, CancellationToken token)
        {
            if (topic == null)
            {
                throw new ArgumentNullException(nameof(topic));
            }
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            var messageType = _typeTopicMap.Get(topic);

            if (messageType == null)
            {
                throw new InvalidOperationException(
                          $"Topic '{topic}' has no message type registered with: {_typeTopicMap.GetType()}.");
            }

            var deserialized = _serializer.Deserialize(messageType, message);

            if (deserialized == null)
            {
                throw new InvalidOperationException(
                          $"Serializer {_serializer.GetType()} returned null for the {message.Length}-byte message of type {messageType}.");
            }

            return(_messageHandlerInvoker.Invoke(deserialized, token));
        }
        public async Task Handle_TopicMapNotDefined_ThrowsInvalidOperation(
            string topic,
            [Frozen] IMessageTypeTopicMap messageTypeTopicMap,
            DispatchingRawMessageHandler sut)
        {
            messageTypeTopicMap.Get(topic).ReturnsNull();
            var ex = await Assert.ThrowsAsync <InvalidOperationException>(() => sut.Handle(topic, new byte[0], None));

            Assert.Equal($"Topic '{topic}' has no message type registered with: {messageTypeTopicMap.GetType()}.", ex.Message);
        }
        public async Task Publish_TopicMapNotDefined_ThrowsInvalidOperation(
            string message,
            [Frozen] IMessageTypeTopicMap messageTypeTopicMap,
            SerializedMessagePublisher sut)
        {
            messageTypeTopicMap.Get(message.GetType()).ReturnsNull();
            var ex = await Assert.ThrowsAsync <InvalidOperationException>(() => sut.Publish(message, None));

            Assert.Equal($"Message type {message.GetType()} is not registered with: {messageTypeTopicMap.GetType()}.",
                         ex.Message);
        }
        public async Task Handle_DeserializerReturnsNull_ThrowsInvalidOperation(
            string topic,
            byte[] message,
            [Frozen] IMessageTypeTopicMap messageTypeTopicMap,
            [Frozen] ISerializer serializer,
            DispatchingRawMessageHandler sut)
        {
            var messageType = GetType();

            messageTypeTopicMap.Get(topic).Returns(messageType);
            serializer.Deserialize(messageType, message).ReturnsNull();

            var ex = await Assert.ThrowsAsync <InvalidOperationException>(() => sut.Handle(topic, message, None));

            Assert.Equal($"Serializer {serializer.GetType()} returned null for the {message.Length}-byte message of type {messageType}.", ex.Message);
        }
        public async Task Publish_SerializerReturnsNull_ThrowsInvalidOperation(
            string topic,
            string message,
            [Frozen] IMessageTypeTopicMap messageTypeTopicMap,
            [Frozen] ISerializer serializer,
            SerializedMessagePublisher sut)
        {
            var messageType = GetType();

            messageTypeTopicMap.Get(topic).Returns(messageType);
            serializer.Serialize(message).ReturnsNull();

            var ex = await Assert.ThrowsAsync <InvalidOperationException>(() => sut.Publish(message, None));

            Assert.Equal(
                $"Serializer {serializer.GetType()} returned null for message of type {message.GetType()}.",
                ex.Message);
        }
        public async Task Handle_DeserializedMessage_CallsInvoker(
            string topic,
            byte[] message,
            object deserializedObject,
            [Frozen] IMessageHandlerInvoker messageHandlerInvoker,
            [Frozen] IMessageTypeTopicMap messageTypeTopicMap,
            [Frozen] ISerializer serializer,
            DispatchingRawMessageHandler sut)
        {
            // Arrange
            var messageType = GetType();

            messageTypeTopicMap.Get(topic).Returns(messageType);
            serializer.Deserialize(messageType, message).Returns(deserializedObject);

            // Act
            await sut.Handle(topic, message, None);

            // Assert
            await messageHandlerInvoker.Received().Invoke(deserializedObject, None);
        }
        public async Task Publish_SerializedMessage_CallsRawPublisher(
            string topic,
            bool message,
            byte[] serializedMessage,
            [Frozen] IRawMessagePublisher rawMessagePublisher,
            [Frozen] IMessageTypeTopicMap messageTypeTopicMap,
            [Frozen] ISerializer serializer,
            SerializedMessagePublisher sut)
        {
            // Arrange
            var messageType = message.GetType();

            messageTypeTopicMap.Get(messageType).Returns(topic);
            serializer.Serialize(message).Returns(serializedMessage);

            // Act
            await sut.Publish(message, None);

            // Assert
            await rawMessagePublisher.Received().Publish(topic, serializedMessage, None);
        }