public async Task VersionedMessageHandler_WhenVersionMatchOnSecond_ExpectAction()
        {
            // Arrange
            var entityOne    = default(TestEntityOne);
            var entityTwo    = default(TestEntityTwo);
            var defaultValue = default(string);
            var exception    = default(Exception);

            var versionedMessageHandler = new AsyncVersionedMessageHandler(SerializerType.ProtocolBuffers, true)
                                          .On <TestEntityOne>(
                e =>
            {
                entityOne = e;
                return(Task.CompletedTask);
            })
                                          .On <TestEntityTwo>(
                typeof(TestEntityTwo).GetVersion(),
                e =>
            {
                entityTwo = e;
                return(Task.CompletedTask);
            })
                                          .Else(
                s =>
            {
                defaultValue = s;
                return(Task.CompletedTask);
            })
                                          .OnError(
                e =>
            {
                exception = e;
                return(Task.CompletedTask);
            });

            var versionedMessage = new VersionedMessage
            {
                Data = new TestEntityTwo {
                    Value1 = "test", Value2 = new DateTime(2018, 1, 1)
                }.SerializeToString(),
                Version = typeof(TestEntityTwo).GetVersion(),
            };

            // Act
            var stopwatch = Stopwatch.StartNew();
            await versionedMessageHandler.PostAsync(versionedMessage).ConfigureAwait(false);

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            Assert.That(entityOne, Is.Null);
            Assert.That(entityTwo, Is.Not.Null);
            Assert.That(defaultValue, Is.Null);
            Assert.That(exception, Is.Null);

            Assert.That(entityTwo.Value1, Is.EqualTo("test"));
            Assert.That(entityTwo.Value2, Is.EqualTo(new DateTime(2018, 1, 1)));
        }
        public async Task VersionedMessageHandler_WhenNoMatch_ExpectDefault()
        {
            // Arrange
            var entityOne    = default(TestEntityOne);
            var entityTwo    = default(TestEntityTwo);
            var defaultValue = default(string);
            var exception    = default(Exception);

            var versionedMessageHandler = new AsyncVersionedMessageHandler(SerializerType.Json, true)
                                          .On <TestEntityOne>(
                e =>
            {
                entityOne = e;
                return(Task.CompletedTask);
            })
                                          .On <TestEntityTwo>(
                e =>
            {
                entityTwo = e;
                return(Task.CompletedTask);
            })
                                          .Else(
                s =>
            {
                defaultValue = s;
                return(Task.CompletedTask);
            })
                                          .OnError(
                e =>
            {
                exception = e;
                return(Task.CompletedTask);
            });

            var versionedMessage = new VersionedMessage
            {
                Data = new TestEntityThree {
                    Value1 = 25.3m
                }.SerializeToString(SerializerType.Json),
                Version = typeof(TestEntityThree).GetVersion(),
            };

            // Act
            var stopwatch = Stopwatch.StartNew();
            await versionedMessageHandler.PostAsync(versionedMessage).ConfigureAwait(false);

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            Assert.That(entityOne, Is.Null);
            Assert.That(entityTwo, Is.Null);
            Assert.That(defaultValue, Is.Not.Null);
            Assert.That(exception, Is.Null);

            Assert.That(defaultValue, Is.EqualTo("{\"Value1\":25.3}"));
        }
        public async Task VersionedMessageHandler_WhenErrorAndNotThrowOnError_ExpectHandled()
        {
            // Arrange
            var entityTwo    = default(TestEntityTwo);
            var defaultValue = default(string);
            var exception    = default(Exception);

            var versionedMessageHandler = new AsyncVersionedMessageHandler(SerializerType.Json, false)
                                          .On <TestEntityOne>(e => throw new DivideByZeroException())
                                          .On <TestEntityTwo>(
                e =>
            {
                entityTwo = e;
                return(Task.CompletedTask);
            })
                                          .Else(
                s =>
            {
                defaultValue = s;
                return(Task.CompletedTask);
            })
                                          .OnError(
                e =>
            {
                exception = e;
                return(Task.CompletedTask);
            });

            var versionedMessage = new VersionedMessage
            {
                Data    = new TestEntityOne().SerializeToString(SerializerType.Json),
                Version = typeof(TestEntityOne).GetVersion(),
            };

            // Act
            var stopwatch = Stopwatch.StartNew();
            await versionedMessageHandler.PostAsync(versionedMessage).ConfigureAwait(false);

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            Assert.That(entityTwo, Is.Null);
            Assert.That(defaultValue, Is.Null);
            Assert.That(exception, Is.Not.Null);

            Assert.That(exception.GetType(), Is.EqualTo(typeof(DivideByZeroException)));
        }
