Example #1
0
        public override ExpectedTrace GetExpectedTrace()
        {
            this.ResetForValidation();

            OrderedTraces orderedTrace = new OrderedTraces();
            Outcome       outcome      = _activity.GetTrace(orderedTrace);
            ExpectedTrace baseTrace    = new ExpectedTrace(orderedTrace);

            baseTrace.AddIgnoreTypes(typeof(WorkflowExceptionTrace));
            baseTrace.AddIgnoreTypes(typeof(WorkflowAbortedTrace));
            baseTrace.AddIgnoreTypes(typeof(SynchronizeTrace));
            baseTrace.AddIgnoreTypes(typeof(BookmarkResumptionTrace));

            bool compensate = outcome.DefaultPropogationState != OutcomeState.Completed;

            foreach (Directive directive in this.CompensationHint)
            {
                TestActivity target = _activity.FindChildActivity(directive.Name);

                if (compensate)
                {
                    target.GetCompensationTrace(baseTrace.Trace);
                }
                else
                {
                    target.GetConfirmationTrace(baseTrace.Trace);
                }
            }

            return(baseTrace);
        }
        private void RunTestWithWorkflowRuntime(TestActivity activity)
        {
            using (TestWorkflowRuntime testWorkflowRuntime = TestRuntime.CreateTestWorkflowRuntime(activity))
            {
                testWorkflowRuntime.OnWorkflowCompleted += new EventHandler <TestWorkflowCompletedEventArgs>(workflowInstance_Completed);
                testWorkflowRuntime.ExecuteWorkflow();

                WorkflowTrackingWatcher watcher = testWorkflowRuntime.GetWatcher();
                OrderedTraces           orderedExpectedTrace = new OrderedTraces
                {
                    Steps =
                    {
                        new WorkflowInstanceTrace(testWorkflowRuntime.CurrentWorkflowInstanceId, WorkflowInstanceState.Started),
                        new WorkflowInstanceTrace(testWorkflowRuntime.CurrentWorkflowInstanceId, WorkflowInstanceState.Terminated),
                        new WorkflowInstanceTrace(testWorkflowRuntime.CurrentWorkflowInstanceId, WorkflowInstanceState.Deleted)
                        {
                            Optional = true
                        }
                    }
                };

                ExpectedTrace expectedWorkflowInstacneTrace = new ExpectedTrace(orderedExpectedTrace);

                Exception exp = new Exception();
                testWorkflowRuntime.WaitForTerminated(1, out exp, watcher.ExpectedTraces, expectedWorkflowInstacneTrace);
            }
        }
Example #3
0
 protected override void GetActivitySpecificTrace(TraceGroup traceGroup)
 {
     if (_textExpressionType == ExpressionType.Activity)
     {
         OrderedTraces orderedTraceGroup = new OrderedTraces();
         CurrentOutcome = _testExpressionActivity.GetTrace(orderedTraceGroup);
         traceGroup.Steps.Add(orderedTraceGroup);
     }
 }
Example #4
0
        public virtual ExpectedTrace GetExpectedTrace()
        {
            this.ResetForValidation();

            OrderedTraces orderedTrace = new OrderedTraces();

            GetTrace(orderedTrace);
            ExpectedTrace expected = new ExpectedTrace(orderedTrace);

            AddIgnoreTypes(expected);
            return(expected);
        }
