public void HandleWorkflowException_SingleInstanceRetryIntervalLengthNotExceeded_SleepsForSpecifiedTime(int lastRetryInterval, int retryCount)
        {
            BrokenWorkflow workflow = new BrokenWorkflow(BrokenWorkflow.State.Start);

            workflow.CreatedOn        = DateTime.UtcNow.AddMinutes(-2);
            workflow.ResumeTrigger    = BasicWorkflow.Trigger.DoStuff.ToString();
            workflow.RetryIntervals   = new int[] { 2, 5, lastRetryInterval };
            workflow.RetryCount       = retryCount;
            workflow.IsSingleInstance = true;

            Exception ex = new Exception("Dummy exception");

            // execute
            IWorkflowExceptionHandler exceptionHandler = new WorkflowExceptionHandler();

            exceptionHandler.HandleWorkflowException(workflow, ex);
            Thread.Sleep(100);

            Assert.AreEqual(ex.ToString(), workflow.LastException);

            // we only have one retry interval on this workflow,
            Assert.IsTrue(workflow.ResumeOn > DateTime.UtcNow.AddSeconds(lastRetryInterval - 1));
            Assert.IsTrue(workflow.ResumeOn < DateTime.UtcNow.AddSeconds(lastRetryInterval + 10));
            Assert.IsFalse(workflow.IsSuspended);
        }
        public void HandleWorkflowException_RetryIntervalEmpty_ThrowsException(bool isSingleInstance)
        {
            BrokenWorkflow workflow = new BrokenWorkflow(BrokenWorkflow.State.Start);

            workflow.CreatedOn        = DateTime.UtcNow.AddMinutes(-2);
            workflow.ResumeTrigger    = BasicWorkflow.Trigger.DoStuff.ToString();
            workflow.RetryIntervals   = new int[] { };
            workflow.IsSingleInstance = isSingleInstance;

            // execute
            IWorkflowExceptionHandler exceptionHandler = new WorkflowExceptionHandler();
            TestDelegate del = () => exceptionHandler.HandleWorkflowException(workflow, new Exception("Dummy exception"));

            // assert
            Assert.Throws <WorkflowException>(del);
        }
        public void HandleMultipleInstanceWorkflowException_RetryCountExceeded_SuspendsWorkflow()
        {
            BrokenWorkflow workflow = new BrokenWorkflow(BrokenWorkflow.State.Start);
            workflow.CreatedOn = DateTime.UtcNow.AddMinutes(-2);
            workflow.ResumeTrigger = BrokenWorkflow.Trigger.DoStuff.ToString();
            workflow.RetryIntervals = new int[] { 10, 10, 10 };
            workflow.RetryCount = workflow.RetryIntervals.Length;

            Exception ex = new Exception("Dummy exception");

            // execute
            IWorkflowExceptionHandler exceptionHandler = new WorkflowExceptionHandler();
            exceptionHandler.HandleMultipleInstanceWorkflowException(workflow, ex);

            Assert.AreEqual(ex.ToString(), workflow.LastException);
            Assert.AreEqual(DateTime.MinValue, workflow.ResumeOn);
            Assert.IsTrue(workflow.IsSuspended);
        }
        public void HandleSingleInstanceWorkflowException_RetryIntervalLengthNotExceeded_SleepsForSpecifiedTime()
        {
            BrokenWorkflow workflow = new BrokenWorkflow(BrokenWorkflow.State.Start);
            workflow.CreatedOn = DateTime.UtcNow.AddMinutes(-2);
            workflow.ResumeTrigger = BasicWorkflow.Trigger.DoStuff.ToString();
            workflow.RetryIntervals = new int[] { 10, 10, 10 };

            Exception ex = new Exception("Dummy exception");

            // execute
            IWorkflowExceptionHandler exceptionHandler = new WorkflowExceptionHandler();
            exceptionHandler.HandleSingleInstanceWorkflowException(workflow, ex);
            Thread.Sleep(100);

            Assert.AreEqual(ex.ToString(), workflow.LastException);
            Assert.IsTrue(workflow.ResumeOn > DateTime.UtcNow);
            Assert.IsTrue(workflow.ResumeOn < DateTime.UtcNow.AddSeconds(10));
            Assert.IsFalse(workflow.IsSuspended);
        }
        public void HandleWorkflowException_MultipleInstanceRetryCountExceeded_SuspendsWorkflow()
        {
            BrokenWorkflow workflow = new BrokenWorkflow(BrokenWorkflow.State.Start);

            workflow.CreatedOn      = DateTime.UtcNow.AddMinutes(-2);
            workflow.ResumeTrigger  = BrokenWorkflow.Trigger.DoStuff.ToString();
            workflow.RetryIntervals = new int[] { 10, 10, 10 };
            workflow.RetryCount     = workflow.RetryIntervals.Length;

            Exception ex = new Exception("Dummy exception");

            // execute
            IWorkflowExceptionHandler exceptionHandler = new WorkflowExceptionHandler();

            exceptionHandler.HandleWorkflowException(workflow, ex);

            Assert.AreEqual(ex.ToString(), workflow.LastException);
            Assert.AreEqual(DateTime.MinValue, workflow.ResumeOn);
            Assert.IsTrue(workflow.IsSuspended);
        }
        public void HandleWorkflowException_MultipleInstanceRetryCountNotExceeded_SetsResumeOnToFuture()
        {
            BrokenWorkflow workflow = new BrokenWorkflow(BrokenWorkflow.State.Start);

            workflow.CreatedOn      = DateTime.UtcNow.AddMinutes(-2);
            workflow.ResumeTrigger  = BasicWorkflow.Trigger.DoStuff.ToString();
            workflow.RetryIntervals = new int[] { 10, 10, 10 };

            Exception ex = new Exception("Dummy exception");

            // execute
            IWorkflowExceptionHandler exceptionHandler = new WorkflowExceptionHandler();

            exceptionHandler.HandleWorkflowException(workflow, ex);
            Thread.Sleep(100);

            Assert.AreEqual(ex.ToString(), workflow.LastException);
            Assert.IsTrue(workflow.ResumeOn > DateTime.UtcNow);
            Assert.IsTrue(workflow.ResumeOn < DateTime.UtcNow.AddSeconds(10));
            Assert.IsFalse(workflow.IsSuspended);
        }