public void event_publisher_failed_test()
        {
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note"
            };

            ((MockDomainEventPublisher)_domainEventPublisher).SetExpectFailedCount(FailedType.UnKnownException, 5);
            var commandResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            ((MockDomainEventPublisher)_domainEventPublisher).Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note"
            };
            ((MockDomainEventPublisher)_domainEventPublisher).SetExpectFailedCount(FailedType.IOException, 5);
            commandResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            ((MockDomainEventPublisher)_domainEventPublisher).Reset();
        }
        public void change_multiple_aggregates_test()
        {
            var command1 = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note1"
            };

            _commandService.ExecuteAsync(command1).Wait();

            var command2 = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note2"
            };

            _commandService.ExecuteAsync(command2).Wait();

            var command3 = new ChangeMultipleAggregatesCommand
            {
                AggregateRootId  = ObjectId.GenerateNewStringId(),
                AggregateRootId1 = command1.AggregateRootId,
                AggregateRootId2 = command2.AggregateRootId
            };
            var commandResult = _commandService.ExecuteAsync(command3).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
        }
        public void domain_exception_publisher_throw_exception_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            _commandService.ExecuteAsync(command).Wait();

            var command1 = new AggregateThrowExceptionCommand
            {
                AggregateRootId   = aggregateId,
                IsDomainException = true
            };

            ((MockDomainExceptionPublisher)_domainExceptionPublisher).SetExpectFailedCount(FailedType.UnKnownException, 5);
            var commandResult = _commandService.ExecuteAsync(command1).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
            ((MockDomainExceptionPublisher)_domainExceptionPublisher).Reset();

            ((MockDomainExceptionPublisher)_domainExceptionPublisher).SetExpectFailedCount(FailedType.IOException, 5);
            commandResult = _commandService.ExecuteAsync(command1).Result;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
            ((MockDomainExceptionPublisher)_domainExceptionPublisher).Reset();
        }
        public void create_and_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var commandResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note"
            };

            commandResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
        public void aggregate_throw_exception_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            _commandService.ExecuteAsync(command).Wait();

            var command1 = new AggregateThrowExceptionCommand
            {
                AggregateRootId   = aggregateId,
                IsDomainException = false
            };
            var commandResult = _commandService.ExecuteAsync(command1).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);

            var command2 = new AggregateThrowExceptionCommand
            {
                AggregateRootId   = aggregateId,
                IsDomainException = true
            };

            commandResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
        }
        public void event_handler_priority_test()
        {
            var noteId   = ObjectId.GenerateNewStringId();
            var command1 = new CreateTestAggregateCommand {
                AggregateRootId = noteId, Title = "Sample Title1"
            };
            var command2 = new TestEventPriorityCommand {
                AggregateRootId = noteId
            };

            _commandService.ExecuteAsync(command1, CommandReturnType.EventHandled).Wait();
            _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Wait();

            Assert.AreEqual(9, HandlerTypes.Count);
            Assert.AreEqual(typeof(Handler3).Name, HandlerTypes[0]);
            Assert.AreEqual(typeof(Handler2).Name, HandlerTypes[1]);
            Assert.AreEqual(typeof(Handler1).Name, HandlerTypes[2]);
            Assert.AreEqual(typeof(Handler122).Name, HandlerTypes[3]);
            Assert.AreEqual(typeof(Handler121).Name, HandlerTypes[4]);
            Assert.AreEqual(typeof(Handler123).Name, HandlerTypes[5]);
            Assert.AreEqual(typeof(Handler1232).Name, HandlerTypes[6]);
            Assert.AreEqual(typeof(Handler1231).Name, HandlerTypes[7]);
            Assert.AreEqual(typeof(Handler1233).Name, HandlerTypes[8]);

            HandlerTypes.Clear();
        }
        public void published_version_store_failed_test()
        {
            var mockPublishedVersionStore = _publishedVersionStore as MockPublishedVersionStore;
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note"
            };

            mockPublishedVersionStore.SetExpectFailedCount(FailedType.UnKnownException, 5);
            var commandResult = _commandService.ExecuteAsync(command, CommandReturnType.EventHandled).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockPublishedVersionStore.Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note"
            };
            mockPublishedVersionStore.SetExpectFailedCount(FailedType.IOException, 5);
            commandResult = _commandService.ExecuteAsync(command, CommandReturnType.EventHandled).Result;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockPublishedVersionStore.Reset();
        }
        public void event_handler_priority_test()
        {
            var noteId   = ObjectId.GenerateNewStringId();
            var command1 = new CreateTestAggregateCommand {
                AggregateRootId = noteId, Title = "Sample Title1"
            };
            var command2 = new TestEventPriorityCommand {
                AggregateRootId = noteId
            };
            var commandResult1 = _commandService.ExecuteAsync(command1, CommandReturnType.EventHandled).Result;
            var commandResult2 = _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Result;

            Thread.Sleep(3000);

            Assert.AreEqual(CommandStatus.Success, commandResult1.Status);
            Assert.AreEqual(CommandStatus.Success, commandResult2.Status);

            Assert.AreEqual(3, HandlerTypes[1].Count);
            Assert.AreEqual(typeof(Handler3).Name, HandlerTypes[1][0]);
            Assert.AreEqual(typeof(Handler2).Name, HandlerTypes[1][1]);
            Assert.AreEqual(typeof(Handler1).Name, HandlerTypes[1][2]);

            Assert.AreEqual(3, HandlerTypes[2].Count);
            Assert.AreEqual(typeof(Handler122).Name, HandlerTypes[2][0]);
            Assert.AreEqual(typeof(Handler121).Name, HandlerTypes[2][1]);
            Assert.AreEqual(typeof(Handler123).Name, HandlerTypes[2][2]);

            Assert.AreEqual(3, HandlerTypes[3].Count);
            Assert.AreEqual(typeof(Handler1232).Name, HandlerTypes[3][0]);
            Assert.AreEqual(typeof(Handler1231).Name, HandlerTypes[3][1]);
            Assert.AreEqual(typeof(Handler1233).Name, HandlerTypes[3][2]);

            HandlerTypes.Clear();
        }
