Skip to content

Commit 6e0b629

Browse files
authored
Deserialize DF orchestrator input (#62)
1 parent 10dbeed commit 6e0b629

File tree

6 files changed

+87
-1
lines changed

6 files changed

+87
-1
lines changed

src/DurableEngine/Models/OrchestrationContext.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ public class OrchestrationContext
2323
/// Input to the orchestrator.
2424
/// </summary>
2525
[DataMember]
26-
public object Input { get; set; }
26+
public object Input
27+
{
28+
get => DTFxContext?.GetInput<object>();
29+
}
2730

2831
/// <summary>
2932
/// Orchestrator instanceID.

test/E2E/AzureFunctions.PowerShell.Durable.SDK.E2E/DurableClientTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,42 @@ await ValidateDurableWorkflowResults(
8888
});
8989
}
9090

91+
[Fact]
92+
public async Task DurableSubOrchestratoWithArrayInputCompletes()
93+
{
94+
var initialResponse = await Utilities.GetHttpStartResponse("SubOrchestratorWithArrayInput");
95+
Assert.Equal(HttpStatusCode.Accepted, initialResponse.StatusCode);
96+
97+
var location = initialResponse.Headers.Location;
98+
Assert.NotNull(location);
99+
100+
await ValidateDurableWorkflowResults(
101+
initialResponse,
102+
validateInitialResponse: (dynamic initialStatusResponseBody) =>
103+
{
104+
Assert.NotNull(initialStatusResponseBody.id);
105+
var statusQueryGetUri = (string)initialStatusResponseBody.statusQueryGetUri;
106+
Assert.Equal(location?.ToString(), statusQueryGetUri);
107+
Assert.NotNull(initialStatusResponseBody.sendEventPostUri);
108+
Assert.NotNull(initialStatusResponseBody.purgeHistoryDeleteUri);
109+
Assert.NotNull(initialStatusResponseBody.terminatePostUri);
110+
Assert.NotNull(initialStatusResponseBody.rewindPostUri);
111+
},
112+
validateIntermediateResponse: (dynamic intermediateStatusResponseBody) =>
113+
{
114+
var runtimeStatus = (string)intermediateStatusResponseBody.runtimeStatus;
115+
Assert.True(
116+
runtimeStatus == "Running" || runtimeStatus == "Pending",
117+
$"Unexpected runtime status: {runtimeStatus}");
118+
},
119+
validateFinalResponse: (dynamic finalStatusResponseBody) =>
120+
{
121+
Assert.Equal("Completed", (string)finalStatusResponseBody.runtimeStatus);
122+
Assert.Equal("Hello Tokyo", finalStatusResponseBody.output[0].ToString());
123+
Assert.Equal("Hello Seattle", finalStatusResponseBody.output[1].ToString());
124+
});
125+
}
126+
91127
[Fact]
92128
public async Task OrchestratorCanReceiveArrayFromActivity()
93129
{
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"bindings": [
3+
{
4+
"name": "Context",
5+
"type": "orchestrationTrigger",
6+
"direction": "in"
7+
}
8+
]
9+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using namespace System.Net
2+
3+
param($Context)
4+
5+
$ErrorActionPreference = 'Stop'
6+
7+
$output = @()
8+
9+
# We call an activity for every element in the input list.
10+
# This allows us to test that array-type inputs are correctly serialized.
11+
# In the past, we've seen issues where arrays are received as JTokens instead of as PS lists.
12+
# Since we cannot iterate over JTokens, an incorrectly serialized array will result in no activities being called. Our test will then error.
13+
foreach ($input in $Context.Input)
14+
{
15+
# invoke the activity function
16+
$output += Invoke-DurableActivity -FunctionName "Hello" -Input $input
17+
}
18+
19+
return $output
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"bindings": [
3+
{
4+
"name": "Context",
5+
"type": "orchestrationTrigger",
6+
"direction": "in"
7+
}
8+
]
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using namespace System.Net
2+
3+
param($Context)
4+
5+
$ErrorActionPreference = 'Stop'
6+
7+
$output = @()
8+
$output += Invoke-DurableSubOrchestrator -FunctionName "FanOutOnInputOrchestrator" -Input @("Tokyo", "Seattle")
9+
10+
return $output

0 commit comments

Comments
 (0)