Beispiel #1
0
        public async Task CanSuspendAndContinueExecution()
        {
            using (var uow = ObjectFactory.GetInstance <IUnitOfWork>())
            {
                PlanDO plan;

                uow.PlanRepository.Add(plan = new PlanDO
                {
                    Name       = "TestPlan",
                    Id         = FixtureData.GetTestGuidById(0),
                    ChildNodes =
                    {
                        new SubplanDO(true)
                        {
                            Id         = FixtureData.GetTestGuidById(1),
                            ChildNodes =
                            {
                                new ActivityDO()
                                {
                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                    Id       = FixtureData.GetTestGuidById(2),
                                    Ordering = 1
                                },

                                new ActivityDO()
                                {
                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                    Id       = FixtureData.GetTestGuidById(3),
                                    Ordering = 2
                                },
                                new ActivityDO()
                                {
                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                    Id       = FixtureData.GetTestGuidById(4),
                                    Ordering = 3
                                },
                            }
                        },
                    }
                });

                plan.PlanState       = PlanState.Executing;
                plan.StartingSubplan = (SubplanDO)plan.ChildNodes[0];

                var userAcct = FixtureData.TestUser1();
                uow.UserRepository.Add(userAcct);
                plan.Fr8Account = userAcct;

                uow.SaveChanges();

                ActivityService.CustomActivities[FixtureData.GetTestGuidById(3)] = new SuspenderActivityMock(CrateManager);

                await Plan.Run(plan.Id, null, null);

                Assert.AreEqual(State.Suspended, uow.ContainerRepository.GetQuery().Single(x => x.PlanId == plan.Id).State, "Invalid container state");
                AssertExecutionSequence(new[]
                {
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(2)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(3)),
                }, ActivityService.ExecutedActivities);

                await ContainerService.Continue(uow, uow.ContainerRepository.GetQuery().Single(x => x.PlanId == plan.Id));

                Assert.AreEqual(1, uow.ContainerRepository.GetQuery().Count(x => x.PlanId == plan.Id), "New container was stared");

                AssertExecutionSequence(new[]
                {
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(2)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(3)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(3)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(4)),
                }, ActivityService.ExecutedActivities);
            }
        }
Beispiel #2
0
        public async Task CanRecoverSequenceWithChildren()
        {
            using (var uow = ObjectFactory.GetInstance <IUnitOfWork>())
            {
                PlanDO plan;

                uow.PlanRepository.Add(plan = new PlanDO
                {
                    Name       = "TestPlan",
                    Id         = FixtureData.GetTestGuidById(0),
                    ChildNodes =
                    {
                        new SubplanDO(true)
                        {
                            Id         = FixtureData.GetTestGuidById(1),
                            ChildNodes =
                            {
                                new ActivityDO()
                                {
                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                    Id       = FixtureData.GetTestGuidById(2),
                                    Ordering = 1
                                },
                                new ActivityDO()
                                {
                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                    Id         = FixtureData.GetTestGuidById(3),
                                    Ordering   = 2,
                                    ChildNodes =
                                    {
                                        new ActivityDO()
                                        {
                                            ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                            Id       = FixtureData.GetTestGuidById(4),
                                            Ordering = 1
                                        },
                                        new ActivityDO()
                                        {
                                            ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                            Id       = FixtureData.GetTestGuidById(5),
                                            Ordering = 3
                                        },
                                        new ActivityDO()
                                        {
                                            ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                            Id         = FixtureData.GetTestGuidById(6),
                                            Ordering   = 4,
                                            ChildNodes =
                                            {
                                                new ActivityDO()
                                                {
                                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                                    Id       = FixtureData.GetTestGuidById(7),
                                                    Ordering = 1
                                                },
                                                new ActivityDO()
                                                {
                                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                                    Id       = FixtureData.GetTestGuidById(8),
                                                    Ordering = 2
                                                },
                                            }
                                        }
                                    }
                                },
                                new ActivityDO()
                                {
                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                    Id         = FixtureData.GetTestGuidById(9),
                                    Ordering   = 3,
                                    ChildNodes =
                                    {
                                        new ActivityDO()
                                        {
                                            ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                            Id       = FixtureData.GetTestGuidById(10),
                                            Ordering = 1
                                        },
                                        new ActivityDO()
                                        {
                                            ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                            Id       = FixtureData.GetTestGuidById(11),
                                            Ordering = 2
                                        },
                                    }
                                },
                                new ActivityDO()
                                {
                                    ActivityTemplateId = FixtureData.GetTestGuidById(1),
                                    Id       = FixtureData.GetTestGuidById(12),
                                    Ordering = 4
                                }
                            }
                        }
                    }
                });

                plan.PlanState       = PlanState.Executing;
                plan.StartingSubplan = (SubplanDO)plan.ChildNodes[0];

                ActivityService.CustomActivities[FixtureData.GetTestGuidById(4)] = new SuspenderActivityMock(CrateManager);

                var userAcct = FixtureData.TestUser1();
                uow.UserRepository.Add(userAcct);
                plan.Fr8Account = userAcct;

                uow.SaveChanges();

                await Plan.Run(plan.Id, null, null);

                var container = uow.ContainerRepository.GetQuery().Single(x => x.PlanId == plan.Id);

                using (var storage = CrateManager.UpdateStorage(() => container.CrateStorage))
                {
                    var opState = storage.CrateContentsOfType <OperationalStateCM>().First();

                    container.CurrentActivityId = opState.CallStack.TopFrame.NodeId;
                    opState.CallStack           = null;
                }

                uow.SaveChanges();

                ActivityService.CustomActivities.Remove(FixtureData.GetTestGuidById(4)); // we are not interested in suspender logic testing here. Just allow activity to run by default.
                await ContainerService.Continue(uow, container);

                AssertExecutionSequence(new[]
                {
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(2)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(3)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(4)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(4)), // second call is because of we've resumed execution
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(5)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(6)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(7)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(8)),
                    new ActivityExecutionCall(ActivityExecutionMode.ReturnFromChildren, FixtureData.GetTestGuidById(6)),
                    new ActivityExecutionCall(ActivityExecutionMode.ReturnFromChildren, FixtureData.GetTestGuidById(3)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(9)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(10)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(11)),
                    new ActivityExecutionCall(ActivityExecutionMode.ReturnFromChildren, FixtureData.GetTestGuidById(9)),
                    new ActivityExecutionCall(ActivityExecutionMode.InitialRun, FixtureData.GetTestGuidById(12)),
                }, ActivityService.ExecutedActivities);
            }
        }