From 67dfa8843589d63b016234ac918e60ed273acdad Mon Sep 17 00:00:00 2001 From: David Justo Date: Tue, 30 Aug 2022 17:11:09 -0700 Subject: [PATCH 1/4] patch external events --- src/DurableSDK/Tasks/ExternalEventTask.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DurableSDK/Tasks/ExternalEventTask.cs b/src/DurableSDK/Tasks/ExternalEventTask.cs index 5d12ad66..f1a1fed3 100644 --- a/src/DurableSDK/Tasks/ExternalEventTask.cs +++ b/src/DurableSDK/Tasks/ExternalEventTask.cs @@ -31,7 +31,7 @@ internal override HistoryEvent GetCompletedHistoryEvent(OrchestrationContext con return context.History.FirstOrDefault( e => e.EventType == HistoryEventType.EventRaised && e.Name == ExternalEventName && - e.IsPlayed == processed); + e.IsProcessed == processed); } internal override OrchestrationAction CreateOrchestrationAction() From 7bcd78f1e00e3af8810a674ed2284b4e563a0289 Mon Sep 17 00:00:00 2001 From: David Justo Date: Tue, 6 Sep 2022 10:33:10 -0700 Subject: [PATCH 2/4] add test --- .../DurableEndToEndTests.cs | 61 +++++++++++++++++++ .../function.json | 9 +++ .../run.ps1 | 10 +++ 3 files changed, 80 insertions(+) create mode 100644 test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/function.json create mode 100644 test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/run.ps1 diff --git a/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs b/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs index 30f30669..15ab155a 100644 --- a/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs +++ b/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs @@ -202,6 +202,67 @@ public async Task OrchestratationContextHasAllExpectedProperties() } } + + [Fact] + public async Task ComplexExternalEventReturnsData() + { + var initialResponse = await Utilities.GetHttpTriggerResponse("DurableClient", queryString: "?FunctionName=DurableOrchestratorComplextRaiseEvent"); + Assert.Equal(HttpStatusCode.Accepted, initialResponse.StatusCode); + + var initialResponseBody = await initialResponse.Content.ReadAsStringAsync(); + dynamic initialResponseBodyObject = JsonConvert.DeserializeObject(initialResponseBody); + var statusQueryGetUri = (string)initialResponseBodyObject.statusQueryGetUri; + var raiseEventUri = (string)initialResponseBodyObject.sendEventPostUri; + + raiseEventUri = raiseEventUri.Replace("{eventName}", "TESTEVENTNAME"); + + var startTime = DateTime.UtcNow; + + using (var httpClient = new HttpClient()) + { + while (true) + { + // Send external event payload + var json = JsonConvert.SerializeObject("helloWorld!"); + var httpContent = new StringContent(json, Encoding.UTF8, "application/json"); + await httpClient.PostAsync(raiseEventUri, httpContent); + + var statusResponse = await httpClient.GetAsync(statusQueryGetUri); + switch (statusResponse.StatusCode) + { + case HttpStatusCode.Accepted: + { + var statusResponseBody = await GetResponseBodyAsync(statusResponse); + var runtimeStatus = (string)statusResponseBody.runtimeStatus; + Assert.True( + runtimeStatus == "Running" || runtimeStatus == "Pending", + $"Unexpected runtime status: {runtimeStatus}"); + + if (DateTime.UtcNow > startTime + _orchestrationCompletionTimeout) + { + Assert.True(false, $"The orchestration has not completed after {_orchestrationCompletionTimeout}"); + } + + await Task.Delay(TimeSpan.FromSeconds(2)); + break; + } + + case HttpStatusCode.OK: + { + var statusResponseBody = await GetResponseBodyAsync(statusResponse); + Assert.Equal("Completed", (string)statusResponseBody.runtimeStatus); + Assert.Equal("helloWorld!", statusResponseBody.output.ToString()); + return; + } + + default: + Assert.True(false, $"Unexpected orchestration status code: {statusResponse.StatusCode}"); + break; + } + } + } + } + [Fact] public async Task ExternalEventReturnsData() { diff --git a/test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/function.json b/test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/function.json new file mode 100644 index 00000000..336f5a18 --- /dev/null +++ b/test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/function.json @@ -0,0 +1,9 @@ +{ + "bindings": [ + { + "name": "Context", + "type": "orchestrationTrigger", + "direction": "in" + } + ] +} \ No newline at end of file diff --git a/test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/run.ps1 b/test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/run.ps1 new file mode 100644 index 00000000..a8be03bf --- /dev/null +++ b/test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/run.ps1 @@ -0,0 +1,10 @@ +param($Context) + +$output = @() + +Invoke-DurableActivity -FunctionName "DurableActivity" -Input "Tokyo" +Invoke-DurableActivity -FunctionName "DurableActivity" -Input "Seattle" +$output += Start-DurableExternalEventListener -EventName "TESTEVENTNAME" +Invoke-DurableActivity -FunctionName "DurableActivity" -Input "London" + +$output From e01f36d50ba7b2b102a97c59bc4b98e9577eef5d Mon Sep 17 00:00:00 2001 From: David Justo Date: Tue, 6 Sep 2022 14:47:46 -0700 Subject: [PATCH 3/4] fix typo --- .../DurableEndToEndTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs b/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs index 15ab155a..2ff00bde 100644 --- a/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs +++ b/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs @@ -206,7 +206,7 @@ public async Task OrchestratationContextHasAllExpectedProperties() [Fact] public async Task ComplexExternalEventReturnsData() { - var initialResponse = await Utilities.GetHttpTriggerResponse("DurableClient", queryString: "?FunctionName=DurableOrchestratorComplextRaiseEvent"); + var initialResponse = await Utilities.GetHttpTriggerResponse("DurableClient", queryString: "?FunctionName=DurableOrchestratorComplexRaiseEvent"); Assert.Equal(HttpStatusCode.Accepted, initialResponse.StatusCode); var initialResponseBody = await initialResponse.Content.ReadAsStringAsync(); From f5748898819b7962dd8b1f669cdd9b3ce8e1698f Mon Sep 17 00:00:00 2001 From: David Justo Date: Tue, 6 Sep 2022 15:17:36 -0700 Subject: [PATCH 4/4] relax test requirements --- .../DurableEndToEndTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs b/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs index 2ff00bde..6ddd58a9 100644 --- a/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs +++ b/test/E2E/Azure.Functions.PowerShellWorker.E2E/Azure.Functions.PowerShellWorker.E2E/DurableEndToEndTests.cs @@ -251,7 +251,7 @@ public async Task ComplexExternalEventReturnsData() { var statusResponseBody = await GetResponseBodyAsync(statusResponse); Assert.Equal("Completed", (string)statusResponseBody.runtimeStatus); - Assert.Equal("helloWorld!", statusResponseBody.output.ToString()); + Assert.Contains("helloWorld!", statusResponseBody.output.ToString()); return; }