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 Can_get_null_for_unknown_instance_id()
        {
            var client = new InMemoryOrchestrationClient(typeof(Funcs).Assembly, _services);

            var status = await client.GetStatusAsync(Guid.NewGuid().ToString());

            Assert.IsNull(status);
        }
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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_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 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);
        }
Beispiel #13
0
        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);
        }
Beispiel #15
0
        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);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        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);
        }
Beispiel #18
0
        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");
        }
Beispiel #19
0
        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);
        }
Beispiel #20
0
        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");
        }
        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);
        }