diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 19d6e7210d..5d588e5e42 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -22,7 +22,7 @@ dependencies { implementation(platform("io.micronaut.platform:micronaut-platform:$micronautVersion")) implementation("io.micronaut.starter:micronaut-starter-api:$micronautVersion") implementation("io.micronaut:micronaut-inject-java") - implementation("org.apache.commons:commons-compress:1.20") + implementation('org.apache.commons:commons-compress:1.21') implementation "io.micronaut.docs:micronaut-docs-asciidoc-extensions:$micronautDocsVersion", { exclude group: "org.codehaus.groovy" } diff --git a/buildSrc/src/main/java/io/micronaut/guides/feature/MockServerClient.java b/buildSrc/src/main/java/io/micronaut/guides/feature/MockServerClient.java deleted file mode 100644 index 669838823e..0000000000 --- a/buildSrc/src/main/java/io/micronaut/guides/feature/MockServerClient.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.micronaut.guides.feature; - -import io.micronaut.core.annotation.NonNull; -import io.micronaut.core.annotation.Nullable; -import io.micronaut.starter.application.ApplicationType; -import io.micronaut.starter.application.generator.GeneratorContext; -import io.micronaut.starter.build.dependencies.Dependency; -import io.micronaut.starter.feature.Feature; -import io.micronaut.starter.feature.database.TestContainers; -import jakarta.inject.Singleton; - -@Singleton -public class MockServerClient implements Feature { - - public static final String ARTIFACT_ID_MOCKSERVER_CLIENT_JAVA = "mockserver-client-java"; - public static final String ARTIFACT_ID_TEST_CONTAINERS_MOCKSERVER = "mockserver"; - - @Override - public @NonNull String getName() { - return "mockserver-client-java"; - } - - @Override - public boolean supports(ApplicationType applicationType) { - return true; - } - - @Override - public @Nullable String getThirdPartyDocumentation() { - return "https://www.mock-server.com/mock_server/mockserver_clients.html#java-mockserver-client"; - } - - @Override - public void apply(GeneratorContext generatorContext) { - addDependencies(generatorContext); - } - - protected void addDependencies(GeneratorContext generatorContext) { - if (generatorContext.getFeatures().hasFeature(TestContainers.class)) { - generatorContext.addDependency(Dependency.builder().groupId(TestContainers.TESTCONTAINERS_GROUP_ID).artifactId(ARTIFACT_ID_TEST_CONTAINERS_MOCKSERVER).test().build()); - } - generatorContext.addDependency(Dependency.builder().lookupArtifactId(ARTIFACT_ID_MOCKSERVER_CLIENT_JAVA).test()); - } -} \ No newline at end of file diff --git a/buildSrc/src/main/java/io/micronaut/guides/feature/OracleTestContainer.java b/buildSrc/src/main/java/io/micronaut/guides/feature/OracleTestContainer.java deleted file mode 100644 index 62e88658f6..0000000000 --- a/buildSrc/src/main/java/io/micronaut/guides/feature/OracleTestContainer.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.micronaut.guides.feature; - -import jakarta.inject.Singleton; - -import static io.micronaut.starter.build.dependencies.Scope.TEST; - -@Singleton -public class OracleTestContainer extends AbstractFeature { - public OracleTestContainer() { - super("testcontainers-oracle", "oracle-xe", TEST); - } -} diff --git a/buildSrc/src/main/resources/pom.xml b/buildSrc/src/main/resources/pom.xml index 07b1c67129..39f9c3255b 100644 --- a/buildSrc/src/main/resources/pom.xml +++ b/buildSrc/src/main/resources/pom.xml @@ -55,11 +55,6 @@ kotlin-gradle-plugin 1.8.22 - - org.jetbrains.kotlin - kotlin-allopen - 1.8.22 - org.springframework.boot spring-boot-gradle-plugin diff --git a/guides/micronaut-mqtt/metadata.json b/guides/micronaut-mqtt/metadata.json index eb4289d48d..55d4c95f9d 100644 --- a/guides/micronaut-mqtt/metadata.json +++ b/guides/micronaut-mqtt/metadata.json @@ -18,7 +18,7 @@ "name": "cli", "features": ["yaml","graalvm", "mqtt"], "javaFeatures": [ "awaitility"], - "kotlinFeatures": [ "awaitility"] + "kotlinFeatures": [ "awaitility", "kapt"] } ] } diff --git a/guides/micronaut-oracle-autonomous-db/groovy/src/test/groovy/example/micronaut/repository/Oracle.groovy b/guides/micronaut-oracle-autonomous-db/groovy/src/test/groovy/example/micronaut/repository/Oracle.groovy new file mode 100644 index 0000000000..7dffa6a6cc --- /dev/null +++ b/guides/micronaut-oracle-autonomous-db/groovy/src/test/groovy/example/micronaut/repository/Oracle.groovy @@ -0,0 +1,37 @@ +package example.micronaut.repository; + +import org.testcontainers.containers.OracleContainer; + +import java.util.Map; + +public class Oracle { + + public static OracleContainer oracle = new OracleContainer("gvenzl/oracle-xe:21-slim-faststart") + .withDatabaseName("testDB") + .withUsername("testUser") + .withPassword("testPassword"); + + public static Map getConfiguration() { + start(); + return Map.of("datasources.default.url", oracle.getJdbcUrl(), + "datasources.default.username", oracle.getUsername(), + "datasources.default.password", oracle.getPassword(), + "datasources.default.driver-class-name", oracle.getDriverClassName()); + } + public static void start() { + if (!oracle.isRunning()) { + oracle.start(); + } + } + + public static void stop() { + if (oracle.isRunning()) { + oracle.stop(); + } + } + + public static void close() { + oracle.close(); + } + +} diff --git a/guides/micronaut-oracle-autonomous-db/groovy/src/test/groovy/example/micronaut/repository/ThingRepositorySpec.groovy b/guides/micronaut-oracle-autonomous-db/groovy/src/test/groovy/example/micronaut/repository/ThingRepositorySpec.groovy index 2acb45aaf7..938aa00339 100644 --- a/guides/micronaut-oracle-autonomous-db/groovy/src/test/groovy/example/micronaut/repository/ThingRepositorySpec.groovy +++ b/guides/micronaut-oracle-autonomous-db/groovy/src/test/groovy/example/micronaut/repository/ThingRepositorySpec.groovy @@ -1,61 +1,80 @@ package example.micronaut.repository +import com.github.dockerjava.api.model.Info import example.micronaut.domain.Thing -import example.micronaut.repository.ThingRepository -import io.micronaut.test.extensions.spock.annotation.MicronautTest +import io.micronaut.context.ApplicationContext +import spock.lang.IgnoreIf +import org.testcontainers.DockerClientFactory import spock.lang.Specification -import jakarta.inject.Inject -import java.util.stream.Collectors - -@MicronautTest class ThingRepositorySpec extends Specification { - @Inject - ThingRepository thingRepository + /** + * WARN t.gvenzl/oracle-xe:21-slim-faststart - The architecture 'amd64' for image 'gvenzl/oracle-xe:21-slim-faststart' + * (ID sha256:395e7780aaba5f8c33082bf533a17a4bffdb7bcdd58034702a1634fcbd3d1137) does not match the Docker server architecture 'arm64'. + * This will cause the container to execute much more slowly due to emulation and may lead to timeout failures. + */ + static boolean dockerArchitecture() { + Info info = DockerClientFactory.instance().getInfo() + String architecture = info.getArchitecture() + if (!architecture) { + return true + } + architecture == "x86_64" + } - void 'test findAll'() { + @IgnoreIf({ !dockerArchitecture() }) + void testFindAll() { + given: + ApplicationContext applicationContext = ApplicationContext.run(Oracle.getConfiguration()) + ThingRepository thingRepository = applicationContext.getBean(ThingRepository.class) - when: // clear out existing data; safe because each // test runs in a transaction that's rolled back + when: thingRepository.deleteAll() then: - !thingRepository.count() + 0 == thingRepository.count() when: thingRepository.saveAll(Arrays.asList( - new Thing('t1'), - new Thing('t2'), - new Thing('t3'))) - + new Thing("t1"), + new Thing("t2"), + new Thing("t3"))) List things = thingRepository.findAll() then: - things.size() == 3 - ['t1', 't2', 't3'] == things.stream() - .map(Thing::getName) - .sorted() - .collect(Collectors.toList()) + 3 == things.size() + Arrays.asList("t1", "t2", "t3") == + things.stream() + .map(Thing::getName) + .sorted() + .toList() + cleanup: + applicationContext.close() } - void 'test findByName'() { + @IgnoreIf({ !dockerArchitecture() }) + void testFindByName() { given: - String name = UUID.randomUUID() - + ApplicationContext applicationContext = ApplicationContext.run(Oracle.getConfiguration()) + ThingRepository thingRepository = applicationContext.getBean(ThingRepository.class) + String name = UUID.randomUUID().toString() when: - Thing thing = thingRepository.findByName(name).orElse(null) - + Thing thing = thingRepository.findByName(name).orElse(null); then: !thing when: - thingRepository.save(new Thing(name)) - thing = thingRepository.findByName(name).orElse(null) + thingRepository.save(new Thing(name)); + thing = thingRepository.findByName(name).orElse(null); then: thing name == thing.name + + cleanup: + applicationContext.close() } } diff --git a/guides/micronaut-oracle-autonomous-db/java/src/test/java/example/micronaut/repository/Oracle.java b/guides/micronaut-oracle-autonomous-db/java/src/test/java/example/micronaut/repository/Oracle.java new file mode 100644 index 0000000000..7dffa6a6cc --- /dev/null +++ b/guides/micronaut-oracle-autonomous-db/java/src/test/java/example/micronaut/repository/Oracle.java @@ -0,0 +1,37 @@ +package example.micronaut.repository; + +import org.testcontainers.containers.OracleContainer; + +import java.util.Map; + +public class Oracle { + + public static OracleContainer oracle = new OracleContainer("gvenzl/oracle-xe:21-slim-faststart") + .withDatabaseName("testDB") + .withUsername("testUser") + .withPassword("testPassword"); + + public static Map getConfiguration() { + start(); + return Map.of("datasources.default.url", oracle.getJdbcUrl(), + "datasources.default.username", oracle.getUsername(), + "datasources.default.password", oracle.getPassword(), + "datasources.default.driver-class-name", oracle.getDriverClassName()); + } + public static void start() { + if (!oracle.isRunning()) { + oracle.start(); + } + } + + public static void stop() { + if (oracle.isRunning()) { + oracle.stop(); + } + } + + public static void close() { + oracle.close(); + } + +} diff --git a/guides/micronaut-oracle-autonomous-db/java/src/test/java/example/micronaut/repository/ThingRepositoryTest.java b/guides/micronaut-oracle-autonomous-db/java/src/test/java/example/micronaut/repository/ThingRepositoryTest.java index a634c81770..049cbbc721 100644 --- a/guides/micronaut-oracle-autonomous-db/java/src/test/java/example/micronaut/repository/ThingRepositoryTest.java +++ b/guides/micronaut-oracle-autonomous-db/java/src/test/java/example/micronaut/repository/ThingRepositoryTest.java @@ -1,28 +1,40 @@ package example.micronaut.repository; +import com.github.dockerjava.api.model.Info; import example.micronaut.domain.Thing; -import example.micronaut.repository.ThingRepository; -import io.micronaut.test.extensions.junit5.annotation.MicronautTest; +import io.micronaut.context.ApplicationContext; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIf; +import org.testcontainers.DockerClientFactory; -import jakarta.inject.Inject; import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; -@MicronautTest class ThingRepositoryTest { - @Inject - ThingRepository thingRepository; + /** + * WARN t.gvenzl/oracle-xe:21-slim-faststart - The architecture 'amd64' for image 'gvenzl/oracle-xe:21-slim-faststart' + * (ID sha256:395e7780aaba5f8c33082bf533a17a4bffdb7bcdd58034702a1634fcbd3d1137) does not match the Docker server architecture 'arm64'. + * This will cause the container to execute much more slowly due to emulation and may lead to timeout failures. + */ + boolean dockerArchitecture() { + Info info = DockerClientFactory.instance().getInfo(); + String architecture = info.getArchitecture(); + if (architecture == null) { + return true; + } + return architecture.equals("x86_64"); + } + @EnabledIf("dockerArchitecture") @Test void testFindAll() { + ApplicationContext applicationContext = ApplicationContext.run(Oracle.getConfiguration()); + ThingRepository thingRepository = applicationContext.getBean(ThingRepository.class); // clear out existing data; safe because each // test runs in a transaction that's rolled back @@ -42,10 +54,15 @@ void testFindAll() { .map(Thing::getName) .sorted() .collect(Collectors.toList())); + applicationContext.close(); } + @EnabledIf("dockerArchitecture") @Test void testFindByName() { + ApplicationContext applicationContext = ApplicationContext.run(Oracle.getConfiguration()); + ThingRepository thingRepository = applicationContext.getBean(ThingRepository.class); + String name = UUID.randomUUID().toString(); Thing thing = thingRepository.findByName(name).orElse(null); @@ -55,5 +72,6 @@ void testFindByName() { thing = thingRepository.findByName(name).orElse(null); assertNotNull(thing); assertEquals(name, thing.getName()); + applicationContext.close(); } } diff --git a/guides/micronaut-oracle-autonomous-db/kotlin/src/test/kotlin/example/micronaut/repository/Oracle.kt b/guides/micronaut-oracle-autonomous-db/kotlin/src/test/kotlin/example/micronaut/repository/Oracle.kt new file mode 100644 index 0000000000..fa405263b8 --- /dev/null +++ b/guides/micronaut-oracle-autonomous-db/kotlin/src/test/kotlin/example/micronaut/repository/Oracle.kt @@ -0,0 +1,37 @@ +package example.micronaut.repository + +import org.testcontainers.containers.OracleContainer + +object Oracle { + var oracle = OracleContainer("gvenzl/oracle-xe:21-slim-faststart") + .withDatabaseName("testDB") + .withUsername("testUser") + .withPassword("testPassword") + + val configuration: Map + get() { + start() + return java.util.Map.of( + "datasources.default.url", oracle.jdbcUrl, + "datasources.default.username", oracle.username, + "datasources.default.password", oracle.password, + "datasources.default.driver-class-name", oracle.driverClassName + ) + } + + fun start() { + if (!oracle.isRunning()) { + oracle.start() + } + } + + fun stop() { + if (oracle.isRunning()) { + oracle.stop() + } + } + + fun close() { + oracle.close() + } +} diff --git a/guides/micronaut-oracle-autonomous-db/kotlin/src/test/kotlin/example/micronaut/repository/ThingRepositoryTest.kt b/guides/micronaut-oracle-autonomous-db/kotlin/src/test/kotlin/example/micronaut/repository/ThingRepositoryTest.kt index be188ef316..63ef4f0534 100644 --- a/guides/micronaut-oracle-autonomous-db/kotlin/src/test/kotlin/example/micronaut/repository/ThingRepositoryTest.kt +++ b/guides/micronaut-oracle-autonomous-db/kotlin/src/test/kotlin/example/micronaut/repository/ThingRepositoryTest.kt @@ -1,20 +1,33 @@ package example.micronaut.repository import example.micronaut.domain.Thing -import example.micronaut.repository.ThingRepository -import io.micronaut.test.extensions.junit5.annotation.MicronautTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.Assertions.assertNull +import example.micronaut.repository.Oracle.configuration +import io.micronaut.context.ApplicationContext +import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test -import java.util.UUID +import org.junit.jupiter.api.condition.EnabledIf +import org.testcontainers.DockerClientFactory +import java.util.* import java.util.stream.Collectors -@MicronautTest -class ThingRepositoryTest(private val thingRepository: ThingRepository) { +class ThingRepositoryTest { + /** + * WARN t.gvenzl/oracle-xe:21-slim-faststart - The architecture 'amd64' for image 'gvenzl/oracle-xe:21-slim-faststart' + * (ID sha256:395e7780aaba5f8c33082bf533a17a4bffdb7bcdd58034702a1634fcbd3d1137) does not match the Docker server architecture 'arm64'. + * This will cause the container to execute much more slowly due to emulation and may lead to timeout failures. + */ + fun dockerArchitecture(): Boolean { + val info = DockerClientFactory.instance().info + val architecture = info.architecture ?: return true + return architecture == "x86_64" + } + + @EnabledIf("dockerArchitecture") @Test fun testFindAll() { + val applicationContext = ApplicationContext.run(configuration) + val thingRepository = applicationContext.getBean(ThingRepository::class.java) // clear out existing data; safe because each // test runs in a transaction that's rolled back @@ -34,10 +47,16 @@ class ThingRepositoryTest(private val thingRepository: ThingRepository) { .map(Thing::name) .sorted() .collect(Collectors.toList())) + + applicationContext.close() } + @EnabledIf("dockerArchitecture") @Test fun testFindByName() { + val applicationContext = ApplicationContext.run(configuration) + val thingRepository = applicationContext.getBean(ThingRepository::class.java) + val name = UUID.randomUUID().toString() var thing = thingRepository.findByName(name).orElse(null) @@ -47,5 +66,7 @@ class ThingRepositoryTest(private val thingRepository: ThingRepository) { thing = thingRepository.findByName(name).orElse(null) assertNotNull(thing) assertEquals(name, thing.name) + + applicationContext.close() } } diff --git a/guides/micronaut-oracle-autonomous-db/metadata.json b/guides/micronaut-oracle-autonomous-db/metadata.json index 25e8881288..7875aed612 100644 --- a/guides/micronaut-oracle-autonomous-db/metadata.json +++ b/guides/micronaut-oracle-autonomous-db/metadata.json @@ -5,8 +5,10 @@ "tags": ["oracle", "cloud", "database"], "categories": ["Oracle Cloud"], "publicationDate": "2021-05-17", - "apps": [{ + "apps": [ + { + "excludeTest": ["DefaultTest"], "name": "default", - "features": ["yaml","data-jdbc", "flyway", "graalvm", "oracle-cloud-atp", "testcontainers", "testcontainers-oracle"] + "features": ["yaml","data-jdbc", "flyway", "graalvm", "oracle-cloud-atp", "testcontainers", "testcontainers-oracle-xe"] }] } diff --git a/guides/micronaut-oracle-autonomous-db/src/test/resources/application-test.yml b/guides/micronaut-oracle-autonomous-db/src/test/resources/application-test.yml index 8385f804dc..3a0bc1d371 100644 --- a/guides/micronaut-oracle-autonomous-db/src/test/resources/application-test.yml +++ b/guides/micronaut-oracle-autonomous-db/src/test/resources/application-test.yml @@ -1,11 +1,3 @@ -#tag::datasource[] -datasources: - default: - url: jdbc:tc:oracle:thin:@/xe - driverClassName: org.testcontainers.jdbc.ContainerDatabaseDriver - username: system - password: oracle -#end::datasource[] #tag::flyway[] flyway: datasources: diff --git a/guides/micronaut-oracle-cloud-streaming/metadata.json b/guides/micronaut-oracle-cloud-streaming/metadata.json index e94ac9483e..cd6e40c54a 100644 --- a/guides/micronaut-oracle-cloud-streaming/metadata.json +++ b/guides/micronaut-oracle-cloud-streaming/metadata.json @@ -6,6 +6,8 @@ "categories": ["Oracle Cloud"], "publicationDate": "2021-07-30", "zipIncludes": ["docker/docker-compose.yml"], + "skipGradleTests": true, + "skipMavenTests": true, "apps": [ { "name": "chess-game", diff --git a/guides/micronaut-oracle-email-delivery/metadata.json b/guides/micronaut-oracle-email-delivery/metadata.json index 3255f88d4d..738fa1fbf4 100644 --- a/guides/micronaut-oracle-email-delivery/metadata.json +++ b/guides/micronaut-oracle-email-delivery/metadata.json @@ -5,6 +5,8 @@ "tags": ["oracle", "cloud"], "categories": ["Oracle Cloud", "Email"], "publicationDate": "2022-05-17", + "skipGradleTests": true, + "skipMavenTests": true, "apps": [{ "name": "default", "features": ["yaml","email-javamail","email-template","views-thymeleaf", "serialization-jackson","validation"] diff --git a/guides/micronaut-security-basicauth/groovy/src/main/groovy/example/micronaut/AuthenticationProviderUserPassword.groovy b/guides/micronaut-security-basicauth/groovy/src/main/groovy/example/micronaut/AuthenticationProviderUserPassword.groovy index a889f7e044..a04049e8b8 100644 --- a/guides/micronaut-security-basicauth/groovy/src/main/groovy/example/micronaut/AuthenticationProviderUserPassword.groovy +++ b/guides/micronaut-security-basicauth/groovy/src/main/groovy/example/micronaut/AuthenticationProviderUserPassword.groovy @@ -1,6 +1,5 @@ package example.micronaut -import groovy.transform.CompileStatic import io.micronaut.core.annotation.Nullable import io.micronaut.http.HttpRequest import io.micronaut.security.authentication.AuthenticationProvider @@ -11,21 +10,19 @@ import org.reactivestreams.Publisher import reactor.core.publisher.Flux import reactor.core.publisher.FluxSink -@CompileStatic @Singleton // <1> class AuthenticationProviderUserPassword implements AuthenticationProvider> { // <2> @Override Publisher authenticate(@Nullable HttpRequest httpRequest, AuthenticationRequest authenticationRequest) { - Flux.create({ emitter -> - if ( authenticationRequest.identity == "sherlock" && authenticationRequest.secret == "password" ) { + Flux.create(emitter -> { + if (authenticationRequest.identity == "sherlock" && authenticationRequest.secret == "password") { emitter.next(AuthenticationResponse.success((String) authenticationRequest.identity)) emitter.complete() } else { emitter.error(AuthenticationResponse.exception()) } - }, FluxSink.OverflowStrategy.ERROR) } } diff --git a/guides/spring-boot-to-micronaut-application-class/metadata.json b/guides/spring-boot-to-micronaut-application-class/metadata.json index c4d5713adb..2e6886c542 100644 --- a/guides/spring-boot-to-micronaut-application-class/metadata.json +++ b/guides/spring-boot-to-micronaut-application-class/metadata.json @@ -5,6 +5,7 @@ "tags": ["spring-boot"], "categories": ["Spring Boot to Micronaut Framework"], "publicationDate": "2022-09-13", + "languages": ["java"], "apps": [ { "framework": "Spring Boot", diff --git a/guides/working-with-jooq-flyway-using-testcontainers/metadata.json b/guides/working-with-jooq-flyway-using-testcontainers/metadata.json index fd3444b135..46b817016e 100644 --- a/guides/working-with-jooq-flyway-using-testcontainers/metadata.json +++ b/guides/working-with-jooq-flyway-using-testcontainers/metadata.json @@ -7,6 +7,7 @@ "publicationDate": "2022-09-13", "languages": ["java"], "buildTools": ["maven"], + "skipMavenTests": true, "apps": [ { "name": "testcontainers", diff --git a/version.txt b/version.txt index 561ad3349b..6aba2b245a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.1.6 +4.2.0