Skip to content

Commit 5f16fd1

Browse files
authored
add utility methods for callback (#316)
1 parent e776e9c commit 5f16fd1

13 files changed

Lines changed: 55 additions & 23 deletions

File tree

examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import org.junit.jupiter.params.ParameterizedTest;
1616
import org.junit.jupiter.params.provider.CsvSource;
1717
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
18-
import software.amazon.awssdk.core.SdkBytes;
1918
import software.amazon.awssdk.regions.Region;
2019
import software.amazon.awssdk.services.lambda.LambdaClient;
20+
import software.amazon.awssdk.services.lambda.model.ErrorObject;
2121
import software.amazon.awssdk.services.lambda.model.OperationStatus;
2222
import software.amazon.awssdk.services.sts.StsClient;
2323
import software.amazon.lambda.durable.TypeToken;
@@ -344,8 +344,7 @@ void testCallbackExample() {
344344
// Complete the preapproval callback
345345
execution.pollUntil(exec -> exec.hasCallback("preapproval-callback"));
346346
var preapprovalCallbackId = execution.getCallbackId("preapproval-callback");
347-
lambdaClient.sendDurableExecutionCallbackSuccess(
348-
req -> req.callbackId(preapprovalCallbackId).result(SdkBytes.fromUtf8String("\"preapproved\"")));
347+
execution.completeCallback(preapprovalCallbackId, "\"preapproved\"");
349348

350349
// Wait for callback to appear
351350
execution.pollUntil(exec -> exec.hasCallback("approval"));
@@ -355,8 +354,7 @@ void testCallbackExample() {
355354
assertNotNull(callbackId);
356355

357356
// Complete the callback using AWS SDK
358-
lambdaClient.sendDurableExecutionCallbackSuccess(
359-
req -> req.callbackId(callbackId).result(SdkBytes.fromUtf8String("\"approved\"")));
357+
execution.completeCallback(callbackId, "\"approved\"");
360358

361359
// Wait for execution to complete
362360
var result = execution.pollUntilComplete();
@@ -385,8 +383,7 @@ void testCallbackExampleWithFailure() {
385383

386384
execution.pollUntil(exec -> exec.hasCallback("preapproval-callback"));
387385
var preapprovalCallbackId = execution.getCallbackId("preapproval-callback");
388-
lambdaClient.sendDurableExecutionCallbackSuccess(
389-
req -> req.callbackId(preapprovalCallbackId).result(SdkBytes.fromUtf8String("\"preapproved\"")));
386+
execution.completeCallback(preapprovalCallbackId, "\"preapproved\"");
390387

391388
// Wait for callback to appear
392389
execution.pollUntil(exec -> exec.hasCallback("approval"));
@@ -396,8 +393,12 @@ void testCallbackExampleWithFailure() {
396393
assertNotNull(callbackId);
397394

398395
// Fail the callback using AWS SDK
399-
lambdaClient.sendDurableExecutionCallbackFailure(req -> req.callbackId(callbackId)
400-
.error(err -> err.errorType("ApprovalRejected").errorMessage("Approval rejected by manager")));
396+
execution.failCallback(
397+
callbackId,
398+
ErrorObject.builder()
399+
.errorType("ApprovalRejected")
400+
.errorMessage("Approval rejected by manager")
401+
.build());
401402

402403
// Wait for execution to complete
403404
var result = execution.pollUntilComplete();
@@ -423,8 +424,7 @@ void testCallbackExampleWithTimeout() {
423424

424425
execution.pollUntil(exec -> exec.hasCallback("preapproval-callback"));
425426
var preapprovalCallbackId = execution.getCallbackId("preapproval-callback");
426-
lambdaClient.sendDurableExecutionCallbackSuccess(
427-
req -> req.callbackId(preapprovalCallbackId).result(SdkBytes.fromUtf8String("\"preapproved\"")));
427+
execution.completeCallback(preapprovalCallbackId, "\"preapproved\"");
428428

429429
// Wait for callback to appear
430430
execution.pollUntil(exec -> exec.hasCallback("approval"));
@@ -454,8 +454,9 @@ void testCallbackExampleWithWaitForCallbackFailure() {
454454

455455
execution.pollUntil(exec -> exec.hasCallback("preapproval-callback"));
456456
var preapprovalCallbackId = execution.getCallbackId("preapproval-callback");
457-
lambdaClient.sendDurableExecutionCallbackFailure(
458-
req -> req.callbackId(preapprovalCallbackId).error(err -> err.errorMessage("preapproval denied")));
457+
execution.failCallback(
458+
preapprovalCallbackId,
459+
ErrorObject.builder().errorMessage("preapproval denied").build());
459460

460461
// Wait for callback to appear
461462
execution.pollUntil(exec -> exec.hasCallback("approval"));

sdk-integration-tests/src/test/java/software/amazon/lambda/durable/DurableExecutionCheckpointTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import software.amazon.lambda.durable.execution.DurableExecutor;
1111
import software.amazon.lambda.durable.model.DurableExecutionInput;
1212
import software.amazon.lambda.durable.model.ExecutionStatus;
13-
import software.amazon.lambda.durable.testing.LocalMemoryExecutionClient;
13+
import software.amazon.lambda.durable.testing.local.LocalMemoryExecutionClient;
1414

1515
/** Integration tests that verify checkpoint behavior using LocalMemoryExecutionClient */
1616
class DurableExecutionCheckpointTest {

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/AsyncExecution.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
import java.time.Instant;
77
import java.util.List;
88
import java.util.function.Predicate;
9+
import software.amazon.awssdk.core.SdkBytes;
910
import software.amazon.awssdk.services.lambda.LambdaClient;
11+
import software.amazon.awssdk.services.lambda.model.ErrorObject;
1012
import software.amazon.awssdk.services.lambda.model.Event;
1113
import software.amazon.awssdk.services.lambda.model.EventType;
1214
import software.amazon.awssdk.services.lambda.model.GetDurableExecutionHistoryRequest;
1315
import software.amazon.awssdk.services.lambda.model.ResourceNotFoundException;
1416
import software.amazon.lambda.durable.TypeToken;
1517
import software.amazon.lambda.durable.model.ExecutionStatus;
18+
import software.amazon.lambda.durable.testing.cloud.HistoryEventProcessor;
1619

1720
/**
1821
* Handle for an asynchronously executing durable function. Allows incremental polling and inspection of execution
@@ -163,6 +166,23 @@ public String getExecutionArn() {
163166
return executionArn;
164167
}
165168

169+
/** calls sendDurableExecutionCallbackSuccess with the given callbackId and result */
170+
public void completeCallback(String callbackId, String result) {
171+
lambdaClient.sendDurableExecutionCallbackSuccess(
172+
req -> req.callbackId(callbackId).result(SdkBytes.fromUtf8String(result)));
173+
}
174+
175+
/** calls sendDurableExecutionCallbackFailure with the give callbackId and error */
176+
public void failCallback(String callbackId, ErrorObject error) {
177+
lambdaClient.sendDurableExecutionCallbackFailure(
178+
req -> req.callbackId(callbackId).error(error));
179+
}
180+
181+
/** call sendDurableExecutionCallbackHeartbeat API with the give callbackId */
182+
public void heartbeatCallback(String callbackId) {
183+
lambdaClient.sendDurableExecutionCallbackHeartbeat(req -> req.callbackId(callbackId));
184+
}
185+
166186
private void refreshHistory() {
167187
try {
168188
var request = GetDurableExecutionHistoryRequest.builder()

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/CloudDurableTestRunner.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import software.amazon.awssdk.services.lambda.model.InvokeRequest;
1111
import software.amazon.lambda.durable.TypeToken;
1212
import software.amazon.lambda.durable.serde.JacksonSerDes;
13+
import software.amazon.lambda.durable.testing.cloud.HistoryEventProcessor;
14+
import software.amazon.lambda.durable.testing.cloud.HistoryPoller;
1315

1416
/**
1517
* Test runner for durable Lambda functions deployed to AWS. Invokes a real Lambda function, polls execution history,

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/LocalDurableTestRunner.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import software.amazon.lambda.durable.model.ExecutionStatus;
2323
import software.amazon.lambda.durable.serde.JacksonSerDes;
2424
import software.amazon.lambda.durable.serde.SerDes;
25+
import software.amazon.lambda.durable.testing.local.LocalMemoryExecutionClient;
26+
import software.amazon.lambda.durable.testing.local.OperationResult;
2527

2628
/**
2729
* In-memory test runner for durable Lambda functions. Simulates the Lambda re-invocation loop locally without requiring

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/TestOperation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ public class TestOperation {
2626
private final List<Event> events;
2727
private final SerDes serDes;
2828

29-
TestOperation(Operation operation, SerDes serDes) {
29+
public TestOperation(Operation operation, SerDes serDes) {
3030
this(operation, List.of(), serDes);
3131
}
3232

33-
TestOperation(Operation operation, List<Event> events, SerDes serDes) {
33+
public TestOperation(Operation operation, List<Event> events, SerDes serDes) {
3434
this.operation = operation;
3535
this.events = events;
3636
this.serDes = serDes;

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/TestResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class TestResult<O> {
3232
private final List<Event> allEvents;
3333
private final SerDes serDes;
3434

35-
TestResult(
35+
public TestResult(
3636
ExecutionStatus status,
3737
String resultPayload,
3838
ErrorObject error,

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/HistoryEventProcessor.java renamed to sdk-testing/src/main/java/software/amazon/lambda/durable/testing/cloud/HistoryEventProcessor.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
package software.amazon.lambda.durable.testing;
3+
package software.amazon.lambda.durable.testing.cloud;
44

55
import java.util.ArrayList;
66
import java.util.HashMap;
@@ -18,6 +18,10 @@
1818
import software.amazon.lambda.durable.TypeToken;
1919
import software.amazon.lambda.durable.model.ExecutionStatus;
2020
import software.amazon.lambda.durable.serde.JacksonSerDes;
21+
import software.amazon.lambda.durable.testing.AsyncExecution;
22+
import software.amazon.lambda.durable.testing.CloudDurableTestRunner;
23+
import software.amazon.lambda.durable.testing.TestOperation;
24+
import software.amazon.lambda.durable.testing.TestResult;
2125

2226
/**
2327
* Processes execution history events from the GetDurableExecutionHistory API into {@link TestResult} objects. Used by

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/HistoryPoller.java renamed to sdk-testing/src/main/java/software/amazon/lambda/durable/testing/cloud/HistoryPoller.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
package software.amazon.lambda.durable.testing;
3+
package software.amazon.lambda.durable.testing.cloud;
44

55
import java.time.Duration;
66
import java.time.Instant;
@@ -10,6 +10,7 @@
1010
import software.amazon.awssdk.services.lambda.model.Event;
1111
import software.amazon.awssdk.services.lambda.model.EventType;
1212
import software.amazon.awssdk.services.lambda.model.GetDurableExecutionHistoryRequest;
13+
import software.amazon.lambda.durable.testing.CloudDurableTestRunner;
1314

1415
/**
1516
* Polls the GetDurableExecutionHistory API until execution completes or a timeout is reached. Used by

sdk-testing/src/main/java/software/amazon/lambda/durable/testing/EventProcessor.java renamed to sdk-testing/src/main/java/software/amazon/lambda/durable/testing/local/EventProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
package software.amazon.lambda.durable.testing;
3+
package software.amazon.lambda.durable.testing.local;
44

55
import static software.amazon.awssdk.services.lambda.model.EventType.*;
66

0 commit comments

Comments
 (0)