Example #5
0
        public void WhileWithExceptionFromCondition()
        {
            //  Test case description:
            //  Throw exception in while and in while condition

            TestSequence     outerSequence = new TestSequence("sequence1");
            TestSequence     innerSequence = new TestSequence("Seq");
            TestAssign <int> increment     = new TestAssign <int>("Increment Counter");
            Variable <int>   counter       = VariableHelper.CreateInitialized <int>("counter", 0);

            TestWhile whileAct = new TestWhile("while act")
            {
                Body = innerSequence,
                HintIterationCount = 10,
            };

            ExceptionThrowingActivitiy <bool> throwFromCondition = new ExceptionThrowingActivitiy <bool>();

            ((Microsoft.CoreWf.Statements.While)whileAct.ProductActivity).Condition = throwFromCondition;
            increment.ToVariable      = counter;
            increment.ValueExpression = ((env) => (((int)counter.Get(env))) + 1);
            innerSequence.Activities.Add(increment);
            outerSequence.Variables.Add(counter);
            outerSequence.Activities.Add(whileAct);
            OrderedTraces trace = new OrderedTraces();

            trace.Steps.Add(new ActivityTrace(outerSequence.DisplayName, ActivityInstanceState.Executing));
            trace.Steps.Add(new ActivityTrace(whileAct.DisplayName, ActivityInstanceState.Executing));

            OrderedTraces   ordered   = new OrderedTraces();
            UnorderedTraces unordered = new UnorderedTraces();

            unordered.Steps.Add(ordered);
            unordered.Steps.Add(new ActivityTrace(throwFromCondition.DisplayName, ActivityInstanceState.Executing));
            unordered.Steps.Add(new ActivityTrace(throwFromCondition.DisplayName, ActivityInstanceState.Faulted));
            trace.Steps.Add(unordered);

            ExpectedTrace expected = new ExpectedTrace(trace);

            expected.AddIgnoreTypes(typeof(WorkflowAbortedTrace));
            expected.AddIgnoreTypes(typeof(SynchronizeTrace));

            Exception           exc;
            TestWorkflowRuntime tr = TestRuntime.CreateTestWorkflowRuntime(outerSequence);

            tr.CreateWorkflow();
            tr.ResumeWorkflow();
            tr.WaitForAborted(out exc, expected);

            Assert.True((exc.GetType() == typeof(DataMisalignedException)) && exc.Message == "I am Miss.Aligned!");
        }
Example #6
0
        //
        // Example hint list describing 3 branches and the order of processing for CA's on each Branch
        // { Branch, CA2, CA1, Branch, CA3, Branch, CA6, CA5, CA4 }
        //

        private void ProcessCompensationHints(IList <Directive> hints, string defaultAction, TraceGroup traceGroup)
        {
            // A splited flowchart Confirmation/Compensation are collections of unordered branch traces
            // (similar to Parallel)
            UnorderedTraces unordered = new UnorderedTraces();

            OrderedTraces ordered = null;

            foreach (Directive directive in hints)
            {
                // If we encounter a Branch directive that means we need to start a new OrderedTraces group
                if (directive.Name == "Branch")
                {
                    if (ordered != null)             // Already had one, so add it to our collection before we create a new one
                    {
                        if (ordered.Steps.Count > 0) // There's a chance we didn't produce any output
                        {
                            unordered.Steps.Add(ordered);
                        }
                    }

                    ordered = new OrderedTraces();
                }
                else
                {
                    TestActivity target = FindChildActivity(directive.Name);

                    TestCompensableActivity.ProcessDirective(target, directive, defaultAction, traceGroup);
                }
            }

            // Was there one left over? (From the last branch directive)
            if (ordered != null)
            {
                if (ordered.Steps.Count > 0) // There's a chance we didn't produce any output
                {
                    unordered.Steps.Add(ordered);
                }
            }

            if (unordered.Steps.Count > 0)
            {
                traceGroup.Steps.Add(unordered);
            }
        }
