From f8a844029c4e180f34dfa50e1045f04d478712af Mon Sep 17 00:00:00 2001 From: David Justo Date: Thu, 8 Sep 2022 10:15:03 -0700 Subject: [PATCH] Patch regression in ExternalEvent History-search (#857) (#860) --- src/DurableSDK/Tasks/ExternalEventTask.cs | 2 +- .../DurableEndToEndTests.cs | 61 +++++++++++++++++++ .../function.json | 9 +++ .../run.ps1 | 10 +++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/function.json create mode 100644 test/E2E/TestFunctionApp/DurableOrchestratorComplexRaiseEvent/run.ps1 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() 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..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 @@ -202,6 +202,67 @@ public async Task OrchestratationContextHasAllExpectedProperties() } } + + [Fact] + public async Task ComplexExternalEventReturnsData() + { + var initialResponse = await Utilities.GetHttpTriggerResponse("DurableClient", queryString: "?FunctionName=DurableOrchestratorComplexRaiseEvent"); + 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.Contains("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