Bläddra i källkod

Remove TestMessageSerializer

Make code simpler by using real serialization errors instead
of using a fake serializer.
Olivier Coanet 3 år sedan
förälder
incheckning
5516e99bb1

+ 29 - 25
src/Abc.Zebus.Tests/Core/BusTests.DeserializationErrors.cs

@@ -32,30 +32,32 @@ namespace Abc.Zebus.Tests.Core
                 _bus.Start();
 
                 var command = new FakeCommand(123);
-                _messageSerializer.AddSerializationExceptionFor(command.TypeId(), "Serialization error");
 
                 using (SystemDateTime.PauseTime())
                 using (MessageId.PauseIdGeneration())
                 {
                     var transportMessage = command.ToTransportMessage();
-
-                    var messageProcessingFailedBytes = new MessageProcessingFailed(null, null, null, DateTime.UtcNow, null).ToTransportMessage().Content;
-                    _messageSerializer.AddSerializationFuncFor<MessageProcessingFailed>(x =>
-                    {
-                        x.FailingMessage.ShouldEqual(transportMessage);
-                        x.ExceptionUtcTime.ShouldEqual(SystemDateTime.UtcNow);
-                        x.ExceptionMessage.ShouldContain("Unable to deserialize message");
-                        x.ExceptionMessage.ShouldContain($"MessageId: {transportMessage.Id}");
-                        return messageProcessingFailedBytes;
-                    });
+                    MakeContentInvalid(transportMessage);
 
                     _transport.RaiseMessageReceived(transportMessage);
 
-                    var processingFailedTransportMessage = new TransportMessage(MessageUtil.TypeId<MessageProcessingFailed>(), messageProcessingFailedBytes, _self);
-                    _transport.ExpectExactly(new TransportMessageSent(processingFailedTransportMessage, _peerUp));
+                    var sentTransportMessage = _transport.Messages.ExpectedSingle();
+                    sentTransportMessage.Targets.ShouldBeEquivalentTo(_peerUp);
+
+                    var sentMessage = sentTransportMessage.TransportMessage.ToMessage().ShouldBe<MessageProcessingFailed>();
+                    sentMessage.FailingMessage.ShouldEqualDeeply(transportMessage);
+                    sentMessage.ExceptionUtcTime.ShouldEqual(SystemDateTime.UtcNow);
+                    sentMessage.ExceptionMessage.ShouldContain("Unable to deserialize message");
+                    sentMessage.ExceptionMessage.ShouldContain($"MessageId: {transportMessage.Id}");
                 }
             }
 
+            private static void MakeContentInvalid(TransportMessage transportMessage)
+            {
+                // Zero is an invalid first byte for protobuf
+                transportMessage.Content = new byte[transportMessage.Content.Length];
+            }
+
             [Test]
             public void should_send_MessageProcessingFailed_when_error_publication_os_not_enabled()
             {
@@ -65,10 +67,10 @@ namespace Abc.Zebus.Tests.Core
 
                 _bus.Start();
 
-                var exception = new Exception("Expected exception");
-                _messageSerializer.AddSerializationExceptionFor<FakeCommand>(exception);
+                var transportMessage = new FakeCommand(123).ToTransportMessage();
+                MakeContentInvalid(transportMessage);
 
-                _transport.RaiseMessageReceived(new FakeCommand(123).ToTransportMessage());
+                _transport.RaiseMessageReceived(transportMessage);
 
                 _transport.ExpectNothing();
             }
@@ -80,13 +82,13 @@ namespace Abc.Zebus.Tests.Core
 
                 _bus.Start();
 
-                var exception = new Exception("Expected exception");
-                _messageSerializer.AddSerializationExceptionFor<FakeCommand>(exception);
+                var transportMessage = new FakeCommand(123).ToTransportMessage();
+                MakeContentInvalid(transportMessage);
 
-                _transport.RaiseMessageReceived(new FakeCommand(123).ToTransportMessage());
+                _transport.RaiseMessageReceived(transportMessage);
 
                 var message = _transport.MessagesSent.OfType<MessageProcessingFailed>().ExpectedSingle();
-                message.ExceptionMessage.ShouldContain(exception.ToString());
+                message.ExceptionMessage.ShouldContain("Exception");
             }
 
             [Test]
