From dfda0a30be7d4ef33c7bd3b6a8ecb2d492c468cc Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 10 Aug 2022 10:04:10 +0200 Subject: [PATCH] Add data-redis-reactive smoke test Closes gh-62 --- ci/smoke-tests.yml | 1 + data-redis-reactive/README.adoc | 1 + data-redis-reactive/build.gradle | 18 ++++++ data-redis-reactive/docker-compose.yml | 6 ++ .../DataRedisReactiveApplicationAotTests.java | 25 ++++++++ .../com/example/data/redis/reactive/CLR.java | 32 ++++++++++ .../DataRedisReactiveApplication.java | 33 ++++++++++ .../example/data/redis/reactive/Person.java | 64 +++++++++++++++++++ .../redis/reactive/RedisConfiguration.java | 26 ++++++++ .../src/main/resources/application.properties | 2 + .../DataRedisReactiveApplicationTests.java | 2 +- settings.gradle | 1 + 12 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 data-redis-reactive/README.adoc create mode 100644 data-redis-reactive/build.gradle create mode 100644 data-redis-reactive/docker-compose.yml create mode 100644 data-redis-reactive/src/aotTest/java/com/example/data/redis/reactive/DataRedisReactiveApplicationAotTests.java create mode 100644 data-redis-reactive/src/main/java/com/example/data/redis/reactive/CLR.java create mode 100644 data-redis-reactive/src/main/java/com/example/data/redis/reactive/DataRedisReactiveApplication.java create mode 100644 data-redis-reactive/src/main/java/com/example/data/redis/reactive/Person.java create mode 100644 data-redis-reactive/src/main/java/com/example/data/redis/reactive/RedisConfiguration.java create mode 100644 data-redis-reactive/src/main/resources/application.properties rename data-redis/src/test/java/com/example/data/redis/DataR2DbcApplicationTests.java => data-redis-reactive/src/test/java/com/example/data/redis/DataRedisReactiveApplicationTests.java (81%) diff --git a/ci/smoke-tests.yml b/ci/smoke-tests.yml index 5f0afbc8..0194859a 100644 --- a/ci/smoke-tests.yml +++ b/ci/smoke-tests.yml @@ -25,6 +25,7 @@ smoke_tests: - data-mongodb-reactive - data-r2dbc - data-redis + - data-redis-reactive - data-rest-mongodb - event-listener - flyway diff --git a/data-redis-reactive/README.adoc b/data-redis-reactive/README.adoc new file mode 100644 index 00000000..3a90a4df --- /dev/null +++ b/data-redis-reactive/README.adoc @@ -0,0 +1 @@ +Tests if Spring Data Redis Reactive works diff --git a/data-redis-reactive/build.gradle b/data-redis-reactive/build.gradle new file mode 100644 index 00000000..d5f63737 --- /dev/null +++ b/data-redis-reactive/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'org.springframework.aot.smoke-test' + id 'org.graalvm.buildtools.native' +} + +dependencies { + implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) + implementation("org.springframework.boot:spring-boot-starter-data-redis-reactive") + implementation("org.springframework.boot:spring-boot-starter-json") + implementation(project(":aot-smoke-test-third-party-hints")) + + testImplementation("org.springframework.boot:spring-boot-starter-test") + + aotTestImplementation(project(":aot-smoke-test-support")) + aotTestImplementation("org.awaitility:awaitility:4.2.0") +} diff --git a/data-redis-reactive/docker-compose.yml b/data-redis-reactive/docker-compose.yml new file mode 100644 index 00000000..83048be3 --- /dev/null +++ b/data-redis-reactive/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.1' +services: + redis: + image: 'redis:7' + ports: + - 6379 diff --git a/data-redis-reactive/src/aotTest/java/com/example/data/redis/reactive/DataRedisReactiveApplicationAotTests.java b/data-redis-reactive/src/aotTest/java/com/example/data/redis/reactive/DataRedisReactiveApplicationAotTests.java new file mode 100644 index 00000000..ee68068d --- /dev/null +++ b/data-redis-reactive/src/aotTest/java/com/example/data/redis/reactive/DataRedisReactiveApplicationAotTests.java @@ -0,0 +1,25 @@ +package com.example.data.redis.reactive; + +import java.time.Duration; + +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.AotSmokeTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@AotSmokeTest +class DataRedisReactiveApplicationAotTests { + + @Test + void findAll(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> { + assertThat(output).hasSingleLineContaining("1: Person{firstname='first-1', lastname='last-1'}") + .hasSingleLineContaining("2: Person{firstname='first-2', lastname='last-2'}") + .hasSingleLineContaining("3: Person{firstname='first-3', lastname='last-3'}"); + }); + } + +} diff --git a/data-redis-reactive/src/main/java/com/example/data/redis/reactive/CLR.java b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/CLR.java new file mode 100644 index 00000000..b87abc8d --- /dev/null +++ b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/CLR.java @@ -0,0 +1,32 @@ +package com.example.data.redis.reactive; + +import reactor.core.publisher.Flux; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.data.redis.core.ReactiveRedisOperations; +import org.springframework.stereotype.Component; + +@Component +class CLR implements CommandLineRunner { + + private final ReactiveRedisOperations redisOperations; + + CLR(ReactiveRedisOperations redisOperations) { + this.redisOperations = redisOperations; + } + + @Override + public void run(String... args) throws Exception { + Flux.just(new Person("1", "first-1", "last-1"), new Person("2", "first-2", "last-2"), + new Person("3", "first-3", "last-3")) + .flatMap((person) -> this.redisOperations.opsForValue().set(person.getId(), person)).collectList() + .block(); + + for (int i = 1; i <= 3; i++) { + String id = Integer.toString(i); + this.redisOperations.opsForValue().get(id).subscribe((person) -> System.out.printf("%s: %s%n", id, person), + (ex) -> ex.printStackTrace(System.out)); + } + } + +} diff --git a/data-redis-reactive/src/main/java/com/example/data/redis/reactive/DataRedisReactiveApplication.java b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/DataRedisReactiveApplication.java new file mode 100644 index 00000000..e0323910 --- /dev/null +++ b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/DataRedisReactiveApplication.java @@ -0,0 +1,33 @@ +package com.example.data.redis.reactive; + +import com.example.data.redis.reactive.DataRedisReactiveApplication.PersonRuntimeHints; + +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; +import org.springframework.aot.smoketest.thirdpartyhints.NettyRuntimeHints; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ImportRuntimeHints; +import org.springframework.context.aot.BindingReflectionHintsRegistrar; + +@SpringBootApplication +@ImportRuntimeHints({ NettyRuntimeHints.class, PersonRuntimeHints.class }) +public class DataRedisReactiveApplication { + + public static void main(String[] args) throws InterruptedException { + SpringApplication.run(DataRedisReactiveApplication.class, args); + Thread.currentThread().join(); // To be able to measure memory consumption + } + + static class PersonRuntimeHints implements RuntimeHintsRegistrar { + + private final BindingReflectionHintsRegistrar bindingReflectionHintsRegistrar = new BindingReflectionHintsRegistrar(); + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + this.bindingReflectionHintsRegistrar.registerReflectionHints(hints.reflection(), Person.class); + } + + } + +} diff --git a/data-redis-reactive/src/main/java/com/example/data/redis/reactive/Person.java b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/Person.java new file mode 100644 index 00000000..0b47e3dc --- /dev/null +++ b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/Person.java @@ -0,0 +1,64 @@ +/* + * Copyright 2020 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.data.redis.reactive; + +public class Person { + + private String id; + + private String firstname; + + private String lastname; + + public Person() { + } + + public Person(String id, String firstname, String lastname) { + this.id = id; + this.firstname = firstname; + this.lastname = lastname; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + @Override + public String toString() { + return "Person{" + "firstname='" + firstname + '\'' + ", lastname='" + lastname + '\'' + '}'; + } + +} diff --git a/data-redis-reactive/src/main/java/com/example/data/redis/reactive/RedisConfiguration.java b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/RedisConfiguration.java new file mode 100644 index 00000000..b8c2b4e5 --- /dev/null +++ b/data-redis-reactive/src/main/java/com/example/data/redis/reactive/RedisConfiguration.java @@ -0,0 +1,26 @@ +package com.example.data.redis.reactive; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; +import org.springframework.data.redis.core.ReactiveRedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration(proxyBeanMethods = false) +class RedisConfiguration { + + @Bean + ReactiveRedisTemplate redisOperations(ObjectMapper objectMapper, + ReactiveRedisConnectionFactory connectionFactory) { + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(objectMapper, Person.class); + RedisSerializationContext.RedisSerializationContextBuilder builder = RedisSerializationContext + .newSerializationContext(new StringRedisSerializer()); + RedisSerializationContext context = builder.value(serializer).build(); + return new ReactiveRedisTemplate<>(connectionFactory, context); + } + +} diff --git a/data-redis-reactive/src/main/resources/application.properties b/data-redis-reactive/src/main/resources/application.properties new file mode 100644 index 00000000..49d9cebe --- /dev/null +++ b/data-redis-reactive/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.data.redis.host=${REDIS_HOST:localhost} +spring.data.redis.port=${REDIS_PORT_6379:6379} diff --git a/data-redis/src/test/java/com/example/data/redis/DataR2DbcApplicationTests.java b/data-redis-reactive/src/test/java/com/example/data/redis/DataRedisReactiveApplicationTests.java similarity index 81% rename from data-redis/src/test/java/com/example/data/redis/DataR2DbcApplicationTests.java rename to data-redis-reactive/src/test/java/com/example/data/redis/DataRedisReactiveApplicationTests.java index 8a3d5c76..a104de00 100644 --- a/data-redis/src/test/java/com/example/data/redis/DataR2DbcApplicationTests.java +++ b/data-redis-reactive/src/test/java/com/example/data/redis/DataRedisReactiveApplicationTests.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class DataR2DbcApplicationTests { +class DataRedisReactiveApplicationTests { @Test void contextLoads() { diff --git a/settings.gradle b/settings.gradle index c019a66e..4b1d0cfd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -53,6 +53,7 @@ include "data-mongodb" include "data-mongodb-reactive" include "data-r2dbc" include "data-redis" +include "data-redis-reactive" include "data-rest-mongodb" include "event-listener" include "flyway"