Example #4
0
        public async Task VersionedMessageHandler_WhenDifferentSerializations_ExpectAllProcessed()
        {
            // Arrange
            var versionedMessageHandler = new AsyncVersionedMessageHandler <TestEntityOne>(SerializerType.ProtocolBuffers, true)
                                          .On <TestEntityOne>(Task.FromResult);

            var e1 = new TestEntityOne {
                Value1 = "test1", Value2 = 42
            }.SerializeToVersionedMessage();
            var e2 = new TestEntityOne {
                Value1 = "test2", Value2 = 42
            }.SerializeToVersionedMessage();
            var e3 = new TestEntityOne {
                Value1 = "test3", Value2 = 42
            }.SerializeToVersionedMessage(SerializerType.Json);
            var e4 = new TestEntityOne {
                Value1 = "test4", Value2 = 42
            }.SerializeToVersionedMessage(SerializerType.Xml);

            // Act
            var stopwatch = Stopwatch.StartNew();
            var r1        = await versionedMessageHandler.PostAsync(e1).ConfigureAwait(false);

            var r2 = await versionedMessageHandler.PostAsync(e2, SerializerType.ProtocolBuffers).ConfigureAwait(false);

            var r3 = await versionedMessageHandler.PostAsync(e3, SerializerType.Json).ConfigureAwait(false);

            var r4 = await versionedMessageHandler.PostAsync(e4, SerializerType.Xml).ConfigureAwait(false);

            var responses = new List <TestEntityOne>
            {
                r1,
                r2,
                r3,
                r4,
            };

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            Assert.That(responses.Count, Is.EqualTo(4));

            Assert.That(responses[0].Value1, Is.EqualTo("test1"));
            Assert.That(responses[1].Value1, Is.EqualTo("test2"));
            Assert.That(responses[2].Value1, Is.EqualTo("test3"));
            Assert.That(responses[3].Value1, Is.EqualTo("test4"));
        }
Example #5
0
        public async Task VersionedMessageHandler_WhenNoMatch_ExpectDefault()
        {
            // Arrange
            var exception = default(Exception);

            var versionedMessageHandler = new AsyncVersionedMessageHandler <TestEntityOne>(SerializerType.Json, true)
                                          .On <TestEntityOne>(e => Task.FromResult(default(TestEntityOne)))
                                          .On <TestEntityTwo>(e => Task.FromResult(default(TestEntityOne)))
                                          .Else(
                s => Task.FromResult(new TestEntityOne
            {
                Value2 = 42,
                Value1 = "DEFAULT",
            }))
                                          .OnError(
                e =>
            {
                exception = e;
                return(Task.FromResult(default(TestEntityOne)));
            });

            var versionedMessage = new VersionedMessage
            {
                Data = new TestEntityThree {
                    Value1 = 25.3m
                }.SerializeToString(SerializerType.Json),
                Version = typeof(TestEntityThree).GetVersion(),
            };

            // Act
            var stopwatch = Stopwatch.StartNew();
            var rtn       = await versionedMessageHandler.PostAsync(versionedMessage).ConfigureAwait(false);

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            Assert.That(exception, Is.Null);

            Assert.That(rtn.Value1, Is.EqualTo("DEFAULT"));
            Assert.That(rtn.Value2, Is.EqualTo(42));
        }