Example #7
0
        protected override void GetActivitySpecificTrace(Test.Common.TestObjects.Utilities.Validation.TraceGroup traceGroup)
        {
            UnorderedTraces parallelTraceGroup = null;

            Outcome outcome = Outcome.Completed;

            parallelTraceGroup = new UnorderedTraces();
            foreach (TestPickBranch branch in this.Branches)
            {
                // Each Branch is Ordered with respect to itself (like normal)
                OrderedTraces branchTraceGroup = new OrderedTraces();

                Outcome bOutcome = branch.GetTriggerTrace(branchTraceGroup);

                if (bOutcome.GetType() != typeof(Outcome))
                {
                    outcome = bOutcome;
                }


                parallelTraceGroup.Steps.Add(branchTraceGroup);
            }
            traceGroup.Steps.Add(parallelTraceGroup);

            parallelTraceGroup = new UnorderedTraces();
            foreach (TestPickBranch branch in this.Branches)
            {
                // Each Branch is Ordered with respect to itself (like normal)
                OrderedTraces branchTraceGroup = new OrderedTraces();

                Outcome bOutcome = branch.GetActionTrace(branchTraceGroup);

                if (bOutcome != null && bOutcome.GetType() != typeof(Outcome))
                {
                    outcome = bOutcome;
                }

                parallelTraceGroup.Steps.Add(branchTraceGroup);
            }
            traceGroup.Steps.Add(parallelTraceGroup);

            this.CurrentOutcome = outcome;
        }
        public static OrderedTraces GetTraces(Outcome expectedOutcome, String name)
        {
            OrderedTraces ot = new OrderedTraces()
            {
                Optional = true
            };

            ot.Steps.Add(new ActivityTrace(name, ActivityInstanceState.Executing)
            {
                Optional = true
            });

            switch (expectedOutcome.DefaultPropogationState)
            {
            case OutcomeState.Completed:
                ot.Steps.Add(new ActivityTrace(name, ActivityInstanceState.Closed)
                {
                    Optional = true
                });
                break;

            case OutcomeState.Canceled:
                ot.Steps.Add(new ActivityTrace(name, ActivityInstanceState.Canceled)
                {
                    Optional = true
                });
                break;

            case OutcomeState.Faulted:
                ot.Steps.Add(new ActivityTrace(name, ActivityInstanceState.Faulted)
                {
                    Optional = true
                });
                break;

            default:
                break;
            }

            return(ot);
        }
        private void WaitForTerminationHelper(TestWorkflowRuntime testWorkflowRuntime)
        {
            WorkflowTrackingWatcher watcher = testWorkflowRuntime.GetWatcher();
            OrderedTraces           orderedExpectedTrace = new OrderedTraces
            {
                Steps =
                {
                    new WorkflowInstanceTrace(testWorkflowRuntime.CurrentWorkflowInstanceId, WorkflowInstanceState.Started),
                    new WorkflowInstanceTrace(testWorkflowRuntime.CurrentWorkflowInstanceId, WorkflowInstanceState.Terminated),
                    new WorkflowInstanceTrace(testWorkflowRuntime.CurrentWorkflowInstanceId, WorkflowInstanceState.Deleted)
                    {
                        Optional = true
                    }
                }
            };

            ExpectedTrace expectedWorkflowInstacneTrace = new ExpectedTrace(orderedExpectedTrace);

            Exception exp = new Exception();

            testWorkflowRuntime.WaitForTerminated(1, out exp, watcher.ExpectedTraces, expectedWorkflowInstacneTrace);
        }
Example #10
0
        protected override void GetActivitySpecificTrace(TraceGroup traceGroup)
        {
            UnorderedTraces parallelTraceGroup = new UnorderedTraces();

            if (this.HintIterationCount < 0 && _values == null)
            {
                return;
            }

            if (this.HintIterationCount < 0 && _values != null)
            {
                this.HintIterationCount = _values.Count <T>();
            }

            if (_valuesActivity != null)
            {
                Outcome conditionOutcome = _valuesActivity.GetTrace(traceGroup);

                if (conditionOutcome.DefaultPropogationState != OutcomeState.Completed)
                {
                    // propogate the unknown outcome upwards
                    this.CurrentOutcome = conditionOutcome;
                }
            }

            if (this.Body != null)
            {
                Outcome outc;

                for (int i = 1; i < _values.Count <T>() + 1; i++)
                {
                    OrderedTraces orderedTraceGroup = new OrderedTraces();

                    if (HintIterationCount < i)
                    {
                        TestDummyTraceActivity tdt = new TestDummyTraceActivity(Body.DisplayName)
                        {
                            ExpectedOutcome = Outcome.Canceled
                        };
                        tdt.GetTrace(orderedTraceGroup);
                    }
                    else
                    {
                        outc = this.Body.GetTrace(orderedTraceGroup);
                        if (this.ProductParallelForEach.CompletionCondition != null && outc.DefaultPropogationState != OutcomeState.Canceled)
                        {
                            TestDummyTraceActivity condition = new TestDummyTraceActivity(this.ProductParallelForEach.CompletionCondition, ConditionOutcome);
                            CurrentOutcome = condition.GetTrace(orderedTraceGroup);
                        }
                        if (outc.DefaultPropogationState != OutcomeState.Completed)
                        {
                            CurrentOutcome = outc;
                        }
                    }


                    parallelTraceGroup.Steps.Add(orderedTraceGroup);
                }

                traceGroup.Steps.Add(parallelTraceGroup);
            }
        }
