Skip to content

Deserialize DF orchestrator input #62

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/DurableEngine/Models/OrchestrationContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ public class OrchestrationContext
/// Input to the orchestrator.
/// </summary>
[DataMember]
public object Input { get; set; }
public object Input
{
get => DTFxContext?.GetInput<object>();
}

/// <summary>
/// Orchestrator instanceID.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,42 @@ await ValidateDurableWorkflowResults(
});
}

[Fact]
public async Task DurableSubOrchestratoWithArrayInputCompletes()
{
var initialResponse = await Utilities.GetHttpStartResponse("SubOrchestratorWithArrayInput");
Assert.Equal(HttpStatusCode.Accepted, initialResponse.StatusCode);

var location = initialResponse.Headers.Location;
Assert.NotNull(location);

await ValidateDurableWorkflowResults(
initialResponse,
validateInitialResponse: (dynamic initialStatusResponseBody) =>
{
Assert.NotNull(initialStatusResponseBody.id);
var statusQueryGetUri = (string)initialStatusResponseBody.statusQueryGetUri;
Assert.Equal(location?.ToString(), statusQueryGetUri);
Assert.NotNull(initialStatusResponseBody.sendEventPostUri);
Assert.NotNull(initialStatusResponseBody.purgeHistoryDeleteUri);
Assert.NotNull(initialStatusResponseBody.terminatePostUri);
Assert.NotNull(initialStatusResponseBody.rewindPostUri);
},
validateIntermediateResponse: (dynamic intermediateStatusResponseBody) =>
{
var runtimeStatus = (string)intermediateStatusResponseBody.runtimeStatus;
Assert.True(
runtimeStatus == "Running" || runtimeStatus == "Pending",
$"Unexpected runtime status: {runtimeStatus}");
},
validateFinalResponse: (dynamic finalStatusResponseBody) =>
{
Assert.Equal("Completed", (string)finalStatusResponseBody.runtimeStatus);
Assert.Equal("Hello Tokyo", finalStatusResponseBody.output[0].ToString());
Assert.Equal("Hello Seattle", finalStatusResponseBody.output[1].ToString());
});
}

[Fact]
public async Task OrchestratorCanReceiveArrayFromActivity()
{
Expand Down
9 changes: 9 additions & 0 deletions test/E2E/durableApp/FanOutOnInputOrchestrator/function.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"bindings": [
{
"name": "Context",
"type": "orchestrationTrigger",
"direction": "in"
}
]
}
19 changes: 19 additions & 0 deletions test/E2E/durableApp/FanOutOnInputOrchestrator/run.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using namespace System.Net

param($Context)

$ErrorActionPreference = 'Stop'

$output = @()

# We call an activity for every element in the input list.
# This allows us to test that array-type inputs are correctly serialized.
# In the past, we've seen issues where arrays are received as JTokens instead of as PS lists.
# Since we cannot iterate over JTokens, an incorrectly serialized array will result in no activities being called. Our test will then error.
foreach ($input in $Context.Input)
{
# invoke the activity function
$output += Invoke-DurableActivity -FunctionName "Hello" -Input $input
}

return $output
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"bindings": [
{
"name": "Context",
"type": "orchestrationTrigger",
"direction": "in"
}
]
}
10 changes: 10 additions & 0 deletions test/E2E/durableApp/SubOrchestratorWithArrayInput/run.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using namespace System.Net

param($Context)

$ErrorActionPreference = 'Stop'

$output = @()
$output += Invoke-DurableSubOrchestrator -FunctionName "FanOutOnInputOrchestrator" -Input @("Tokyo", "Seattle")

return $output