@@ -96,10 +98,10 @@ namespace Abc.Zebus.Tests.Core
 
                 _bus.Start();
 
-                var exception = new Exception("Expected exception");
-                _messageSerializer.AddSerializationExceptionFor<FakeCommand>(exception);
+                var transportMessage = new FakeCommand(123).ToTransportMessage();
+                MakeContentInvalid(transportMessage);
 
-                _transport.RaiseMessageReceived(new FakeCommand(123).ToTransportMessage());
+                _transport.RaiseMessageReceived(transportMessage);
 
                 var message = _transport.MessagesSent.OfType<MessageProcessingFailed>().ExpectedSingle();
                 message.ExceptionMessage.ShouldContain(_bus.DeserializationFailureDumpDirectoryPath);
@@ -109,9 +111,10 @@ namespace Abc.Zebus.Tests.Core
             public void should_ack_transport_when_handling_undeserializable_message()
             {
                 var command = new FakeCommand(123);
-                _messageSerializer.AddSerializationExceptionFor(command.TypeId());
 
                 var transportMessage = command.ToTransportMessage();
+                MakeContentInvalid(transportMessage);
+
                 _transport.RaiseMessageReceived(transportMessage);
 
                 _transport.AckedMessages.ShouldContain(transportMessage);
@@ -121,9 +124,10 @@ namespace Abc.Zebus.Tests.Core
             public void should_dump_incoming_message_if_unable_to_deserialize_it()
             {
                 var command = new FakeCommand(123);
-                _messageSerializer.AddSerializationExceptionFor(command.TypeId());
 
                 var transportMessage = command.ToTransportMessage();
+                MakeContentInvalid(transportMessage);
+
                 _transport.RaiseMessageReceived(transportMessage);
 
                 var dumpFileName = System.IO.Directory.GetFiles(_bus.DeserializationFailureDumpDirectoryPath).ExpectedSingle();

+ 3 - 5
src/Abc.Zebus.Tests/Core/BusTests.DispatchErrors.cs

@@ -151,18 +151,16 @@ namespace Abc.Zebus.Tests.Core
                 using (SystemDateTime.PauseTime())
                 using (MessageId.PauseIdGeneration())
                 {
-                    SetupPeersHandlingMessage<FakeCommand>(_self);
+                    SetupPeersHandlingMessage<UnserializableMessage>(_self);
 
-                    var command = new FakeCommand(123);
+                    var command = new UnserializableMessage();
                     SetupDispatch(command, error: new Exception("Dispatch exception"));
 
-                    _messageSerializer.AddSerializationExceptionFor(command.TypeId(), exceptionMessage: "Serialization exception");
-
                     _bus.Send(command);
 
                     var error = _transport.MessagesSent.OfType<CustomProcessingFailed>().ExpectedSingle();
                     error.ExceptionMessage.ShouldContain("Dispatch exception");
-                    error.ExceptionMessage.ShouldContain("Serialization exception");
+                    error.ExceptionMessage.ShouldContain("Unable to serialize message");
                     error.ExceptionMessage.ShouldContain(command.GetType().FullName);
                 }
             }

+ 3 - 2
src/Abc.Zebus.Tests/Core/BusTests.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using Abc.Zebus.Core;
 using Abc.Zebus.Directory;
 using Abc.Zebus.Dispatch;
+using Abc.Zebus.Serialization;
 using Abc.Zebus.Testing.Comparison;
 using Abc.Zebus.Testing.Dispatch;
 using Abc.Zebus.Testing.Transport;
@@ -26,7 +27,7 @@ namespace Abc.Zebus.Tests.Core
         private TestTransport _transport;
         private Mock<IPeerDirectory> _directoryMock;
         private Mock<IMessageDispatcher> _messageDispatcherMock;
-        private TestMessageSerializer _messageSerializer;
+        private MessageSerializer _messageSerializer;
         private List<IMessageHandlerInvoker> _invokers;
 
         [SetUp]
@@ -36,7 +37,7 @@ namespace Abc.Zebus.Tests.Core
             _transport = new TestTransport(_self.EndPoint);
             _directoryMock = new Mock<IPeerDirectory>();
             _messageDispatcherMock = new Mock<IMessageDispatcher>();
-            _messageSerializer = new TestMessageSerializer();
+            _messageSerializer = new MessageSerializer();
 
             _bus = new Bus(_transport, _directoryMock.Object, _messageSerializer, _messageDispatcherMock.Object, new DefaultMessageSendingStrategy(), new DefaultStoppingStrategy(), _configuration);
             _bus.Configure(_self.Id, _environment);

+ 5 - 4
src/Abc.Zebus.Tests/Dispatch/DispatchQueueTests.cs

@@ -5,6 +5,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using Abc.Zebus.Dispatch;
 using Abc.Zebus.Dispatch.Pipes;
+using Abc.Zebus.Serialization;
 using Abc.Zebus.Testing;
 using Abc.Zebus.Testing.Dispatch;
 using Abc.Zebus.Testing.Extensions;
@@ -84,7 +85,7 @@ namespace Abc.Zebus.Tests.Dispatch
             _dispatchQueue.Start();
 
             var message1 = new ExecutableEvent { Callback = x => throw new Exception("Processing error") };
-            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message1, new TestMessageSerializer(), (d, r) => throw new Exception("Continuation error"));
+            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message1, new MessageSerializer(), (d, r) => throw new Exception("Continuation error"));
             dispatch.SetHandlerCount(1);
 
             _dispatchQueue.Enqueue(dispatch, new TestMessageHandlerInvoker<ExecutableEvent>());