Example #9
0
        public void create_and_update_dirty_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var commandResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            var directUpdateEventStoreCommandId = ObjectId.GenerateNewStringId();
            var eventStore            = ObjectContainer.Resolve <IEventStore>();
            var publishedVersionStore = ObjectContainer.Resolve <IPublishedVersionStore>();
            var eventStreamList       = new List <DomainEventStream>();
            var evnts = new List <IDomainEvent>();
            var evnt  = new TestAggregateTitleChanged("Note Title2")
            {
                AggregateRootId       = aggregateId,
                AggregateRootTypeName = typeof(TestAggregate).FullName,
                CommandId             = directUpdateEventStoreCommandId,
                Version = 2
            };

            evnts.Add(evnt);
            var eventStream = new DomainEventStream(ObjectId.GenerateNewStringId(), aggregateId, typeof(TestAggregate).FullName, DateTime.UtcNow, evnts);

            eventStreamList.Add(eventStream);
            eventStore.BatchAppendAsync(eventStreamList).Wait();

            var eventProcessorName = ENodeConfiguration.Instance.Setting.DomainEventProcessorName;

            publishedVersionStore.UpdatePublishedVersionAsync(eventProcessorName, typeof(TestAggregate).FullName, aggregateId, 2).Wait();

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleWhenDirtyCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note",
                IsFirstExecute  = true
            };

            commandResult = _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Result;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(3, ((IAggregateRoot)note).Version);
        }
Example #10
0
        public void create_and_concurrent_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //并发执行修改聚合根的命令
            var totalCount    = 100;
            var finishedCount = 0;
            var waitHandle    = new ManualResetEvent(false);

            for (var i = 0; i < totalCount; i++)
            {
                var updateCommand = new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Changed Note"
                };
                _commandService.ExecuteAsync(updateCommand).ContinueWith(t =>
                {
                    var result = t.Result;
                    Assert.IsNotNull(result);
                    Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                    Assert.IsNotNull(result.Data);
                    Assert.AreEqual(CommandStatus.Success, result.Data.Status);

                    var current = Interlocked.Increment(ref finishedCount);
                    if (current == totalCount)
                    {
                        note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
                        Assert.IsNotNull(note);
                        Assert.AreEqual("Changed Note", note.Title);
                        Assert.AreEqual(totalCount + 1, ((IAggregateRoot)note).Version);
                        waitHandle.Set();
                    }
                });
            }
            waitHandle.WaitOne();
        }
