public static void VerifyWaitForDurableTasks(
            DurableTaskHandler durableTaskHandler,
            TimeSpan delayBeforeStopping,
            bool expectedWaitForStop,
            Action action
            )
        {
            // action() call may block until Stop is invoked from another thread.
            var thread = new Thread(() =>
            {
                Thread.Sleep(delayBeforeStopping);
                durableTaskHandler.Stop();
            });

            thread.Start();
            try
            {
                var elapsedMilliseconds = MeasureExecutionTimeInMilliseconds(action);

                if (expectedWaitForStop)
                {
                    Assert.True(elapsedMilliseconds > delayBeforeStopping.TotalMilliseconds * 0.8);
                }
                else
                {
                    Assert.True(elapsedMilliseconds < delayBeforeStopping.TotalMilliseconds * 0.2);
                }
            }
            finally
            {
                thread.Join();
            }
        }
 public static void EmulateStop(DurableTaskHandler durableTaskHandler)
 {
     // In the actual usage, Stop is supposed to be invoked from another thread.
     // However, in order to simplify tests and avoid spawning threads, waiting for
     // them to finish, and handling potentially non-deterministic behavior,
     // we cheat a little and invoke Stop _before_ invoking WaitAll/WaitAny,
     // just to let WaitAll/WaitAny finish soon.
     // The fact that WaitAll/WaitAny _actually_ blocks until Stop is invoked
     // is verified by dedicated tests.
     durableTaskHandler.Stop();
 }
        public void WaitAll_And_WaitAny_StartNewActivityBatch(bool invokeWaitAll, bool invokeWaitAny, int expectedNumberOfBatches)
        {
            var orchestrationContext = new OrchestrationContext {
                History = new HistoryEvent[0]
            };
            var durableTaskHandler = new DurableTaskHandler();

            durableTaskHandler.StopAndInitiateDurableTaskOrReplay(
                new ActivityInvocationTask("Function", "Input"),
                orchestrationContext,
                noWait: true,
                output: _ => {},
                onFailure: _ => {}
                );

            if (invokeWaitAll)
            {
                durableTaskHandler.Stop(); // just to avoid the next call getting stuck waiting for a stop event
                durableTaskHandler.WaitAll(new DurableTask[0], orchestrationContext, output: _ => {});
            }

            if (invokeWaitAny)
            {
                durableTaskHandler.Stop(); // just to avoid the next call getting stuck waiting for a stop event
                durableTaskHandler.WaitAny(new DurableTask[0], orchestrationContext, output: _ => {});
            }

            durableTaskHandler.StopAndInitiateDurableTaskOrReplay(
                new ActivityInvocationTask("Function", "Input"),
                orchestrationContext,
                noWait: true,
                output: _ => {},
                onFailure: _ => {}
                );

            var(_, actions) = orchestrationContext.OrchestrationActionCollector.WaitForActions(new AutoResetEvent(initialState: true));
            Assert.Equal(expectedNumberOfBatches, actions.Count);
        }
        public void StopAndInitiateDurableTaskOrReplay_AddsActivityBatch_UnlessNoWait(bool noWait, int numberOfActions, int expectedNumberOfBatches)
        {
            var orchestrationContext = new OrchestrationContext {
                History = new HistoryEvent[0]
            };
            var durableTaskHandler = new DurableTaskHandler();

            for (var i = 0; i < numberOfActions; ++i)
            {
                durableTaskHandler.Stop(); // just to avoid the next call getting stuck waiting for a stop event

                durableTaskHandler.StopAndInitiateDurableTaskOrReplay(
                    new ActivityInvocationTask("Function", "Input"),
                    orchestrationContext,
                    noWait: noWait,
                    output: _ => {},
                    onFailure: _ => {}
                    );
            }

            var(_, actions) = orchestrationContext.OrchestrationActionCollector.WaitForActions(new AutoResetEvent(initialState: true));
            Assert.Equal(expectedNumberOfBatches, actions.Count);
        }
コード例 #5
0
 protected override void StopProcessing()
 {
     _durableTaskHandler.Stop();
 }