From 5d6b89c3cff459945f5b206dc1e94dfe8a0cdf1e Mon Sep 17 00:00:00 2001 From: Andy Elliott Date: Sun, 16 May 2021 12:38:21 +0800 Subject: [PATCH 1/4] Azurite TestContainer for Azure blob testing --- pom.xml | 8 +++ spring-content-azure-storage/pom.xml | 6 ++ .../content/azure/it/AzureStorageIT.java | 49 +++++++++------- .../content/azure/it/Azurite.java | 57 +++++++++++++++++++ 4 files changed, 101 insertions(+), 19 deletions(-) create mode 100644 spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/Azurite.java diff --git a/pom.xml b/pom.xml index a09e3895f..144425c52 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,14 @@ Integrates with Spring Data, Spring Data REST and Apache Solr ../target/generated-docs/refs/${env.BUILD_TYPE}/ + + + ch.qos.logback + logback-classic + 1.2.3 + + + diff --git a/spring-content-azure-storage/pom.xml b/spring-content-azure-storage/pom.xml index 830957a02..30397d6ec 100644 --- a/spring-content-azure-storage/pom.xml +++ b/spring-content-azure-storage/pom.xml @@ -93,6 +93,12 @@ hibernate-core test + + org.testcontainers + testcontainers + 1.15.3 + test + diff --git a/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java index c01d40c27..9de72c1e5 100644 --- a/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java +++ b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java @@ -25,20 +25,24 @@ import javax.persistence.Id; import javax.sql.DataSource; +import com.azure.storage.blob.BlobContainerClient; +import internal.org.springframework.content.azure.config.BlobIdResolverConverter; import org.apache.commons.io.IOUtils; import org.hamcrest.Matchers; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; import org.springframework.content.azure.config.EnableAzureStorage; import org.springframework.content.commons.annotations.ContentId; import org.springframework.content.commons.annotations.ContentLength; import org.springframework.content.commons.io.DeletableResource; import org.springframework.content.commons.repository.ContentStore; +import org.springframework.content.commons.utils.PlacementService; +import org.springframework.content.commons.utils.PlacementServiceImpl; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; import org.springframework.core.io.Resource; import org.springframework.core.io.WritableResource; import org.springframework.data.jpa.repository.JpaRepository; @@ -52,7 +56,6 @@ import org.springframework.transaction.PlatformTransactionManager; import com.azure.core.http.rest.PagedIterable; -import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.blob.models.BlobItem; import com.github.paulcwarren.ginkgo4j.Ginkgo4jConfiguration; @@ -76,8 +79,7 @@ public class AzureStorageIT { private TestEntityRepository repo; private TestEntityStore store; - private BlobServiceClientBuilder storage; - private BlobServiceClient client; + private BlobContainerClient client; private String resourceLocation; @@ -91,8 +93,7 @@ public class AzureStorageIT { repo = context.getBean(TestEntityRepository.class); store = context.getBean(TestEntityStore.class); - storage = context.getBean(BlobServiceClientBuilder.class); - client = storage.buildClient(); + client = context.getBean(BlobContainerClient.class); RandomString random = new RandomString(5); resourceLocation = random.nextString(); @@ -115,9 +116,9 @@ public class AzureStorageIT { ((DeletableResource)genericResource).delete(); } - PagedIterable blobs = client.getBlobContainerClient("test").listBlobs(); + PagedIterable blobs = client.listBlobs(); for(BlobItem blob : blobs) { - client.getBlobContainerClient("test").getBlobClient(blob.getName()).delete(); + client.getBlobClient(blob.getName()).delete(); } }); @@ -247,9 +248,9 @@ public class AzureStorageIT { AfterEach(() -> { - PagedIterable blobs = client.getBlobContainerClient("test").listBlobs(); + PagedIterable blobs = client.listBlobs(); for(BlobItem blob : blobs) { - client.getBlobContainerClient("test").getBlobClient(blob.getName()).delete(); + client.getBlobClient(blob.getName()).delete(); } }); @@ -359,18 +360,28 @@ public void test() { @EnableAzureStorage(basePackages="internal.org.springframework.content.azure.it") @Import(InfrastructureConfig.class) public static class TestConfig { + @Bean + public BlobServiceClientBuilder blobServiceClientBuilder() { + return Azurite.getBlobServiceClientBuilder(); + } - @Value("#{environment.AZURE_STORAGE_ENDPOINT}") - private String endpoint; - - @Value("#{environment.AZURE_STORAGE_CONNECTION_STRING}") - private String connString; + @Bean + public BlobContainerClient blobContainerClient(BlobServiceClientBuilder builder) { + BlobContainerClient client = builder.buildClient().getBlobContainerClient("test"); + // No pre-defined containers at start-up, create it on first bean generation + if (!client.exists()) { + client.create(); + } + return client; + } @Bean - public BlobServiceClientBuilder storage() { - return new BlobServiceClientBuilder() - .endpoint(endpoint) - .connectionString(connString); + @Primary + public PlacementService azureStoragePlacementService() { + // Provide default for tests to cover for missing env.AZURE_STORAGE_BUCKET + PlacementService conversion = new PlacementServiceImpl(); + conversion.addConverter(new BlobIdResolverConverter("azure-test-bucket")); + return conversion; } } diff --git a/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/Azurite.java b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/Azurite.java new file mode 100644 index 000000000..db578c776 --- /dev/null +++ b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/Azurite.java @@ -0,0 +1,57 @@ +package internal.org.springframework.content.azure.it; + +import java.io.Serializable; + +import com.azure.storage.blob.BlobServiceClientBuilder; +import org.testcontainers.containers.GenericContainer; + +/** + * This class provides a TestContainers implementation of Azure storage via + * an Azurite docker container. + * + * Please refer to the following for details:- + * http://www.testcontainers.org + * http://github.com/testcontainers/testcontainers-java + * http://github.com/Azure/Azurite + */ + +public class Azurite extends GenericContainer implements Serializable { + + // Will default to latest tag on every test run + private static final String DOCKER_IMAGE_NAME = "mcr.microsoft.com/azure-storage/azurite"; + + // Default config as per Azurite docs + private static final int BLOB_SERVICE_PORT = 10000; + + @SuppressWarnings("HttpUrlsUsage") // Testing only + private static final String ENDPOINT = "http://%s:%d/%s"; + private static final String DEV_ACC_NAME = "devstoreaccount1"; + private static final String PROTOCOL = "DefaultEndpointsProtocol=http"; + private static final String ACC_NAME = "AccountName=" + DEV_ACC_NAME; + private static final String ACC_KEY = + "AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="; + + private Azurite() { + super(DOCKER_IMAGE_NAME); + this.start(); + } + + public static BlobServiceClientBuilder getBlobServiceClientBuilder() { + final String host = Singleton.INSTANCE.getContainerIpAddress(); + final Integer mappedPort = Singleton.INSTANCE.getMappedPort(BLOB_SERVICE_PORT); + final String endpoint = String.format(ENDPOINT, host, mappedPort, DEV_ACC_NAME); + + return new BlobServiceClientBuilder() + .endpoint(endpoint) + .connectionString(String.join(";", PROTOCOL, ACC_NAME, ACC_KEY, "BlobEndpoint=" + endpoint)); + } + + @SuppressWarnings("unused") // Serializable safe singleton usage + protected Azurite readResolve() { + return Singleton.INSTANCE; + } + + private static class Singleton { + private static final Azurite INSTANCE = new Azurite(); + } +} From 03cad857203a276e65794b2e1164bfb8a1334ef4 Mon Sep 17 00:00:00 2001 From: Andy Elliott Date: Sun, 16 May 2021 16:46:23 +0800 Subject: [PATCH 2/4] Add testconteiners for AWS, fix broken multi-tenant test --- spring-content-s3/pom.xml | 6 +++ .../content/s3/config/EnableS3StoresTest.java | 13 +++++ .../content/s3/it/LocalStack.java | 51 +++++++++++++++++++ .../content/s3/it/S3StoreIT.java | 39 +++++++------- 4 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/LocalStack.java diff --git a/spring-content-s3/pom.xml b/spring-content-s3/pom.xml index 0fd05f021..b34d5a6cd 100644 --- a/spring-content-s3/pom.xml +++ b/spring-content-s3/pom.xml @@ -88,6 +88,12 @@ hibernate-core test + + org.testcontainers + localstack + 1.15.3 + test + diff --git a/spring-content-s3/src/test/java/internal/org/springframework/content/s3/config/EnableS3StoresTest.java b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/config/EnableS3StoresTest.java index ecfe77a51..f16d788ca 100644 --- a/spring-content-s3/src/test/java/internal/org/springframework/content/s3/config/EnableS3StoresTest.java +++ b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/config/EnableS3StoresTest.java @@ -14,12 +14,15 @@ import org.springframework.content.commons.annotations.ContentId; import org.springframework.content.commons.repository.AssociativeStore; import org.springframework.content.commons.repository.ContentStore; +import org.springframework.content.commons.utils.PlacementService; +import org.springframework.content.commons.utils.PlacementServiceImpl; import org.springframework.content.s3.S3ObjectIdResolver; import org.springframework.content.s3.config.*; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; import org.springframework.core.convert.converter.ConverterRegistry; import org.springframework.core.io.Resource; @@ -223,6 +226,16 @@ public AmazonS3 getAmazonS3() { } }; } + + @Bean + @Primary + public PlacementService s3StorePlacementService() { + PlacementService conversion = new PlacementServiceImpl(); + conversion.addConverter( + new S3ObjectIdResolverConverter( + new DefaultAssociativeStoreS3ObjectIdResolver(), "aws-test-bucket")); + return conversion; + } } @Configuration diff --git a/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/LocalStack.java b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/LocalStack.java new file mode 100644 index 000000000..5dfecfacd --- /dev/null +++ b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/LocalStack.java @@ -0,0 +1,51 @@ +package internal.org.springframework.content.s3.it; + +import java.io.Serializable; +import java.net.URI; +import java.net.URISyntaxException; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import org.apache.http.client.utils.URIBuilder; +import org.testcontainers.containers.localstack.LocalStackContainer; +import org.testcontainers.utility.DockerImageName; + +public class LocalStack extends LocalStackContainer implements Serializable { + + private static final DockerImageName IMAGE_NAME = DockerImageName.parse("localstack/localstack"); + + private LocalStack() { + super(IMAGE_NAME); + withServices(Service.S3); + start(); + } + + private static class Singleton { + private static final LocalStack INSTANCE = new LocalStack(); + } + + public static AmazonS3 getAmazonS3Client() { + return AmazonS3ClientBuilder + .standard() + .withEndpointConfiguration(Singleton.INSTANCE.getEndpointConfiguration(Service.S3)) + .withCredentials(Singleton.INSTANCE.getDefaultCredentialsProvider()) + .withPathStyleAccessEnabled(true) + .build(); + } + + @Override + public URI getEndpointOverride(EnabledService service) { + try { + // super method converts localhost to 127.0.0.1 which fails on macos + // need to revert it back to whatever getContainerIpAddress() returns + return new URIBuilder(super.getEndpointOverride(service)).setHost(getContainerIpAddress()).build(); + } catch (URISyntaxException e) { + throw new IllegalStateException("Cannot obtain endpoint URL", e); + } + } + + @SuppressWarnings("unused") // Serializable safe singleton usage + protected LocalStack readResolve() { + return Singleton.INSTANCE; + } +} diff --git a/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java index 52e934531..95cb89463 100644 --- a/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java +++ b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java @@ -26,21 +26,24 @@ import javax.persistence.Table; import javax.sql.DataSource; +import internal.org.springframework.content.s3.config.DefaultAssociativeStoreS3ObjectIdResolver; +import internal.org.springframework.content.s3.config.S3ObjectIdResolverConverter; import org.apache.commons.io.IOUtils; import org.hamcrest.Matchers; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.content.commons.annotations.ContentId; import org.springframework.content.commons.annotations.ContentLength; import org.springframework.content.commons.io.DeletableResource; import org.springframework.content.commons.repository.ContentStore; +import org.springframework.content.commons.utils.PlacementService; +import org.springframework.content.commons.utils.PlacementServiceImpl; import org.springframework.content.s3.config.EnableS3Stores; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.core.env.Environment; +import org.springframework.context.annotation.Primary; import org.springframework.core.io.Resource; import org.springframework.core.io.WritableResource; import org.springframework.data.jpa.repository.JpaRepository; @@ -53,12 +56,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; -import com.amazonaws.auth.AWSCredentials; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.regions.Region; -import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.github.paulcwarren.ginkgo4j.Ginkgo4jConfiguration; import com.github.paulcwarren.ginkgo4j.Ginkgo4jRunner; @@ -80,6 +78,7 @@ public class S3StoreIT { private TestEntityRepository repo; private TestEntityStore store; + private AmazonS3 client; private String resourceLocation; @@ -93,6 +92,9 @@ public class S3StoreIT { repo = context.getBean(TestEntityRepository.class); store = context.getBean(TestEntityStore.class); + client = context.getBean(AmazonS3.class); + + client.createBucket("aws-test-bucket"); RandomString random = new RandomString(5); resourceLocation = random.nextString(); @@ -343,24 +345,19 @@ public void test() { @EnableS3Stores(basePackages="internal.org.springframework.content.s3.it") @Import(InfrastructureConfig.class) public static class TestConfig { - - @Autowired - private Environment env; - - public Region region() { - return Region.getRegion(Regions.fromName(System.getenv("AWS_REGION"))); - } - @Bean - public BasicAWSCredentials basicAWSCredentials() { - return new BasicAWSCredentials(env.getProperty("AWS_ACCESS_KEY_ID"), env.getProperty("AWS_SECRET_KEY")); + public AmazonS3 client() { + return LocalStack.getAmazonS3Client(); } @Bean - public AmazonS3 client(AWSCredentials awsCredentials) { - AmazonS3Client amazonS3Client = new AmazonS3Client(awsCredentials); - amazonS3Client.setRegion(region()); - return amazonS3Client; + @Primary + public PlacementService s3StorePlacementService() { + PlacementService conversion = new PlacementServiceImpl(); + conversion.addConverter( + new S3ObjectIdResolverConverter( + new DefaultAssociativeStoreS3ObjectIdResolver(), "aws-test-bucket")); + return conversion; } } From 5f0415459536f463d7baf73edb7f4e80e75cb8b6 Mon Sep 17 00:00:00 2001 From: Andy Elliott Date: Wed, 19 May 2021 08:28:53 +0800 Subject: [PATCH 3/4] Testcontainers for remaining JPA/REST impls + mongo --- .github/workflows/maven.yml | 46 ------------- pom.xml | 7 ++ .../azure/config/EnableAzureStorageTest.java | 12 +--- .../content/azure/it/AzureStorageIT.java | 23 +++---- spring-content-jpa/pom.xml | 20 +++++- .../springframework/content/jpa/StoreIT.java | 68 +++++-------------- .../container-license-acceptance.txt | 1 + spring-content-mongo/pom.xml | 6 ++ .../content/mongo/it/MongoStoreIT.java | 10 +-- .../content/mongo/it/MongoTestContainer.java | 39 +++++++++++ spring-content-rest/pom.xml | 26 ++++++- .../rest/it/cachecontrol/CacheControlIT.java | 16 ++--- .../PreferResourceForPutsAndPostsIT.java | 20 ++---- .../content/rest/it/h2/Application.java | 18 ++--- .../content/rest/it/hsql/Application.java | 16 ++--- .../http_405/MethodNotAllowedExceptionIT.java | 16 ++--- .../content/rest/it/mysql/Application.java | 30 +++----- .../content/rest/it/oracle/Application.java | 16 ++--- .../content/rest/it/pg/Application.java | 30 +++----- .../rest/it/sqlserver/Application.java | 36 +++------- .../rest/storeresolver/Application.java | 14 ++-- .../LockingAndVersioningRestIT.java | 12 +--- .../mongostorage/MongoTestContainer.java | 38 +++++++++++ .../container-license-acceptance.txt | 1 + .../content/s3/it/S3StoreIT.java | 21 ++---- spring-content-solr/pom.xml | 6 ++ .../content/solr/SolrTestContainer.java | 45 ++++++++++++ 27 files changed, 305 insertions(+), 288 deletions(-) create mode 100644 spring-content-jpa/src/test/resources/container-license-acceptance.txt create mode 100644 spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoTestContainer.java create mode 100644 spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/MongoTestContainer.java create mode 100644 spring-content-rest/src/test/resources/container-license-acceptance.txt create mode 100644 spring-content-solr/src/test/java/org/springframework/content/solr/SolrTestContainer.java diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 64a5dbd14..e3b59690d 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -15,28 +15,6 @@ jobs: runs-on: ubuntu-latest services: - sqlserver: - image: exoplatform/sqlserver:2017-CU8 - env: - SA_PASSWORD: 5F4Dt9ky9dU$ - SQLSERVER_DATABASE: sc - SQLSERVER_USER: user - SQLSERVER_PASSWORD: 5F4Dt9ky9dU$ - ports: - - 1433:1433 - postgres: - image: postgres:12.1 - env: - POSTGRES_PASSWORD: 5F4Dt9ky9dU$ - ports: - - 5432:5432 - mysql: - image: mysql:8.0.19 - env: - MYSQL_ROOT_PASSWORD: 5F4Dt9ky9dU$ - MYSQL_DATABASE: sc - ports: - - 3306:3306 elasticsearch: image: paulcwarren/elasticsearch:7.6.2 env: @@ -48,12 +26,6 @@ jobs: image: paulcwarren/solr ports: - 8983:8983 - mongo: - image: mongo:3.6.12 - env: - MONGO_INITDB_DATABASE: spring-content - ports: - - 27017:27017 steps: - uses: actions/checkout@v2 @@ -74,28 +46,10 @@ jobs: mvn -B -P tests -Dmaven.javadoc.skip=true install jacoco:report --file pom.xml bash <(curl -s https://codecov.io/bash) env: - SQLSERVER_USERNAME: "sa" - SQLSERVER_PASSWORD: "5F4Dt9ky9dU$" - SQLSERVER_DB_NAME: "sc" - SQLSERVER_HOST: "localhost" - POSTGRESQL_USERNAME: "postgres" - POSTGRESQL_PASSWORD: "5F4Dt9ky9dU$" - POSTGRESQL_URL: "jdbc:postgresql://localhost:5432/postgres?sslmode=disable" - MYSQL_USERNAME: "root" - MYSQL_PASSWORD: "5F4Dt9ky9dU$" - MYSQL_URL: "jdbc:mysql://localhost:3306/sc?emulateLocators=true&serverTimezone=UTC" - MONGODB_URL: "mongodb://localhost:27017/spring-content?retryWrites=false" SOLR_USER: "solr" SOLR_PASSWORD: "SolrRocks" - AWS_ACCESS_KEY_ID: ${{secrets.AWS_ACCESS_KEY_ID}} - AWS_BUCKET: ${{secrets.AWS_BUCKET}} - AWS_REGION: ${{secrets.AWS_REGION}} - AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}} GCP_STORAGE_BUCKET: ${{secrets.GCP_STORAGE_BUCKET}} GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }} - AZURE_STORAGE_BUCKET: ${{ secrets.AZURE_STORAGE_BUCKET }} - AZURE_STORAGE_ENDPOINT: ${{ secrets.AZURE_STORAGE_ENDPOINT }} - AZURE_STORAGE_CONNECTION_STRING: ${{ secrets.AZURE_STORAGE_CONNECTION_STRING }} - name: Publish JARs run: | diff --git a/pom.xml b/pom.xml index 144425c52..0a441683d 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,8 @@ Integrates with Spring Data, Spring Data REST and Apache Solr UTF-8 UTF-8 ../target/generated-docs/refs/${env.BUILD_TYPE}/ + + 1.15.3 @@ -79,6 +81,11 @@ Integrates with Spring Data, Spring Data REST and Apache Solr pom import + + org.testcontainers + testcontainers + ${test-containers.version} + diff --git a/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/config/EnableAzureStorageTest.java b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/config/EnableAzureStorageTest.java index 5d194f9c2..dee115b78 100644 --- a/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/config/EnableAzureStorageTest.java +++ b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/config/EnableAzureStorageTest.java @@ -39,11 +39,10 @@ @RunWith(Ginkgo4jRunner.class) public class EnableAzureStorageTest { - private static BlobServiceClientBuilder builder = Azurite.getBlobServiceClientBuilder(); - private static BlobContainerClient client = null; + private static final BlobServiceClientBuilder builder = Azurite.getBlobServiceClientBuilder(); + private static final BlobContainerClient client = builder.buildClient().getBlobContainerClient("test"); static { - client = builder.buildClient().getBlobContainerClient("test"); if (!client.exists()) { client.create(); } @@ -55,7 +54,6 @@ public class EnableAzureStorageTest { // mocks static AzureStorageConfigurer configurer; - static BlobServiceClientBuilder storage; { Describe("EnableAzureStorage", () -> { @@ -171,16 +169,10 @@ public interface TestEntityStore extends AssociativeStore { @Configuration public static class InfrastructureConfig { - @Bean public BlobServiceClientBuilder builder() { return builder; } - - @Bean - public BlobContainerClient blobContainerClient() { - return client; - } } @Data diff --git a/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java index c93caf3b1..7a3f855fa 100644 --- a/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java +++ b/spring-content-azure-storage/src/test/java/internal/org/springframework/content/azure/it/AzureStorageIT.java @@ -25,7 +25,6 @@ import javax.persistence.Id; import javax.sql.DataSource; -import com.azure.storage.blob.BlobContainerClient; import org.apache.commons.io.IOUtils; import org.hamcrest.Matchers; import org.junit.Test; @@ -52,6 +51,7 @@ import org.springframework.transaction.PlatformTransactionManager; import com.azure.core.http.rest.PagedIterable; +import com.azure.storage.blob.BlobContainerClient; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.blob.models.BlobItem; import com.github.paulcwarren.ginkgo4j.Ginkgo4jConfiguration; @@ -66,7 +66,14 @@ @Ginkgo4jConfiguration(threads=1) public class AzureStorageIT { + private static final BlobServiceClientBuilder builder = Azurite.getBlobServiceClientBuilder(); + private static final BlobContainerClient client = builder.buildClient().getBlobContainerClient("test"); + static { + if (!client.exists()) { + client.create(); + } + System.setProperty("spring.content.azure.bucket", "azure-test-bucket"); } @@ -79,7 +86,6 @@ public class AzureStorageIT { private TestEntityRepository repo; private TestEntityStore store; - private BlobContainerClient client; private String resourceLocation; @@ -93,7 +99,6 @@ public class AzureStorageIT { repo = context.getBean(TestEntityRepository.class); store = context.getBean(TestEntityStore.class); - client = context.getBean(BlobContainerClient.class); RandomString random = new RandomString(5); resourceLocation = random.nextString(); @@ -362,17 +367,7 @@ public void test() { public static class TestConfig { @Bean public BlobServiceClientBuilder blobServiceClientBuilder() { - return Azurite.getBlobServiceClientBuilder(); - } - - @Bean - public BlobContainerClient blobContainerClient(BlobServiceClientBuilder builder) { - BlobContainerClient client = builder.buildClient().getBlobContainerClient("test"); - // No pre-defined containers at start-up, create it on first bean generation - if (!client.exists()) { - client.create(); - } - return client; + return builder; } } diff --git a/spring-content-jpa/pom.xml b/spring-content-jpa/pom.xml index a72727f00..4132aec61 100644 --- a/spring-content-jpa/pom.xml +++ b/spring-content-jpa/pom.xml @@ -88,7 +88,25 @@ org.testcontainers oracle-xe - 1.15.3 + ${test-containers.version} + test + + + org.testcontainers + mysql + ${test-containers.version} + test + + + org.testcontainers + postgresql + ${test-containers.version} + test + + + org.testcontainers + mssqlserver + ${test-containers.version} test diff --git a/spring-content-jpa/src/test/java/internal/org/springframework/content/jpa/StoreIT.java b/spring-content-jpa/src/test/java/internal/org/springframework/content/jpa/StoreIT.java index 7723563fb..1706aab15 100644 --- a/spring-content-jpa/src/test/java/internal/org/springframework/content/jpa/StoreIT.java +++ b/spring-content-jpa/src/test/java/internal/org/springframework/content/jpa/StoreIT.java @@ -347,30 +347,18 @@ DataSourceInitializer datasourceInitializer(DataSource dataSource) { return initializer; } - - @Value("#{environment.MYSQL_URL}") - private String url; - @Value("#{environment.MYSQL_USERNAME}") - private String username; - @Value("#{environment.MYSQL_PASSWORD}") - private String password; @Bean public DataSource dataSource() { - Assert.notNull(url, "url not set"); - Assert.notNull(username, "username not set"); - Assert.notNull(password, "password not set"); - DriverManagerDataSource ds = new DriverManagerDataSource(); - ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); - ds.setUrl(url); - ds.setUsername(username); - ds.setPassword(password); + ds.setUrl("jdbc:tc:mysql:5.7.34:///databasename?TC_TMPFS=/testtmpfs:rw&TC_DAEMON=true&emulateLocators=true"); + ds.setUsername("test"); + ds.setPassword("test"); return ds; } @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setDatabase(Database.MYSQL); vendorAdapter.setGenerateDdl(true); @@ -378,7 +366,7 @@ public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan(getClass().getPackage().getName()); - factory.setDataSource(dataSource()); + factory.setDataSource(dataSource); factory.setJpaVendorAdapter(vendorAdapter); HashMap properties = new HashMap<>(); @@ -389,9 +377,11 @@ public LocalContainerEntityManagerFactoryBean entityManagerFactory() { } @Bean - public PlatformTransactionManager transactionManager() { + public PlatformTransactionManager transactionManager( + LocalContainerEntityManagerFactoryBean entityManagerFactory) { + JpaTransactionManager txManager = new JpaTransactionManager(); - txManager.setEntityManagerFactory(entityManagerFactory().getObject()); + txManager.setEntityManagerFactory(entityManagerFactory.getObject()); return txManager; } } @@ -420,22 +410,14 @@ DataSourceInitializer datasourceInitializer(DataSource dataSource) { return initializer; } - - @Value("#{environment.POSTGRESQL_URL}") - private String url; - @Value("#{environment.POSTGRESQL_USERNAME}") - private String username; - @Value("#{environment.POSTGRESQL_PASSWORD}") - private String password; @Bean public DataSource dataSource() { DriverManagerDataSource ds = new DriverManagerDataSource(); - ds.setDriverClassName("org.postgresql.Driver"); - ds.setUrl(url); - ds.setUsername(username); - ds.setPassword(password); - return ds; + ds.setUrl("jdbc:tc:postgresql:12:///databasename?TC_TMPFS=/testtmpfs:rw&TC_DAEMON=true"); + ds.setUsername("test"); + ds.setPassword("test"); + return ds; } @Bean @@ -484,28 +466,14 @@ DataSourceInitializer datasourceInitializer(DataSource dataSource) { return initializer; } - - @Value("#{environment.SQLSERVER_HOST}") - private String sqlServerHost; - - @Value("#{environment.SQLSERVER_DB_NAME}") - private String sqlServerDbName; - - @Value("#{environment.SQLSERVER_USERNAME}") - private String username; - - @Value("#{environment.SQLSERVER_PASSWORD}") - private String password; @Bean public DataSource dataSource() { - DriverManagerDataSource ds = new DriverManagerDataSource(); - ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); - String connectionString = String.format("jdbc:sqlserver://%s;databaseName=%s", sqlServerHost, sqlServerDbName); - ds.setUrl(connectionString); - ds.setUsername(username); - ds.setPassword(password); - return ds; + DriverManagerDataSource ds = new DriverManagerDataSource(); + ds.setUrl("jdbc:tc:sqlserver:///databasename?TC_TMPFS=/testtmpfs:rw&TC_DAEMON=true"); + ds.setUsername("SA"); + ds.setPassword("A_Str0ng_Required_Password"); + return ds; } @Bean diff --git a/spring-content-jpa/src/test/resources/container-license-acceptance.txt b/spring-content-jpa/src/test/resources/container-license-acceptance.txt new file mode 100644 index 000000000..8a704b9c0 --- /dev/null +++ b/spring-content-jpa/src/test/resources/container-license-acceptance.txt @@ -0,0 +1 @@ +mcr.microsoft.com/mssql/server:2017-CU12 diff --git a/spring-content-mongo/pom.xml b/spring-content-mongo/pom.xml index 6dd53cc54..907aa6ebd 100644 --- a/spring-content-mongo/pom.xml +++ b/spring-content-mongo/pom.xml @@ -66,5 +66,11 @@ mongodb-driver-sync test + + org.testcontainers + mongodb + ${test-containers.version} + test + diff --git a/spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoStoreIT.java b/spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoStoreIT.java index 9a301cfba..b42e74168 100644 --- a/spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoStoreIT.java +++ b/spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoStoreIT.java @@ -23,7 +23,6 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; import org.springframework.content.commons.annotations.ContentId; import org.springframework.content.commons.annotations.ContentLength; import org.springframework.content.commons.io.DeletableResource; @@ -47,7 +46,6 @@ import com.github.paulcwarren.ginkgo4j.Ginkgo4jRunner; import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoClients; import com.mongodb.client.gridfs.model.GridFSFile; import internal.org.springframework.content.mongo.store.DefaultMongoStoreImpl; @@ -340,19 +338,15 @@ public static class TestConfig { @Configuration public static class InfrastructureConfig extends AbstractMongoClientConfiguration { - - @Value("#{environment.MONGODB_URL}") - private String mongoDbUrl = "mongodb://localhost:27017"; - @Override protected String getDatabaseName() { - return "spring-content"; + return MongoTestContainer.getTestDbName(); } @Override @Bean public MongoClient mongoClient() { - return MongoClients.create(mongoDbUrl); + return MongoTestContainer.getMongoClient(); } @Bean diff --git a/spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoTestContainer.java b/spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoTestContainer.java new file mode 100644 index 000000000..a65a39beb --- /dev/null +++ b/spring-content-mongo/src/test/java/internal/org/springframework/content/mongo/it/MongoTestContainer.java @@ -0,0 +1,39 @@ +package internal.org.springframework.content.mongo.it; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.shaded.org.apache.commons.lang.StringUtils; + +public class MongoTestContainer extends MongoDBContainer { + + private static final String DOCKER_IMAGE_NAME = "mongo"; + + private MongoTestContainer() { + super(DOCKER_IMAGE_NAME); + start(); + } + + // Strip the db name from the end of the replicaSetUrl + public static String getTestDbName() { + return StringUtils.substringAfterLast(Singleton.INSTANCE.getReplicaSetUrl(), "/"); + + } + + public static String getTestDbUrl() { + return StringUtils.substringBeforeLast(Singleton.INSTANCE.getReplicaSetUrl(), "/"); + } + + public static MongoClient getMongoClient() { + return MongoClients.create(getTestDbUrl()); + } + + @SuppressWarnings("unused") // Serializable safe singleton usage + protected MongoTestContainer readResolve() { + return Singleton.INSTANCE; + } + + private static class Singleton { + private static final MongoTestContainer INSTANCE = new MongoTestContainer(); + } +} diff --git a/spring-content-rest/pom.xml b/spring-content-rest/pom.xml index bc1b5766d..20788fdc3 100644 --- a/spring-content-rest/pom.xml +++ b/spring-content-rest/pom.xml @@ -239,7 +239,31 @@ org.testcontainers oracle-xe - 1.15.3 + ${test-containers.version} + test + + + org.testcontainers + mysql + ${test-containers.version} + test + + + org.testcontainers + postgresql + ${test-containers.version} + test + + + org.testcontainers + mssqlserver + ${test-containers.version} + test + + + org.testcontainers + mongodb + ${test-containers.version} test diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/cachecontrol/CacheControlIT.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/cachecontrol/CacheControlIT.java index 583cec51c..ceda2bd18 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/cachecontrol/CacheControlIT.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/cachecontrol/CacheControlIT.java @@ -19,6 +19,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.web.server.LocalServerPort; @@ -29,10 +32,7 @@ import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -121,12 +121,10 @@ public interface CacheControlRepository extends CrudRepository private interface CacheControlStore extends FilesystemContentStore { } - @SpringBootApplication - @ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration" - }) + @SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public static class Application { diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/config/PreferResourceForPutsAndPostsIT.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/config/PreferResourceForPutsAndPostsIT.java index 31ede762f..7efc0758f 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/config/PreferResourceForPutsAndPostsIT.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/config/PreferResourceForPutsAndPostsIT.java @@ -8,7 +8,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.hamcrest.MockitoHamcrest.argThat; -import java.lang.reflect.Method; import java.util.UUID; import javax.sql.DataSource; @@ -19,24 +18,22 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.content.rest.config.ContentRestConfigurer; import org.springframework.content.rest.config.RestConfiguration; -import org.springframework.content.rest.config.RestConfiguration.Resolver; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.repository.CrudRepository; -import org.springframework.http.HttpHeaders; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.jdbc.datasource.init.DataSourceInitializer; @@ -46,7 +43,6 @@ import org.springframework.orm.jpa.vendor.Database; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.util.Assert; import com.github.paulcwarren.ginkgo4j.Ginkgo4jConfiguration; import com.github.paulcwarren.ginkgo4j.Ginkgo4jSpringRunner; @@ -109,12 +105,10 @@ public interface PreferResourceForPutsAndPostsRepository extends CrudRepository< private interface PreferResourceForPutsAndPostsStore extends MockContentStore { } - @SpringBootApplication - @ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration" - }) + @SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public static class Application { diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/h2/Application.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/h2/Application.java index 33d60a2da..f63f860f5 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/h2/Application.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/h2/Application.java @@ -7,13 +7,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.content.jpa.config.EnableJpaStores; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -25,18 +25,14 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.Database; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication -@ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration" - }) +@SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public class Application { diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/hsql/Application.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/hsql/Application.java index fa7e65e68..3709d716f 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/hsql/Application.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/hsql/Application.java @@ -7,13 +7,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.content.jpa.config.EnableJpaStores; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -29,12 +29,10 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication -@ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration", - }) +@SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public class Application { diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/http_405/MethodNotAllowedExceptionIT.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/http_405/MethodNotAllowedExceptionIT.java index 80263437c..b757eead0 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/http_405/MethodNotAllowedExceptionIT.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/http_405/MethodNotAllowedExceptionIT.java @@ -22,6 +22,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.web.server.LocalServerPort; @@ -34,9 +37,6 @@ import org.springframework.content.rest.RestResource; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; @@ -174,12 +174,10 @@ public static class TEntity { } - @SpringBootApplication - @ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration" - }) + @SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public static class Application { diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/mysql/Application.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/mysql/Application.java index 5c42e7109..06cda1964 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/mysql/Application.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/mysql/Application.java @@ -7,13 +7,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.content.jpa.config.EnableJpaStores; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -27,12 +27,10 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication -@ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration", - }) +@SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public class Application { @@ -67,21 +65,13 @@ DataSourceInitializer datasourceInitializer(DataSource dataSource) { return initializer; } - - @Value("#{environment.MYSQL_URL}") - private String url; - @Value("#{environment.MYSQL_USERNAME}") - private String username; - @Value("#{environment.MYSQL_PASSWORD}") - private String password; @Bean public DataSource dataSource() { DriverManagerDataSource ds = new DriverManagerDataSource(); - ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); - ds.setUrl(url); - ds.setUsername(username); - ds.setPassword(password); + ds.setUrl("jdbc:tc:mysql:5.7.34:///databasename?TC_TMPFS=/testtmpfs:rw&TC_DAEMON=true&emulateLocators=true"); + ds.setUsername("test"); + ds.setPassword("test"); return ds; } diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/oracle/Application.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/oracle/Application.java index ff236c6ed..653e3ff3a 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/oracle/Application.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/oracle/Application.java @@ -7,13 +7,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.content.jpa.config.EnableJpaStores; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -27,12 +27,10 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication -@ComponentScan(excludeFilters = { - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration", - }) +@SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public class Application { diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/pg/Application.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/pg/Application.java index 7ee4cbfcb..65c9e8354 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/pg/Application.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/pg/Application.java @@ -7,13 +7,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.content.jpa.config.EnableJpaStores; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -27,12 +27,10 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication -@ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration", - }) +@SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public class Application { @@ -67,21 +65,13 @@ DataSourceInitializer datasourceInitializer(DataSource dataSource) { return initializer; } - - @Value("#{environment.POSTGRESQL_URL}") - private String url; - @Value("#{environment.POSTGRESQL_USERNAME}") - private String username; - @Value("#{environment.POSTGRESQL_PASSWORD}") - private String password; @Bean public DataSource dataSource() { DriverManagerDataSource ds = new DriverManagerDataSource(); - ds.setDriverClassName("org.postgresql.Driver"); - ds.setUrl(url); - ds.setUsername(username); - ds.setPassword(password); + ds.setUrl("jdbc:tc:postgresql:12:///databasename?TC_TMPFS=/testtmpfs:rw&TC_DAEMON=true"); + ds.setUsername("test"); + ds.setPassword("test"); return ds; } diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/sqlserver/Application.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/sqlserver/Application.java index 2ed671512..60003dd44 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/sqlserver/Application.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/it/sqlserver/Application.java @@ -7,13 +7,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.content.jpa.config.EnableJpaStores; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -27,12 +27,10 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -@SpringBootApplication -@ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration", - }) +@SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public class Application { @@ -67,27 +65,13 @@ DataSourceInitializer datasourceInitializer(DataSource dataSource) { return initializer; } - - @Value("#{environment.SQLSERVER_HOST}") - private String sqlServerHost; - - @Value("#{environment.SQLSERVER_DB_NAME}") - private String sqlServerDbName; - - @Value("#{environment.SQLSERVER_USERNAME}") - private String username; - - @Value("#{environment.SQLSERVER_PASSWORD}") - private String password; @Bean public DataSource dataSource() { DriverManagerDataSource ds = new DriverManagerDataSource(); - ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); - String connectionString = String.format("jdbc:sqlserver://%s;databaseName=%s", sqlServerHost, sqlServerDbName); - ds.setUrl(connectionString); - ds.setUsername(username); - ds.setPassword(password); + ds.setUrl("jdbc:tc:sqlserver:///databasename?TC_TMPFS=/testtmpfs:rw&TC_DAEMON=true"); + ds.setUsername("SA"); + ds.setPassword("A_Str0ng_Required_Password"); return ds; } diff --git a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/storeresolver/Application.java b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/storeresolver/Application.java index dbbaf0cf5..890a5ebed 100644 --- a/spring-content-rest/src/test/java/internal/org/springframework/content/rest/storeresolver/Application.java +++ b/spring-content-rest/src/test/java/internal/org/springframework/content/rest/storeresolver/Application.java @@ -5,6 +5,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.content.commons.annotations.ContentId; import org.springframework.content.commons.annotations.ContentLength; import org.springframework.content.commons.annotations.MimeType; @@ -18,7 +21,6 @@ import org.springframework.content.rest.config.ContentRestConfigurer; import org.springframework.content.rest.config.RestConfiguration; import org.springframework.context.annotation.*; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.core.io.ClassPathResource; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -41,12 +43,10 @@ import java.nio.file.Files; -@SpringBootApplication -@ComponentScan(excludeFilters={ - @Filter(type = FilterType.REGEX, - pattern = { - ".*MongoConfiguration" - }) +@SpringBootApplication(exclude = { + MongoAutoConfiguration.class, + MongoDataAutoConfiguration.class, + MongoRepositoriesAutoConfiguration.class }) public class Application { diff --git a/spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/LockingAndVersioningRestIT.java b/spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/LockingAndVersioningRestIT.java index befae5bcf..66bb687c1 100644 --- a/spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/LockingAndVersioningRestIT.java +++ b/spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/LockingAndVersioningRestIT.java @@ -86,7 +86,6 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoClients; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -101,9 +100,6 @@ public class LockingAndVersioningRestIT { @Autowired private VersionedDocumentAndVersioningRepository repo; - @Autowired - private VersionedDocumentStore store; - @LocalServerPort int port; @@ -221,19 +217,15 @@ public static void main(String[] args) { @Configuration public class VersioningConfig extends AbstractMongoClientConfiguration { - - @Value("#{environment.MONGODB_URL}") - private String mongoDbUrl = "mongodb://localhost:27017"; - @Override protected String getDatabaseName() { - return "spring-content"; + return MongoTestContainer.getTestDbName(); } @Override @Bean public MongoClient mongoClient() { - return MongoClients.create(mongoDbUrl); + return MongoTestContainer.getMongoClient(); } @Bean diff --git a/spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/MongoTestContainer.java b/spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/MongoTestContainer.java new file mode 100644 index 000000000..ff1c8f041 --- /dev/null +++ b/spring-content-rest/src/test/java/it/rest/jpaversioning/mongostorage/MongoTestContainer.java @@ -0,0 +1,38 @@ +package it.rest.jpaversioning.mongostorage; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.shaded.org.apache.commons.lang.StringUtils; + +public class MongoTestContainer extends MongoDBContainer { + + private static final String DOCKER_IMAGE_NAME = "mongo"; + + private MongoTestContainer() { + super(DOCKER_IMAGE_NAME); + start(); + } + + public static String getTestDbName() { + return StringUtils.substringAfterLast(Singleton.INSTANCE.getReplicaSetUrl(), "/"); + + } + + public static String getTestDbUrl() { + return StringUtils.substringBeforeLast(Singleton.INSTANCE.getReplicaSetUrl(), "/"); + } + + public static MongoClient getMongoClient() { + return MongoClients.create(getTestDbUrl()); + } + + @SuppressWarnings("unused") // Serializable safe singleton usage + protected MongoTestContainer readResolve() { + return Singleton.INSTANCE; + } + + private static class Singleton { + private static final MongoTestContainer INSTANCE = new MongoTestContainer(); + } +} diff --git a/spring-content-rest/src/test/resources/container-license-acceptance.txt b/spring-content-rest/src/test/resources/container-license-acceptance.txt new file mode 100644 index 000000000..8a704b9c0 --- /dev/null +++ b/spring-content-rest/src/test/resources/container-license-acceptance.txt @@ -0,0 +1 @@ +mcr.microsoft.com/mssql/server:2017-CU12 diff --git a/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java index 95cb89463..4b151aead 100644 --- a/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java +++ b/spring-content-s3/src/test/java/internal/org/springframework/content/s3/it/S3StoreIT.java @@ -26,8 +26,6 @@ import javax.persistence.Table; import javax.sql.DataSource; -import internal.org.springframework.content.s3.config.DefaultAssociativeStoreS3ObjectIdResolver; -import internal.org.springframework.content.s3.config.S3ObjectIdResolverConverter; import org.apache.commons.io.IOUtils; import org.hamcrest.Matchers; import org.junit.Test; @@ -36,14 +34,11 @@ import org.springframework.content.commons.annotations.ContentLength; import org.springframework.content.commons.io.DeletableResource; import org.springframework.content.commons.repository.ContentStore; -import org.springframework.content.commons.utils.PlacementService; -import org.springframework.content.commons.utils.PlacementServiceImpl; import org.springframework.content.s3.config.EnableS3Stores; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; import org.springframework.core.io.Resource; import org.springframework.core.io.WritableResource; import org.springframework.data.jpa.repository.JpaRepository; @@ -69,6 +64,12 @@ @Ginkgo4jConfiguration(threads=1) public class S3StoreIT { + private static final String BUCKET = "aws-test-bucket"; + + static { + System.setProperty("spring.content.s3.bucket", BUCKET); + } + private TestEntity entity; private Resource genericResource; @@ -349,16 +350,6 @@ public static class TestConfig { public AmazonS3 client() { return LocalStack.getAmazonS3Client(); } - - @Bean - @Primary - public PlacementService s3StorePlacementService() { - PlacementService conversion = new PlacementServiceImpl(); - conversion.addConverter( - new S3ObjectIdResolverConverter( - new DefaultAssociativeStoreS3ObjectIdResolver(), "aws-test-bucket")); - return conversion; - } } @Configuration diff --git a/spring-content-solr/pom.xml b/spring-content-solr/pom.xml index 1dc0d2e8c..9afaf7697 100644 --- a/spring-content-solr/pom.xml +++ b/spring-content-solr/pom.xml @@ -100,6 +100,12 @@ 1.2.4-SNAPSHOT test + + org.testcontainers + solr + ${test-containers.version} + test + diff --git a/spring-content-solr/src/test/java/org/springframework/content/solr/SolrTestContainer.java b/spring-content-solr/src/test/java/org/springframework/content/solr/SolrTestContainer.java new file mode 100644 index 000000000..80697f2b3 --- /dev/null +++ b/spring-content-solr/src/test/java/org/springframework/content/solr/SolrTestContainer.java @@ -0,0 +1,45 @@ +package org.springframework.content.solr; + +import java.io.IOException; + +import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.impl.HttpSolrClient; +import org.testcontainers.containers.SolrContainer; +import org.testcontainers.utility.DockerImageName; + +public class SolrTestContainer extends SolrContainer { + + private static final String CONNECTION_URL = "http://%s:%d/solr"; + private static final DockerImageName IMAGE_NAME = DockerImageName.parse("solr").withTag("8.3.0"); + + private SolrTestContainer() { + super(IMAGE_NAME); + start(); + // can use exec in container command here to set things up, e.g. +// try { +// execInContainer("solr -c create test"); +// execInContainer("solr command 2"); +// execInContainer("solr command 3"); +// } catch (IOException | InterruptedException e) { +// throw new RuntimeException("Failed to setup solr container", e); +// } + } + + public static SolrClient getSolrClient() { + String solrUrl = String.format( + CONNECTION_URL, + Singleton.INSTANCE.getContainerIpAddress(), + Singleton.INSTANCE.getMappedPort(SolrContainer.SOLR_PORT)); + + return new HttpSolrClient.Builder(solrUrl).build(); + } + + @SuppressWarnings("unused") // Serializable safe singleton usage + protected SolrTestContainer readResolve() { + return Singleton.INSTANCE; + } + + private static class Singleton { + private static final SolrTestContainer INSTANCE = new SolrTestContainer(); + } +} From 52db9dd2e986416fab65e61d362b87dde8037686 Mon Sep 17 00:00:00 2001 From: Andy Elliott Date: Wed, 19 May 2021 08:46:37 +0800 Subject: [PATCH 4/4] Removing ENV vars for TC migration --- .github/workflows/prs.yml | 81 +-------------------------------------- 1 file changed, 1 insertion(+), 80 deletions(-) diff --git a/.github/workflows/prs.yml b/.github/workflows/prs.yml index 96a299260..56d85d321 100644 --- a/.github/workflows/prs.yml +++ b/.github/workflows/prs.yml @@ -11,28 +11,6 @@ jobs: runs-on: ubuntu-latest services: - sqlserver: - image: exoplatform/sqlserver:2017-CU8 - env: - SA_PASSWORD: 5F4Dt9ky9dU$ - SQLSERVER_DATABASE: sc - SQLSERVER_USER: user - SQLSERVER_PASSWORD: 5F4Dt9ky9dU$ - ports: - - 1433:1433 - postgres: - image: postgres:12.1 - env: - POSTGRES_PASSWORD: 5F4Dt9ky9dU$ - ports: - - 5432:5432 - mysql: - image: mysql:8.0.19 - env: - MYSQL_ROOT_PASSWORD: 5F4Dt9ky9dU$ - MYSQL_DATABASE: sc - ports: - - 3306:3306 elasticsearch: image: paulcwarren/elasticsearch:7.6.2 env: @@ -43,13 +21,7 @@ jobs: solr: image: paulcwarren/solr ports: - - 8983:8983 - mongo: - image: mongo:3.6.12 - env: - MONGO_INITDB_DATABASE: spring-content - ports: - - 27017:27017 + - 8983:8983 steps: - uses: google-github-actions/setup-gcloud@master @@ -85,28 +57,10 @@ jobs: mvn -B -P tests -Dmaven.javadoc.skip=true install --file pom.xml popd env: - SQLSERVER_USERNAME: "sa" - SQLSERVER_PASSWORD: "5F4Dt9ky9dU$" - SQLSERVER_DB_NAME: "sc" - SQLSERVER_HOST: "localhost" - POSTGRESQL_USERNAME: "postgres" - POSTGRESQL_PASSWORD: "5F4Dt9ky9dU$" - POSTGRESQL_URL: "jdbc:postgresql://localhost:5432/postgres?sslmode=disable" - MYSQL_USERNAME: "root" - MYSQL_PASSWORD: "5F4Dt9ky9dU$" - MYSQL_URL: "jdbc:mysql://localhost:3306/sc?emulateLocators=true&serverTimezone=UTC" - MONGODB_URL: "mongodb://localhost:27017/spring-content?retryWrites=false" SOLR_USER: "solr" SOLR_PASSWORD: "SolrRocks" - AWS_ACCESS_KEY_ID: ${{secrets.AWS_ACCESS_KEY_ID}} - AWS_BUCKET: ${{secrets.AWS_BUCKET}} - AWS_REGION: ${{secrets.AWS_REGION}} - AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}} GCP_STORAGE_BUCKET: ${{secrets.GCP_STORAGE_BUCKET}} GOOGLE_APPLICATION_CREDENTIALS: ${{env.GOOGLE_APPLICATION_CREDENTIALS}} - AZURE_STORAGE_BUCKET: ${{ secrets.AZURE_STORAGE_BUCKET }} - AZURE_STORAGE_ENDPOINT: ${{ secrets.AZURE_STORAGE_ENDPOINT }} - AZURE_STORAGE_CONNECTION_STRING: ${{ secrets.AZURE_STORAGE_CONNECTION_STRING }} - name: Validate examples run: | @@ -114,28 +68,10 @@ jobs: mvn -B clean install popd env: - SQLSERVER_USERNAME: "sa" - SQLSERVER_PASSWORD: "5F4Dt9ky9dU$" - SQLSERVER_DB_NAME: "sc" - SQLSERVER_HOST: "localhost" - POSTGRESQL_USERNAME: "postgres" - POSTGRESQL_PASSWORD: "5F4Dt9ky9dU$" - POSTGRESQL_URL: "jdbc:postgresql://localhost:5432/postgres?sslmode=disable" - MYSQL_USERNAME: "root" - MYSQL_PASSWORD: "5F4Dt9ky9dU$" - MYSQL_URL: "jdbc:mysql://localhost:3306/sc?emulateLocators=true&serverTimezone=UTC" - MONGODB_URL: "mongodb://localhost:27017/spring-content?retryWrites=false" SOLR_USER: "solr" SOLR_PASSWORD: "SolrRocks" - AWS_ACCESS_KEY_ID: ${{secrets.AWS_ACCESS_KEY_ID}} - AWS_BUCKET: ${{secrets.AWS_BUCKET}} - AWS_REGION: ${{secrets.AWS_REGION}} - AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}} GCP_STORAGE_BUCKET: ${{secrets.GCP_STORAGE_BUCKET}} GOOGLE_APPLICATION_CREDENTIALS: ${{env.GOOGLE_APPLICATION_CREDENTIALS}} - AZURE_STORAGE_BUCKET: ${{ secrets.AZURE_STORAGE_BUCKET }} - AZURE_STORAGE_ENDPOINT: ${{ secrets.AZURE_STORAGE_ENDPOINT }} - AZURE_STORAGE_CONNECTION_STRING: ${{ secrets.AZURE_STORAGE_CONNECTION_STRING }} - name: Validate gettingstarteds run: | @@ -143,20 +79,5 @@ jobs: mvn -B clean install popd env: - SQLSERVER_USERNAME: "sa" - SQLSERVER_PASSWORD: "5F4Dt9ky9dU$" - SQLSERVER_DB_NAME: "sc" - SQLSERVER_HOST: "localhost" - POSTGRESQL_USERNAME: "postgres" - POSTGRESQL_PASSWORD: "5F4Dt9ky9dU$" - POSTGRESQL_URL: "jdbc:postgresql://localhost:5432/postgres?sslmode=disable" - MYSQL_USERNAME: "root" - MYSQL_PASSWORD: "5F4Dt9ky9dU$" - MYSQL_URL: "jdbc:mysql://localhost:3306/sc?emulateLocators=true&serverTimezone=UTC" - MONGODB_URL: "mongodb://localhost:27017/spring-content?retryWrites=false" SOLR_USER: "solr" SOLR_PASSWORD: "SolrRocks" - AWS_ACCESS_KEY_ID: ${{secrets.AWS_ACCESS_KEY_ID}} - AWS_BUCKET: ${{secrets.AWS_BUCKET}} - AWS_REGION: ${{secrets.AWS_REGION}} - AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}} \ No newline at end of file