Skip to content

Commit c7e04cd

Browse files
committed
new test-suite module for testing multi module use cases.
1 parent 5eeda56 commit c7e04cd

File tree

5 files changed

+308
-0
lines changed

5 files changed

+308
-0
lines changed

pom.xml

+11
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<module>powertools-metrics</module>
3535
<module>powertools-parameters</module>
3636
<module>powertools-validation</module>
37+
<module>powertools-test-suite</module>
3738
</modules>
3839

3940
<scm>
@@ -88,6 +89,16 @@
8889
<artifactId>powertools-core</artifactId>
8990
<version>${project.version}</version>
9091
</dependency>
92+
<dependency>
93+
<groupId>software.amazon.lambda</groupId>
94+
<artifactId>powertools-logging</artifactId>
95+
<version>${project.version}</version>
96+
</dependency>
97+
<dependency>
98+
<groupId>software.amazon.lambda</groupId>
99+
<artifactId>powertools-sqs</artifactId>
100+
<version>${project.version}</version>
101+
</dependency>
91102
<dependency>
92103
<groupId>com.amazonaws</groupId>
93104
<artifactId>aws-lambda-java-core</artifactId>

powertools-test-suite/pom.xml

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<artifactId>powertools-test-suite</artifactId>
8+
<packaging>jar</packaging>
9+
10+
<parent>
11+
<artifactId>powertools-parent</artifactId>
12+
<groupId>software.amazon.lambda</groupId>
13+
<version>1.7.3</version>
14+
</parent>
15+
16+
<name>AWS Lambda Powertools Java library Test Suite</name>
17+
<description>
18+
A suite of tests for interactions between the various Powertools modules.
19+
</description>
20+
<url>https://aws.amazon.com/lambda/</url>
21+
<issueManagement>
22+
<system>GitHub Issues</system>
23+
<url>https://github.com/awslabs/aws-lambda-powertools-java/issues</url>
24+
</issueManagement>
25+
<scm>
26+
<url>https://github.com/awslabs/aws-lambda-powertools-java.git</url>
27+
</scm>
28+
<developers>
29+
<developer>
30+
<name>AWS Lambda Powertools team</name>
31+
<organization>Amazon Web Services</organization>
32+
<organizationUrl>https://aws.amazon.com/</organizationUrl>
33+
</developer>
34+
</developers>
35+
36+
<distributionManagement>
37+
<snapshotRepository>
38+
<id>ossrh</id>
39+
<url>https://aws.oss.sonatype.org/content/repositories/snapshots</url>
40+
</snapshotRepository>
41+
</distributionManagement>
42+
43+
<dependencies>
44+
<dependency>
45+
<groupId>software.amazon.lambda</groupId>
46+
<artifactId>powertools-core</artifactId>
47+
</dependency>
48+
<dependency>
49+
<groupId>com.amazonaws</groupId>
50+
<artifactId>aws-lambda-java-core</artifactId>
51+
</dependency>
52+
<dependency>
53+
<groupId>com.amazonaws</groupId>
54+
<artifactId>aws-lambda-java-events</artifactId>
55+
</dependency>
56+
<dependency>
57+
<groupId>software.amazon.lambda</groupId>
58+
<artifactId>powertools-logging</artifactId>
59+
</dependency>
60+
<dependency>
61+
<groupId>software.amazon.lambda</groupId>
62+
<artifactId>powertools-sqs</artifactId>
63+
</dependency>
64+
65+
<!-- Test dependencies -->
66+
<dependency>
67+
<groupId>org.junit.jupiter</groupId>
68+
<artifactId>junit-jupiter-api</artifactId>
69+
<scope>test</scope>
70+
</dependency>
71+
<dependency>
72+
<groupId>org.junit.jupiter</groupId>
73+
<artifactId>junit-jupiter-engine</artifactId>
74+
<scope>test</scope>
75+
</dependency>
76+
<dependency>
77+
<groupId>org.apache.commons</groupId>
78+
<artifactId>commons-lang3</artifactId>
79+
<scope>test</scope>
80+
</dependency>
81+
<dependency>
82+
<groupId>org.mockito</groupId>
83+
<artifactId>mockito-core</artifactId>
84+
<scope>test</scope>
85+
</dependency>
86+
<dependency>
87+
<groupId>org.aspectj</groupId>
88+
<artifactId>aspectjweaver</artifactId>
89+
<scope>test</scope>
90+
</dependency>
91+
<dependency>
92+
<groupId>org.assertj</groupId>
93+
<artifactId>assertj-core</artifactId>
94+
<scope>test</scope>
95+
</dependency>
96+
<dependency>
97+
<groupId>org.skyscreamer</groupId>
98+
<artifactId>jsonassert</artifactId>
99+
<scope>test</scope>
100+
</dependency>
101+
</dependencies>
102+
103+
<build>
104+
<plugins>
105+
<plugin>
106+
<groupId>org.codehaus.mojo</groupId>
107+
<artifactId>aspectj-maven-plugin</artifactId>
108+
<version>1.14.0</version>
109+
<configuration>
110+
<source>${maven.compiler.source}</source>
111+
<target>${maven.compiler.target}</target>
112+
<complianceLevel>${maven.compiler.target}</complianceLevel>
113+
<aspectLibraries>
114+
<aspectLibrary>
115+
<groupId>software.amazon.lambda</groupId>
116+
<artifactId>powertools-logging</artifactId>
117+
</aspectLibrary>
118+
<aspectLibrary>
119+
<groupId>software.amazon.lambda</groupId>
120+
<artifactId>powertools-sqs</artifactId>
121+
</aspectLibrary>
122+
</aspectLibraries>
123+
</configuration>
124+
<executions>
125+
<execution>
126+
<goals>
127+
<goal>compile</goal>
128+
</goals>
129+
</execution>
130+
</executions>
131+
</plugin>
132+
</plugins>
133+
</build>
134+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package software.amazon.lambda.powertools.testsuite;
2+
3+
4+
import com.amazonaws.services.lambda.runtime.Context;
5+
import com.amazonaws.services.lambda.runtime.RequestHandler;
6+
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
7+
import com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification;
8+
import com.amazonaws.services.s3.AmazonS3;
9+
import com.amazonaws.services.s3.model.S3Object;
10+
import com.fasterxml.jackson.core.JsonProcessingException;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import org.apache.logging.log4j.Level;
13+
import org.apache.logging.log4j.ThreadContext;
14+
import org.json.JSONException;
15+
import org.junit.jupiter.api.Assertions;
16+
import org.junit.jupiter.api.BeforeEach;
17+
import org.junit.jupiter.api.Test;
18+
import org.mockito.Mock;
19+
import software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor;
20+
import software.amazon.lambda.powertools.logging.internal.LambdaLoggingAspect;
21+
import software.amazon.lambda.powertools.sqs.internal.SqsLargeMessageAspect;
22+
import software.amazon.lambda.powertools.testsuite.handler.LoggingOrderMessageHandler;
23+
24+
import java.io.BufferedReader;
25+
import java.io.ByteArrayInputStream;
26+
import java.io.IOException;
27+
import java.io.InputStreamReader;
28+
import java.lang.reflect.InvocationTargetException;
29+
import java.lang.reflect.Method;
30+
import java.nio.channels.FileChannel;
31+
import java.nio.file.Files;
32+
import java.nio.file.Paths;
33+
import java.nio.file.StandardOpenOption;
34+
import java.util.Map;
35+
36+
import static java.util.Collections.emptyMap;
37+
import static java.util.Collections.singletonList;
38+
import static java.util.stream.Collectors.joining;
39+
import static org.apache.commons.lang3.reflect.FieldUtils.writeStaticField;
40+
import static org.assertj.core.api.Assertions.fail;
41+
import static org.mockito.Mockito.when;
42+
import static org.mockito.MockitoAnnotations.openMocks;
43+
import static org.skyscreamer.jsonassert.JSONAssert.assertEquals;
44+
45+
public class LoggingOrderTest {
46+
47+
private static final String BUCKET_NAME = "ms-extended-sqs-client";
48+
private static final String BUCKET_KEY = "c71eb2ae-37e0-4265-8909-32f4153faddf";
49+
50+
@Mock
51+
private Context context;
52+
53+
@Mock
54+
private AmazonS3 amazonS3;
55+
56+
@BeforeEach
57+
void setUp() throws IllegalAccessException, IOException, NoSuchMethodException, InvocationTargetException {
58+
openMocks(this);
59+
writeStaticField(SqsLargeMessageAspect.class, "amazonS3", amazonS3, true);
60+
ThreadContext.clearAll();
61+
writeStaticField(LambdaHandlerProcessor.class, "IS_COLD_START", null, true);
62+
setupContext();
63+
//Make sure file is cleaned up before running full stack logging regression
64+
FileChannel.open(Paths.get("target/logfile.json"), StandardOpenOption.WRITE).truncate(0).close();
65+
resetLogLevel(Level.INFO);
66+
}
67+
68+
/**
69+
* The SQSEvent payload will be altered by the @SqsLargeMessage annoation. Logging of the event should happen
70+
* after the event has been altered
71+
*
72+
* @throws IOException
73+
* @throws JSONException
74+
*/
75+
@Test
76+
public void testThatLoggingAnnotationActsLast() throws IOException, JSONException {
77+
S3Object s3Response = new S3Object();
78+
s3Response.setObjectContent(new ByteArrayInputStream("A big message".getBytes()));
79+
80+
when(amazonS3.getObject(BUCKET_NAME, BUCKET_KEY)).thenReturn(s3Response);
81+
SQSEvent sqsEvent = messageWithBody("[\"software.amazon.payloadoffloading.PayloadS3Pointer\",{\"s3BucketName\":\"" + BUCKET_NAME + "\",\"s3Key\":\"" + BUCKET_KEY + "\"}]");
82+
83+
LoggingOrderMessageHandler requestHandler = new LoggingOrderMessageHandler();
84+
requestHandler.handleRequest(sqsEvent, context);
85+
86+
// Map<String, Object> log = parseToMap(Files.lines(Paths.get("target/logfile.json")).collect(joining()));
87+
String loglines = Files.lines(Paths.get("target/logfile.json")).collect(joining());
88+
89+
Assertions.assertEquals("A big message", loglines);
90+
// String event = (String) log.get("message");
91+
92+
// String expectEvent = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/s3EventNotification.json")))
93+
// .lines().collect(joining("\n"));
94+
95+
// assertEquals(expectEvent, event, false);
96+
}
97+
98+
private void setupContext() {
99+
when(context.getFunctionName()).thenReturn("testFunction");
100+
when(context.getInvokedFunctionArn()).thenReturn("testArn");
101+
when(context.getFunctionVersion()).thenReturn("1");
102+
when(context.getMemoryLimitInMB()).thenReturn(10);
103+
when(context.getAwsRequestId()).thenReturn("RequestId");
104+
}
105+
106+
private void resetLogLevel(Level level) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
107+
Method resetLogLevels = LambdaLoggingAspect.class.getDeclaredMethod("resetLogLevels", Level.class);
108+
resetLogLevels.setAccessible(true);
109+
resetLogLevels.invoke(null, level);
110+
writeStaticField(LambdaLoggingAspect.class, "LEVEL_AT_INITIALISATION", level, true);
111+
}
112+
113+
// private Map<String, Object> parseToMap(String stringAsJson) {
114+
// try {
115+
// return new ObjectMapper().readValue(stringAsJson, Map.class);
116+
// } catch (JsonProcessingException e) {
117+
// fail("Failed parsing logger line " + stringAsJson);
118+
// return emptyMap();
119+
// }
120+
// }
121+
122+
private SQSEvent messageWithBody(String messageBody) {
123+
SQSEvent.SQSMessage sqsMessage = new SQSEvent.SQSMessage();
124+
sqsMessage.setBody(messageBody);
125+
SQSEvent sqsEvent = new SQSEvent();
126+
sqsEvent.setRecords(singletonList(sqsMessage));
127+
return sqsEvent;
128+
}
129+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package software.amazon.lambda.powertools.testsuite.handler;
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.SQSEvent;
6+
import software.amazon.lambda.powertools.logging.Logging;
7+
import software.amazon.lambda.powertools.sqs.SqsLargeMessage;
8+
9+
public class LoggingOrderMessageHandler implements RequestHandler<SQSEvent, String> {
10+
11+
@Override
12+
@SqsLargeMessage
13+
@Logging(logEvent = true)
14+
public String handleRequest(SQSEvent sqsEvent, Context context) {
15+
System.out.println(sqsEvent.getRecords().get(0).getBody());
16+
return sqsEvent.getRecords().get(0).getBody();
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration packages="com.amazonaws.services.lambda.runtime.log4j2">
3+
<Appenders>
4+
<File name="JsonAppender" fileName="target/logfile.json">
5+
<LambdaJsonLayout compact="true" eventEol="true"/>
6+
</File>
7+
</Appenders>
8+
<Loggers>
9+
<Logger name="JsonLogger" level="INFO" additivity="false">
10+
<AppenderRef ref="JsonAppender"/>
11+
</Logger>
12+
<Root level="info">
13+
<AppenderRef ref="JsonAppender"/>
14+
</Root>
15+
</Loggers>
16+
</Configuration>

0 commit comments

Comments
 (0)