public async Task Can_cancel_external_event() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var input = TimeSpanInput.FromMinutes(1); var ct = new CancellationTokenSource(); ct.Token.Register(() => { Console.WriteLine("cancelled"); }); TimeSpanInput.Token = ct.Token; var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithExternalEventTimeoutCancel), input); await Task.Delay(10); ct.Cancel(false); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task CallHttpAsync_responds_OK_as_default() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(DurableFuncWithCallHttp.CallHttpFunction), new DurableFunctionWithTimerInput(TimeSpan.FromHours(1))); var status = await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); Assert.AreEqual(HttpStatusCode.OK, status.Output?.ToObject <DurableHttpResponse>()?.StatusCode); }
public async Task Can_WaitForOrchestrationToFinish_when_success() { var input = new TestFunctionInputAsync(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithOneActivityAsync), input); var status = await client.WaitForOrchestrationToFinish(instanceId); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Can_WaitForOrchestrationToFinish_when_failed() { var input = new TestFunctionInputAsync(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.FailAtGivenCallNoActivity), input); var status = await client.WaitForOrchestrationToFinish(instanceId); Assert.AreEqual(OrchestrationRuntimeStatus.Failed, status.RuntimeStatus); }
public async Task Can_fail_after_max_retries() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, new ServiceCollection().BuildServiceProvider()); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithRetryFailingActivity), null); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Failed, TimeSpan.FromSeconds(5)); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Failed, status.RuntimeStatus); }
public async Task Can_timeout_external_event() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithExternalEventTimeout), TimeSpanInput.FromMilliseconds(5)); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Failed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Failed, status.RuntimeStatus); }
public async Task Can_execute_direct_bound_durable_activities() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithDirectBinding), null); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Can_WaitForCustomStatus_to_match_predicate() { var input = new TestFunctionInputAsync(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithCustomStatus), input); var status = await client.WaitForCustomStatus(instanceId, c => c?.ToObject <CustomStatus>() != null); Assert.AreEqual(OrchestrationRuntimeStatus.Running, status.RuntimeStatus); Assert.IsNotNull(status.CustomStatus); }
public async Task Missing_dependency_failures_are_helpful() { var services = new ServiceCollection(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, services.BuildServiceProvider()); var instanceId = await client.StartNewAsync(nameof(DurableFunctionWithDependencies.Function), null); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Failed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out, true); }
public async Task Can_customize_CallHttpAsync_response() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var customResponse = new DurableHttpResponse(HttpStatusCode.BadRequest); client.SetCallHttpHandler(_ => customResponse); var instanceId = await client .StartNewAsync(nameof(DurableFuncWithCallHttp.CallHttpFunction), new DurableFunctionWithTimerInput(TimeSpan.FromHours(1))); var status = await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); Assert.AreEqual(customResponse.StatusCode, status.Output?.ToObject <DurableHttpResponse>()?.StatusCode); }
public async Task Can_fast_forward_time() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithTimer), new DurableFunctionWithTimerInput(TimeSpan.FromHours(1))); await client.Timeshift(instanceId, TimeSpan.FromHours(1)); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Can_execute_durable_function_with_return() { var input = new TestFunctionInput(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithOneActivityReturn), input); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Adds_TaskFailed_history_event_for_unknown_orchestration_function() { var input = new TestFunctionInput(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var noSuchFuncName = "NoSuchFunction"; var instanceId = await client .StartNewAsync(noSuchFuncName, input); var status = await client.GetStatusAsync(instanceId); AssertHistoryEventOrder(status, EventType.ExecutionStarted, EventType.TaskFailed, EventType.ExecutionCompleted); }
public async Task Can_get_history_for_activity() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithOneActivity), null); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); AssertHistoryEventOrder(status, EventType.ExecutionStarted, EventType.TaskScheduled, EventType.TaskCompleted, EventType.ExecutionCompleted); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Activity_can_inject_ExecutionContext() { var services = new ServiceCollection(); services.AddLogging(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, services.BuildServiceProvider()); var instanceId = await client.StartNewAsync(nameof(DurableFunctionWithExecutionContext.ExecutionContextFunction), null); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Durable_function_class_can_have_dependencies() { var services = new ServiceCollection(); services.AddTransient <IFoo, Foo>(); var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, services.BuildServiceProvider()); var instanceId = await client.StartNewAsync(nameof(DurableFunctionWithDependencies.Function), null); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Activity_can_redefine_input_without_leaking_into_orchestrator_context() { var startInput = new TestFunctionInput { Token = "original" }; var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithSeparateActivityInput), startInput); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); var endInput = status.Input.ToObject <TestFunctionInput>(); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(startInput.Token, endInput.Token, "Activity redefining input should not leak into orchestrator"); }
public async Task Can_get_history_for_waiting() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithExternalEvent), null); await client.WaitForOrchestrationToExpectEvent(instanceId, Funcs.ExternalEventName); await client.RaiseEventAsync(instanceId, Funcs.ExternalEventName); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); AssertHistoryEventOrder(status, EventType.ExecutionStarted, EventType.GenericEvent, EventType.TimerCreated, EventType.GenericEvent, EventType.ExecutionCompleted); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); }
public async Task Can_raise_external_event() { var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithExternalEvent), null); await client.WaitForOrchestrationToExpectEvent(instanceId, Funcs.ExternalEventName); var status = await client.GetStatusAsync(instanceId); Assert.AreEqual(OrchestrationRuntimeStatus.Running, status.RuntimeStatus); await client.RaiseEventAsync(instanceId, Funcs.ExternalEventName, null); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status2 = await client.GetStatusAsync(instanceId); TestUtil.LogHistory(status2, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status2.RuntimeStatus); }
public async Task Functions_cannot_mutate_their_input_source() { var startInput = new TestFunctionInput { Token = "original" }; var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services); var instanceId = await client .StartNewAsync(nameof(Funcs.DurableFunctionWithMutatedInput), startInput); await client.WaitForOrchestrationToReachStatus(instanceId, OrchestrationRuntimeStatus.Completed); var status = await client.GetStatusAsync(instanceId); var endInput = status.Input.ToObject <TestFunctionInput>(); TestUtil.LogHistory(status, Console.Out); Assert.AreEqual(OrchestrationRuntimeStatus.Completed, status.RuntimeStatus); Assert.AreEqual(startInput.Token, endInput.Token, "Functions mutating inputs should not mutate their source"); }