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); } }
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); } }