From 87554fb4dcf107b2dc66d4213bb6cb6fcd9a146d Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 27 Jul 2023 14:51:50 +0200 Subject: [PATCH] Add test for RabbitMQ smoke test Closes gh-36610 --- .../testcontainers/DockerImageNames.java | 10 +++ .../spring-boot-smoke-test-amqp/build.gradle | 6 ++ .../docker-compose.yml | 5 -- .../amqp/SampleAmqpSimpleApplication.java | 10 ++- .../src/main/java/smoketest/amqp/Sender.java | 8 +-- .../SampleAmqpSimpleApplicationTests.java | 63 +++++++++++++++++++ 6 files changed, 89 insertions(+), 13 deletions(-) delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/docker-compose.yml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/test/java/smoketest/amqp/SampleAmqpSimpleApplicationTests.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java index 44da467557..fe82512990 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java @@ -36,6 +36,8 @@ public final class DockerImageNames { private static final String POSTGRESQL_VERSION = "14.0"; + private static final String RABBIT_VERSION = "3.11-alpine"; + private static final String REDIS_VERSION = "4.0.14"; private static final String REGISTRY_VERSION = "2.7.1"; @@ -93,6 +95,14 @@ public final class DockerImageNames { return DockerImageName.parse("postgres").withTag(POSTGRESQL_VERSION); } + /** + * Return a {@link DockerImageName} suitable for running RabbitMQ. + * @return a docker image name for running redis + */ + public static DockerImageName rabbit() { + return DockerImageName.parse("rabbitmq").withTag(RABBIT_VERSION); + } + /** * Return a {@link DockerImageName} suitable for running Redis. * @return a docker image name for running redis diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle index 691266ec9d..75d6494542 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle @@ -7,4 +7,10 @@ description = "Spring Boot AMQP smoke test" dependencies { implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-amqp")) + + testImplementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-test")) + testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) + testImplementation("org.awaitility:awaitility") + testImplementation("org.testcontainers:junit-jupiter") + testImplementation("org.testcontainers:rabbitmq") } \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/docker-compose.yml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/docker-compose.yml deleted file mode 100644 index 267fb2ace5..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/docker-compose.yml +++ /dev/null @@ -1,5 +0,0 @@ -rabbitmq: - image: rabbitmq - ports: - - "5672:5672" - - "15672:15672" diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/SampleAmqpSimpleApplication.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/SampleAmqpSimpleApplication.java index b13b9fa901..410385cb72 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/SampleAmqpSimpleApplication.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/SampleAmqpSimpleApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2023 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. @@ -21,15 +21,14 @@ import java.util.Date; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.messaging.handler.annotation.Payload; -import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @RabbitListener(queues = "foo") -@EnableScheduling public class SampleAmqpSimpleApplication { @Bean @@ -47,6 +46,11 @@ public class SampleAmqpSimpleApplication { System.out.println(new Date() + ": " + foo); } + @Bean + public ApplicationRunner runner(Sender sender) { + return (args) -> sender.send("Hello"); + } + public static void main(String[] args) { SpringApplication.run(SampleAmqpSimpleApplication.class, args); } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/Sender.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/Sender.java index dbe11c4b53..aff5d82da1 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/Sender.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/main/java/smoketest/amqp/Sender.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2023 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. @@ -18,16 +18,14 @@ package smoketest.amqp; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; public class Sender { @Autowired private RabbitTemplate rabbitTemplate; - @Scheduled(fixedDelay = 1000L) - public void send() { - this.rabbitTemplate.convertAndSend("foo", "hello"); + public void send(String message) { + this.rabbitTemplate.convertAndSend("foo", message); } } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/test/java/smoketest/amqp/SampleAmqpSimpleApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/test/java/smoketest/amqp/SampleAmqpSimpleApplicationTests.java new file mode 100644 index 0000000000..fd330b20c4 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/src/test/java/smoketest/amqp/SampleAmqpSimpleApplicationTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2023 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 smoketest.amqp; + +import java.time.Duration; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.testcontainers.containers.RabbitMQContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@Testcontainers(disabledWithoutDocker = true) +@ExtendWith(OutputCaptureExtension.class) +class SampleAmqpSimpleApplicationTests { + + @Container + static final RabbitMQContainer rabbit = new RabbitMQContainer(DockerImageNames.rabbit()) + .withStartupTimeout(Duration.ofMinutes(4)); + + @DynamicPropertySource + static void rabbitProperties(DynamicPropertyRegistry properties) { + properties.add("spring.rabbitmq.addresses", rabbit::getAmqpUrl); + properties.add("spring.rabbitmq.username", rabbit::getAdminUsername); + properties.add("spring.rabbitmq.password", rabbit::getAdminPassword); + } + + @Autowired + private Sender sender; + + @Test + void sendSimpleMessage(CapturedOutput output) { + this.sender.send("Test message"); + Awaitility.waitAtMost(Duration.ofMinutes(1)).untilAsserted(() -> assertThat(output).contains("Test message")); + } + +}