diff --git a/sdk/src/main/java/software/amazon/lambda/durable/DurableHandler.java b/sdk/src/main/java/software/amazon/lambda/durable/DurableHandler.java index 966960979..3efdb24e3 100644 --- a/sdk/src/main/java/software/amazon/lambda/durable/DurableHandler.java +++ b/sdk/src/main/java/software/amazon/lambda/durable/DurableHandler.java @@ -130,6 +130,11 @@ public final void handleRequest(InputStream inputStream, OutputStream outputStre var inputString = new String(inputStream.readAllBytes()); logger.debug("Raw input from durable handler: {}", inputString); var input = serDes.deserialize(inputString, TypeToken.get(DurableExecutionInput.class)); + // Durable function inputs must contain DurableExecutionArn and CheckpointToken + if (input.durableExecutionArn() == null || input.checkpointToken() == null) { + throw new IllegalStateException( + "Unexpected payload provided to start the durable execution. DurableConfig must be set in Lambda function configuration."); + } var output = DurableExecutor.execute(input, context, inputType, this::handleRequest, config); outputStream.write(serDes.serialize(output).getBytes()); } diff --git a/sdk/src/test/java/software/amazon/lambda/durable/DurableHandlerTest.java b/sdk/src/test/java/software/amazon/lambda/durable/DurableHandlerTest.java index 922c048d7..f823ec1dc 100644 --- a/sdk/src/test/java/software/amazon/lambda/durable/DurableHandlerTest.java +++ b/sdk/src/test/java/software/amazon/lambda/durable/DurableHandlerTest.java @@ -4,7 +4,12 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; import org.junit.jupiter.api.Test; class DurableHandlerTest { @@ -47,6 +52,19 @@ public Object handleRequest(Object input, DurableContext context) { } } + @Test + void testNonDurableFunctionThrowsUserFriendlyError() throws Exception { + var handler = new TestDurableHandler(); + // Durable function inputs must contain DurableExecutionArn and CheckpointToken + var nonDurableInput = "{\"input\": \"non-durable\"}"; + var inputStream = new ByteArrayInputStream(nonDurableInput.getBytes(StandardCharsets.UTF_8)); + var outputStream = new ByteArrayOutputStream(); + + var exception = + assertThrows(IllegalStateException.class, () -> handler.handleRequest(inputStream, outputStream, null)); + assertTrue(exception.getMessage().contains("Unexpected payload provided to start the durable execution")); + } + // Test handler implementation private static class TestDurableHandler extends DurableHandler { @Override