Example #11
0
        public void duplicate_create_aggregate_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //用同一个命令再次执行创建聚合根的命令
            asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //用另一个命令再次执行创建相同聚合根的命令
            command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };
            asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);
        }
Example #12
0
        public void event_store_failed_test()
        {
            var mockEventStore = _eventStore as MockEventStore;
            var command        = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note"
            };

            mockEventStore.SetExpectFailedCount(FailedType.UnKnownException, 5);
            var asyncResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockEventStore.Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note"
            };
            mockEventStore.SetExpectFailedCount(FailedType.IOException, 5);
            asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockEventStore.Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title           = "Sample Note"
            };
            mockEventStore.SetExpectFailedCount(FailedType.TaskIOException, 5);
            asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockEventStore.Reset();
        }
Example #13
0
        public void duplicate_update_aggregate_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command1    = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //先创建一个聚合根
            var status = _commandService.ExecuteAsync(command1).Result.Data.Status;

            Assert.AreEqual(CommandStatus.Success, status);

            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note"
            };

            //执行修改聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);

            //在重复执行该命令
            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
        public void published_version_store_failed_test()
        {
            var mockPublishedVersionStore = _publishedVersionStore as MockPublishedVersionStore;
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note"
            };
            mockPublishedVersionStore.SetExpectFailedCount(FailedType.UnKnownException, 5);
            var asyncResult = _commandService.ExecuteAsync(command, CommandReturnType.EventHandled).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockPublishedVersionStore.Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note"
            };
            mockPublishedVersionStore.SetExpectFailedCount(FailedType.IOException, 5);
            asyncResult = _commandService.ExecuteAsync(command, CommandReturnType.EventHandled).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockPublishedVersionStore.Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note"
            };
            mockPublishedVersionStore.SetExpectFailedCount(FailedType.TaskIOException, 5);
            asyncResult = _commandService.ExecuteAsync(command, CommandReturnType.EventHandled).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            mockPublishedVersionStore.Reset();
        }
Example #15
0
        public void event_publisher_failed_test()
        {
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note"
            };
            ((MockDomainEventPublisher)_domainEventPublisher).SetExpectFailedCount(FailedType.UnKnownException, 5);
            var asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            ((MockDomainEventPublisher)_domainEventPublisher).Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note"
            };
            ((MockDomainEventPublisher)_domainEventPublisher).SetExpectFailedCount(FailedType.IOException, 5);
            asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            ((MockDomainEventPublisher)_domainEventPublisher).Reset();

            command = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note"
            };
            ((MockDomainEventPublisher)_domainEventPublisher).SetExpectFailedCount(FailedType.TaskIOException, 5);
            asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            ((MockDomainEventPublisher)_domainEventPublisher).Reset();
        }
        public void publishable_exception_publisher_throw_exception_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            _commandService.ExecuteAsync(command).Wait();

            var command1 = new AggregateThrowExceptionCommand
            {
                AggregateRootId = aggregateId,
                PublishableException = true
            };
            ((MockPublishableExceptionPublisher)_publishableExceptionPublisher).SetExpectFailedCount(FailedType.UnKnownException, 5);
            var asyncResult = _commandService.ExecuteAsync(command1).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
            ((MockPublishableExceptionPublisher)_publishableExceptionPublisher).Reset();

            ((MockPublishableExceptionPublisher)_publishableExceptionPublisher).SetExpectFailedCount(FailedType.IOException, 5);
            asyncResult = _commandService.ExecuteAsync(command1).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
            ((MockPublishableExceptionPublisher)_publishableExceptionPublisher).Reset();

            ((MockPublishableExceptionPublisher)_publishableExceptionPublisher).SetExpectFailedCount(FailedType.TaskIOException, 5);
            asyncResult = _commandService.ExecuteAsync(command1).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
            ((MockPublishableExceptionPublisher)_publishableExceptionPublisher).Reset();
        }
Example #17
0
        public void command_sync_execute_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note",
                SleepMilliseconds = 3000
            };

            //执行创建聚合根的命令
            var commandResult = _commandService.Execute(command, 5000);
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);
        }