Example #11
0
        protected override void GetActivitySpecificTrace(TraceGroup traceGroup)
        {
            // Parallel is a collection of unordered branches
            UnorderedTraces parallelTraceGroup = new UnorderedTraces();

            bool oneCompleted = false;
            int  index        = 0;

            foreach (TestActivity branch in _branches)
            {
                // Each Branch is Ordered with respect to itself (like normal)
                OrderedTraces branchTraceGroup = new OrderedTraces();

                if (_numberOfBranchesExecution == index)
                {
                    // so if we have gone past the hint
                    if (branch.ExpectedOutcome.DefaultPropogationState == OutcomeState.Completed)
                    {
                        TestDummyTraceActivity tdt = new TestDummyTraceActivity(branch.DisplayName)
                        {
                            ExpectedOutcome = Outcome.Canceled
                        };
                        tdt.GetTrace(branchTraceGroup);
                    }
                }
                else
                {
                    index++;

                    Outcome bOutcome = branch.GetTrace(branchTraceGroup);
                    if (bOutcome.DefaultPropogationState == OutcomeState.Completed)
                    {
                        oneCompleted = true;

                        if (this.ProductParallel.CompletionCondition != null)
                        {
                            if (_expressionActivity != null)
                            {
                                CurrentOutcome = _expressionActivity.GetTrace(branchTraceGroup);
                            }
                            else
                            {
                                TestDummyTraceActivity tdt = new TestDummyTraceActivity(this.ProductParallel.CompletionCondition, Outcome.Completed);
                                CurrentOutcome = tdt.GetTrace(branchTraceGroup);
                            }
                        }
                    }
                    else if (CurrentOutcome.IsOverrideable)
                    {
                        CurrentOutcome = bOutcome;
                    }
                }

                parallelTraceGroup.Steps.Add(branchTraceGroup);
            }

            // If there's at least one good branch and the CompletionCondition is true, we probably succeeded
            if (oneCompleted && _completionCondition)
            {
                this.CurrentOutcome = Outcome.Completed;
            }

            traceGroup.Steps.Add(parallelTraceGroup);
        }
Example #12
0
        public void ParallelForEachWithAChildThatOverridesCancelAndCompletionConditionIsTrue()
        {
            Variable <bool> cancelIt = new Variable <bool> {
                Name = "cancelIt", Default = false
            };
            DelegateInArgument <bool> arg = new DelegateInArgument <bool>("arg");

            TestParallelForEach <bool> pfeAct = new TestParallelForEach <bool>
            {
                DisplayName                 = "ParallelForEach1",
                HintIterationCount          = 2,
                HintValues                  = new bool[] { true, false },
                ValuesExpression            = (e => new bool[] { true, false }),
                CurrentVariable             = arg,
                CompletionConditionVariable = cancelIt,
                Body = new TestIf(HintThenOrElse.Then, HintThenOrElse.Else)
                {
                    DisplayName         = "If1",
                    ConditionExpression = e => arg.Get(e),
                    ThenActivity        = new TestBlockingActivityWithWriteLineInCancel("writeLineInCancel", OutcomeState.Completed)
                    {
                        ExpectedOutcome = new Outcome(OutcomeState.Completed, OutcomeState.Canceled),
                    },
                    ElseActivity = new TestSequence
                    {
                        DisplayName = "Sequence2",
                        Activities  =
                        {
                            new TestDelay("d1", new TimeSpan(1)),
                            new TestAssign <bool> {
                                DisplayName = "Assign1",Value = true,    ToVariable       = cancelIt
                            }
                        }
                    }
                },
            };

            TestSequence root = new TestSequence
            {
                DisplayName = "Sequence1",
                Activities  = { pfeAct },
                Variables   = { cancelIt },
            };

            OrderedTraces ordered = new OrderedTraces()
            {
                Steps =
                {
                    new ActivityTrace("Sequence1",                              ActivityInstanceState.Executing),
                    new ActivityTrace("ParallelForEach1",                       ActivityInstanceState.Executing),
                    new UnorderedTraces
                    {
                        Steps =
                        {
                            new OrderedTraces()
                            {
                                Steps =
                                {
                                    new ActivityTrace("If1",               ActivityInstanceState.Executing),
                                    new ActivityTrace("writeLineInCancel", ActivityInstanceState.Executing),
                                    new ActivityTrace("w1",                ActivityInstanceState.Executing),
                                    new ActivityTrace("w1",                ActivityInstanceState.Closed),
                                    new ActivityTrace("writeLineInCancel", ActivityInstanceState.Closed),
                                    new ActivityTrace("If1",               ActivityInstanceState.Closed),
                                }
                            },
                            new OrderedTraces()
                            {
                                Steps =
                                {
                                    new ActivityTrace("If1",                    ActivityInstanceState.Executing),
                                    new ActivityTrace("Sequence2",              ActivityInstanceState.Executing),
                                    new ActivityTrace("d1",                     ActivityInstanceState.Executing),
                                    new ActivityTrace("d1",                     ActivityInstanceState.Closed),
                                    new ActivityTrace("Assign1",                ActivityInstanceState.Executing),
                                    new ActivityTrace("Assign1",                ActivityInstanceState.Closed),
                                    new ActivityTrace("Sequence2",              ActivityInstanceState.Closed),
                                    new ActivityTrace("If1",                    ActivityInstanceState.Closed),
                                    new ActivityTrace("VariableValue<Boolean>", ActivityInstanceState.Executing),
                                    new ActivityTrace("VariableValue<Boolean>", ActivityInstanceState.Closed),
                                }
                            }
                        }
                    },
                    new ActivityTrace("ParallelForEach1",                       ActivityInstanceState.Closed),
                    new ActivityTrace("Sequence1",                              ActivityInstanceState.Closed),
                }
            };

            ExpectedTrace trace = new ExpectedTrace(ordered);

            trace.AddIgnoreTypes(typeof(SynchronizeTrace));
            trace.AddIgnoreTypes(typeof(BookmarkResumptionTrace));
            TestRuntime.RunAndValidateWorkflow(root, trace);
        }
