diff --git a/.github/workflows/aws-lambda-java-events.yml b/.github/workflows/aws-lambda-java-events.yml index 6b7e2f81..df2a06be 100644 --- a/.github/workflows/aws-lambda-java-events.yml +++ b/.github/workflows/aws-lambda-java-events.yml @@ -34,4 +34,4 @@ jobs: run: mvn -B package --file aws-lambda-java-serialization/pom.xml - name: Build events-sdk-transformer with Maven run: mvn -B package --file aws-lambda-java-events-sdk-transformer/pom.xml - + diff --git a/.github/workflows/aws-lambda-java-tests.yml b/.github/workflows/aws-lambda-java-tests.yml new file mode 100644 index 00000000..b00b3781 --- /dev/null +++ b/.github/workflows/aws-lambda-java-tests.yml @@ -0,0 +1,37 @@ +# This workflow will be triggered if there will be changes to aws-lambda-java-tests +# package and it builds the package and the packages that depend on it. + +name: Java CI aws-lambda-java-tests + +on: + push: + branches: [ master ] + paths: + - 'aws-lambda-java-tests/**' + pull_request: + branches: [ '*' ] + paths: + - 'aws-lambda-java-tests/**' + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + # Install base module + - name: Install events with Maven + run: mvn -B install --file aws-lambda-java-events/pom.xml + - name: Install serialization with Maven + run: mvn -B install --file aws-lambda-java-serialization/pom.xml + + # Package target module + - name: Package tests with Maven + run: mvn -B package --file aws-lambda-java-tests/pom.xml + diff --git a/README.md b/README.md index 44215219..3c386922 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Check out the per-module release notes: - [aws-lambda-java-log4j2](aws-lambda-java-log4j2/RELEASE.CHANGELOG.md) - [aws-lambda-java-runtime-interface-client](aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md) - [aws-lambda-java-serialization](aws-lambda-java-serialization/RELEASE.CHANGELOG.md) +- [aws-lambda-java-test](aws-lambda-java-tests/RELEASE.CHANGELOG.md) # Where to get packages ___ @@ -53,6 +54,12 @@ ___ aws-lambda-java-runtime-interface-client 1.0.0 + + com.amazonaws + aws-lambda-java-tests + 1.0.0 + test + ``` [Gradle](https://gradle.org) @@ -63,6 +70,7 @@ ___ 'com.amazonaws:aws-lambda-java-events-sdk-transformer:3.0.1' 'com.amazonaws:aws-lambda-java-log4j2:1.2.0' 'com.amazonaws:aws-lambda-java-runtime-interface-client:1.0.0' +'com.amazonaws:aws-lambda-java-tests:1.0.0' ``` [Leiningen](http://leiningen.org) and [Boot](http://boot-clj.com) @@ -73,6 +81,7 @@ ___ [com.amazonaws/aws-lambda-java-events-sdk-transformer "3.0.1"] [com.amazonaws/aws-lambda-java-log4j2 "1.2.0"] [com.amazonaws/aws-lambda-java-runtime-interface-client "1.0.0"] +[com.amazonaws/aws-lambda-java-tests "1.0.0"] ``` [sbt](http://www.scala-sbt.org) @@ -83,6 +92,7 @@ ___ "com.amazonaws" % "aws-lambda-java-events-sdk-transformer" % "3.0.1" "com.amazonaws" % "aws-lambda-java-log4j2" % "1.2.0" "com.amazonaws" % "aws-lambda-java-runtime-interface-client" % "1.0.0" +"com.amazonaws" % "aws-lambda-java-tests" % "1.0.0" ``` # Using aws-lambda-java-core @@ -114,3 +124,7 @@ The purpose of this package is to allow developers to deploy their applications # Using aws-lambda-java-serialization This package defines the Lambda serialization logic using in the aws-lambda-java-runtime-client library. It has no current standalone usage. + +# Using aws-lambda-java-tests + +This package provides utils to ease Lambda Java testing. Used with `aws-lambda-java-serialization` and `aws-lambda-java-events` to inject events in your JUnit tests. diff --git a/aws-lambda-java-tests/README.md b/aws-lambda-java-tests/README.md new file mode 100644 index 00000000..780717fe --- /dev/null +++ b/aws-lambda-java-tests/README.md @@ -0,0 +1,198 @@ + +# Tests utility + +The `aws-lambda-java-tests` module provides opinionated tools to ease Java Lambda testing. This is a test dependency. + +**Key features** + +* Load events from json files and get them deserialized into Java Events. +* Inject Events directly in JUnit 5 tests, using the `@ParameterizedTest` annotation. + + +## Background + +When using Java for a Lambda function, you must implement the RequestHandler interface and provide input and output types: + +```java +public interface RequestHandler { + public O handleRequest(I input, Context context); +} +``` + +The input is automatically deserialized by the Lambda Java Runtime from a json event into the type you define, +and the output is serialized into JSON from the output type. More info in the [docs](https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html). + +When you want to test your Lambda function and your handleRequest method, you cannot simply use JSON events files +as some of the event fields may not be deserialized correctly. + +For example, an SQS JSON event contains a list of "Records", while the [`SQSEvent`](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SQSEvent.java) use "records" with a lowercase. +You can choose to modify the JSON input but it can be tedious and you generally want to keep the JSON event as you get it +in the doc, the Lambda console or in your logs. + +Now you can use the [aws-lambda-java-serialization](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-serialization) module to deserialize events. And this test library is using this module as a dependency to ease tests of lambda function handlers. + +## Installation + +To install this utility, add the following dependency to your project. Note that it's a test dependency. + +```xml + + com.amazonaws + aws-lambda-java-tests + 1.0.0 + test + +``` + +Also have surefire in your plugins: + +```xml + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + +``` + +## Usage + +### Events injection + +A set of annotations can be used to inject Events and/or to validate handler responses against those Events. +**All those annotations must be used in conjunction with the [`@ParameterizedTest`](https://junit.org/junit5/docs/current/api/org.junit.jupiter.params/org/junit/jupiter/params/ParameterizedTest.html) annotation from Junit 5.** + +`ParameterizedTest` enables to inject arguments into a unit test, so you can run the same test one or more time with different parameters. +See [the doc](https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests) for more details on this. + +**Event** + +The `@Event` annotation permits to inject one Event into a Junit test. + +Example: + +```java +// the json file must be in the classpath (most often in src/test/resources) +@ParameterizedTest +@Event(value = "sqs/sqs_event.json", type = SQSEvent.class) +public void testInjectSQSEvent(SQSEvent event) { + // test your handleRequest method with this event as parameter +} +``` + +**Events** + +The `@Events` annotation permits to inject multiple Events into a Junit test + +Examples: + +```java +@ParameterizedTest +@Events( + events = { + @Event("sqs/sqs_event.json"), + @Event("sqs/sqs_event2.json"), + }, + type = SQSEvent.class +) +public void testInjectEvents(SQSEvent event) { + // test your handleRequest method with all the JSON events available in the sqs folder +} + +// OR simpler + +// sqs folder must be in the classpath (most often in src/test/resources) +@ParameterizedTest +@Events(folder = "sqs", type = SQSEvent.class) +public void testInjectEventsFromFolder(SQSEvent event) { + // test your handleRequest method with all the JSON events available in the sqs folder +} +``` + +**HandlerParams** + +The `@HandlerParams` is the most advanced one as it permits to provide both input and output as arguments to your tests. +Thus you can validate your `handlerRequest` method by providing the output and asserting on the expected output. + +```java + +// Single event +@ParameterizedTest +@HandlerParams( + event = @Event(value = "apigw/events/apigw_event.json", type = APIGatewayProxyRequestEvent.class), + response = @Response(value = "apigw/responses/apigw_response.json", type = APIGatewayProxyResponseEvent.class)) +public void testSingleEventResponse(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) { +} + +// Multiple events in folder +@ParameterizedTest +@HandlerParams( + events = @Events(folder = "apigw/events/", type = APIGatewayProxyRequestEvent.class), + responses = @Responses(folder = "apigw/responses/", type = APIGatewayProxyResponseEvent.class)) +public void testMultipleEventsResponsesInFolder(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) { +} + +// Multiple events +@HandlerParams( + events = @Events( + events = { + @Event("apigw/events/apigw_event.json"), + @Event("apigw/events/apigw_event2.json"), + }, + type = APIGatewayProxyRequestEvent.class + ), + responses = @Responses( + responses = { + @Response("apigw/responses/apigw_response.json"), + @Response("apigw/responses/apigw_response2.json") + }, + type = APIGatewayProxyResponseEvent.class + ) +) +public void testMultipleEventsResponses(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) { +} +``` + +If you cannot use those annotations (for example if you use TestNG), or if you want to load the events on your own, you can directly use the `EventLoader`, which is the underlying class that load the json events. + +### EventLoader + +`EventLoader` enables to load any Event from a JSON file and deserialize it into a Java Object. +Either one from the [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-events) library +or your own Event. + +EventLoader provides a load method for most of the pre-defined events: + +```java +APIGatewayV2HTTPEvent httpEvent = + EventLoader.loadApiGatewayHttpEvent("apigw_http_event.json"); + +APIGatewayProxyRequestEvent restEvent = + EventLoader.loadApiGatewayRestEvent("apigw_rest_event.json"); + +DynamodbEvent ddbEvent = EventLoader.loadDynamoDbEvent("ddb_event.json"); + +KinesisEvent kinesisEvent = + EventLoader.loadKinesisEvent("kinesis_event.json"); + +ScheduledEvent eventBridgeEvent = + EventLoader.loadScheduledEvent("eb_event.json"); + +S3Event s3Event = EventLoader.loadS3Event("s3_event.json"); + +SNSEvent snsEvent = EventLoader.loadSNSEvent("sns_event.json"); + +SQSEvent sqsEvent = EventLoader.loadSQSEvent("sqs_event.json"); + +// ... and many others +``` + +Or you can load what you prefer with the generic method: + +```java +MyEvent myEvent = EventLoader.loadEvent("my_event.json", MyEvent.class); +``` + diff --git a/aws-lambda-java-tests/RELEASE.CHANGELOG.md b/aws-lambda-java-tests/RELEASE.CHANGELOG.md new file mode 100644 index 00000000..60b92247 --- /dev/null +++ b/aws-lambda-java-tests/RELEASE.CHANGELOG.md @@ -0,0 +1,3 @@ +### December 03, 2020 +`1.0.0`: +- Initial release of AWS Lambda Java Tests \ No newline at end of file diff --git a/aws-lambda-java-tests/pom.xml b/aws-lambda-java-tests/pom.xml new file mode 100644 index 00000000..0b734a9b --- /dev/null +++ b/aws-lambda-java-tests/pom.xml @@ -0,0 +1,256 @@ + + 4.0.0 + + com.amazonaws + aws-lambda-java-tests + 1.0.0 + jar + + AWS Lambda Java Tests + Testing module for the AWS Lambda Java Runtime + https://aws.amazon.com/lambda/ + + + Apache License, Version 2.0 + https://aws.amazon.com/apache2.0 + repo + + + + https://github.com/aws/aws-lambda-java-libs.git + + + + AWS Lambda team + Amazon Web Services + https://aws.amazon.com/ + + + + + 1.8 + 1.8 + UTF-8 + 5.7.0 + + + + + com.amazonaws + aws-lambda-java-serialization + 1.0.0 + + + com.amazonaws + aws-lambda-java-events + 3.6.0 + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + + + org.junit.jupiter + junit-jupiter-params + ${junit.version} + + + org.apache.commons + commons-lang3 + 3.11 + + + + org.assertj + assertj-core + 3.18.1 + test + + + + + + checkDependencies + + + checkDependencies + + + + + + org.owasp + dependency-check-maven + 5.3.2 + + + validate + + check + + + + + + + + + dev + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.2.0 + + none + false + 8 + false + + + + attach-javadocs + + jar + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.6 + + + default-prepare-agent + + prepare-agent + + + + default-report + test + + report + + + + default-check + test + + check + + + + + PACKAGE + + + LINE + COVEREDRATIO + 0 + + + + + + + + + + + + + release + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.2.0 + + none + false + 8 + false + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.3 + true + + sonatype-nexus-staging + https://aws.oss.sonatype.org/ + false + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${maven.compiler.source} + ${maven.compiler.target} + false + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + + \ No newline at end of file diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventArgumentsProvider.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventArgumentsProvider.java new file mode 100644 index 00000000..0dec6e6b --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventArgumentsProvider.java @@ -0,0 +1,29 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.tests.annotations.Event; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; +import org.junit.jupiter.params.support.AnnotationConsumer; + +import java.util.stream.Stream; + +/** + * Used to process @{@link Event} com.amazonaws.services.lambda.runtime.tests.annotations + */ +public class EventArgumentsProvider implements ArgumentsProvider, AnnotationConsumer { + + private Event event; + + @Override + public Stream provideArguments(ExtensionContext extensionContext) { + Object o = EventLoader.loadEvent(event.value(), event.type()); + return Stream.of(Arguments.of(o)); + } + + @Override + public void accept(Event event) { + this.event = event; + } +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java new file mode 100644 index 00000000..0216d5e3 --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java @@ -0,0 +1,137 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.serialization.PojoSerializer; +import com.amazonaws.services.lambda.runtime.serialization.events.LambdaEventSerializers; + +import java.io.*; + +import com.amazonaws.services.lambda.runtime.events.*; + +/** + * Load events from json files and serialize them in Events + */ +public class EventLoader { + + public static ActiveMQEvent loadActiveMQEvent(String filename) { + return loadEvent(filename, ActiveMQEvent.class); + } + + public static APIGatewayV2HTTPEvent loadApiGatewayHttpEvent(String filename) { + return loadEvent(filename, APIGatewayV2HTTPEvent.class); + } + + public static APIGatewayProxyRequestEvent loadApiGatewayRestEvent(String filename) { + return loadEvent(filename, APIGatewayProxyRequestEvent.class); + } + + public static APIGatewayCustomAuthorizerEvent loadAPIGatewayCustomAuthorizerEvent(String filename) { + return loadEvent(filename, APIGatewayCustomAuthorizerEvent.class); + } + + public static APIGatewayV2CustomAuthorizerEvent loadAPIGatewayV2CustomAuthorizerEvent(String filename) { + return loadEvent(filename, APIGatewayV2CustomAuthorizerEvent.class); + } + + public static ApplicationLoadBalancerRequestEvent loadApplicationLoadBalancerRequestEvent(String filename) { + return loadEvent(filename, ApplicationLoadBalancerRequestEvent.class); + } + + public static CloudFormationCustomResourceEvent loadCloudFormationCustomResourceEvent(String filename) { + return loadEvent(filename, CloudFormationCustomResourceEvent.class); + } + + public static CloudFrontEvent loadCloudFrontEvent(String filename) { + return loadEvent(filename, CloudFrontEvent.class); + } + + public static CloudWatchLogsEvent loadCloudWatchLogsEvent(String filename) { + return loadEvent(filename, CloudWatchLogsEvent.class); + } + + public static CodeCommitEvent loadCodeCommitEvent(String filename) { + return loadEvent(filename, CodeCommitEvent.class); + } + + public static ConfigEvent loadConfigEvent(String filename) { + return loadEvent(filename, ConfigEvent.class); + } + + public static ConnectEvent loadConnectEvent(String filename) { + return loadEvent(filename, ConnectEvent.class); + } + + public static DynamodbEvent loadDynamoDbEvent(String filename) { + return loadEvent(filename, DynamodbEvent.class); + } + + public static KafkaEvent loadKafkaEvent(String filename) { + return loadEvent(filename, KafkaEvent.class); + } + + public static KinesisEvent loadKinesisEvent(String filename) { + return loadEvent(filename, KinesisEvent.class); + } + + public static KinesisFirehoseEvent loadKinesisFirehoseEvent(String filename) { + return loadEvent(filename, KinesisFirehoseEvent.class); + } + + public static LambdaDestinationEvent loadLambdaDestinationEvent(String filename) { + return loadEvent(filename, LambdaDestinationEvent.class); + } + + public static LexEvent loadLexEvent(String filename) { + return loadEvent(filename, LexEvent.class); + } + + public static S3Event loadS3Event(String filename) { + return loadEvent(filename, S3Event.class); + } + + public static SecretsManagerRotationEvent loadSecretsManagerRotationEvent(String filename) { + return loadEvent(filename, SecretsManagerRotationEvent.class); + } + + public static ScheduledEvent loadScheduledEvent(String filename) { + return loadEvent(filename, ScheduledEvent.class); + } + + public static SNSEvent loadSNSEvent(String filename) { + return loadEvent(filename, SNSEvent.class); + } + + public static SQSEvent loadSQSEvent(String filename) { + return loadEvent(filename, SQSEvent.class); + } + + public static T loadEvent(String filename, Class targetClass) { + + if (!filename.endsWith("json")) { + throw new IllegalArgumentException("File " + filename + " must have json extension"); + } + + PojoSerializer serializer = LambdaEventSerializers.serializerFor(targetClass, ClassLoader.getSystemClassLoader()); + + InputStream stream = serializer.getClass().getResourceAsStream(filename); + if (stream == null) { + stream = serializer.getClass().getClassLoader().getResourceAsStream(filename); + } + if (stream == null) { + try { + stream = new FileInputStream(new File(filename)); + } catch (FileNotFoundException e) { + throw new EventLoadingException("Cannot load " + filename, e); + } + } + try { + return serializer.fromJson(stream); + } finally { + try { + stream.close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + } +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoadingException.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoadingException.java new file mode 100644 index 00000000..c7b8c34d --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoadingException.java @@ -0,0 +1,18 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +public class EventLoadingException extends RuntimeException { + + private static final long serialVersionUID = 5766526909472206270L; + + public EventLoadingException() { + } + + public EventLoadingException(String message) { + super(message); + } + + public EventLoadingException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventsArgumentsProvider.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventsArgumentsProvider.java new file mode 100644 index 00000000..2a3b93df --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventsArgumentsProvider.java @@ -0,0 +1,52 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.tests.annotations.Events; +import org.apache.commons.lang3.ArrayUtils; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; +import org.junit.jupiter.params.support.AnnotationConsumer; + +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.stream.Stream; + +/** + * Used to process @{@link Events} com.amazonaws.services.lambda.runtime.tests.annotations + */ +public class EventsArgumentsProvider implements ArgumentsProvider, AnnotationConsumer { + + private Events events; + + @Override + public void accept(Events events) { + this.events = events; + } + + @Override + public Stream provideArguments(ExtensionContext context) throws Exception { + if (ArrayUtils.isNotEmpty(events.events())) { + return Arrays.stream(events.events()) + .map(event -> { + Class clazz = event.type() == Void.class ? events.type() : event.type(); + return Arguments.of(EventLoader.loadEvent(event.value(), clazz)); + }); + } else { + URL folderUrl = getClass().getResource(events.folder()); + if (folderUrl == null) { + folderUrl = getClass().getClassLoader().getResource(events.folder()); + } + if (folderUrl == null) { + throw new IllegalArgumentException("Path " + events.folder() + " cannot be found"); + } + Stream files = Files.list(Paths.get(folderUrl.toURI())); + return files + .filter(Files::isRegularFile) + .map(path -> Arguments.of(EventLoader.loadEvent(path.toString(), events.type()))); + } + } +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/HandlerParamsArgumentsProvider.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/HandlerParamsArgumentsProvider.java new file mode 100644 index 00000000..269180dc --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/HandlerParamsArgumentsProvider.java @@ -0,0 +1,130 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.tests.annotations.*; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; +import org.junit.jupiter.params.support.AnnotationConsumer; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Used to process @{@link HandlerParams} com.amazonaws.services.lambda.runtime.tests.annotations + */ +public class HandlerParamsArgumentsProvider implements ArgumentsProvider, AnnotationConsumer { + + private Event event; + private Response response; + + private Events events; + private Responses responses; + + @Override + public void accept(HandlerParams handlerParams) { + this.event = handlerParams.event(); + this.response = handlerParams.response(); + this.events = handlerParams.events(); + this.responses = handlerParams.responses(); + } + + @Override + public Stream provideArguments(ExtensionContext context) throws Exception { + if ((!event.value().isEmpty() && response.value().isEmpty()) || + (event.value().isEmpty() && !response.value().isEmpty())) { + throw new IllegalStateException("You must use either Event & Response (singular) or Events & Responses (plural) annotations together, you cannot mix them"); + } + if (((ArrayUtils.isEmpty(events.events()) && StringUtils.isEmpty(events.folder())) + && (StringUtils.isNotEmpty(responses.folder()) || ArrayUtils.isNotEmpty(responses.responses()))) + || + ((ArrayUtils.isEmpty(responses.responses()) && StringUtils.isEmpty(responses.folder())) + && (StringUtils.isNotEmpty(events.folder()) || ArrayUtils.isNotEmpty(events.events())))) { + throw new IllegalStateException("You must use either Event & Response (singular) or Events & Responses (plural) annotations together, you cannot mix them"); + } + + // deal with one element + if (!event.value().isEmpty() && !response.value().isEmpty()) { + return Stream.of( + Arguments.of( + EventLoader.loadEvent(event.value(), event.type()), + EventLoader.loadEvent(response.value(), response.type()) + ) + ); + } + + // deal with many elements + List eventList = getEvents(); + List responseList = getResponses(); + if (eventList == null || eventList.size() == 0 || responseList == null || responseList.size() == 0 || eventList.size() != responseList.size()) { + throw new IllegalStateException("At least one event and one response should be provided, and you should have the exact same number of events and responses."); + } + + Stream.Builder streamBuilder = Stream.builder(); + for (int i = 0; i < eventList.size(); i++) { + streamBuilder.add(Arguments.of(eventList.get(i), responseList.get(i))); + } + return streamBuilder.build(); + } + + private List getResponses() throws IOException, URISyntaxException { + List responseList; + if (ArrayUtils.isNotEmpty(responses.responses())) { + responseList = Arrays.stream(responses.responses()).map( + response -> { + Class clazz = response.type() == Void.class ? responses.type() : response.type(); + return EventLoader.loadEvent(response.value(), clazz); + } + ).collect(Collectors.toList()); + } else { + Stream files = listFiles(responses.folder()); + + responseList = files + .filter(Files::isRegularFile) + .map(path -> EventLoader.loadEvent(path.toString(), responses.type())) + .collect(Collectors.toList()); + } + return responseList; + } + + private List getEvents() throws IOException, URISyntaxException { + List eventList; + if (ArrayUtils.isNotEmpty(events.events())) { + eventList = Arrays.stream(events.events()).map( + event -> { + Class clazz = event.type() == Void.class ? events.type() : event.type(); + return EventLoader.loadEvent(event.value(), clazz); + } + ).collect(Collectors.toList()); + } else { + Stream files = listFiles(events.folder()); + + eventList = files + .filter(Files::isRegularFile) + .map(path -> EventLoader.loadEvent(path.toString(), events.type())) + .collect(Collectors.toList()); + } + return eventList; + } + + private Stream listFiles(String folder) throws IOException, URISyntaxException { + URL folderUrl = getClass().getResource(folder); + if (folderUrl == null) { + folderUrl = getClass().getClassLoader().getResource(folder); + } + if (folderUrl == null) { + throw new IllegalArgumentException("Path " + folder + " cannot be found"); + } + return Files.list(Paths.get(folderUrl.toURI())); + } +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Event.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Event.java new file mode 100644 index 00000000..d5011290 --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Event.java @@ -0,0 +1,39 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests.annotations; + +import com.amazonaws.services.lambda.runtime.tests.EventArgumentsProvider; +import org.junit.jupiter.params.provider.ArgumentsSource; + +import java.lang.annotation.*; + +/** + * This annotation must be used in conjunction with {@link org.junit.jupiter.params.ParameterizedTest}.
+ * It enables to inject an event (loaded from a json file) of the desired type into the current test.
+ * Example:
+ *
+ *     @ParameterizedTest
+ *     @Event(value = "sqs_event.json", type = SQSEvent.class)
+ *     public void testInjectEvent(SQSEvent event) {
+ *         assertThat(event).isNotNull();
+ *         assertThat(event.getRecords()).hasSize(1);
+ *     }
+ * 
+ */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@ArgumentsSource(EventArgumentsProvider.class) +public @interface Event { + + /** + * Path and file name of the json event + * @return the file name (including the path) + */ + String value(); + + /** + * Type of the event (for example, one of the aws-lambda-java-events), or your own type + * @return the type of the event + */ + Class type() default Void.class; +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Events.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Events.java new file mode 100644 index 00000000..240caab4 --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Events.java @@ -0,0 +1,81 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests.annotations; + +import com.amazonaws.services.lambda.runtime.tests.EventsArgumentsProvider; +import org.junit.jupiter.params.provider.ArgumentsSource; + +import java.lang.annotation.*; + +/** + * This annotation must be used in conjunction with {@link org.junit.jupiter.params.ParameterizedTest}.
+ * It enables to inject multiple events (loaded from json files) of the desired type into the current test.
+ *

+ * Several notations are possible according to what you want to do: + *

    + *
  • + * Using the folder parameter is the more straightforward, and it will use all files in the folder
    + *
    + *     @ParameterizedTest
    + *     @Events(folder = "sqs", type = SQSEvent.class)
    + *     public void testInjectEventsFromFolder(SQSEvent event) {
    + *         assertThat(event).isNotNull();
    + *         assertThat(event.getRecords()).hasSize(1);
    + *     }
    + * 
    + *
  • + *
  • + * Or you can list all the {@link Event}s
    + *
    + * @ParameterizedTest
    + *     @Events(
    + *             events = {
    + *                     @Event("sqs/sqs_event.json"),
    + *                     @Event("sqs/sqs_event2.json"),
    + *             },
    + *             type = SQSEvent.class
    + *     )
    + *     public void testInjectEvents(SQSEvent event) {
    + *         assertThat(event).isNotNull();
    + *         assertThat(event.getRecords()).hasSize(1);
    + *     }
    + *
    + *     @ParameterizedTest
    + *     @Events(
    + *             events = {
    + *                     @Event(value = "sqs/sqs_event.json", type = SQSEvent.class),
    + *                     @Event(value = "sqs/sqs_event2.json", type = SQSEvent.class),
    + *             }
    + *     )
    + *     public void testInjectEvents2(SQSEvent event) {
    + *         assertThat(event).isNotNull();
    + *         assertThat(event.getRecords()).hasSize(1);
    + *     }
    + * 
    + *
  • + *
+ *

+ */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@ArgumentsSource(EventsArgumentsProvider.class) +public @interface Events { + + /** + * Folder where to find json files containing events + * @return the folder name + */ + String folder() default ""; + + /** + * Type of the events (for example, one of the aws-lambda-java-events), or your own type + * @return the type of the events + */ + Class type() default Void.class; + + /** + * Mutually exclusive with folder + * @return the array of events + */ + Event[] events() default {}; +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/HandlerParams.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/HandlerParams.java new file mode 100644 index 00000000..3e656cc9 --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/HandlerParams.java @@ -0,0 +1,63 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests.annotations; + +import com.amazonaws.services.lambda.runtime.tests.HandlerParamsArgumentsProvider; +import org.junit.jupiter.params.provider.ArgumentsSource; + +import java.lang.annotation.*; + +/** + * This annotation must be used in conjunction with {@link org.junit.jupiter.params.ParameterizedTest}.
+ * It enables to inject Events and Responses into the current test.
+ * Either use the {@link #event()} and {@link #response()} for a single event/response + * or {@link #events()} and {@link #responses()} for multiple ones.
+ * + * Example:
+ *
+ * @ParameterizedTest
+ * @HandlerParams(
+ *         event = @Event(value = "apigw/events/apigw_event.json", type = APIGatewayProxyRequestEvent.class),
+ *         response = @Response(value = "apigw/responses/apigw_response.json", type = APIGatewayProxyResponseEvent.class))
+ * public void testSingleEventResponse(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) {
+ * }
+ *
+ * @ParameterizedTest
+ * @HandlerParams(
+ *         events = @Events(folder = "apigw/events/", type = APIGatewayProxyRequestEvent.class),
+ *         responses = @Responses(folder = "apigw/responses/", type = APIGatewayProxyResponseEvent.class))
+ * public void testMultipleEventsResponsesInFolder(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) {
+ * }
+ *
+ * @ParameterizedTest
+ * @HandlerParams(
+ *         events = @Events(
+ *                 events = {
+ *                         @Event("apigw/events/apigw_event.json"),
+ *                         @Event("apigw/events/apigw_event2.json"),
+ *                 },
+ *                 type = APIGatewayProxyRequestEvent.class
+ *         ),
+ *         responses = @Responses(
+ *                 responses = {
+ *                         @Response("apigw/responses/apigw_response.json"),
+ *                         @Response("apigw/responses/apigw_response2.json")
+ *                 },
+ *                 type = APIGatewayProxyResponseEvent.class
+ *         )
+ * )
+ * public void testMultipleEventsResponses(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) {
+ * }
+ * 
+ */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@ArgumentsSource(HandlerParamsArgumentsProvider.class) +public @interface HandlerParams { + + Event event() default @Event(""); + Response response() default @Response(""); + + Events events() default @Events; + Responses responses() default @Responses; +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Response.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Response.java new file mode 100644 index 00000000..d53ef128 --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Response.java @@ -0,0 +1,25 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests.annotations; + +import java.lang.annotation.*; + +/** + * This annotation must be used in conjunction with {@link HandlerParams}. + */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Response { + + /** + * Path and file name of the json response + * @return the file name (including the path) + */ + String value(); + + /** + * Type of the response + * @return the type of the response + */ + Class type() default Void.class; +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Responses.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Responses.java new file mode 100644 index 00000000..8788baa7 --- /dev/null +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/annotations/Responses.java @@ -0,0 +1,31 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests.annotations; + +import java.lang.annotation.*; + +/** + * This annotation must be used in conjunction with {@link HandlerParams}. + */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Responses { + + /** + * Folder where to find json files containing responses + * @return the folder name + */ + String folder() default ""; + + /** + * Type of the responses + * @return the type of the responses + */ + Class type() default Void.class; + + /** + * Mutually exclusive with folder + * @return the array of responses + */ + Response[] responses() default {}; +} diff --git a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java new file mode 100644 index 00000000..61d9eaf1 --- /dev/null +++ b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java @@ -0,0 +1,303 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue; +import com.amazonaws.services.lambda.runtime.events.models.dynamodb.Record; +import com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord; +import org.joda.time.DateTime; +import org.junit.jupiter.api.Test; + +import java.time.Instant; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static java.time.Instant.ofEpochSecond; +import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.from; + +import com.amazonaws.services.lambda.runtime.events.*; + +public class EventLoaderTest { + + @Test + public void testLoadApiGatewayRestEvent() { + APIGatewayProxyRequestEvent event = EventLoader.loadApiGatewayRestEvent("apigw_rest_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getBody()).isEqualTo("Hello from Lambda!"); + assertThat(event.getHeaders()).hasSize(2); + } + + @Test + public void testLoadApiGatewayHttpEvent() { + APIGatewayV2HTTPEvent event = EventLoader.loadApiGatewayHttpEvent("apigw_http_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getBody()).isEqualTo("Hello from Lambda!!"); + } + + @Test + public void testLoadAPIGatewayCustomAuthorizerEvent() { + APIGatewayCustomAuthorizerEvent event = EventLoader.loadAPIGatewayCustomAuthorizerEvent("apigw_auth.json"); + + assertThat(event).isNotNull(); + assertThat(event.getRequestContext().getHttpMethod()).isEqualTo("GET"); + assertThat(event.getHeaders()).hasSize(8); + } + + @Test + public void testLoadAPIGatewayV2CustomAuthorizerEvent() { + APIGatewayV2CustomAuthorizerEvent event = EventLoader.loadAPIGatewayV2CustomAuthorizerEvent("apigw_auth_v2.json"); + + assertThat(event).isNotNull(); + assertThat(event.getRequestContext().getHttp().getMethod()).isEqualTo("POST"); + assertThat(event.getRequestContext().getTimeEpoch()).isEqualTo(Instant.ofEpochMilli(1583348638390L)); + } + + @Test + public void testLoadApplicationLoadBalancerRequestEvent() { + ApplicationLoadBalancerRequestEvent event = EventLoader.loadApplicationLoadBalancerRequestEvent("elb_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getBody()).isEqualTo("Hello from ELB"); + } + + @Test + public void testLoadConfigEvent() { + ConfigEvent event = EventLoader.loadConfigEvent("config_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getConfigRuleArn()).isEqualTo("arn:aws:config:eu-central-1:123456789012:config-rule/config-rule-0123456"); + assertThat(event.getConfigRuleName()).isEqualTo("change-triggered-config-rule"); + } + + @Test + public void testLoadKafkaEvent() { + KafkaEvent event = EventLoader.loadKafkaEvent("kafka_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getEventSourceArn()).isEqualTo("arn:aws:kafka:us-east-1:123456789012:cluster/vpc-3432434/4834-3547-3455-9872-7929"); + + KafkaEvent.KafkaEventRecord record = event.getRecords().get("mytopic-01").get(0); + assertThat(record.getValue()).decodedAsBase64().asString().isEqualTo("Hello from Kafka !!"); + } + + @Test + public void testLoadLambdaDestinationEvent() { + LambdaDestinationEvent event = EventLoader.loadLambdaDestinationEvent("lambda_destination_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getTimestamp()).isEqualTo(DateTime.parse("2019-11-24T21:52:47.333Z")); + assertThat(event.getRequestContext().getFunctionArn()).isEqualTo("arn:aws:lambda:sa-east-1:123456678912:function:event-destinations:$LATEST"); + assertThat(event.getRequestPayload().get("Success")).isEqualTo(false); + } + + @Test + public void testLoadLexEvent() { + LexEvent event = EventLoader.loadLexEvent("lex_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getInvocationSource()).isEqualTo("DialogCodeHook"); + assertThat(event.getSessionAttributes()).hasSize(1); + assertThat(event.getCurrentIntent().getName()).isEqualTo("BookHotel"); + assertThat(event.getCurrentIntent().getSlots()).hasSize(4); + assertThat(event.getBot().getName()).isEqualTo("BookTrip"); + } + + @Test + public void testLoadKinesisFirehoseEvent() { + KinesisFirehoseEvent event = EventLoader.loadKinesisFirehoseEvent("firehose_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getDeliveryStreamArn()).isEqualTo("arn:aws:kinesis:EXAMPLE"); + assertThat(event.getRecords()).hasSize(1); + assertThat(event.getRecords().get(0).getData().array()).asString().isEqualTo("Hello, this is a test 123."); + } + + @Test + public void testLoadS3Event() { + S3Event event = EventLoader.loadS3Event("s3_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + } + + @Test + public void testLoadSQSEvent() { + SQSEvent event = EventLoader.loadSQSEvent("sqs/sqs_event_nobody.json"); + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + assertThat(event.getRecords().get(0).getEventSourceArn()).isEqualTo("arn:aws:sqs:eu-central-1:123456789012:TestLambda"); + } + + @Test + public void testLoadSNSEvent() { + SNSEvent event = EventLoader.loadSNSEvent("sns_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + + SNSEvent.SNSRecord record = event.getRecords().get(0); + assertThat(record.getEventSource()).isEqualTo("aws:sns"); + assertThat(record.getEventVersion()).isEqualTo("1.0"); + assertThat(record.getEventSubscriptionArn()).isEqualTo("arn:aws:sns:eu-central-1:123456789012:TopicSendToMe:e3ddc7d5-2f86-40b8-a13d-3362f94fd8dd"); + + SNSEvent.SNS sns = record.getSNS(); + assertThat(sns) + .returns("Test sns message", from(SNSEvent.SNS::getSubject)) + .returns("{\n \"id\": 42,\n \"name\": \"Bob\"\n}", from(SNSEvent.SNS::getMessage)) + .returns("arn:aws:sns:eu-central-1:123456789012:TopicSendToMe", from(SNSEvent.SNS::getTopicArn)) + .returns("dc918f50-80c6-56a2-ba33-d8a9bbf013ab", from(SNSEvent.SNS::getMessageId)) + .returns(DateTime.parse("2020-10-08T16:06:14.656Z"), from(SNSEvent.SNS::getTimestamp)) + .returns("https://sns.eu-central-1.amazonaws.com/?Action=Unsubscribe", SNSEvent.SNS::getUnsubscribeUrl); + assertThat(sns.getMessageAttributes()).containsKey("name"); + assertThat(sns.getMessageAttributes().get("name").getValue()).isEqualTo("Bob"); + assertThat(sns.getMessageAttributes().get("name").getType()).isEqualTo("String"); + } + + @Test + public void testLoadDynamoEvent() { + DynamodbEvent event = EventLoader.loadDynamoDbEvent("dynamo_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(3); + + DynamodbEvent.DynamodbStreamRecord record = event.getRecords().get(0); + assertThat(record) + .returns("arn:aws:dynamodb:eu-central-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", from(DynamodbEvent.DynamodbStreamRecord::getEventSourceARN)) + .returns("INSERT", from(Record::getEventName)); + + StreamRecord streamRecord = record.getDynamodb(); + assertThat(streamRecord) + .returns("4421584500000000017450439091", StreamRecord::getSequenceNumber) + .returns(26L, StreamRecord::getSizeBytes) + .returns("NEW_AND_OLD_IMAGES", StreamRecord::getStreamViewType) + .returns(Date.from(ofEpochSecond(1428537600)), StreamRecord::getApproximateCreationDateTime); + + assertThat(streamRecord.getKeys()).contains(entry("Id", new AttributeValue().withN("101"))); + assertThat(streamRecord.getNewImage()).containsAnyOf( + entry("Message", new AttributeValue("New item!")), + entry("Id", new AttributeValue().withN("101")) + ); + } + + @Test + public void testLoadKinesisEvent() { + KinesisEvent event = EventLoader.loadKinesisEvent("kinesis_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + + KinesisEvent.Record record = event.getRecords().get(0).getKinesis(); + assertThat(record.getEncryptionType()).isEqualTo("NONE"); + assertThat(record.getApproximateArrivalTimestamp()).isEqualTo(Date.from(ofEpochSecond(1428537600))); + assertThat(new String(record.getData().array())).isEqualTo("Hello, this is a test 123."); + } + + @Test + public void testLoadActiveMQEvent() { + ActiveMQEvent event = EventLoader.loadActiveMQEvent("mq_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getMessages()).hasSize(2); + + assertThat(event.getMessages().get(0).getMessageID()).isEqualTo("ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1"); + assertThat(event.getMessages().get(1).getMessageID()).isEqualTo("ID:b-8bcfa572-428a-4642-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1"); + } + + @Test + public void testLoadCodeCommitEvent() { + CodeCommitEvent event = EventLoader.loadCodeCommitEvent("codecommit_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + + CodeCommitEvent.Record record = event.getRecords().get(0); + assertThat(record.getEventSourceArn()).isEqualTo("arn:aws:codecommit:eu-central-1:123456789012:my-repo"); + assertThat(record.getUserIdentityArn()).isEqualTo("arn:aws:iam::123456789012:root"); + assertThat(record.getEventTime()).isEqualTo(DateTime.parse("2016-01-01T23:59:59.000+0000")); + + assertThat(record.getCodeCommit().getReferences()).hasSize(1); + CodeCommitEvent.Reference reference = record.getCodeCommit().getReferences().get(0); + assertThat(reference.getCommit()).isEqualTo("5c4ef1049f1d27deadbeeff313e0730018be182b"); + assertThat(reference.getRef()).isEqualTo("refs/heads/master"); + } + + @Test + public void testLoadCloudWatchLogsEvent() { + CloudWatchLogsEvent cloudWatchLogsEvent = EventLoader.loadCloudWatchLogsEvent("cloudwatchlogs_event.json"); + assertThat(cloudWatchLogsEvent).isNotNull(); + assertThat(cloudWatchLogsEvent.getAwsLogs().getData()).isEqualTo("H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA=="); + } + + @Test + public void testLoadCloudFrontEvent() { + CloudFrontEvent event = EventLoader.loadCloudFrontEvent("cloudfront_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + assertThat(event.getRecords().get(0).getCf().getConfig().getDistributionId()).isEqualTo("EXAMPLE"); + } + + @Test + public void testLoadScheduledEvent() { + ScheduledEvent event = EventLoader.loadScheduledEvent("cloudwatch_event.json"); + assertThat(event).isNotNull(); + assertThat(event.getDetailType()).isEqualTo("Scheduled Event"); + assertThat(event.getTime()).isEqualTo(DateTime.parse("2020-09-30T15:58:34Z")); + } + + @Test + public void testLoadConnectEvent() { + ConnectEvent event = EventLoader.loadConnectEvent("connect_event.json"); + assertThat(event).isNotNull(); + + ConnectEvent.ContactData contactData = event.getDetails().getContactData(); + assertThat(contactData) + .returns("VOICE", from(ConnectEvent.ContactData::getChannel)) + .returns("5ca32fbd-8f92-46af-92a5-6b0f970f0efe", from(ConnectEvent.ContactData::getContactId)) + .returns("6ca32fbd-8f92-46af-92a5-6b0f970f0efe", from(ConnectEvent.ContactData::getInitialContactId)) + .returns("API", from(ConnectEvent.ContactData::getInitiationMethod)) + .returns("arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa", from(ConnectEvent.ContactData::getInstanceArn)) + .returns("4ca32fbd-8f92-46af-92a5-6b0f970f0efe", from(ConnectEvent.ContactData::getPreviousContactId)); + + assertThat(contactData.getCustomerEndpoint()) + .returns("+11234567890",from(ConnectEvent.CustomerEndpoint::getAddress)) + .returns("TELEPHONE_NUMBER",from(ConnectEvent.CustomerEndpoint::getType)); + + assertThat(contactData.getSystemEndpoint()) + .returns("+21234567890",from(ConnectEvent.SystemEndpoint::getAddress)) + .returns("TELEPHONE_NUMBER",from(ConnectEvent.SystemEndpoint::getType)); + } + + @Test + public void testLoadCloudFormationCustomResourceEvent() { + CloudFormationCustomResourceEvent event = EventLoader.loadCloudFormationCustomResourceEvent("cloudformation_event.json"); + assertThat(event).isNotNull(); + assertThat(event) + .returns("Update", from(CloudFormationCustomResourceEvent::getRequestType)) + .returns("http://pre-signed-S3-url-for-response", from(CloudFormationCustomResourceEvent::getResponseUrl)) + .returns("arn:aws:cloudformation:eu-central-1:123456789012:stack/MyStack/guid", from(CloudFormationCustomResourceEvent::getStackId)) + .returns("unique id for this create request", from(CloudFormationCustomResourceEvent::getRequestId)) + .returns("Custom::TestResource", from(CloudFormationCustomResourceEvent::getResourceType)) + .returns("MyTestResource", from(CloudFormationCustomResourceEvent::getLogicalResourceId)) + .returns("MyTestResourceId", from(CloudFormationCustomResourceEvent::getPhysicalResourceId)) + .returns("abcd", from(CloudFormationCustomResourceEvent::getServiceToken)); + + Map resourceProperties = event.getResourceProperties(); + assertThat(resourceProperties).hasSize(2); + assertThat(resourceProperties.get("StackName")).isEqualTo("MyStack"); + assertThat(resourceProperties.get("List")).isInstanceOf(List.class); + assertThat(resourceProperties.get("List")).asList().hasSize(3); + + Map oldResourceProperties = event.getOldResourceProperties(); + assertThat(oldResourceProperties).hasSize(2); + assertThat(oldResourceProperties.get("StackName")).isEqualTo("MyStack"); + assertThat(oldResourceProperties.get("List")).isInstanceOf(List.class); + assertThat(oldResourceProperties.get("List")).asList().hasSize(1); + } + + @Test + public void testLoadSecretsManagerRotationEvent() { + SecretsManagerRotationEvent event = EventLoader.loadSecretsManagerRotationEvent("secrets_rotation_event.json"); + assertThat(event).isNotNull(); + assertThat(event) + .returns("123e4567-e89b-12d3-a456-426614174000", from(SecretsManagerRotationEvent::getClientRequestToken)) + .returns("arn:aws:secretsmanager:eu-central-1:123456789012:secret:/powertools/secretparam-xBPaJ5", from(SecretsManagerRotationEvent::getSecretId)) + .returns("CreateSecret", from(SecretsManagerRotationEvent::getStep)); + } +} diff --git a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventTest.java b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventTest.java new file mode 100644 index 00000000..af94bcc3 --- /dev/null +++ b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventTest.java @@ -0,0 +1,18 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.events.SQSEvent; +import com.amazonaws.services.lambda.runtime.tests.annotations.Event; +import org.junit.jupiter.params.ParameterizedTest; + +import static org.assertj.core.api.Assertions.assertThat; + +public class EventTest { + + @ParameterizedTest + @Event(value = "sqs/sqs_event_nobody.json", type = SQSEvent.class) + public void testInjectEvent(SQSEvent event) { + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + } +} diff --git a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventsTest.java b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventsTest.java new file mode 100644 index 00000000..0861878e --- /dev/null +++ b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventsTest.java @@ -0,0 +1,45 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.events.SQSEvent; +import com.amazonaws.services.lambda.runtime.tests.annotations.Event; +import com.amazonaws.services.lambda.runtime.tests.annotations.Events; +import org.junit.jupiter.params.ParameterizedTest; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class EventsTest { + + @ParameterizedTest + @Events( + events = { + @Event("sqs/sqs_event_nobody.json"), + @Event("sqs/sqs_event_product.json"), + }, + type = SQSEvent.class + ) + public void testInjectEvents(SQSEvent event) { + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + } + + @ParameterizedTest + @Events( + events = { + @Event(value = "sqs/sqs_event_nobody.json", type = SQSEvent.class), + @Event(value = "sqs/sqs_event_product.json", type = SQSEvent.class), + } + ) + public void testInjectEvents2(SQSEvent event) { + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + } + + @ParameterizedTest + @Events(folder = "sqs", type = SQSEvent.class) + public void testInjectEventsFromFolder(SQSEvent event) { + assertThat(event).isNotNull(); + assertThat(event.getRecords()).hasSize(1); + } +} diff --git a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/HandlerParamsTest.java b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/HandlerParamsTest.java new file mode 100644 index 00000000..a7c3c6e0 --- /dev/null +++ b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/HandlerParamsTest.java @@ -0,0 +1,71 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.amazonaws.services.lambda.runtime.tests.annotations.*; +import org.junit.jupiter.params.ParameterizedTest; + +import static org.assertj.core.api.Assertions.assertThat; + +public class HandlerParamsTest { + + @ParameterizedTest + @HandlerParams( + event = @Event(value = "apigw/events/apigw_event.json", type = APIGatewayProxyRequestEvent.class), + response = @Response(value = "apigw/responses/apigw_response.json", type = APIGatewayProxyResponseEvent.class)) + public void testSimpleEventResponse(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) { + assertThat(event).isNotNull(); + assertThat(event.getBody()).contains("Lambda rocks"); + assertThat(event.getHeaders()).hasSize(18); + assertThat(event.getHttpMethod()).isEqualTo("POST"); + + assertThat(response).isNotNull(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.getBody()).contains("Lambda rocks"); + } + + @ParameterizedTest + @HandlerParams( + events = @Events(folder = "apigw/events/", type = APIGatewayProxyRequestEvent.class), + responses = @Responses(folder = "apigw/responses/", type = APIGatewayProxyResponseEvent.class)) + public void testMultipleEventsResponsesinFolder(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) { + assertThat(event).isNotNull(); + assertThat(event.getHeaders()).hasSize(18); + assertThat(event.getHttpMethod()).isEqualTo("POST"); + + assertThat(response).isNotNull(); + assertThat(response.getStatusCode()).isEqualTo(200); + + assertThat(response.getBody()).isEqualTo(event.getBody()); + } + + @ParameterizedTest + @HandlerParams( + events = @Events( + events = { + @Event("apigw/events/apigw_event.json"), + @Event("apigw/events/apigw_event_nobody.json"), + }, + type = APIGatewayProxyRequestEvent.class + ), + responses = @Responses( + responses = { + @Response("apigw/responses/apigw_response.json"), + @Response("apigw/responses/apigw_response2.json") + }, + type = APIGatewayProxyResponseEvent.class + ) + ) + public void testMultipleEventsResponses(APIGatewayProxyRequestEvent event, APIGatewayProxyResponseEvent response) { + assertThat(event).isNotNull(); + assertThat(event.getHeaders()).hasSize(18); + assertThat(event.getHttpMethod()).isEqualTo("POST"); + + assertThat(response).isNotNull(); + assertThat(response.getStatusCode()).isEqualTo(200); + + assertThat(response.getBody()).isEqualTo(event.getBody()); + } + +} diff --git a/aws-lambda-java-tests/src/test/resources/apigw/events/apigw_event.json b/aws-lambda-java-tests/src/test/resources/apigw/events/apigw_event.json new file mode 100644 index 00000000..5a575592 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw/events/apigw_event.json @@ -0,0 +1,62 @@ +{ + "body": "{\"message\": \"Lambda rocks\"}", + "resource": "/{proxy+}", + "path": "/path/to/resource", + "httpMethod": "POST", + "isBase64Encoded": false, + "queryStringParameters": { + "foo": "bar" + }, + "pathParameters": { + "proxy": "/path/to/resource" + }, + "stageVariables": { + "baz": "qux" + }, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "CloudFront-Forwarded-Proto": "https", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-Mobile-Viewer": "false", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Tablet-Viewer": "false", + "CloudFront-Viewer-Country": "US", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String", + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/path/to/resource", + "resourcePath": "/{proxy+}", + "httpMethod": "POST", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/aws-lambda-java-tests/src/test/resources/apigw/events/apigw_event_nobody.json b/aws-lambda-java-tests/src/test/resources/apigw/events/apigw_event_nobody.json new file mode 100644 index 00000000..e5677441 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw/events/apigw_event_nobody.json @@ -0,0 +1,62 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/path/to/resource", + "httpMethod": "POST", + "isBase64Encoded": false, + "queryStringParameters": { + "foo": "bar" + }, + "pathParameters": { + "proxy": "/path/to/resource" + }, + "stageVariables": { + "baz": "qux" + }, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "CloudFront-Forwarded-Proto": "https", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-Mobile-Viewer": "false", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Tablet-Viewer": "false", + "CloudFront-Viewer-Country": "US", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String", + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/path/to/resource", + "resourcePath": "/{proxy+}", + "httpMethod": "POST", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/aws-lambda-java-tests/src/test/resources/apigw/responses/apigw_response.json b/aws-lambda-java-tests/src/test/resources/apigw/responses/apigw_response.json new file mode 100644 index 00000000..691ca3a9 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw/responses/apigw_response.json @@ -0,0 +1,16 @@ +{ + "body": "{\"message\": \"Lambda rocks\"}", + "statusCode": 200, + "headers": { + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String", + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "isBase64Encoded": false +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/apigw/responses/apigw_response2.json b/aws-lambda-java-tests/src/test/resources/apigw/responses/apigw_response2.json new file mode 100644 index 00000000..365d9ca5 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw/responses/apigw_response2.json @@ -0,0 +1,16 @@ +{ + "body": "", + "statusCode": 200, + "headers": { + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String", + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "isBase64Encoded": false +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/apigw_auth.json b/aws-lambda-java-tests/src/test/resources/apigw_auth.json new file mode 100644 index 00000000..eb73956e --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw_auth.json @@ -0,0 +1,41 @@ +{ + "version": "1.0", + "type": "REQUEST", + "methodArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request", + "identitySource": "user1,123", + "authorizationToken": "user1,123", + "resource": "/request", + "path": "/request", + "httpMethod": "GET", + "headers": { + "X-AMZ-Date": "20170718T062915Z", + "Accept": "*/*", + "HeaderAuth1": "headerValue1", + "CloudFront-Viewer-Country": "US", + "CloudFront-Forwarded-Proto": "https", + "CloudFront-Is-Tablet-Viewer": "false", + "CloudFront-Is-Mobile-Viewer": "false", + "User-Agent": "..." + }, + "queryStringParameters": { + "QueryString1": "queryValue1" + }, + "pathParameters": {}, + "stageVariables": { + "StageVar1": "stageValue1" + }, + "requestContext": { + "path": "/request", + "accountId": "123456789012", + "resourceId": "05c7jb", + "stage": "test", + "requestId": "...", + "identity": { + "apiKey": "...", + "sourceIp": "..." + }, + "resourcePath": "/request", + "httpMethod": "GET", + "apiId": "abcdef123" + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/apigw_auth_v2.json b/aws-lambda-java-tests/src/test/resources/apigw_auth_v2.json new file mode 100644 index 00000000..a603763e --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw_auth_v2.json @@ -0,0 +1,35 @@ +{ + "version": "2.0", + "type": "REQUEST", + "routeArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request", + "identitySource": ["user1", "123"], + "routeKey": "$default", + "rawPath": "/my/path", + "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", + "cookies": [ "cookie1", "cookie2" ], + "headers": { + "Header1": "value1", + "Header2": "value2" + }, + "queryStringParameters": { "parameter1": "value1,value2", "parameter2": "value" }, + "requestContext": { + "accountId": "123456789012", + "apiId": "api-id", + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "http": { + "method": "POST", + "path": "/my/path", + "protocol": "HTTP/1.1", + "sourceIp": "IP", + "userAgent": "agent" + }, + "requestId": "id", + "routeKey": "$default", + "stage": "$default", + "time": "12/Mar/2020:19:03:58 +0000", + "timeEpoch": 1583348638390 + }, + "pathParameters": {"parameter1": "value1"}, + "stageVariables": {"stageVariable1": "value1", "stageVariable2": "value2"} +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/apigw_http_event.json b/aws-lambda-java-tests/src/test/resources/apigw_http_event.json new file mode 100644 index 00000000..88f4e5b4 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw_http_event.json @@ -0,0 +1,69 @@ +{ + "version": "2.0", + "routeKey": "$default", + "rawPath": "/my/path", + "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", + "cookies": [ + "cookie1", + "cookie2" + ], + "headers": { + "Header1": "value1", + "Header2": "value1,value2" + }, + "queryStringParameters": { + "parameter1": "value1,value2", + "parameter2": "value" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "api-id", + "authentication": { + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "authorizer": { + "jwt": { + "claims": { + "claim1": "value1", + "claim2": "value2" + }, + "scopes": [ + "scope1", + "scope2" + ] + } + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "http": { + "method": "POST", + "path": "/my/path", + "protocol": "HTTP/1.1", + "sourceIp": "IP", + "userAgent": "agent" + }, + "requestId": "id", + "routeKey": "$default", + "stage": "$default", + "time": "12/Mar/2020:19:03:58 +0000", + "timeEpoch": 1583348638390 + }, + "body": "Hello from Lambda!!", + "pathParameters": { + "parameter1": "value1" + }, + "isBase64Encoded": false, + "stageVariables": { + "stageVariable1": "value1", + "stageVariable2": "value2" + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/apigw_rest_event.json b/aws-lambda-java-tests/src/test/resources/apigw_rest_event.json new file mode 100644 index 00000000..28f10c22 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/apigw_rest_event.json @@ -0,0 +1,80 @@ +{ + "version": "1.0", + "resource": "/my/path", + "path": "/my/path", + "httpMethod": "GET", + "headers": { + "Header1": "value1", + "Header2": "value2" + }, + "multiValueHeaders": { + "Header1": [ + "value1" + ], + "Header2": [ + "value1", + "value2" + ] + }, + "queryStringParameters": { + "parameter1": "value1", + "parameter2": "value" + }, + "multiValueQueryStringParameters": { + "parameter1": [ + "value1", + "value2" + ], + "parameter2": [ + "value" + ] + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "id", + "authorizer": { + "claims": null, + "scopes": null + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "extendedRequestId": "request-id", + "httpMethod": "GET", + "identity": { + "accessKey": null, + "accountId": null, + "caller": null, + "cognitoAuthenticationProvider": null, + "cognitoAuthenticationType": null, + "cognitoIdentityId": null, + "cognitoIdentityPoolId": null, + "principalOrgId": null, + "sourceIp": "IP", + "user": null, + "userAgent": "user-agent", + "userArn": null, + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "path": "/my/path", + "protocol": "HTTP/1.1", + "requestId": "id=", + "requestTime": "04/Mar/2020:19:15:17 +0000", + "requestTimeEpoch": 1583349317135, + "resourceId": null, + "resourcePath": "/my/path", + "stage": "$default" + }, + "pathParameters": null, + "stageVariables": null, + "body": "Hello from Lambda!", + "isBase64Encoded": true +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/cloudformation_event.json b/aws-lambda-java-tests/src/test/resources/cloudformation_event.json new file mode 100644 index 00000000..92b95b71 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/cloudformation_event.json @@ -0,0 +1,24 @@ +{ + "RequestType": "Update", + "ResponseURL": "http://pre-signed-S3-url-for-response", + "StackId": "arn:aws:cloudformation:eu-central-1:123456789012:stack/MyStack/guid", + "RequestId": "unique id for this create request", + "ResourceType": "Custom::TestResource", + "LogicalResourceId": "MyTestResource", + "PhysicalResourceId": "MyTestResourceId", + "ServiceToken": "abcd", + "ResourceProperties": { + "StackName": "MyStack", + "List": [ + "1", + "2", + "3" + ] + }, + "OldResourceProperties": { + "StackName": "MyStack", + "List": [ + "1" + ] + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/cloudfront_event.json b/aws-lambda-java-tests/src/test/resources/cloudfront_event.json new file mode 100644 index 00000000..7485310e --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/cloudfront_event.json @@ -0,0 +1,37 @@ +{ + "Records": [ + { + "cf": { + "config": { + "distributionId": "EXAMPLE" + }, + "request": { + "uri": "/test", + "querystring": "auth=test&foo=bar", + "method": "GET", + "clientIp": "2001:cdba::3257:9652", + "headers": { + "host": [ + { + "key": "Host", + "value": "d123.cf.net" + } + ], + "user-agent": [ + { + "key": "User-Agent", + "value": "Test Agent" + } + ], + "user-name": [ + { + "key": "User-Name", + "value": "aws-cloudfront" + } + ] + } + } + } + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/cloudwatch_event.json b/aws-lambda-java-tests/src/test/resources/cloudwatch_event.json new file mode 100644 index 00000000..0573f3fe --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/cloudwatch_event.json @@ -0,0 +1,15 @@ +{ + "version": "0", + "id": "fae0433b-7a0e-e383-7849-7e10153eaa47", + "detail-type": "Scheduled Event", + "source": "aws.events", + "account": "123456789012", + "time": "2020-09-30T15:58:34Z", + "region": "eu-central-1", + "resources": [ + "arn:aws:events:eu-central-1:123456789012:rule/demoschedule" + ], + "detail": { + + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/cloudwatchlogs_event.json b/aws-lambda-java-tests/src/test/resources/cloudwatchlogs_event.json new file mode 100644 index 00000000..2b455b9b --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/cloudwatchlogs_event.json @@ -0,0 +1,5 @@ +{ + "awslogs": { + "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA==" + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/codecommit_event.json b/aws-lambda-java-tests/src/test/resources/codecommit_event.json new file mode 100644 index 00000000..227cac73 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/codecommit_event.json @@ -0,0 +1,27 @@ +{ + "Records": [ + { + "awsRegion": "eu-central-1", + "codecommit": { + "references": [ + { + "commit": "5c4ef1049f1d27deadbeeff313e0730018be182b", + "ref": "refs/heads/master" + } + ] + }, + "customData": "this is custom data", + "eventId": "5a824061-17ca-46a9-bbf9-114edeadbeef", + "eventName": "TriggerEventTest", + "eventPartNumber": 1, + "eventSource": "aws:codecommit", + "eventSourceARN": "arn:aws:codecommit:eu-central-1:123456789012:my-repo", + "eventTime": "2016-01-01T23:59:59.000+0000", + "eventTotalParts": 1, + "eventTriggerConfigId": "5a824061-17ca-46a9-bbf9-114edeadbeef", + "eventTriggerName": "my-trigger", + "eventVersion": "1.0", + "userIdentityARN": "arn:aws:iam::123456789012:root" + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/config_event.json b/aws-lambda-java-tests/src/test/resources/config_event.json new file mode 100644 index 00000000..cf795687 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/config_event.json @@ -0,0 +1,12 @@ +{ + "invokingEvent": "{\"configurationItem\":{\"configurationItemCaptureTime\":\"2016-10-06T16:46:16.261Z\",\"awsAccountId\":\"123456789012\",\"configurationItemStatus\":\"OK\",\"resourceId\":\"i-00000000\",\"resourceName\":\"foo\",\"configurationStateMd5Hash\":\"8f1ee69b297895a0f8bc5753eca68e96\",\"resourceCreationTime\":\"2016-10-06T16:46:10.489Z\",\"configurationStateId\":0,\"configurationItemVersion\":\"1.2\",\"ARN\":\"arn:aws:ec2:eu-central-1:123456789012:instance/i-00000000\",\"awsRegion\":\"eu-central-1\",\"availabilityZone\":\"eu-central-1\",\"resourceType\":\"AWS::EC2::Instance\",\"tags\":{\"\":\"\"},\"relationships\":[{\"resourceId\":\"eipalloc-00000000\",\"resourceType\":\"AWS::EC2::EIP\",\"name\":\"Is attached to ElasticIp\"}],\"configuration\":{\"\":\"\"}},\"messageType\":\"ConfigurationItemChangeNotification\"}", + "ruleParameters": "{\"\":\"\"}", + "resultToken": "myResultToken", + "eventLeftScope": false, + "executionRoleArn": "arn:aws:iam::123456789012:role/config-role", + "configRuleArn": "arn:aws:config:eu-central-1:123456789012:config-rule/config-rule-0123456", + "configRuleName": "change-triggered-config-rule", + "configRuleId": "config-rule-0123456", + "accountId": "123456789012", + "version": "1.0" +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/connect_event.json b/aws-lambda-java-tests/src/test/resources/connect_event.json new file mode 100644 index 00000000..a9e04f7f --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/connect_event.json @@ -0,0 +1,33 @@ +{ + "Name": "ContactFlowEvent", + "Details": { + "ContactData": { + "Attributes": {}, + "Channel": "VOICE", + "ContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", + "CustomerEndpoint": { + "Address": "+11234567890", + "Type": "TELEPHONE_NUMBER" + }, + "InitialContactId": "6ca32fbd-8f92-46af-92a5-6b0f970f0efe", + "InitiationMethod": "API", + "InstanceARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa", + "MediaStreams": { + "Customer": { + "Audio": { + "StartFragmentNumber": "91343852333181432392682062622220590765191907586", + "StartTimestamp": "1565781909613", + "StreamARN": "arn:aws:kinesisvideo:eu-central-1:123456789012:stream/connect-contact-a3d73b84-ce0e-479a-a9dc-5637c9d30ac9/1565272947806" + } + } + }, + "PreviousContactId": "4ca32fbd-8f92-46af-92a5-6b0f970f0efe", + "Queue": null, + "SystemEndpoint": { + "Address": "+21234567890", + "Type": "TELEPHONE_NUMBER" + } + }, + "Parameters": {} + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/dynamo_event.json b/aws-lambda-java-tests/src/test/resources/dynamo_event.json new file mode 100644 index 00000000..f28ce0e6 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/dynamo_event.json @@ -0,0 +1,97 @@ +{ + "Records": [ + { + "eventID": "c4ca4238a0b923820dcc509a6f75849b", + "eventName": "INSERT", + "eventVersion": "1.1", + "eventSource": "aws:dynamodb", + "awsRegion": "eu-central-1", + "dynamodb": { + "Keys": { + "Id": { + "N": "101" + } + }, + "NewImage": { + "Message": { + "S": "New item!" + }, + "Id": { + "N": "101" + } + }, + "ApproximateCreationDateTime": 1428537600, + "SequenceNumber": "4421584500000000017450439091", + "SizeBytes": 26, + "StreamViewType": "NEW_AND_OLD_IMAGES" + }, + "eventSourceARN": "arn:aws:dynamodb:eu-central-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", + "userIdentity": { + "principalId": "dynamodb.amazonaws.com", + "type": "Service" + } + }, + { + "eventID": "c81e728d9d4c2f636f067f89cc14862c", + "eventName": "MODIFY", + "eventVersion": "1.1", + "eventSource": "aws:dynamodb", + "awsRegion": "eu-central-1", + "dynamodb": { + "Keys": { + "Id": { + "N": "101" + } + }, + "NewImage": { + "Message": { + "S": "This item has changed" + }, + "Id": { + "N": "101" + } + }, + "OldImage": { + "Message": { + "S": "New item!" + }, + "Id": { + "N": "101" + } + }, + "ApproximateCreationDateTime": 1428537600, + "SequenceNumber": "4421584500000000017450439092", + "SizeBytes": 59, + "StreamViewType": "NEW_AND_OLD_IMAGES" + }, + "eventSourceARN": "arn:aws:dynamodb:eu-central-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899" + }, + { + "eventID": "eccbc87e4b5ce2fe28308fd9f2a7baf3", + "eventName": "REMOVE", + "eventVersion": "1.1", + "eventSource": "aws:dynamodb", + "awsRegion": "eu-central-1", + "dynamodb": { + "Keys": { + "Id": { + "N": "101" + } + }, + "OldImage": { + "Message": { + "S": "This item has changed" + }, + "Id": { + "N": "101" + } + }, + "ApproximateCreationDateTime": 1428537600, + "SequenceNumber": "4421584500000000017450439093", + "SizeBytes": 38, + "StreamViewType": "NEW_AND_OLD_IMAGES" + }, + "eventSourceARN": "arn:aws:dynamodb:eu-central-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899" + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/elb_event.json b/aws-lambda-java-tests/src/test/resources/elb_event.json new file mode 100644 index 00000000..23f599f4 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/elb_event.json @@ -0,0 +1,26 @@ +{ + "requestContext": { + "elb": { + "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:XXXXXXXXXXX:targetgroup/sample/6d0ecf831eec9f09" + } + }, + "httpMethod": "GET", + "path": "/", + "queryStringParameters": {}, + "headers": { + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "accept-encoding": "gzip", + "accept-language": "en-US,en;q=0.5", + "connection": "keep-alive", + "cookie": "name=value", + "host": "lambda-YYYYYYYY.elb.amazonaws.com", + "upgrade-insecure-requests": "1", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:60.0) Gecko/20100101 Firefox/60.0", + "x-amzn-trace-id": "Root=1-5bdb40ca-556d8b0c50dc66f0511bf520", + "x-forwarded-for": "192.0.2.1", + "x-forwarded-port": "80", + "x-forwarded-proto": "http" + }, + "body": "Hello from ELB", + "isBase64Encoded": false +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/firehose_event.json b/aws-lambda-java-tests/src/test/resources/firehose_event.json new file mode 100644 index 00000000..df235839 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/firehose_event.json @@ -0,0 +1,12 @@ +{ + "invocationId": "invocationIdExample", + "deliveryStreamArn": "arn:aws:kinesis:EXAMPLE", + "region": "eu-central-1", + "records": [ + { + "recordId": "49546986683135544286507457936321625675700192471156785154", + "approximateArrivalTimestamp": 1495072949453, + "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IDEyMy4=" + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/kafka_event.json b/aws-lambda-java-tests/src/test/resources/kafka_event.json new file mode 100644 index 00000000..ad089134 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/kafka_event.json @@ -0,0 +1,16 @@ +{ + "eventSource": "aws:kafka", + "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/vpc-3432434/4834-3547-3455-9872-7929", + "records": { + "mytopic-01": [ + { + "topic": "mytopic", + "partition": 0, + "offset": 15, + "timestamp": 1596480920837, + "timestampType": "CREATE_TIME", + "value": "SGVsbG8gZnJvbSBLYWZrYSAhIQ==" + } + ] + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/kinesis_event.json b/aws-lambda-java-tests/src/test/resources/kinesis_event.json new file mode 100644 index 00000000..5e083f49 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/kinesis_event.json @@ -0,0 +1,21 @@ +{ + "Records": [ + { + "kinesis": { + "partitionKey": "partitionKey-03", + "kinesisSchemaVersion": "1.0", + "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IDEyMy4=", + "sequenceNumber": "49545115243490985018280067714973144582180062593244200961", + "approximateArrivalTimestamp": 1428537600, + "encryptionType": "NONE" + }, + "eventSource": "aws:kinesis", + "eventID": "shardId-000000000000:49545115243490985018280067714973144582180062593244200961", + "invokeIdentityArn": "arn:aws:iam::EXAMPLE", + "eventVersion": "1.0", + "eventName": "aws:kinesis:record", + "eventSourceARN": "arn:aws:kinesis:EXAMPLE", + "awsRegion": "eu-central-1" + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/lambda_destination_event.json b/aws-lambda-java-tests/src/test/resources/lambda_destination_event.json new file mode 100644 index 00000000..30dea813 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/lambda_destination_event.json @@ -0,0 +1,23 @@ +{ + "version": "1.0", + "timestamp": "2019-11-24T21:52:47.333Z", + "requestContext": { + "requestId": "8ea123e4-1db7-4aca-ad10-d9ca1234c1fd", + "functionArn": "arn:aws:lambda:sa-east-1:123456678912:function:event-destinations:$LATEST", + "condition": "RetriesExhausted", + "approximateInvokeCount": 3 + }, + "requestPayload": { + "Success": false + }, + "responseContext": { + "statusCode": 200, + "executedVersion": "$LATEST", + "functionError": "Handled" + }, + "responsePayload": { + "errorMessage": "Failure from event, Success = false, I am failing!", + "errorType": "Error", + "stackTrace": [ "exports.handler (/var/task/index.js:18:18)" ] + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/lex_event.json b/aws-lambda-java-tests/src/test/resources/lex_event.json new file mode 100644 index 00000000..880baa15 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/lex_event.json @@ -0,0 +1,24 @@ +{ + "messageVersion": "1.0", + "invocationSource": "DialogCodeHook", + "userId": "John", + "sessionAttributes": { + "key": "value" + }, + "bot": { + "name": "BookTrip", + "alias": "$LATEST", + "version": "$LATEST" + }, + "outputDialogMode": "Text", + "currentIntent": { + "name": "BookHotel", + "slots": { + "Location": "Chicago", + "CheckInDate": "2030-11-08", + "Nights": 4, + "RoomType": "queen" + }, + "confirmationStatus": "None" + } +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/mq_event.json b/aws-lambda-java-tests/src/test/resources/mq_event.json new file mode 100644 index 00000000..a9a79854 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/mq_event.json @@ -0,0 +1,32 @@ +{ + "eventSource": "aws:amq", + "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", + "messages": [ + { + "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", + "messageType": "jms/text-message", + "data": "QUJDOkFBQUE=", + "connectionId": "myJMSCoID", + "redelivered": false, + "destination": { + "physicalname": "testQueue" + }, + "timestamp": 1598827811958, + "brokerInTime": 1598827811958, + "brokerOutTime": 1598827811959 + }, + { + "messageID": "ID:b-8bcfa572-428a-4642-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", + "messageType": "jms/bytes-message", + "data": "3DTOOW7crj51prgVLQaGQ82S48k=", + "connectionId": "myJMSCoID1", + "persistent": false, + "destination": { + "physicalname": "testQueue" + }, + "timestamp": 1598827811958, + "brokerInTime": 1598827811958, + "brokerOutTime": 1598827811959 + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/s3_event.json b/aws-lambda-java-tests/src/test/resources/s3_event.json new file mode 100644 index 00000000..89e0bd31 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/s3_event.json @@ -0,0 +1,38 @@ +{ + "Records": [ + { + "eventVersion": "2.0", + "eventSource": "aws:s3", + "awsRegion": "eu-central-1", + "eventTime": "1970-01-01T00:00:00.000Z", + "eventName": "ObjectCreated:Put", + "userIdentity": { + "principalId": "EXAMPLE" + }, + "requestParameters": { + "sourceIPAddress": "127.0.0.1" + }, + "responseElements": { + "x-amz-request-id": "EXAMPLE123456789", + "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH" + }, + "s3": { + "s3SchemaVersion": "1.0", + "configurationId": "testConfigRule", + "bucket": { + "name": "example-bucket", + "ownerIdentity": { + "principalId": "EXAMPLE" + }, + "arn": "arn:aws:s3:::example-bucket" + }, + "object": { + "key": "test/key", + "size": 1024, + "eTag": "0123456789abcdef0123456789abcdef", + "sequencer": "0A1B2C3D4E5F678901" + } + } + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/secrets_rotation_event.json b/aws-lambda-java-tests/src/test/resources/secrets_rotation_event.json new file mode 100644 index 00000000..38440fac --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/secrets_rotation_event.json @@ -0,0 +1,5 @@ +{ + "Step" : "CreateSecret", + "SecretId" : "arn:aws:secretsmanager:eu-central-1:123456789012:secret:/powertools/secretparam-xBPaJ5", + "ClientRequestToken" : "123e4567-e89b-12d3-a456-426614174000" +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/sns_event.json b/aws-lambda-java-tests/src/test/resources/sns_event.json new file mode 100644 index 00000000..25e123c4 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/sns_event.json @@ -0,0 +1,27 @@ +{ + "Records": [ + { + "EventSource": "aws:sns", + "EventVersion": "1.0", + "EventSubscriptionArn": "arn:aws:sns:eu-central-1:123456789012:TopicSendToMe:e3ddc7d5-2f86-40b8-a13d-3362f94fd8dd", + "Sns": { + "Type": "Notification", + "MessageId": "dc918f50-80c6-56a2-ba33-d8a9bbf013ab", + "TopicArn": "arn:aws:sns:eu-central-1:123456789012:TopicSendToMe", + "Subject": "Test sns message", + "Message": "{\n \"id\": 42,\n \"name\": \"Bob\"\n}", + "Timestamp": "2020-10-08T16:06:14.656Z", + "SignatureVersion": "1", + "Signature": "UWnPpkqPAphyr+6PXzUF9++4zJcw==", + "SigningCertUrl": "https://sns.eu-central-1.amazonaws.com/SimpleNotificationService-a86cb10b4e1f29c941702d737128f7b6.pem", + "UnsubscribeUrl": "https://sns.eu-central-1.amazonaws.com/?Action=Unsubscribe", + "MessageAttributes": { + "name": { + "Type": "String", + "Value": "Bob" + } + } + } + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/sqs/sqs_event_nobody.json b/aws-lambda-java-tests/src/test/resources/sqs/sqs_event_nobody.json new file mode 100644 index 00000000..bff825bd --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/sqs/sqs_event_nobody.json @@ -0,0 +1,22 @@ +{ + "Records": [ + { + "messageId": "d9144555-9a4f-4ec3-99a0-fc4e625a8db2", + "receiptHandle": "7kam5bfzbDsjtcjElvhSbxeLJbeey3A==", + "body": "", + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1601975709495", + "SenderId": "AROAIFU457DVZ5L2J53F2", + "ApproximateFirstReceiveTimestamp": "1601975709499" + }, + "messageAttributes": { + + }, + "md5OfBody": "0f96e88a291edb4429f2f7b9fdc3df96", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:eu-central-1:123456789012:TestLambda", + "awsRegion": "eu-central-1" + } + ] +} \ No newline at end of file diff --git a/aws-lambda-java-tests/src/test/resources/sqs/sqs_event_product.json b/aws-lambda-java-tests/src/test/resources/sqs/sqs_event_product.json new file mode 100644 index 00000000..d97bf2c9 --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/sqs/sqs_event_product.json @@ -0,0 +1,22 @@ +{ + "Records": [ + { + "messageId": "d9144555-9a4f-4ec3-99a0-34ce359b4b54", + "receiptHandle": "13e7f7851d2eaa5c01f208ebadbf1e72==", + "body": "{\n \"id\": 1234,\n \"name\": \"Product1234\",\n \"price\": 450\n}", + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1601975706495", + "SenderId": "AROAIFU437PVZ5L2J53F5", + "ApproximateFirstReceiveTimestamp": "1601975706499" + }, + "messageAttributes": { + + }, + "md5OfBody": "13e7f7851d2eaa5c01f208ebadbf1e72", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:eu-central-1:123456789012:TestLambda", + "awsRegion": "eu-central-1" + } + ] +} \ No newline at end of file