From 8255fc0da37da9784962f35d2a52e81e251de236 Mon Sep 17 00:00:00 2001 From: Soby Chacko Date: Mon, 5 Dec 2022 15:13:31 -0500 Subject: [PATCH] Smoke test for Spring Pulsar reactive native app --- .../spring-pulsar-reactive/build.gradle | 24 +++++++++++++ .../spring-pulsar-reactive/docker-compose.yml | 8 +++++ ...ringPulsarReactiveApplicationAotTests.java | 21 +++++++++++ .../SpringPulsarReactiveApplication.java | 36 +++++++++++++++++++ .../src/main/resources/application.properties | 2 ++ 5 files changed, 91 insertions(+) create mode 100644 integration/spring-pulsar-reactive/build.gradle create mode 100644 integration/spring-pulsar-reactive/docker-compose.yml create mode 100644 integration/spring-pulsar-reactive/src/appTest/java/com/example/pulsar/SpringPulsarReactiveApplicationAotTests.java create mode 100644 integration/spring-pulsar-reactive/src/main/java/com/example/pulsar/SpringPulsarReactiveApplication.java create mode 100644 integration/spring-pulsar-reactive/src/main/resources/application.properties diff --git a/integration/spring-pulsar-reactive/build.gradle b/integration/spring-pulsar-reactive/build.gradle new file mode 100644 index 00000000..4e331a53 --- /dev/null +++ b/integration/spring-pulsar-reactive/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'org.springframework.aot.smoke-test' + id 'org.graalvm.buildtools.native' +} + +ext { + set('springPulsarVersion', "0.1.0-SNAPSHOT") +} + +repositories { + maven { url 'https://repository.apache.org/content/repositories/snapshots' } +} + +dependencies { + implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) + implementation("org.springframework.pulsar:spring-pulsar-reactive-spring-boot-starter:${springPulsarVersion}") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + + appTestImplementation(project(":aot-smoke-test-support")) + appTestImplementation("org.awaitility:awaitility:4.2.0") +} diff --git a/integration/spring-pulsar-reactive/docker-compose.yml b/integration/spring-pulsar-reactive/docker-compose.yml new file mode 100644 index 00000000..f47cf256 --- /dev/null +++ b/integration/spring-pulsar-reactive/docker-compose.yml @@ -0,0 +1,8 @@ +version: '3' +services: + pulsar: + image: apachepulsar/pulsar:2.10.2 + ports: + - '8080' + - '6650' + command: bin/pulsar standalone diff --git a/integration/spring-pulsar-reactive/src/appTest/java/com/example/pulsar/SpringPulsarReactiveApplicationAotTests.java b/integration/spring-pulsar-reactive/src/appTest/java/com/example/pulsar/SpringPulsarReactiveApplicationAotTests.java new file mode 100644 index 00000000..ec1c29d6 --- /dev/null +++ b/integration/spring-pulsar-reactive/src/appTest/java/com/example/pulsar/SpringPulsarReactiveApplicationAotTests.java @@ -0,0 +1,21 @@ +package com.example.pulsar; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; +import org.springframework.aot.smoketest.support.assertj.AssertableOutput; +import org.springframework.aot.smoketest.support.junit.ApplicationTest; + +import java.time.Duration; + +import static org.assertj.core.api.Assertions.assertThat; + +@ApplicationTest +public class SpringPulsarReactiveApplicationAotTests { + + @Test + void reactivePulsarListenerMethodReceivesMessage(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> assertThat(output).hasSingleLineContaining("Message Received: sample-message-50")); + } + +} diff --git a/integration/spring-pulsar-reactive/src/main/java/com/example/pulsar/SpringPulsarReactiveApplication.java b/integration/spring-pulsar-reactive/src/main/java/com/example/pulsar/SpringPulsarReactiveApplication.java new file mode 100644 index 00000000..0ed7ddf3 --- /dev/null +++ b/integration/spring-pulsar-reactive/src/main/java/com/example/pulsar/SpringPulsarReactiveApplication.java @@ -0,0 +1,36 @@ +package com.example.pulsar; + +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.pulsar.reactive.config.annotation.ReactivePulsarListener; +import org.springframework.pulsar.reactive.core.ReactivePulsarTemplate; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@SpringBootApplication +public class SpringPulsarReactiveApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringPulsarReactiveApplication.class, args); + } + + @Bean + ApplicationRunner sendMessageToTopicOnAppStartup(ReactivePulsarTemplate reactivePulsarTemplate) { + String topic = "graalvm-demo-topic-reactive"; + return args -> { + Flux.range(0, 100).map((i) -> "sample-message-" + i) + .as(messages -> reactivePulsarTemplate.send(topic, messages)).subscribe(); + }; + } + + @ReactivePulsarListener(subscriptionName = "graalvm-demo-subscription-reactive", + topics = "graalvm-demo-topic-reactive") + public Mono listenReactive(String message) { + System.out.println("Message Received: " + message); + return Mono.empty(); + } + +} diff --git a/integration/spring-pulsar-reactive/src/main/resources/application.properties b/integration/spring-pulsar-reactive/src/main/resources/application.properties new file mode 100644 index 00000000..c6359061 --- /dev/null +++ b/integration/spring-pulsar-reactive/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.pulsar.client.service-url=pulsar://${PULSAR_HOST:localhost}:${PULSAR_PORT_6650:6650} +spring.pulsar.administration.service-url=http://${PULSAR_HOST:localhost}:${PULSAR_PORT_8080:8080} \ No newline at end of file