Example #18
0
        public void event_handler_priority_test()
        {
            var noteId = ObjectId.GenerateNewStringId();
            var command1 = new CreateTestAggregateCommand { AggregateRootId = noteId, Title = "Sample Title1" };
            var command2 = new TestEventPriorityCommand { AggregateRootId = noteId };
            _commandService.ExecuteAsync(command1, CommandReturnType.EventHandled).Wait();
            _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Wait();

            Assert.AreEqual(9, HandlerTypes.Count);
            Assert.AreEqual(typeof(Handler3).Name, HandlerTypes[0]);
            Assert.AreEqual(typeof(Handler2).Name, HandlerTypes[1]);
            Assert.AreEqual(typeof(Handler1).Name, HandlerTypes[2]);
            Assert.AreEqual(typeof(Handler122).Name, HandlerTypes[3]);
            Assert.AreEqual(typeof(Handler121).Name, HandlerTypes[4]);
            Assert.AreEqual(typeof(Handler123).Name, HandlerTypes[5]);
            Assert.AreEqual(typeof(Handler1232).Name, HandlerTypes[6]);
            Assert.AreEqual(typeof(Handler1231).Name, HandlerTypes[7]);
            Assert.AreEqual(typeof(Handler1233).Name, HandlerTypes[8]);

            HandlerTypes.Clear();
        }
Example #19
0
        public void command_sync_execute_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId   = aggregateId,
                Title             = "Sample Note",
                SleepMilliseconds = 3000
            };

            //执行创建聚合根的命令
            var commandResult = _commandService.Execute(command, 5000);

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get <TestAggregate>(aggregateId);

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);
        }
        public async Task send_concurrent_command_test()
        {
            ThreadPool.SetMinThreads(1, 1);
            ThreadPool.SetMaxThreads(2, 2);

            var tasks = new List <Task <CommandResult> >();

            for (int i = 0; i < 1000; i++)
            {
                var aggregateId = ObjectId.GenerateNewStringId();
                var command     = new CreateTestAggregateCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Sample Note"
                };

                tasks.Add(_commandService.ExecuteAsync(command, CommandReturnType.EventHandled));
            }

            await Task.WhenAll(tasks);
        }
        public void aggregate_throw_exception_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            _commandService.ExecuteAsync(command).Wait();

            var command1 = new AggregateThrowExceptionCommand
            {
                AggregateRootId      = aggregateId,
                PublishableException = false
            };
            var asyncResult = _commandService.ExecuteAsync(command1).Result;

            Assert.NotNull(asyncResult);
            Assert.Equal(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.NotNull(commandResult);
            Assert.Equal(CommandStatus.Failed, commandResult.Status);

            var command2 = new AggregateThrowExceptionCommand
            {
                AggregateRootId      = aggregateId,
                PublishableException = true
            };

            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.NotNull(asyncResult);
            Assert.Equal(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.NotNull(commandResult);
            Assert.Equal(CommandStatus.Failed, commandResult.Status);
        }
        public async Task command_sync_execute_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId   = aggregateId,
                Title             = "Sample Note",
                SleepMilliseconds = 3000
            };

            //执行创建聚合根的命令
            var commandResult = await _commandService.ExecuteAsync(command);

            Assert.NotNull(commandResult);
            Assert.Equal(CommandStatus.Success, commandResult.Status);
            var note = await _memoryCache.GetAsync <TestAggregate>(aggregateId);

            Assert.NotNull(note);
            Assert.Equal("Sample Note", note.Title);
            Assert.Equal(1, ((IAggregateRoot)note).Version);

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note"
            };

            commandResult = await _commandService.ExecuteAsync(command2);

            Assert.NotNull(commandResult);
            Assert.Equal(CommandStatus.Success, commandResult.Status);
            note = await _memoryCache.GetAsync <TestAggregate>(aggregateId);

            Assert.NotNull(note);
            Assert.Equal("Changed Note", note.Title);
            Assert.Equal(2, ((IAggregateRoot)note).Version);
        }
Example #23
0
        public void create_and_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title = "Changed Note"
            };
            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
Example #24
0
        public void command_sync_execute_timeout_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId   = aggregateId,
                Title             = "Sample Note",
                SleepMilliseconds = 5000
            };

            //执行创建聚合根的命令
            var isTimeout = false;

            try
            {
                var commandResult = _commandService.Execute(command, 3000);
            }
            catch (CommandExecuteTimeoutException)
            {
                isTimeout = true;
            }
            Assert.IsTrue(isTimeout);
        }
