diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/application.properties b/spring-cloud-function-samples/function-sample-supplier-exporter/application.properties deleted file mode 100644 index 175231985..000000000 --- a/spring-cloud-function-samples/function-sample-supplier-exporter/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -# Useful for running locally (hence not in src/main/resources) -spring.cloud.function.web.export.source.url=http://localhost:8000/home -spring.cloud.function.web.export.sink.url=http://localhost:8000/echo -spring.cloud.function.web.export.debug=true -logging.level.org.springframework=DEBUG \ No newline at end of file diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/build.sh b/spring-cloud-function-samples/function-sample-supplier-exporter/build.sh deleted file mode 100644 index 6b4a373a2..000000000 --- a/spring-cloud-function-samples/function-sample-supplier-exporter/build.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -BLUE='\033[0;34m' -NC='\033[0m' - -printf "=== ${BLUE}Building %s sample${NC} ===\n" "${PWD##*/}" - -./compile.sh || exit 1 - -JARDIR=target/native-image -java -cp $JARDIR/BOOT-INF/lib/*:$JARDIR/BOOT-INF/classes:$JARDIR:target/test-classes com.example.test.TestServer & -SPID=$! -sleep 5 - -${PWD%/*samples/*}/scripts/test.sh --spring.cloud.function.web.export.source.url=http://localhost:8000/home --spring.cloud.function.web.export.sink.url=http://localhost:8000/echo - -kill $SPID diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml b/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml index f546fb89f..a9209b840 100644 --- a/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml +++ b/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml @@ -21,7 +21,6 @@ 1.8 3.1.0-SNAPSHOT - 1.0.17.RELEASE @@ -42,6 +41,16 @@ spring-boot-starter-test test + + org.awaitility + awaitility + + + org.testcontainers + testcontainers + 1.14.3 + test + @@ -68,13 +77,6 @@ org.springframework.boot spring-boot-maven-plugin - - - org.springframework.boot.experimental - spring-boot-thin-layout - ${wrapper.version} - - diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/demo/ContainerTests.java b/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/demo/ContainerTests.java new file mode 100644 index 000000000..599e46b01 --- /dev/null +++ b/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/demo/ContainerTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2019-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.demo; + +import java.util.concurrent.TimeUnit; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.output.ToStringConsumer; +import org.testcontainers.utility.MountableFile; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Dave Syer + * + */ +// @Disabled +public class ContainerTests { + + @Test + void test() throws Exception { + ToStringConsumer consumer = new ToStringConsumer(); + try (@SuppressWarnings("resource") + GenericContainer container = new GenericContainer<>("lambci/lambda:provided").withLogConsumer(consumer) + .withCopyFileToContainer(MountableFile.forClasspathResource("bootstrap"), "/var/task/") + .withEnv("DOCKER_LAMBDA_STAY_OPEN", "1").withExposedPorts(9001)) { + container.start(); + int port = container.getFirstMappedPort(); + String host = container.getHost(); + System.err.println(host + ":" + port); + DemoApplication.main(new String[] { "--AWS_LAMBDA_RUNTIME_API=" + host + ":" + port, "--_HANDLER=foobar", + "--logging.level.org.springframework=DEBUG" }); + ResponseEntity response = Awaitility.waitAtMost(30, TimeUnit.SECONDS).until(() -> { + ResponseEntity result = new RestTemplate().postForEntity( + "http://" + host + ":" + port + "/2015-03-31/functions/foobar/invocations", + "{\"name\":\"foo\"}", String.class); + return result; + }, result -> result != null); + assertThat(response.getBody()).contains("hi foo!"); + assertThat(response.getHeaders()).containsKey("X-Amzn-Requestid"); + } + String output = consumer.toUtf8String(); + assertThat(output).contains("Lambda API listening on port 9001"); + assertThat(output).contains("START RequestId:"); + assertThat(output).contains("END RequestId:"); + } + +} diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/demo/DemoApplicationTests.java b/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/demo/DemoApplicationTests.java deleted file mode 100644 index 5cce20b94..000000000 --- a/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/demo/DemoApplicationTests.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.example.demo; - -import com.example.test.TestServer; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.cloud.function.context.test.FunctionalSpringBootTest; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.util.SocketUtils; -import org.springframework.web.reactive.function.client.WebClient; - -import static org.assertj.core.api.Assertions.assertThat; - -@FunctionalSpringBootTest({"spring.cloud.function.web.export.source.url=http://localhost:${export.port}/home", - "spring.cloud.function.web.export.sink.url=http://localhost:${export.port}/echo", - "logging.level.reactor=OFF", - "logging.level.io.netty=OFF"}) -public class DemoApplicationTests { - - static ConfigurableApplicationContext context; - - @Value("${export.port}") - private int port; - - @Autowired - private WebClient.Builder builder; - - @Test - public void contextLoads() throws Exception { - WebClient client = builder.baseUrl("http://localhost:" + port).build(); - client.post().uri("/add").bodyValue("{\"name\":\"Fred\"}").exchange().block(); - Thread.sleep(1000L); - String response = client.get().uri("/take").exchange().block().bodyToMono(String.class).block(); - assertThat(response).isEqualTo("{\"name\":\"hi Fred!\"}"); - } - - @AfterAll - static void after() { - if (context != null) { - context.close(); - } - } - - @BeforeAll - static void before() { - int port = SocketUtils.findAvailableTcpPort(); - System.setProperty("export.port", "" + port); - context = SpringApplication.run(TestServer.class, "--server.port="+port, "--spring.cloud.function.web.export.enabled=false", "--spring.main.web-application-type=reactive"); - } - -} diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/test/TestServer.java b/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/test/TestServer.java deleted file mode 100644 index 7af07eb6d..000000000 --- a/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/java/com/example/test/TestServer.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.example.test; - -import java.util.Arrays; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Supplier; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.function.json.JsonMapper; -import org.springframework.context.annotation.Bean; - -import reactor.core.publisher.Mono; -import reactor.core.publisher.MonoProcessor; - -@SpringBootApplication(proxyBeanMethods = false) -public class TestServer { - - private MonoProcessor output = MonoProcessor.create(); - - private String response = ""; - - public static void main(String[] args) { - Set list = new LinkedHashSet<>(Arrays.asList(args)); - list.addAll(Arrays.asList("--server.port=8000", "--spring.cloud.function.web.export.enabled=false", "--spring.main.web-application-type=reactive")); - SpringApplication.run(TestServer.class, list.toArray(new String[0])); - } - - @Bean - public Supplier> home() { - return () -> output; - } - -// @Bean -// public Function echo(JsonMapper mapper) { -// return input -> { -// response = input; -// return "Echo: " + response; -// }; -// } - - @Bean - public Function echo(JsonMapper mapper) { - return input -> { - System.out.println("===> POJO " + input); - response = new String(mapper.toJson(input)); - return "Echo: " + response; - }; - } - - @Bean - public Function add() { - return input -> { - System.err.println("Add: " + input); - output.onNext(input); - output = MonoProcessor.create(); - return "Added: " + input; - }; - } - - @Bean - public Supplier take() { - return () -> response; - } - -} - -class Foo { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Foo(String name) { - this.name = name; - } - - Foo() {} -} diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/resources/bootstrap b/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/resources/bootstrap new file mode 100755 index 000000000..142d4caad --- /dev/null +++ b/spring-cloud-function-samples/function-sample-supplier-exporter/src/test/resources/bootstrap @@ -0,0 +1,6 @@ +#!/bin/sh + +while true +do + sleep 1 +done \ No newline at end of file diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/verify.sh b/spring-cloud-function-samples/function-sample-supplier-exporter/verify.sh deleted file mode 100644 index 3d4560817..000000000 --- a/spring-cloud-function-samples/function-sample-supplier-exporter/verify.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -curl -s localhost:8000/add -d '{"name":"world"}' -H "Content-Type: text/plain" -echo -echo Waiting... -sleep 1 -RESPONSE=`curl -s localhost:8000/take` -echo Got response: $RESPONSE -if [[ "$RESPONSE" == '{"name":"hi world!"}' ]]; then - exit 0 -else - exit 1 -fi