Example #13
0
        protected override void GetActivitySpecificTrace(TraceGroup traceGroup)
        {
            // To support PartialTrust, StateMachineEventManagerFactory activity is used in Variable<StateMachineEventManager>.Default
            // The code below generates the expected trace for StateMachineEventManagerFactory activity
            new TestDummyTraceActivity("StateMachineEventManagerFactory").GetTrace(traceGroup);

            Stack <TestStateMachineState> stack = new Stack <TestStateMachineState>();

            // get trace for initial state
            TestTransition fakeInitialTransition = new TestTransition("fakeinitial")
            {
                To = this.InitialState
            };

            Outcome    outcome = this.ExpectedOutcome;
            TraceGroup ordered = new OrderedTraces();

            traceGroup.Steps.Add(ordered);

            TestStateMachineState currentState = null;
            TestTransition        t            = fakeInitialTransition;

            while (t != null && t.To != null && t.To.IsFinal != true)
            {
                TestTransition nextTransition = null;
                currentState = t.To;

                OrderedTraces stateTrace = new OrderedTraces();
                ordered.Steps.Add(stateTrace);
                // keep HintTransition in nextTransition, because TestStateMachineState.GetTrace increases TestStateMachineState.iterationNumber
                nextTransition = currentState.HintTransition;
                outcome        = currentState.GetTrace(stateTrace, t);

                if (CurrentOutcome.IsOverrideable)
                {
                    CurrentOutcome = outcome.Propogate();
                }

                if (CurrentOutcome.DefaultPropogationState != OutcomeState.Completed)
                {
                    break;
                }

                t = nextTransition;
            }

            if (t == null || t.To == null)
            {
                throw new InvalidOperationException("Invalid HintTransition: null");
            }
            else if (CurrentOutcome.DefaultPropogationState == OutcomeState.Completed)
            {
                if (t.To.IsFinal == true)
                {
                    outcome = t.To.GetTrace(traceGroup, null);
                    if (CurrentOutcome.IsOverrideable)
                    {
                        CurrentOutcome = outcome.Propogate();
                    }
                }
                else
                {
                    throw new InvalidOperationException(string.Format("Invalid HintTransition: {0}", t.To.DisplayName));
                }
            }
            // faulting and cancellation will be handled by TestActivity
        }