Example #25
0
        public void create_concurrent_conflict_and_then_update_many_times_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var commandId   = ObjectId.GenerateNewStringId();

            //往EventStore直接插入事件,用于模拟并发冲突的情况
            var eventStream = new DomainEventStream(
                commandId,
                aggregateId,
                typeof(TestAggregate).FullName,
                1,
                DateTime.Now,
                new IDomainEvent[] { new TestAggregateTitleChanged("Note Title")
                                     {
                                         AggregateRootId = aggregateId, Version = 1
                                     } },
                null);
            var result = _eventStore.AppendAsync(eventStream).Result;

            Assert.IsNotNull(result);
            Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
            Assert.AreEqual(EventAppendResult.Success, result.Data);
            _logger.Info("----create_concurrent_conflict_and_then_update_many_times_test, _eventStore.AppendAsync success");

            var result2 = _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 1).Result;

            Assert.IsNotNull(result2);
            Assert.AreEqual(AsyncTaskStatus.Success, result2.Status);
            _logger.Info("----create_concurrent_conflict_and_then_update_many_times_test, UpdatePublishedVersionAsync success");

            //执行创建聚合根的命令
            var command = new CreateTestAggregateCommand
            {
                Id = commandId,
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };
            var asyncResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            _logger.Info("----create_concurrent_conflict_and_then_update_many_times_test, _commandService.ExecuteAsync create success");

            var commandList = new List <ICommand>();

            for (var i = 0; i < 50; i++)
            {
                commandList.Add(new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Changed Note Title"
                });
            }

            var waitHandle = new ManualResetEvent(false);
            var count      = 0L;

            foreach (var updateCommand in commandList)
            {
                _commandService.ExecuteAsync(updateCommand).ContinueWith(t =>
                {
                    Assert.IsNotNull(t.Result);
                    Assert.AreEqual(AsyncTaskStatus.Success, t.Result.Status);
                    var updateCommandResult = t.Result.Data;
                    Assert.IsNotNull(updateCommandResult);
                    Assert.AreEqual(CommandStatus.Success, updateCommandResult.Status);
                    var totalCount = Interlocked.Increment(ref count);
                    _logger.InfoFormat("----create_concurrent_conflict_and_then_update_many_times_test, updateCommand finished, count: {0}", totalCount);
                    if (totalCount == commandList.Count)
                    {
                        waitHandle.Set();
                    }
                });
            }
            waitHandle.WaitOne();
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual(commandList.Count + 1, ((IAggregateRoot)note).Version);
        }
        public void update_concurrent_conflict_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var commandResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //往EventStore直接插入事件,用于模拟并发冲突的情况
            var eventStream = new DomainEventStream(
                ObjectId.GenerateNewStringId(),
                aggregateId,
                typeof(TestAggregate).FullName,
                DateTime.Now,
                new IDomainEvent[] { new TestAggregateTitleChanged("Changed Title")
                                     {
                                         AggregateRootId = aggregateId, Version = 2
                                     } },
                null);
            var result = _eventStore.BatchAppendAsync(new DomainEventStream[] { eventStream }).Result;

            Assert.IsNotNull(result);
            Assert.AreEqual(aggregateId, result.SuccessAggregateRootIdList[0]);

            _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 2).Wait();

            var commandList = new List <ICommand>();

            for (var i = 0; i < 50; i++)
            {
                commandList.Add(new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Changed Note2"
                });
            }

            var waitHandle = new ManualResetEvent(false);
            var count      = 0L;

            foreach (var updateCommand in commandList)
            {
                _commandService.ExecuteAsync(updateCommand).ContinueWith(t =>
                {
                    Assert.IsNotNull(t.Result);
                    var currentCommandResult = t.Result;
                    Assert.IsNotNull(currentCommandResult);
                    Assert.AreEqual(CommandStatus.Success, currentCommandResult.Status);
                    var totalCount = Interlocked.Increment(ref count);
                    if (totalCount == commandList.Count)
                    {
                        waitHandle.Set();
                    }
                });
            }
            waitHandle.WaitOne();
            note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
            Assert.IsNotNull(note);
            Assert.AreEqual(2 + commandList.Count, ((IAggregateRoot)note).Version);
            Assert.AreEqual("Changed Note2", note.Title);
        }