Example #6
0
        public async Task VersionedMessageHandler_WhenVersionMatchOnFirst_ExpectAction()
        {
            // Arrange
            var exception = default(Exception);

            var versionedMessageHandler = new AsyncVersionedMessageHandler <TestEntityOne>(SerializerType.ProtocolBuffers, true)
                                          .On <TestEntityOne>(Task.FromResult)
                                          .On <TestEntityTwo>(e => Task.FromResult(default(TestEntityOne)))
                                          .Else(e => Task.FromResult(default(TestEntityOne)))
                                          .OnError(
                e =>
            {
                exception = e;
                return(Task.FromResult(default(TestEntityOne)));
            });

            var versionedMessage = new VersionedMessage
            {
                Data = new TestEntityOne {
                    Value1 = "test", Value2 = 42
                }.SerializeToString(),
                Version = typeof(TestEntityOne).GetVersion(),
            };

            // Act
            var stopwatch     = Stopwatch.StartNew();
            var testEntityOne = await versionedMessageHandler.PostAsync(versionedMessage).ConfigureAwait(false);

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            Assert.That(exception, Is.Null);

            Assert.That(testEntityOne.Value1, Is.EqualTo("test"));
            Assert.That(testEntityOne.Value2, Is.EqualTo(42));
        }
        public void VersionedMessageHandler_WhenErrorAndThrowOnError_ExpectThrows()
        {
            // Arrange
            var versionedMessageHandler = new AsyncVersionedMessageHandler(SerializerType.Json, true)
                                          .On <TestEntityOne>(e => throw new DivideByZeroException())
                                          .On <TestEntityTwo>(
                e =>
            {
                return(Task.CompletedTask);
            })
                                          .Else(
                s =>
            {
                return(Task.CompletedTask);
            })
                                          .OnError(
                e =>
            {
                return(Task.CompletedTask);
            });

            var versionedMessage = new VersionedMessage
            {
                Data    = new TestEntityOne().SerializeToString(SerializerType.Json),
                Version = typeof(TestEntityOne).GetVersion(),
            };

            // Act
            var stopwatch = Stopwatch.StartNew();

            Assert.ThrowsAsync <DivideByZeroException>(() => versionedMessageHandler.PostAsync(versionedMessage));
            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);
        }
        public async Task VersionedMessageHandler_WhenBatchedVersionedMessage_ExpectAllProcessed()
        {
            // Arrange
            var entityOne    = default(TestEntityOne);
            var entityTwo    = default(TestEntityTwo);
            var defaultValue = default(string);
            var exception    = default(Exception);

            var versionedMessageHandler = new AsyncVersionedMessageHandler(SerializerType.ProtocolBuffers, true)
                                          .On <TestEntityOne>(
                e =>
            {
                entityOne = e;
                return(Task.CompletedTask);
            })
                                          .On <TestEntityTwo>(
                e =>
            {
                entityTwo = e;
                return(Task.CompletedTask);
            })
                                          .Else(
                s =>
            {
                defaultValue = s;
                return(Task.CompletedTask);
            })
                                          .OnError(
                e =>
            {
                exception = e;
                return(Task.CompletedTask);
            });

            var batchedVersionedMessage = new BatchedVersionedMessage
            {
                Messages = new List <VersionedMessage>
                {
                    new TestEntityOne {
                        Value1 = "test", Value2 = 42
                    }.SerializeToVersionedMessage(),
                    new TestEntityTwo {
                        Value1 = "Value1", Value2 = new DateTime(2018, 1, 1)
                    }.SerializeToVersionedMessage(),
                    new TestEntityThree {
                        Value1 = 3
                    }.SerializeToVersionedMessage(),
                },
            };

            // Act
            var stopwatch = Stopwatch.StartNew();
            await versionedMessageHandler.PostAsync(batchedVersionedMessage).ConfigureAwait(false);

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            Assert.That(entityOne, Is.Not.Null);
            Assert.That(entityTwo, Is.Not.Null);
            Assert.That(defaultValue, Is.Not.Null);
            Assert.That(exception, Is.Null);

            Assert.That(entityOne.Value1, Is.EqualTo("test"));
            Assert.That(entityOne.Value2, Is.EqualTo(42));

            Assert.That(entityTwo.Value1, Is.EqualTo("Value1"));
            Assert.That(entityTwo.Value2, Is.EqualTo(new DateTime(2018, 1, 1)));

            Assert.That(defaultValue.Deserialize <TestEntityThree>().Value1, Is.EqualTo(3));
        }
Example #9
0
        public async Task VersionedMessageHandler_WhenBatchedVersionedMessage_ExpectAllProcessed()
        {
            // Arrange
            var exception = default(Exception);

            var versionedMessageHandler = new AsyncVersionedMessageHandler <TestEntityOne>(SerializerType.ProtocolBuffers, true)
                                          .On <TestEntityOne>(
                e => Task.FromResult(new TestEntityOne
            {
                Value1 = e.Value1,
                Value2 = e.Value2,
            }))
                                          .On <TestEntityTwo>(
                e => Task.FromResult(new TestEntityOne
            {
                Value1 = e.Value1,
                Value2 = 5,
            }))
                                          .Else(
                s => Task.FromResult(new TestEntityOne
            {
                Value1 = "TestVal",
                Value2 = 5,
            }))
                                          .OnError(
                e =>
            {
                exception = e;
                return(Task.FromResult(default(TestEntityOne)));
            });

            var batchedVersionedMessage = new BatchedVersionedMessage
            {
                Messages = new List <VersionedMessage>
                {
                    new TestEntityOne {
                        Value1 = "test", Value2 = 42
                    }.SerializeToVersionedMessage(),
                    new TestEntityTwo {
                        Value1 = "Value1", Value2 = new DateTime(2018, 1, 1)
                    }.SerializeToVersionedMessage(),
                    new TestEntityThree {
                        Value1 = 3
                    }.SerializeToVersionedMessage(),
                },
            };

            // Act
            var stopwatch = Stopwatch.StartNew();
            var results   = await versionedMessageHandler.PostAsync(batchedVersionedMessage).ConfigureAwait(false);

            stopwatch.Stop();

            // Assert
            this.WriteTimeElapsed(stopwatch);

            var resultsList = results.ToList();

            Assert.That(resultsList[0], Is.Not.Null);
            Assert.That(resultsList[1], Is.Not.Null);
            Assert.That(resultsList[2], Is.Not.Null);
            Assert.That(exception, Is.Null);

            Assert.That(resultsList[0].Value1, Is.EqualTo("test"));
            Assert.That(resultsList[0].Value2, Is.EqualTo(42));

            Assert.That(resultsList[1].Value1, Is.EqualTo("Value1"));
            Assert.That(resultsList[1].Value2, Is.EqualTo(5));

            Assert.That(resultsList[2].Value1, Is.EqualTo("TestVal"));
            Assert.That(resultsList[2].Value2, Is.EqualTo(5));
        }