Skip to content

Commit d00cbc0

Browse files
authored
add Cloud runner support for invoke operation (#44)
1 parent 475c38e commit d00cbc0

2 files changed

Lines changed: 76 additions & 1 deletion

File tree

examples/src/test/java/com/amazonaws/lambda/durable/examples/CloudBasedIntegrationTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@ void testSimpleStepExample() {
6868
assertEquals("create-greeting", createGreetingOp.getName());
6969
}
7070

71+
@Test
72+
void testSimpleInvokeExample() {
73+
var runner = CloudDurableTestRunner.create(arn("simple-invoke-example"), Map.class, String.class);
74+
var result = runner.run(Map.of("message", "test"));
75+
76+
assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
77+
assertNotNull(result.getResult(String.class));
78+
79+
var createGreetingOp = runner.getOperation("invoke-greeting1");
80+
assertNotNull(createGreetingOp);
81+
assertEquals("invoke-greeting1", createGreetingOp.getName());
82+
}
83+
7184
@Test
7285
void testRetryExample() {
7386
var runner = CloudDurableTestRunner.create(arn("retry-example"), String.class, String.class);

sdk-testing/src/main/java/com/amazonaws/lambda/durable/testing/HistoryEventProcessor.java

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.HashMap;
99
import java.util.List;
1010
import software.amazon.awssdk.services.lambda.model.CallbackDetails;
11+
import software.amazon.awssdk.services.lambda.model.ChainedInvokeDetails;
1112
import software.amazon.awssdk.services.lambda.model.ErrorObject;
1213
import software.amazon.awssdk.services.lambda.model.Event;
1314
import software.amazon.awssdk.services.lambda.model.Operation;
@@ -150,8 +151,12 @@ public <O> TestResult<O> processEvents(List<Event> events, Class<O> outputType)
150151
CHAINED_INVOKE_FAILED,
151152
CHAINED_INVOKE_TIMED_OUT,
152153
CHAINED_INVOKE_STOPPED -> {
153-
throw new UnsupportedOperationException("Context operations currently not supported");
154+
if (operationId != null) {
155+
operations.putIfAbsent(operationId, createInvokeOperation(operationId, event));
156+
}
154157
}
158+
159+
default -> throw new UnsupportedOperationException("Unknown operation: " + eventType);
155160
}
156161
}
157162

@@ -230,4 +235,61 @@ private Operation createCallbackOperation(String id, String name, OperationStatu
230235
.callbackDetails(builder.build())
231236
.build();
232237
}
238+
239+
private Operation createInvokeOperation(String id, Event event) {
240+
var builder = ChainedInvokeDetails.builder();
241+
242+
OperationStatus status =
243+
switch (event.eventType()) {
244+
case CHAINED_INVOKE_STARTED -> OperationStatus.STARTED;
245+
case CHAINED_INVOKE_SUCCEEDED -> {
246+
var details = event.callbackSucceededDetails();
247+
if (details != null
248+
&& details.result() != null
249+
&& details.result().payload() != null) {
250+
builder.result(details.result().payload());
251+
}
252+
yield OperationStatus.SUCCEEDED;
253+
}
254+
case CHAINED_INVOKE_FAILED -> {
255+
var details = event.callbackFailedDetails();
256+
if (details != null
257+
&& details.error() != null
258+
&& details.error().payload() != null) {
259+
builder.error(details.error().payload());
260+
}
261+
yield OperationStatus.FAILED;
262+
}
263+
case CHAINED_INVOKE_STOPPED -> {
264+
var details = event.chainedInvokeStoppedDetails();
265+
if (details != null
266+
&& details.error() != null
267+
&& details.error().payload() != null) {
268+
builder.error(details.error().payload());
269+
}
270+
271+
yield OperationStatus.STOPPED;
272+
}
273+
case CHAINED_INVOKE_TIMED_OUT -> {
274+
var details = event.chainedInvokeTimedOutDetails();
275+
if (details != null
276+
&& details.error() != null
277+
&& details.error().payload() != null) {
278+
builder.error(details.error().payload());
279+
}
280+
yield OperationStatus.TIMED_OUT;
281+
}
282+
default ->
283+
throw new UnsupportedOperationException(
284+
"Unknown chained invocation operation: " + event.eventType());
285+
};
286+
287+
return Operation.builder()
288+
.id(id)
289+
.name(event.name())
290+
.status(status)
291+
.type(OperationType.CHAINED_INVOKE)
292+
.chainedInvokeDetails(builder.build())
293+
.build();
294+
}
233295
}

0 commit comments

Comments
 (0)