Example #27
0
        public void update_concurrent_conflict_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command     = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;

            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;

            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get <TestAggregate>(aggregateId);

            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //往EventStore直接插入事件,用于模拟并发冲突的情况
            var eventStream = new DomainEventStream(
                ObjectId.GenerateNewStringId(),
                aggregateId,
                typeof(TestAggregate).FullName,
                2,
                DateTime.Now,
                new IDomainEvent[] { new TestAggregateTitleChanged("Changed Title")
                                     {
                                         AggregateRootId = aggregateId, Version = 2
                                     } },
                null);
            var result = _eventStore.AppendAsync(eventStream).Result;

            Assert.IsNotNull(result);
            Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
            Assert.AreEqual(EventAppendResult.Success, result.Data);

            var result2 = _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 2).Result;

            Assert.IsNotNull(result2);
            Assert.AreEqual(AsyncTaskStatus.Success, result2.Status);

            //执行修改聚合根的命令
            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title           = "Changed Note2"
            };

            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.Get <TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual(3, ((IAggregateRoot)note).Version);
            Assert.AreEqual("Changed Note2", note.Title);
        }
Example #28
0
        public void update_concurrent_conflict_not_enable_batch_insert_test()
        {
            _eventStore.SupportBatchAppendEvent = false;

            try
            {
                var aggregateId = ObjectId.GenerateNewStringId();
                var command = new CreateTestAggregateCommand
                {
                    AggregateRootId = aggregateId,
                    Title = "Sample Note"
                };

                //执行创建聚合根的命令
                var asyncResult = _commandService.ExecuteAsync(command).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                var commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);
                var note = _memoryCache.Get<TestAggregate>(aggregateId);
                Assert.IsNotNull(note);
                Assert.AreEqual("Sample Note", note.Title);
                Assert.AreEqual(1, ((IAggregateRoot)note).Version);

                //往EventStore直接插入事件,用于模拟并发冲突的情况
                var eventStream = new DomainEventStream(
                    ObjectId.GenerateNewStringId(),
                    aggregateId,
                    typeof(TestAggregate).FullName,
                    2,
                    DateTime.Now,
                    new IDomainEvent[] { new TestAggregateTitleChanged("Changed Title") { AggregateRootId = aggregateId, Version = 2 } },
                    null);
                var result = _eventStore.AppendAsync(eventStream).Result;
                Assert.IsNotNull(result);
                Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                Assert.AreEqual(EventAppendResult.Success, result.Data);

                var result2 = _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 2).Result;
                Assert.IsNotNull(result2);
                Assert.AreEqual(AsyncTaskStatus.Success, result2.Status);

                //执行修改聚合根的命令
                var command2 = new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title = "Changed Note2"
                };
                asyncResult = _commandService.ExecuteAsync(command2).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);
                note = _memoryCache.Get<TestAggregate>(aggregateId);
                Assert.IsNotNull(note);
                Assert.AreEqual(3, ((IAggregateRoot)note).Version);
                Assert.AreEqual("Changed Note2", note.Title);
            }
            finally
            {
                _eventStore.SupportBatchAppendEvent = true;
            }
        }