@@ -561,7 +562,7 @@ namespace Abc.Zebus.Tests.Dispatch
         {
             var tcs = new TaskCompletionSource<DispatchResult>();
 
-            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message, new TestMessageSerializer(), (d, r) => tcs.SetResult(r));
+            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message, new MessageSerializer(), (d, r) => tcs.SetResult(r));
             dispatch.SetHandlerCount(1);
 
             var invoker = new TestMessageHandlerInvoker<ExecutableEvent>();
@@ -575,7 +576,7 @@ namespace Abc.Zebus.Tests.Dispatch
         {
             var tcs = new TaskCompletionSource<DispatchResult>();
 
-            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message, new TestMessageSerializer(), (d, r) => tcs.SetResult(r));
+            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message, new MessageSerializer(), (d, r) => tcs.SetResult(r));
             dispatch.SetHandlerCount(1);
 
             var invoker = new TestAsyncMessageHandlerInvoker<AsyncExecutableEvent>();
@@ -589,7 +590,7 @@ namespace Abc.Zebus.Tests.Dispatch
         {
             var tcs = new TaskCompletionSource<DispatchResult>();
 
-            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message, new TestMessageSerializer(), (d, r) => tcs.SetResult(r));
+            var dispatch = new MessageDispatch(MessageContext.CreateTest(), message, new MessageSerializer(), (d, r) => tcs.SetResult(r));
             dispatch.SetHandlerCount(1);
 
             var invoker = new TestBatchedMessageHandlerInvoker<FakeEvent>();

+ 4 - 3
src/Abc.Zebus.Tests/Dispatch/MessageDispatcherTests.cs

@@ -7,6 +7,7 @@ using Abc.Zebus.Dispatch;
 using Abc.Zebus.Dispatch.Pipes;
 using Abc.Zebus.Routing;
 using Abc.Zebus.Scan;
+using Abc.Zebus.Serialization;
 using Abc.Zebus.Testing;
 using Abc.Zebus.Testing.Extensions;
 using Abc.Zebus.Tests.Dispatch.DispatchMessages;
@@ -205,7 +206,7 @@ namespace Abc.Zebus.Tests.Dispatch
             var context = MessageContext.CreateTest("u.name");
             var command = new DispatchCommand();
             var dispatched = new ManualResetEvent(false);
-            var dispatch = new MessageDispatch(context, command, new TestMessageSerializer(), (x, r) => dispatched.Set());
+            var dispatch = new MessageDispatch(context, command, new MessageSerializer(), (x, r) => dispatched.Set());
             _messageDispatcher.Dispatch(dispatch, x => x == typeof(AsyncCommandHandler));
 
             dispatched.WaitOne(5.Seconds()).ShouldBeTrue();
@@ -355,7 +356,7 @@ namespace Abc.Zebus.Tests.Dispatch
 
             int? replyCode = null;
             var context = MessageContext.CreateTest();
