Skip to content

Commit af37313

Browse files
committed
e2e tests for large messages + improve Infra
1 parent 860f002 commit af37313

File tree

14 files changed

+1435
-11
lines changed

14 files changed

+1435
-11
lines changed

.github/workflows/run-e2e-tests.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,16 @@ on:
1414
- 'powertools-idempotency/**'
1515
- 'powertools-parameters/**'
1616
- 'powertools-metrics/**'
17+
- 'powertools-large-messages/**'
1718
- 'pom.xml'
1819
- '.github/workflows/**'
1920

21+
pull_request:
22+
branches:
23+
- main
24+
paths:
25+
- 'powertools-e2e-tests/**'
26+
2027
jobs:
2128
e2e:
2229
runs-on: ubuntu-latest
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<parent>
6+
<groupId>software.amazon.lambda</groupId>
7+
<artifactId>e2e-test-handlers-parent</artifactId>
8+
<version>1.0.0</version>
9+
</parent>
10+
11+
<artifactId>e2e-test-handler-largemessage</artifactId>
12+
<packaging>jar</packaging>
13+
<name>A Lambda function using Powertools for AWS Lambda (Java) large message</name>
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>software.amazon.awssdk</groupId>
18+
<artifactId>dynamodb</artifactId>
19+
</dependency>
20+
<dependency>
21+
<groupId>software.amazon.lambda</groupId>
22+
<artifactId>powertools-large-messages</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>software.amazon.lambda</groupId>
26+
<artifactId>powertools-logging</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>com.amazonaws</groupId>
30+
<artifactId>aws-lambda-java-events</artifactId>
31+
</dependency>
32+
33+
</dependencies>
34+
35+
<build>
36+
<plugins>
37+
<plugin>
38+
<groupId>dev.aspectj</groupId>
39+
<artifactId>aspectj-maven-plugin</artifactId>
40+
<configuration>
41+
<source>${maven.compiler.source}</source>
42+
<target>${maven.compiler.target}</target>
43+
<complianceLevel>${maven.compiler.target}</complianceLevel>
44+
<aspectLibraries>
45+
<aspectLibrary>
46+
<groupId>software.amazon.lambda</groupId>
47+
<artifactId>powertools-large-messages</artifactId>
48+
</aspectLibrary>
49+
<aspectLibrary>
50+
<groupId>software.amazon.lambda</groupId>
51+
<artifactId>powertools-logging</artifactId>
52+
</aspectLibrary>
53+
</aspectLibraries>
54+
</configuration>
55+
<executions>
56+
<execution>
57+
<goals>
58+
<goal>compile</goal>
59+
</goals>
60+
</execution>
61+
</executions>
62+
</plugin>
63+
<plugin>
64+
<groupId>org.apache.maven.plugins</groupId>
65+
<artifactId>maven-shade-plugin</artifactId>
66+
</plugin>
67+
</plugins>
68+
</build>
69+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package software.amazon.lambda.powertools.e2e;
2+
3+
import com.amazonaws.services.lambda.runtime.Context;
4+
import com.amazonaws.services.lambda.runtime.RequestHandler;
5+
import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse;
6+
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
7+
import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;
8+
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
9+
import software.amazon.awssdk.regions.Region;
10+
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
11+
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
12+
import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;
13+
import software.amazon.awssdk.utils.BinaryUtils;
14+
import software.amazon.awssdk.utils.Md5Utils;
15+
import software.amazon.lambda.powertools.largemessages.LargeMessage;
16+
import software.amazon.lambda.powertools.logging.Logging;
17+
18+
import java.nio.charset.StandardCharsets;
19+
import java.util.HashMap;
20+
import java.util.Map;
21+
22+
public class Function implements RequestHandler<SQSEvent, SQSBatchResponse> {
23+
24+
private static final String TABLE_FOR_ASYNC_TESTS = System.getenv("TABLE_FOR_ASYNC_TESTS");
25+
private DynamoDbClient client;
26+
27+
public Function() {
28+
if (client == null) {
29+
client = DynamoDbClient.builder()
30+
.httpClient(UrlConnectionHttpClient.builder().build())
31+
.region(Region.of(System.getenv("AWS_REGION")))
32+
.build();
33+
}
34+
}
35+
36+
@Logging(logEvent = true)
37+
public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
38+
for (SQSMessage message: event.getRecords()) {
39+
processRawMessage(message, context);
40+
}
41+
return SQSBatchResponse.builder().build();
42+
}
43+
44+
@LargeMessage(deleteS3Object = false)
45+
private void processRawMessage(SQSMessage sqsMessage, Context context) {
46+
String bodyMD5 = md5(sqsMessage.getBody());
47+
if (!sqsMessage.getMd5OfBody().equals(bodyMD5)) {
48+
throw new SecurityException(String.format("message digest does not match, expected %s, got %s", sqsMessage.getMd5OfBody(), bodyMD5));
49+
}
50+
51+
Map<String, AttributeValue> item = new HashMap<>();
52+
item.put("functionName", AttributeValue.builder().s(context.getFunctionName()).build());
53+
item.put("id", AttributeValue.builder().s(sqsMessage.getMessageId()).build());
54+
item.put("bodyMD5", AttributeValue.builder().s(bodyMD5).build());
55+
item.put("bodySize", AttributeValue.builder().n(String.valueOf(sqsMessage.getBody().getBytes(StandardCharsets.UTF_8).length)).build());
56+
57+
client.putItem(PutItemRequest.builder().tableName(TABLE_FOR_ASYNC_TESTS).item(item).build());
58+
}
59+
60+
private String md5(String message) {
61+
return BinaryUtils.toHex(Md5Utils.computeMD5Hash(message.getBytes(StandardCharsets.UTF_8)));
62+
}
63+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration>
3+
<Appenders>
4+
<Console name="JsonAppender" target="SYSTEM_OUT">
5+
<JsonTemplateLayout eventTemplateUri="classpath:LambdaJsonLayout.json" />
6+
</Console>
7+
</Appenders>
8+
<Loggers>
9+
<Root level="INFO">
10+
<AppenderRef ref="JsonAppender"/>
11+
</Root>
12+
<Logger name="JsonLogger" level="INFO" additivity="false">
13+
<AppenderRef ref="JsonAppender"/>
14+
</Logger>
15+
</Loggers>
16+
</Configuration>

