public void StopAndInitiateDurableTaskOrReplay_UpdatesCurrentUtcDateTimeToNextOrchestratorStartedTimestamp_OnlyIfTimerCreatedAndFired(bool timerCreated, bool timerFired) { var history = DurableTestUtilities.MergeHistories( CreateOrchestratorStartedHistory(date: _startTime, isProcessed: true), CreateDurableTimerHistory(timerCreated: timerCreated, timerFired: timerFired, fireAt: _fireAt, restartTime: _restartTime, orchestratorStartedIsProcessed: false), CreateOrchestratorStartedHistory(date: _shouldNotHitTime, isProcessed: false) ); var context = new OrchestrationContext { History = history, CurrentUtcDateTime = _startTime }; var durableTaskHandler = new DurableTaskHandler(); var task = new DurableTimerTask(_fireAt); if (!timerCreated || !timerFired) { DurableTestUtilities.EmulateStop(durableTaskHandler); durableTaskHandler.StopAndInitiateDurableTaskOrReplay( task: task, context: context, noWait: false, output: _ => { Assert.True(false, "Unexpected output"); }, onFailure: _ => { }); Assert.Equal(_startTime, context.CurrentUtcDateTime); } else { durableTaskHandler.StopAndInitiateDurableTaskOrReplay(task: task, context: context, noWait: false, _ => { Assert.True(false, "Unexpected output"); }, errorMessage => { }); Assert.Equal(_restartTime, context.CurrentUtcDateTime); } VerifyCreateDurableTimerActionAdded(context, _fireAt); }
protected override void EndProcessing() { var privateData = (Hashtable)MyInvocation.MyCommand.Module.PrivateData; var context = (OrchestrationContext)privateData[SetFunctionInvocationContextCommand.ContextKey]; DateTime fireAt = context.CurrentUtcDateTime.Add(Duration); var task = new DurableTimerTask(fireAt); _durableTaskHandler.StopAndInitiateDurableTaskOrReplay( task, context, NoWait.IsPresent, WriteObject, failureReason => DurableActivityErrorHandler.Handle(this, failureReason)); }
public void WaitAny_OutputsEarliestCompletedTask_WhenAnyTaskCompleted(bool completed) { var history = DurableTestUtilities.MergeHistories( CreateOrchestratorStartedHistory(date: _startTime, isProcessed: true), CreateActivityHistory("FunctionA", scheduled: true, restartTime: _restartTime, completed: completed, output: "\"Result1\"", orchestratorStartedIsProcessed: false), CreateActivityHistory("FunctionA", scheduled: false, completed: false, output: "\"Result2\""), CreateDurableTimerHistory(timerCreated: true, timerFired: true, fireAt: _fireAt, restartTime: _restartTime, orchestratorStartedIsProcessed: false) ); var orchestrationContext = new OrchestrationContext { History = history }; var firedTimer = new DurableTimerTask(_fireAt); var completedActivity = new ActivityInvocationTask("FunctionA", FunctionInput); var tasksToWaitFor = new ReadOnlyCollection <DurableTask>( new DurableTask[] { completedActivity, new ActivityInvocationTask("FunctionA", FunctionInput), firedTimer }); var allOutput = new List <object>(); var durableTaskHandler = new DurableTaskHandler(); durableTaskHandler.WaitAny(tasksToWaitFor, orchestrationContext, output => { allOutput.Add(output); }); if (completed) { Assert.Equal(new[] { completedActivity }, allOutput); } else { Assert.Equal(new[] { firedTimer }, allOutput); } VerifyNoOrchestrationActionAdded(orchestrationContext); }