diff --git a/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java b/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
index 16109778d..038704931 100644
--- a/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
+++ b/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
@@ -60,4 +60,4 @@ public String handleRequest(Input input, Context context) {
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME.withZone(TimeZone.getTimeZone("UTC").toZoneId());
return dtf.format(Instant.now());
}
-}
\ No newline at end of file
+}
diff --git a/powertools-e2e-tests/handlers/tracing/pom.xml b/powertools-e2e-tests/handlers/tracing/pom.xml
index b1bc14c05..67bcee662 100644
--- a/powertools-e2e-tests/handlers/tracing/pom.xml
+++ b/powertools-e2e-tests/handlers/tracing/pom.xml
@@ -1,5 +1,5 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
@@ -21,6 +21,14 @@
com.amazonaws
aws-lambda-java-events
+
+ com.amazonaws
+ aws-lambda-java-runtime-interface-client
+
+
+ com.amazonaws
+ aws-lambda-java-core
+
org.aspectj
aspectjrt
@@ -57,4 +65,18 @@
+
+
+
+ native-image
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+
+
+
+
+
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-core/reflect-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-core/reflect-config.json
new file mode 100644
index 000000000..2780aca09
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-core/reflect-config.json
@@ -0,0 +1,13 @@
+[
+ {
+ "name":"com.amazonaws.services.lambda.runtime.LambdaRuntime",
+ "methods":[{"name":"","parameterTypes":[] }],
+ "fields":[{"name":"logger"}],
+ "allPublicMethods":true
+ },
+ {
+ "name":"com.amazonaws.services.lambda.runtime.LambdaRuntimeInternal",
+ "methods":[{"name":"","parameterTypes":[] }],
+ "allPublicMethods":true
+ }
+]
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-events/reflect-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-events/reflect-config.json
new file mode 100644
index 000000000..ddda5d5f1
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-events/reflect-config.json
@@ -0,0 +1,35 @@
+[
+ {
+ "name": "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent",
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true,
+ "allDeclaredConstructors": true
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent$ProxyRequestContext",
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true,
+ "allDeclaredConstructors": true
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent$RequestIdentity",
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true,
+ "allDeclaredConstructors": true
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent",
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true,
+ "allDeclaredConstructors": true
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredClasses": true,
+ "allPublicClasses": true
+ }
+]
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/jni-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/jni-config.json
new file mode 100644
index 000000000..91be72f7a
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/jni-config.json
@@ -0,0 +1,11 @@
+[
+ {
+ "name":"com.amazonaws.services.lambda.runtime.api.client.runtimeapi.LambdaRuntimeClientException",
+ "methods":[{"name":"","parameterTypes":["java.lang.String","int"] }]
+ },
+ {
+ "name":"com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.InvocationRequest",
+ "fields":[{"name":"id"}, {"name":"invokedFunctionArn"}, {"name":"deadlineTimeInMs"}, {"name":"xrayTraceId"}, {"name":"clientContext"}, {"name":"cognitoIdentity"}, {"name": "tenantId"}, {"name":"content"}],
+ "allPublicMethods":true
+ }
+]
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/native-image.properties b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/native-image.properties
new file mode 100644
index 000000000..20f8b7801
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/native-image.properties
@@ -0,0 +1 @@
+Args = --initialize-at-build-time=jdk.xml.internal.SecuritySupport
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/reflect-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/reflect-config.json
new file mode 100644
index 000000000..e69fa735c
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/reflect-config.json
@@ -0,0 +1,61 @@
+[
+ {
+ "name": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.Deserializers[]"
+ },
+ {
+ "name": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ext.Java7SupportImpl",
+ "methods": [{ "name": "", "parameterTypes": [] }]
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.LambdaRuntime",
+ "fields": [{ "name": "logger" }]
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.logging.LogLevel",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.logging.LogFormat",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "name": "java.lang.Void",
+ "methods": [{ "name": "", "parameterTypes": [] }]
+ },
+ {
+ "name": "java.util.Collections$UnmodifiableMap",
+ "fields": [{ "name": "m" }]
+ },
+ {
+ "name": "jdk.internal.module.IllegalAccessLogger",
+ "fields": [{ "name": "logger" }]
+ },
+ {
+ "name": "sun.misc.Unsafe",
+ "fields": [{ "name": "theUnsafe" }]
+ },
+ {
+ "name": "com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.InvocationRequest",
+ "fields": [
+ { "name": "id" },
+ { "name": "invokedFunctionArn" },
+ { "name": "deadlineTimeInMs" },
+ { "name": "xrayTraceId" },
+ { "name": "clientContext" },
+ { "name": "cognitoIdentity" },
+ { "name": "tenantId" },
+ { "name": "content" }
+ ],
+ "allPublicMethods": true
+ }
+]
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/resource-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/resource-config.json
new file mode 100644
index 000000000..1062b4249
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-runtime-interface-client/resource-config.json
@@ -0,0 +1,19 @@
+{
+ "resources": {
+ "includes": [
+ {
+ "pattern": "\\Qjni/libaws-lambda-jni.linux-aarch_64.so\\E"
+ },
+ {
+ "pattern": "\\Qjni/libaws-lambda-jni.linux-x86_64.so\\E"
+ },
+ {
+ "pattern": "\\Qjni/libaws-lambda-jni.linux_musl-aarch_64.so\\E"
+ },
+ {
+ "pattern": "\\Qjni/libaws-lambda-jni.linux_musl-x86_64.so\\E"
+ }
+ ]
+ },
+ "bundles": []
+}
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-serialization/reflect-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-serialization/reflect-config.json
new file mode 100644
index 000000000..9890688f9
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/com.amazonaws/aws-lambda-java-serialization/reflect-config.json
@@ -0,0 +1,25 @@
+[
+ {
+ "name": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.Deserializers[]"
+ },
+ {
+ "name": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ext.Java7HandlersImpl",
+ "methods": [{ "name": "", "parameterTypes": [] }]
+ },
+ {
+ "name": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ext.Java7SupportImpl",
+ "methods": [{ "name": "", "parameterTypes": [] }]
+ },
+ {
+ "name": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ser.Serializers[]"
+ },
+ {
+ "name": "org.joda.time.DateTime",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredClasses": true,
+ "allPublicClasses": true
+ }
+]
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/software.amazon.lambda.powertools.e2e/reflect-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/software.amazon.lambda.powertools.e2e/reflect-config.json
new file mode 100644
index 000000000..9ddd235e2
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/software.amazon.lambda.powertools.e2e/reflect-config.json
@@ -0,0 +1,20 @@
+[
+ {
+ "name": "software.amazon.lambda.powertools.e2e.Function",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredClasses": true,
+ "allPublicClasses": true
+ },
+ {
+ "name": "software.amazon.lambda.powertools.e2e.Input",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredClasses": true,
+ "allPublicClasses": true
+ }
+]
diff --git a/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/software.amazon.lambda.powertools.e2e/resource-config.json b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/software.amazon.lambda.powertools.e2e/resource-config.json
new file mode 100644
index 000000000..be6aac3f6
--- /dev/null
+++ b/powertools-e2e-tests/handlers/tracing/src/main/resources/META-INF/native-image/software.amazon.lambda.powertools.e2e/resource-config.json
@@ -0,0 +1,7 @@
+{
+ "resources":{
+ "includes":[{
+ "pattern":"\\Qlog4j2.xml\\E"
+ }]},
+ "bundles":[]
+}
diff --git a/powertools-e2e-tests/pom.xml b/powertools-e2e-tests/pom.xml
index 1b36d4701..ccd87e95e 100644
--- a/powertools-e2e-tests/pom.xml
+++ b/powertools-e2e-tests/pom.xml
@@ -40,14 +40,12 @@
log4j-slf4j2-impl
test
-
software.amazon.awssdk
lambda
${aws.sdk.version}
test
-
software.amazon.awssdk
dynamodb
@@ -66,72 +64,62 @@
${aws.sdk.version}
test
-
software.amazon.awssdk
xray
${aws.sdk.version}
test
-
software.amazon.awssdk
sqs
${aws.sdk.version}
test
-
com.amazonaws
amazon-sqs-java-extended-client-lib
2.1.2
test
-
software.amazon.awssdk
url-connection-client
test
-
org.junit.jupiter
junit-jupiter-api
test
-
commons-io
commons-io
2.20.0
-
org.junit.jupiter
junit-jupiter-engine
test
-
org.assertj
assertj-core
test
-
- com.evanlennick
- retry4j
- 0.15.0
+ io.github.resilience4j
+ resilience4j-retry
+
+ 1.7.1
test
-
software.amazon.awscdk
aws-cdk-lib
${cdk.version}
test
-
software.constructs
constructs
@@ -226,9 +214,6 @@
**/*E2ET.java
-
- **/TracingE2ET.java
-
@@ -257,10 +242,8 @@
**/MetricsE2ET.java
**/LoggingE2ET.java
**/ParametersE2ET.java
+ **/TracingE2ET.java
-
- **/TracingE2ET.java
-
true
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/BatchE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/BatchE2ET.java
index c5f74594d..181d5e583 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/BatchE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/BatchE2ET.java
@@ -15,10 +15,7 @@
package software.amazon.lambda.powertools;
import static org.assertj.core.api.Assertions.assertThat;
-import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -26,11 +23,16 @@
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
@@ -44,18 +46,18 @@
import software.amazon.awssdk.services.kinesis.KinesisClient;
import software.amazon.awssdk.services.kinesis.model.PutRecordsRequest;
import software.amazon.awssdk.services.kinesis.model.PutRecordsRequestEntry;
-import software.amazon.awssdk.services.kinesis.model.PutRecordsResponse;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;
import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;
+import software.amazon.lambda.powertools.testutils.DataNotReadyException;
import software.amazon.lambda.powertools.testutils.Infrastructure;
+import software.amazon.lambda.powertools.testutils.RetryUtils;
import software.amazon.lambda.powertools.utilities.JsonConfig;
-public class BatchE2ET {
+class BatchE2ET {
private static final SdkHttpClient httpClient = UrlConnectionHttpClient.builder().build();
private static final Region region = Region.of(System.getProperty("AWS_DEFAULT_REGION", "eu-west-1"));
private static Infrastructure infrastructure;
- private static String functionName;
private static String queueUrl;
private static String kinesisStreamName;
@@ -71,13 +73,12 @@ public BatchE2ET() {
testProducts = Arrays.asList(
new Product(1, "product1", 1.23),
new Product(2, "product2", 4.56),
- new Product(3, "product3", 6.78)
- );
+ new Product(3, "product3", 6.78));
}
@BeforeAll
@Timeout(value = 5, unit = TimeUnit.MINUTES)
- public static void setup() {
+ static void setup() {
String random = UUID.randomUUID().toString().substring(0, 6);
String queueName = "batchqueue" + random;
kinesisStreamName = "batchstream" + random;
@@ -94,7 +95,6 @@ public static void setup() {
.build();
Map outputs = infrastructure.deploy();
- functionName = outputs.get(FUNCTION_NAME_OUTPUT);
queueUrl = outputs.get("QueueURL");
kinesisStreamName = outputs.get("KinesisStreamName");
outputTable = outputs.get("TableNameForAsyncTests");
@@ -117,21 +117,21 @@ public static void setup() {
}
@AfterAll
- public static void tearDown() {
+ static void tearDown() {
if (infrastructure != null) {
infrastructure.destroy();
}
}
@AfterEach
- public void cleanUpTest() {
+ void cleanUpTest() {
// Delete everything in the output table
ScanResponse items = ddbClient.scan(ScanRequest.builder()
.tableName(outputTable)
.build());
for (Map item : items.items()) {
- HashMap key = new HashMap() {
+ Map key = new HashMap<>() {
{
put("functionName", AttributeValue.builder()
.s(item.get("functionName").s())
@@ -150,7 +150,7 @@ public void cleanUpTest() {
}
@Test
- public void sqsBatchProcessingSucceeds() throws InterruptedException {
+ void sqsBatchProcessingSucceeds() {
List entries = testProducts.stream()
.map(p -> {
try {
@@ -169,17 +169,23 @@ public void sqsBatchProcessingSucceeds() throws InterruptedException {
.entries(entries)
.queueUrl(queueUrl)
.build());
- Thread.sleep(30000); // wait for function to be executed
// THEN
- ScanResponse items = ddbClient.scan(ScanRequest.builder()
- .tableName(outputTable)
- .build());
- validateAllItemsHandled(items);
+ ScanRequest scanRequest = ScanRequest.builder().tableName(outputTable).build();
+ RetryUtils.withRetry(() -> {
+ ScanResponse items = ddbClient.scan(scanRequest);
+ if (!areAllTestProductsPresent(items)) {
+ throw new DataNotReadyException("sqs-batch-processing not complete yet");
+ }
+ return null;
+ }, "sqs-batch-processing", DataNotReadyException.class).get();
+
+ ScanResponse finalItems = ddbClient.scan(scanRequest);
+ assertThat(areAllTestProductsPresent(finalItems)).isTrue();
}
@Test
- public void kinesisBatchProcessingSucceeds() throws InterruptedException {
+ void kinesisBatchProcessingSucceeds() {
List entries = testProducts.stream()
.map(p -> {
try {
@@ -194,21 +200,27 @@ public void kinesisBatchProcessingSucceeds() throws InterruptedException {
.collect(Collectors.toList());
// WHEN
- PutRecordsResponse result = kinesisClient.putRecords(PutRecordsRequest.builder()
+ kinesisClient.putRecords(PutRecordsRequest.builder()
.streamName(kinesisStreamName)
.records(entries)
.build());
- Thread.sleep(30000); // wait for function to be executed
// THEN
- ScanResponse items = ddbClient.scan(ScanRequest.builder()
- .tableName(outputTable)
- .build());
- validateAllItemsHandled(items);
+ ScanRequest scanRequest = ScanRequest.builder().tableName(outputTable).build();
+ RetryUtils.withRetry(() -> {
+ ScanResponse items = ddbClient.scan(scanRequest);
+ if (!areAllTestProductsPresent(items)) {
+ throw new DataNotReadyException("kinesis-batch-processing not complete yet");
+ }
+ return null;
+ }, "kinesis-batch-processing", DataNotReadyException.class).get();
+
+ ScanResponse finalItems = ddbClient.scan(scanRequest);
+ assertThat(areAllTestProductsPresent(finalItems)).isTrue();
}
@Test
- public void ddbStreamsBatchProcessingSucceeds() throws InterruptedException {
+ void ddbStreamsBatchProcessingSucceeds() {
// GIVEN
String theId = "my-test-id";
@@ -223,39 +235,43 @@ public void ddbStreamsBatchProcessingSucceeds() throws InterruptedException {
}
})
.build());
- Thread.sleep(90000); // wait for function to be executed
// THEN
- ScanResponse items = ddbClient.scan(ScanRequest.builder()
- .tableName(outputTable)
- .build());
+ ScanRequest scanRequest = ScanRequest.builder().tableName(outputTable).build();
+ RetryUtils.withRetry(() -> {
+ ScanResponse items = ddbClient.scan(scanRequest);
+ if (items.count() != 1) {
+ throw new DataNotReadyException("DDB streams processing not complete yet");
+ }
+ return null;
+ }, "ddb-streams-batch-processing", DataNotReadyException.class).get();
- assertThat(items.count()).isEqualTo(1);
- assertThat(items.items().get(0).get("id").s()).isEqualTo(theId);
+ ScanResponse finalItems = ddbClient.scan(scanRequest);
+ assertThat(finalItems.count()).isEqualTo(1);
+ assertThat(finalItems.items().get(0).get("id").s()).isEqualTo(theId);
}
- private void validateAllItemsHandled(ScanResponse items) {
+ private boolean areAllTestProductsPresent(ScanResponse items) {
for (Product p : testProducts) {
boolean foundIt = false;
for (Map a : items.items()) {
if (a.get("id").s().equals(Long.toString(p.id))) {
foundIt = true;
+ break;
}
}
- assertThat(foundIt).isTrue();
+ if (!foundIt) {
+ return false;
+ }
}
+ return true;
}
class Product {
private long id;
-
private String name;
-
private double price;
- public Product() {
- }
-
public Product(long id, String name, double price) {
this.id = id;
this.name = name;
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java
index 242d1a2db..292f46bfa 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java
@@ -21,21 +21,23 @@
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
+
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
+
import software.amazon.lambda.powertools.testutils.Infrastructure;
import software.amazon.lambda.powertools.testutils.lambda.InvocationResult;
-public class IdempotencyE2ET {
+class IdempotencyE2ET {
private static Infrastructure infrastructure;
private static String functionName;
@BeforeAll
@Timeout(value = 5, unit = TimeUnit.MINUTES)
- public static void setup() {
+ static void setup() {
String random = UUID.randomUUID().toString().substring(0, 6);
infrastructure = Infrastructure.builder()
.testName(IdempotencyE2ET.class.getSimpleName())
@@ -47,14 +49,14 @@ public static void setup() {
}
@AfterAll
- public static void tearDown() {
+ static void tearDown() {
if (infrastructure != null) {
infrastructure.destroy();
}
}
@Test
- public void test_ttlNotExpired_sameResult_ttlExpired_differentResult() throws InterruptedException {
+ void test_ttlNotExpired_sameResult_ttlExpired_differentResult() throws InterruptedException {
// GIVEN
String event = "{\"message\":\"TTL 10sec\"}";
@@ -65,6 +67,7 @@ public void test_ttlNotExpired_sameResult_ttlExpired_differentResult() throws In
// Second invocation (should get same result)
InvocationResult result2 = invokeFunction(functionName, event);
+ // Function idempotency record expiration is set to 10 seconds
Thread.sleep(12000);
// Third invocation (should get different result)
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageE2ET.java
index d9c3ef749..74247ca2e 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageE2ET.java
@@ -36,9 +36,11 @@
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
+import software.amazon.lambda.powertools.testutils.DataNotReadyException;
import software.amazon.lambda.powertools.testutils.Infrastructure;
+import software.amazon.lambda.powertools.testutils.RetryUtils;
-public class LargeMessageE2ET {
+class LargeMessageE2ET {
private static final Logger LOG = LoggerFactory.getLogger(LargeMessageE2ET.class);
private static final SdkHttpClient httpClient = UrlConnectionHttpClient.builder().build();
@@ -62,7 +64,7 @@ public class LargeMessageE2ET {
@BeforeAll
@Timeout(value = 5, unit = TimeUnit.MINUTES)
- public static void setup() {
+ static void setup() {
String random = UUID.randomUUID().toString().substring(0, 6);
bucketName = "largemessagebucket" + random;
String queueName = "largemessagequeue" + random;
@@ -84,14 +86,14 @@ public static void setup() {
}
@AfterAll
- public static void tearDown() {
+ static void tearDown() {
if (infrastructure != null) {
infrastructure.destroy();
}
}
@AfterEach
- public void reset() {
+ void reset() {
if (messageId != null) {
Map itemToDelete = new HashMap<>();
itemToDelete.put("functionName", AttributeValue.builder().s(functionName).build());
@@ -102,25 +104,24 @@ public void reset() {
}
@Test
- public void bigSQSMessageOffloadedToS3_shouldLoadFromS3() throws IOException, InterruptedException {
- // given
+ void bigSQSMessageOffloadedToS3_shouldLoadFromS3() throws IOException {
+ // GIVEN
final ExtendedClientConfiguration extendedClientConfig = new ExtendedClientConfiguration()
.withPayloadSupportEnabled(s3Client, bucketName);
try (AmazonSQSExtendedClient client = new AmazonSQSExtendedClient(
- SqsClient.builder().region(region).httpClient(httpClient).build(), extendedClientConfig)) {
- InputStream inputStream = this.getClass().getResourceAsStream("/large_sqs_message.txt");
+ SqsClient.builder().region(region).httpClient(httpClient).build(), extendedClientConfig);
+ InputStream inputStream = this.getClass().getResourceAsStream("/large_sqs_message.txt");) {
String bigMessage = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
- // when
+ // WHEN
client.sendMessage(SendMessageRequest
.builder()
.queueUrl(queueUrl)
.messageBody(bigMessage)
.build());
}
- Thread.sleep(30000); // wait for function to be executed
- // then
+ // THEN
QueryRequest request = QueryRequest
.builder()
.tableName(tableName)
@@ -128,8 +129,17 @@ public void bigSQSMessageOffloadedToS3_shouldLoadFromS3() throws IOException, In
.expressionAttributeValues(
Collections.singletonMap(":func", AttributeValue.builder().s(functionName).build()))
.build();
- QueryResponse response = dynamoDbClient.query(request);
- List