powertools-e2e-tests/handlers/pom.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<maven.shade.version>3.5.0</maven.shade.version>
2121
<aspectj.plugin.version>1.13.1</aspectj.plugin.version>
2222
<maven.compiler.version>3.11.0</maven.compiler.version>
23+
<aws.sdk.version>2.20.108</aws.sdk.version>
2324
</properties>
2425

2526
<modules>
@@ -32,6 +33,14 @@
3233

3334
<dependencyManagement>
3435
<dependencies>
36+
<dependency>
37+
<groupId>software.amazon.awssdk</groupId>
38+
<artifactId>bom</artifactId>
39+
<version>${aws.sdk.version}</version>
40+
<type>pom</type>
41+
<scope>import</scope>
42+
</dependency>
43+
3544
<dependency>
3645
<groupId>software.amazon.lambda</groupId>
3746
<artifactId>powertools-logging</artifactId>
@@ -57,6 +66,11 @@
5766
<artifactId>powertools-parameters</artifactId>
5867
<version>${lambda.powertools.version}</version>
5968
</dependency>
69+
<dependency>
70+
<groupId>software.amazon.lambda</groupId>
71+
<artifactId>powertools-large-messages</artifactId>
72+
<version>${lambda.powertools.version}</version>
73+
</dependency>
6074
<dependency>
6175
<groupId>com.amazonaws</groupId>
6276
<artifactId>aws-lambda-java-core</artifactId>

powertools-e2e-tests/pom.xml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@
5151
<scope>test</scope>
5252
</dependency>
5353

54+
<dependency>
55+
<groupId>software.amazon.awssdk</groupId>
56+
<artifactId>dynamodb</artifactId>
57+
<version>${aws.sdk.version}</version>
58+
<scope>test</scope>
59+
</dependency>
60+
5461
<dependency>
5562
<groupId>software.amazon.awssdk</groupId>
5663
<artifactId>cloudwatch</artifactId>
@@ -65,6 +72,20 @@
6572
<scope>test</scope>
6673
</dependency>
6774

75+
<dependency>
76+
<groupId>software.amazon.awssdk</groupId>
77+
<artifactId>sqs</artifactId>
78+
<version>${aws.sdk.version}</version>
79+
<scope>test</scope>
80+
</dependency>
81+
82+
<dependency>
83+
<groupId>com.amazonaws</groupId>
84+
<artifactId>amazon-sqs-java-extended-client-lib</artifactId>
85+
<version>2.0.3</version>
86+
<scope>test</scope>
87+
</dependency>
88+
6889
<dependency>
6990
<groupId>software.amazon.awssdk</groupId>
7091
<artifactId>url-connection-client</artifactId>
@@ -77,6 +98,12 @@
7798
<scope>test</scope>
7899
</dependency>
79100

101+
<dependency>
102+
<groupId>commons-io</groupId>
103+
<artifactId>commons-io</artifactId>
104+
<version>2.11.0</version>
105+
</dependency>
106+
80107
<dependency>
81108
<groupId>org.junit.jupiter</groupId>
82109
<artifactId>junit-jupiter-engine</artifactId>

powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414

1515
package software.amazon.lambda.powertools;
1616

17+
import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
1718
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;
1819

1920
import java.time.Year;
2021
import java.util.Collections;
22+
import java.util.Map;
2123
import java.util.UUID;
2224
import java.util.concurrent.TimeUnit;
2325
import org.assertj.core.api.Assertions;
@@ -42,7 +44,8 @@ public static void setup() {
4244
.idempotencyTable("idempo" + random)
4345
.environmentVariables(Collections.singletonMap("IDEMPOTENCY_TABLE", "idempo" + random))
4446
.build();
45-
functionName = infrastructure.deploy();
47+
Map<String, String> outputs = infrastructure.deploy();
48+
functionName = outputs.get(FUNCTION_NAME_OUTPUT);
4649
}
4750

4851
@AfterAll

0 commit comments

Comments
 (0)