Example #29
0
        public void create_concurrent_conflict_and_then_update_many_times_not_enable_batch_insert_test()
        {
            _eventStore.SupportBatchAppendEvent = false;

            try
            {
                var aggregateId = ObjectId.GenerateNewStringId();
                var commandId = ObjectId.GenerateNewStringId();

                //往EventStore直接插入事件,用于模拟并发冲突的情况
                var eventStream = new DomainEventStream(
                    commandId,
                    aggregateId,
                    typeof(TestAggregate).FullName,
                    1,
                    DateTime.Now,
                    new IDomainEvent[] { new TestAggregateTitleChanged("Note Title") { AggregateRootId = aggregateId, Version = 1 } },
                    null);
                var result = _eventStore.AppendAsync(eventStream).Result;
                Assert.IsNotNull(result);
                Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                Assert.AreEqual(EventAppendResult.Success, result.Data);

                var result2 = _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 1).Result;
                Assert.IsNotNull(result2);
                Assert.AreEqual(AsyncTaskStatus.Success, result2.Status);

                //执行创建聚合根的命令
                var command = new CreateTestAggregateCommand
                {
                    Id = commandId,
                    AggregateRootId = aggregateId,
                    Title = "Sample Note"
                };
                var asyncResult = _commandService.ExecuteAsync(command).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                var commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);

                var commandList = new List<ICommand>();
                for (var i = 0; i < 5000; i++)
                {
                    commandList.Add(new ChangeTestAggregateTitleCommand
                    {
                        AggregateRootId = aggregateId,
                        Title = "Changed Note Title"
                    });
                }

                var waitHandle = new ManualResetEvent(false);
                var count = 0L;
                foreach (var updateCommand in commandList)
                {
                    _commandService.ExecuteAsync(updateCommand).ContinueWith(t =>
                    {
                        Assert.IsNotNull(t.Result);
                        Assert.AreEqual(AsyncTaskStatus.Success, t.Result.Status);
                        var updateCommandResult = t.Result.Data;
                        Assert.IsNotNull(updateCommandResult);
                        Assert.AreEqual(CommandStatus.Success, updateCommandResult.Status);
                        var totalCount = Interlocked.Increment(ref count);
                        if (totalCount == commandList.Count)
                        {
                            waitHandle.Set();
                        }
                    });
                }
                waitHandle.WaitOne();
                var note = _memoryCache.Get<TestAggregate>(aggregateId);
                Assert.IsNotNull(note);
                Assert.AreEqual(commandList.Count + 1, ((IAggregateRoot)note).Version);
            }
            finally
            {
                _eventStore.SupportBatchAppendEvent = true;
            }
        }
Example #30
0
        public void aggregate_throw_exception_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            _commandService.ExecuteAsync(command).Wait();

            var command1 = new AggregateThrowExceptionCommand
            {
                AggregateRootId = aggregateId,
                PublishableException = false
            };
            var asyncResult = _commandService.ExecuteAsync(command1).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);

            var command2 = new AggregateThrowExceptionCommand
            {
                AggregateRootId = aggregateId,
                PublishableException = true
            };
            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
        }
Example #31
0
        public void change_multiple_aggregates_test()
        {
            var command1 = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note1"
            };
            _commandService.ExecuteAsync(command1).Wait();

            var command2 = new CreateTestAggregateCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                Title = "Sample Note2"
            };
            _commandService.ExecuteAsync(command2).Wait();

            var command3 = new ChangeMultipleAggregatesCommand
            {
                AggregateRootId = ObjectId.GenerateNewStringId(),
                AggregateRootId1 = command1.AggregateRootId,
                AggregateRootId2 = command2.AggregateRootId
            };
            var asyncResult = _commandService.ExecuteAsync(command3).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
        }
Example #32
0
        public void create_concurrent_conflict_not_enable_batch_insert_test()
        {
            _eventStore.SupportBatchAppendEvent = false;

            try
            {
                var aggregateId = ObjectId.GenerateNewStringId();
                var commandId   = ObjectId.GenerateNewStringId();

                //往EventStore直接插入事件,用于模拟并发冲突的情况
                var eventStream = new DomainEventStream(
                    commandId,
                    aggregateId,
                    typeof(TestAggregate).FullName,
                    1,
                    DateTime.Now,
                    new IDomainEvent[] { new TestAggregateTitleChanged("Note Title")
                                         {
                                             AggregateRootId = aggregateId, Version = 1
                                         } },
                    null);
                var result = _eventStore.AppendAsync(eventStream).Result;
                Assert.IsNotNull(result);
                Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                Assert.AreEqual(EventAppendResult.Success, result.Data);
                var result2 = _publishedVersionStore.UpdatePublishedVersionAsync("DefaultEventProcessor", typeof(TestAggregate).FullName, aggregateId, 1).Result;
                Assert.IsNotNull(result2);
                Assert.AreEqual(AsyncTaskStatus.Success, result2.Status);

                //执行创建聚合根的命令
                var command = new CreateTestAggregateCommand
                {
                    AggregateRootId = aggregateId,
                    Title           = "Sample Note"
                };
                var asyncResult = _commandService.ExecuteAsync(command).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                var commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Failed, commandResult.Status);
                Assert.AreEqual("Duplicate aggregate creation.", commandResult.Result);
                var note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
                Assert.IsNotNull(note);
                Assert.AreEqual("Note Title", note.Title);
                Assert.AreEqual(1, ((IAggregateRoot)note).Version);

                //执行创建聚合根的命令
                command = new CreateTestAggregateCommand
                {
                    Id = commandId,
                    AggregateRootId = aggregateId,
                    Title           = "Sample Note"
                };
                asyncResult = _commandService.ExecuteAsync(command).Result;
                Assert.IsNotNull(asyncResult);
                Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
                commandResult = asyncResult.Data;
                Assert.IsNotNull(commandResult);
                Assert.AreEqual(CommandStatus.Success, commandResult.Status);
                note = _memoryCache.GetAsync <TestAggregate>(aggregateId).Result;
                Assert.IsNotNull(note);
                Assert.AreEqual("Note Title", note.Title);
                Assert.AreEqual(1, ((IAggregateRoot)note).Version);
            }
            finally
            {
                _eventStore.SupportBatchAppendEvent = true;
            }
        }