-            var dispatch = new MessageDispatch(context, new ReplyCommand(), new TestMessageSerializer(), (x, r) => replyCode = context.ReplyCode);
+            var dispatch = new MessageDispatch(context, new ReplyCommand(), new MessageSerializer(), (x, r) => replyCode = context.ReplyCode);
             _messageDispatcher.Dispatch(dispatch);
 
             Wait.Until(() => replyCode == ReplyCommand.ReplyCode, 2.Seconds());
@@ -457,7 +458,7 @@ namespace Abc.Zebus.Tests.Dispatch
         {
             var taskCompletionSource = new TaskCompletionSource<DispatchResult>();
 
-            var dispatch = new MessageDispatch(MessageContext.CreateTest("u.name"), message, new TestMessageSerializer(), (x, r) => taskCompletionSource.SetResult(r))
+            var dispatch = new MessageDispatch(MessageContext.CreateTest("u.name"), message, new MessageSerializer(), (x, r) => taskCompletionSource.SetResult(r))
             {
                 IsLocal = isLocal
             };

+ 2 - 2
src/Abc.Zebus.Tests/Messages/FakeCommand.cs

@@ -6,7 +6,7 @@ namespace Abc.Zebus.Tests.Messages
     public class FakeCommand : ICommand
     {
         [ProtoMember(1, IsRequired = true)] public readonly int FakeId;
-        
+
         FakeCommand()
         {
         }
@@ -16,4 +16,4 @@ namespace Abc.Zebus.Tests.Messages
             FakeId = fakeId;
         }
     }
-}
+}

+ 14 - 0
src/Abc.Zebus.Tests/Messages/UnserializableMessage.cs

@@ -0,0 +1,14 @@
+using ProtoBuf;
+
+namespace Abc.Zebus.Tests.Messages
+{
+    [ProtoContract]
+    public class UnserializableMessage : ICommand
+    {
+        [ProtoMember(1)]
+        public int Id { get; set; }
+
+        [ProtoMember(1)]
+        public int TypeId { get; set; }
+    }
+}

+ 0 - 53
src/Abc.Zebus.Tests/Serialization/TestMessageSerializer.cs

@@ -1,53 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using Abc.Zebus.Serialization;
-
-namespace Abc.Zebus.Tests.Serialization
-{
-    public class TestMessageSerializer : IMessageSerializer
-    {
-        private readonly Dictionary<MessageTypeId, Exception> _serializationExceptions = new Dictionary<MessageTypeId, Exception>();
-        private readonly Dictionary<MessageTypeId, Func<IMessage, ReadOnlyMemory<byte>>> _serializationFuncs = new Dictionary<MessageTypeId, Func<IMessage, ReadOnlyMemory<byte>>>();
-        private readonly MessageSerializer _serializer = new MessageSerializer();
-
-        public void AddSerializationFuncFor<TMessage>(Func<TMessage, ReadOnlyMemory<byte>> func)
-            where TMessage : IMessage
-        {
-            _serializationFuncs.Add(MessageUtil.TypeId<TMessage>(), msg => func((TMessage)msg));
-        }
-
-        public void AddSerializationExceptionFor(MessageTypeId messageTypeId, string exceptionMessage = "Error")
-        {
-            _serializationExceptions.Add(messageTypeId, new Exception(exceptionMessage));
-        }
-
-        public void AddSerializationExceptionFor<TMessage>(Exception exception)
-            where TMessage : IMessage
-        {
-            _serializationExceptions.Add(MessageUtil.TypeId<TMessage>(), exception);
-        }
-
-        public IMessage Deserialize(MessageTypeId messageTypeId, ReadOnlyMemory<byte> bytes)
-        {
-            if (_serializationExceptions.TryGetValue(messageTypeId, out var exception))
-                throw exception;
-
-            return _serializer.Deserialize(messageTypeId, bytes);
-        }
-
-        public bool TryClone(IMessage message, out IMessage clone)
-            => _serializer.TryClone(message, out clone);
-
-        public ReadOnlyMemory<byte> Serialize(IMessage message)
-        {
-            if (_serializationExceptions.TryGetValue(message.TypeId(), out var exception))
-                throw exception;
-
-            if (_serializationFuncs.TryGetValue(message.TypeId(), out var serializationFunc))
-                return serializationFunc.Invoke(message);
-
-            return _serializer.Serialize(message);
-        }
-    }
-}