Example #33
0
        public void command_sync_execute_timeout_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note",
                SleepMilliseconds = 5000
            };

            //执行创建聚合根的命令
            var isTimeout = false;
            try
            {
                var commandResult = _commandService.Execute(command, 3000);
            }
            catch (CommandExecuteTimeoutException)
            {
                isTimeout = true;
            }
            Assert.IsTrue(isTimeout);
        }
Example #34
0
        public void duplicate_update_aggregate_command_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command1 = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            //先创建一个聚合根
            var status = _commandService.ExecuteAsync(command1).Result.Data.Status;
            Assert.AreEqual(CommandStatus.Success, status);

            var command2 = new ChangeTestAggregateTitleCommand
            {
                AggregateRootId = aggregateId,
                Title = "Changed Note"
            };

            //执行修改聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command2, CommandReturnType.EventHandled).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);

            //在重复执行该命令
            asyncResult = _commandService.ExecuteAsync(command2).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Changed Note", note.Title);
            Assert.AreEqual(2, ((IAggregateRoot)note).Version);
        }
Example #35
0
        public void create_and_concurrent_update_aggregate_test()
        {
            var aggregateId = ObjectId.GenerateNewStringId();
            var command = new CreateTestAggregateCommand
            {
                AggregateRootId = aggregateId,
                Title = "Sample Note"
            };

            //执行创建聚合根的命令
            var asyncResult = _commandService.ExecuteAsync(command).Result;
            Assert.IsNotNull(asyncResult);
            Assert.AreEqual(AsyncTaskStatus.Success, asyncResult.Status);
            var commandResult = asyncResult.Data;
            Assert.IsNotNull(commandResult);
            Assert.AreEqual(CommandStatus.Success, commandResult.Status);
            var note = _memoryCache.Get<TestAggregate>(aggregateId);
            Assert.IsNotNull(note);
            Assert.AreEqual("Sample Note", note.Title);
            Assert.AreEqual(1, ((IAggregateRoot)note).Version);

            //并发执行修改聚合根的命令
            var totalCount = 100;
            var finishedCount = 0;
            var waitHandle = new ManualResetEvent(false);
            for (var i = 0; i < totalCount; i++)
            {
                var updateCommand = new ChangeTestAggregateTitleCommand
                {
                    AggregateRootId = aggregateId,
                    Title = "Changed Note"
                };
                _commandService.ExecuteAsync(updateCommand).ContinueWith(t =>
                {
                    var result = t.Result;
                    Assert.IsNotNull(result);
                    Assert.AreEqual(AsyncTaskStatus.Success, result.Status);
                    Assert.IsNotNull(result.Data);
                    Assert.AreEqual(CommandStatus.Success, result.Data.Status);

                    var current = Interlocked.Increment(ref finishedCount);
                    if (current == totalCount)
                    {
                        note = _memoryCache.Get<TestAggregate>(aggregateId);
                        Assert.IsNotNull(note);
                        Assert.AreEqual("Changed Note", note.Title);
                        Assert.AreEqual(totalCount + 1, ((IAggregateRoot)note).Version);
                        waitHandle.Set();
                    }
                });
            }
            waitHandle.WaitOne();
        }