From 4637a9c901c942a8efdafa6a7df6c8e66a909553 Mon Sep 17 00:00:00 2001 From: ndr_brt Date: Mon, 17 Feb 2025 10:55:09 +0100 Subject: [PATCH] build(test): use testcontainers for postgresql tests --- .github/workflows/verify.yaml | 9 -- .../PostgresqlEndToEndExtension.java | 95 ++++++++++++++++ .../PostgresqlEndToEndInstance.java | 49 --------- .../testfixtures/PostgresqlLocalInstance.java | 62 ----------- .../PostgresqlStoreSetupExtension.java | 93 +++++++--------- ...qlEndpointDataReferenceEntryIndexTest.java | 4 +- .../e2e/ClusteredDataPlaneEndToEndTest.java | 6 +- .../e2e-transfer-test/runner/build.gradle.kts | 1 + .../org/eclipse/edc/test/e2e/Runtimes.java | 10 +- .../test/e2e/TransferEndToEndParticipant.java | 16 --- .../test/e2e/TransferPullEndToEndTest.java | 22 ++-- .../test/e2e/TransferPushEndToEndTest.java | 21 ++-- .../e2e/TransferStreamingEndToEndTest.java | 22 ++-- .../managementapi/AssetApiEndToEndTest.java | 12 ++- .../AuthConfigurationApiEndToEndTest.java | 2 +- .../managementapi/CatalogApiEndToEndTest.java | 12 ++- .../ContractAgreementApiEndToEndTest.java | 12 ++- .../ContractDefinitionApiEndToEndTest.java | 11 +- .../ContractNegotiationApiEndToEndTest.java | 15 ++- .../DataPlaneSelectorApiEndToEndTest.java | 12 ++- .../ManagementEndToEndExtension.java | 102 ++++++++---------- .../ManagementEndToEndTestContext.java | 16 ++- .../PolicyDefinitionApiEndToEndTest.java | 17 ++- .../e2e/managementapi/SerdeEndToEndTest.java | 2 +- .../TransferProcessApiEndToEndTest.java | 12 ++- .../test/e2e/sts/api/StsApiEndToEndTest.java | 66 +++++------- 26 files changed, 358 insertions(+), 343 deletions(-) create mode 100644 extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndExtension.java delete mode 100644 extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndInstance.java delete mode 100644 extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlLocalInstance.java diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml index 49e5e652af7..9eaf11c542e 100644 --- a/.github/workflows/verify.yaml +++ b/.github/workflows/verify.yaml @@ -47,15 +47,6 @@ jobs: Postgresql-Integration-Tests: runs-on: ubuntu-latest - - services: - postgres: - image: postgres:14.2 - ports: - - 5432:5432 - env: - POSTGRES_PASSWORD: password - steps: - uses: actions/checkout@v4 - uses: eclipse-edc/.github/.github/actions/setup-build@main diff --git a/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndExtension.java b/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndExtension.java new file mode 100644 index 00000000000..105638e65e0 --- /dev/null +++ b/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndExtension.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2025 Cofinity-X + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Cofinity-X - initial API and implementation + * + */ + +package org.eclipse.edc.sql.testfixtures; + +import org.eclipse.edc.spi.system.configuration.Config; +import org.eclipse.edc.spi.system.configuration.ConfigFactory; +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.testcontainers.containers.PostgreSQLContainer; + +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Map; + +import static java.lang.String.format; +import static org.testcontainers.containers.PostgreSQLContainer.POSTGRESQL_PORT; + +/** + * Extension to be used in end-to-end tests with Postgresql persistence + */ +public class PostgresqlEndToEndExtension implements BeforeAllCallback, AfterAllCallback { + + private static final String DEFAULT_IMAGE = "postgres:17.3"; + + private final PostgreSQLContainer postgres; + + public PostgresqlEndToEndExtension() { + this(DEFAULT_IMAGE); + } + + public PostgresqlEndToEndExtension(String dockerImageName) { + postgres = new PostgreSQLContainer<>(dockerImageName); + } + + @Override + public void beforeAll(ExtensionContext context) { + postgres.start(); + } + + @Override + public void afterAll(ExtensionContext context) { + postgres.stop(); + postgres.close(); + } + + /** + * Return config suitable for EDC runtime for default database. + * + * @return the config. + */ + public Config config() { + return configFor(postgres.getDatabaseName()); + } + + /** + * Return config suitable for EDC runtime giving the database name. + * + * @param databaseName the database name; + * @return the config. + */ + public Config configFor(String databaseName) { + var settings = Map.of( + "edc.datasource.default.url", "jdbc:postgresql://%s:%d/%s" + .formatted(postgres.getHost(), postgres.getMappedPort(POSTGRESQL_PORT), databaseName), + "edc.datasource.default.user", postgres.getUsername(), + "edc.datasource.default.password", postgres.getPassword(), + "edc.sql.schema.autocreate", "true" + ); + + return ConfigFactory.fromMap(settings); + } + + public void createDatabase(String name) { + var jdbcUrl = postgres.getJdbcUrl() + postgres.getDatabaseName(); + try (var connection = DriverManager.getConnection(jdbcUrl, postgres.getUsername(), postgres.getPassword())) { + connection.createStatement().execute(format("create database %s;", name)); + } catch (SQLException e) { + // database could already exist + } + } + +} diff --git a/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndInstance.java b/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndInstance.java deleted file mode 100644 index d4deaf9dc73..00000000000 --- a/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlEndToEndInstance.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation - * - */ - -package org.eclipse.edc.sql.testfixtures; - -import org.eclipse.edc.spi.persistence.EdcPersistenceException; - -import java.util.HashMap; -import java.util.Map; - -public interface PostgresqlEndToEndInstance { - - String USER = "postgres"; - String PASSWORD = "password"; - String JDBC_URL_PREFIX = "jdbc:postgresql://localhost:5432/"; - - static void createDatabase(String participantName) { - try { - Class.forName("org.postgresql.Driver"); - } catch (ClassNotFoundException e) { - throw new EdcPersistenceException(e); - } - - var postgres = new PostgresqlLocalInstance(USER, PASSWORD, JDBC_URL_PREFIX); - postgres.createDatabase(participantName); - } - - static Map defaultDatasourceConfiguration(String name) { - return new HashMap<>() { - { - put("edc.datasource.default.url", JDBC_URL_PREFIX + name); - put("edc.datasource.default.user", USER); - put("edc.datasource.default.password", PASSWORD); - } - }; - } - -} diff --git a/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlLocalInstance.java b/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlLocalInstance.java deleted file mode 100644 index 4406a5c633c..00000000000 --- a/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlLocalInstance.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2022 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation - * - */ - -package org.eclipse.edc.sql.testfixtures; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; - -import static java.lang.String.format; - -public final class PostgresqlLocalInstance { - private final String jdbcUrlPrefix; - private final String username; - private final String password; - - public PostgresqlLocalInstance(String username, String password, String jdbcUrlPrefix) { - this.username = username; - this.password = password; - this.jdbcUrlPrefix = jdbcUrlPrefix; - } - - public void createDatabase(String name) { - try (var connection = getConnection("postgres")) { - connection.createStatement().execute(format("create database %s;", name)); - } catch (SQLException e) { - // database could already exist - } - } - - public Connection getConnection(String databaseName) { - try { - return DriverManager.getConnection(jdbcUrlPrefix + databaseName, username, password); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public Map createDefaultDatasourceConfiguration(String databaseName) { - return new HashMap<>() { - { - put("edc.datasource.default.url", jdbcUrlPrefix + databaseName); - put("edc.datasource.default.user", username); - put("edc.datasource.default.password", password); - } - }; - } - -} diff --git a/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlStoreSetupExtension.java b/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlStoreSetupExtension.java index d03e923d0d4..e7c0f81784b 100644 --- a/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlStoreSetupExtension.java +++ b/extensions/common/sql/sql-test-fixtures/src/testFixtures/java/org/eclipse/edc/sql/testfixtures/PostgresqlStoreSetupExtension.java @@ -14,8 +14,6 @@ package org.eclipse.edc.sql.testfixtures; -import org.eclipse.edc.spi.system.configuration.Config; -import org.eclipse.edc.spi.system.configuration.ConfigFactory; import org.eclipse.edc.sql.DriverManagerConnectionFactory; import org.eclipse.edc.sql.QueryExecutor; import org.eclipse.edc.sql.SqlQueryExecutor; @@ -36,90 +34,58 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.List; -import java.util.Map; import java.util.Properties; import java.util.UUID; -import static java.lang.String.format; -import static org.eclipse.edc.util.io.Ports.getFreePort; - /** - * Extension for running PG SQL store implementation. It automatically creates a test database and provided all the base data structure - * for a SQL store to run such as {@link DataSourceRegistry}, {@link TransactionContext} and data source name which is automatically generated + * Extension for running PostgreSQL store implementation tests. It starts a database container and provides all the base + * data structure for a SQL store to run such as {@link DataSourceRegistry}, {@link TransactionContext} and data source + * name which is automatically generated. */ public class PostgresqlStoreSetupExtension implements BeforeEachCallback, BeforeAllCallback, AfterAllCallback, ParameterResolver { - public static final String POSTGRES_IMAGE_NAME = "postgres:16.1"; - private final PostgreSQLContainer postgreSqlContainer = new PostgreSQLContainer<>(POSTGRES_IMAGE_NAME) - .withExposedPorts(5432) - .withUsername("postgres") - .withPassword("password") - .withDatabaseName("itest"); - private final PostgresqlLocalInstance postgres; + private static final String DEFAULT_IMAGE = "postgres:17.3"; + + private final PostgreSQLContainer postgres; private final QueryExecutor queryExecutor = new SqlQueryExecutor(); private final TransactionContext transactionContext = new NoopTransactionContext(); private final DataSourceRegistry dataSourceRegistry = new DefaultDataSourceRegistry(); private final String datasourceName = UUID.randomUUID().toString(); - private final String jdbcUrlPrefix; public PostgresqlStoreSetupExtension() { - var exposedPort = getFreePort(); - postgreSqlContainer.setPortBindings(List.of("%s:5432".formatted(exposedPort))); - jdbcUrlPrefix = format("jdbc:postgresql://%s:%s/", postgreSqlContainer.getHost(), exposedPort); - postgres = new PostgresqlLocalInstance(postgreSqlContainer.getUsername(), postgreSqlContainer.getPassword(), jdbcUrlPrefix); - } - - public String getDatasourceName() { - return datasourceName; + this(DEFAULT_IMAGE); } - public Connection getConnection() { - try { - return dataSourceRegistry.resolve(datasourceName).getConnection(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public int runQuery(String query) { - return transactionContext.execute(() -> queryExecutor.execute(getConnection(), query)); - } - - public TransactionContext getTransactionContext() { - return transactionContext; - } - - public DataSourceRegistry getDataSourceRegistry() { - return dataSourceRegistry; + public PostgresqlStoreSetupExtension(String dockerImageName) { + postgres = new PostgreSQLContainer<>(dockerImageName); } @Override public void beforeAll(ExtensionContext context) { - postgreSqlContainer.start(); - postgres.createDatabase(postgreSqlContainer.getDatabaseName()); + postgres.start(); } @Override public void beforeEach(ExtensionContext context) { var properties = new Properties(); - properties.put("user", postgreSqlContainer.getUsername()); - properties.put("password", postgreSqlContainer.getPassword()); + properties.put("user", postgres.getUsername()); + properties.put("password", postgres.getPassword()); var connectionFactory = new DriverManagerConnectionFactory(); - var jdbcUrl = jdbcUrlPrefix + postgreSqlContainer.getDatabaseName(); + var jdbcUrl = postgres.getJdbcUrl() + postgres.getDatabaseName(); var dataSource = new ConnectionFactoryDataSource(connectionFactory, jdbcUrl, properties); dataSourceRegistry.register(datasourceName, dataSource); } @Override public void afterAll(ExtensionContext context) { - postgreSqlContainer.stop(); - postgreSqlContainer.close(); + postgres.stop(); + postgres.close(); } @Override public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { var type = parameterContext.getParameter().getParameterizedType(); - return List.of(PostgresqlStoreSetupExtension.class, Connection.class, QueryExecutor.class, PostgresqlLocalInstance.class).contains(type); + return List.of(PostgresqlStoreSetupExtension.class, Connection.class, QueryExecutor.class).contains(type); } @Override @@ -131,17 +97,32 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte return getConnection(); } else if (type.equals(QueryExecutor.class)) { return queryExecutor; - } else if (type.equals(PostgresqlLocalInstance.class)) { - return postgres; } return null; } - public Config getDatasourceConfig() { - return ConfigFactory.fromMap(getDatasourceConfiguration()); + public String getDatasourceName() { + return datasourceName; + } + + public Connection getConnection() { + try { + return dataSourceRegistry.resolve(datasourceName).getConnection(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public int runQuery(String query) { + return transactionContext.execute(() -> queryExecutor.execute(getConnection(), query)); } - public Map getDatasourceConfiguration() { - return postgres.createDefaultDatasourceConfiguration(postgreSqlContainer.getDatabaseName()); + public TransactionContext getTransactionContext() { + return transactionContext; } + + public DataSourceRegistry getDataSourceRegistry() { + return dataSourceRegistry; + } + } diff --git a/extensions/common/store/sql/edr-index-sql/src/test/java/org/eclipse/edc/edr/store/index/sql/SqlEndpointDataReferenceEntryIndexTest.java b/extensions/common/store/sql/edr-index-sql/src/test/java/org/eclipse/edc/edr/store/index/sql/SqlEndpointDataReferenceEntryIndexTest.java index 7e6e3383d79..6d36235cd83 100644 --- a/extensions/common/store/sql/edr-index-sql/src/test/java/org/eclipse/edc/edr/store/index/sql/SqlEndpointDataReferenceEntryIndexTest.java +++ b/extensions/common/store/sql/edr-index-sql/src/test/java/org/eclipse/edc/edr/store/index/sql/SqlEndpointDataReferenceEntryIndexTest.java @@ -28,8 +28,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; -import java.io.IOException; - @ComponentTest @ExtendWith(PostgresqlStoreSetupExtension.class) public class SqlEndpointDataReferenceEntryIndexTest extends EndpointDataReferenceEntryIndexTestBase { @@ -39,7 +37,7 @@ public class SqlEndpointDataReferenceEntryIndexTest extends EndpointDataReferenc private SqlEndpointDataReferenceEntryIndex entryIndex; @BeforeEach - void setUp(PostgresqlStoreSetupExtension extension, QueryExecutor queryExecutor) throws IOException { + void setUp(PostgresqlStoreSetupExtension extension, QueryExecutor queryExecutor) { entryIndex = new SqlEndpointDataReferenceEntryIndex(extension.getDataSourceRegistry(), extension.getDatasourceName(), extension.getTransactionContext(), new ObjectMapper(), statements, queryExecutor); diff --git a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/ClusteredDataPlaneEndToEndTest.java b/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/ClusteredDataPlaneEndToEndTest.java index a7e09756e71..38432486eee 100644 --- a/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/ClusteredDataPlaneEndToEndTest.java +++ b/system-tests/e2e-dataplane-tests/tests/src/test/java/org/eclipse/edc/test/e2e/ClusteredDataPlaneEndToEndTest.java @@ -25,7 +25,7 @@ import org.eclipse.edc.spi.types.domain.transfer.DataFlowStartMessage; import org.eclipse.edc.spi.types.domain.transfer.FlowType; import org.eclipse.edc.spi.types.domain.transfer.TransferType; -import org.eclipse.edc.sql.testfixtures.PostgresqlStoreSetupExtension; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.eclipse.edc.test.e2e.participant.DataPlaneParticipant; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Order; @@ -52,7 +52,7 @@ public class ClusteredDataPlaneEndToEndTest { @RegisterExtension @Order(0) - private static final PostgresqlStoreSetupExtension POSTGRESQL = new PostgresqlStoreSetupExtension(); + private static final PostgresqlEndToEndExtension POSTGRESQL = new PostgresqlEndToEndExtension(); @RegisterExtension @Order(1) @@ -74,7 +74,7 @@ public class ClusteredDataPlaneEndToEndTest { ":system-tests:e2e-dataplane-tests:runtimes:data-plane", ":dist:bom:dataplane-feature-sql-bom") .configurationProvider(dataPlaneParticipant::dataPlaneConfig) - .configurationProvider(POSTGRESQL::getDatasourceConfig) + .configurationProvider(POSTGRESQL::config) .configurationProvider(dummyControlPlane.dataPlaneConfigurationSupplier()) .configurationProvider(() -> ConfigFactory.fromMap(Map.of( "edc.runtime.id", name, diff --git a/system-tests/e2e-transfer-test/runner/build.gradle.kts b/system-tests/e2e-transfer-test/runner/build.gradle.kts index c45073c8cd8..12ea36f2075 100644 --- a/system-tests/e2e-transfer-test/runner/build.gradle.kts +++ b/system-tests/e2e-transfer-test/runner/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { testImplementation(libs.kafkaClients) testImplementation(libs.testcontainers.junit) testImplementation(libs.testcontainers.kafka) + testImplementation(libs.testcontainers.postgres) testCompileOnly(project(":system-tests:e2e-transfer-test:control-plane")) testCompileOnly(project(":system-tests:e2e-transfer-test:data-plane")) diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/Runtimes.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/Runtimes.java index 6804717310b..644acc4e8d9 100644 --- a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/Runtimes.java +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/Runtimes.java @@ -43,18 +43,12 @@ public enum Runtimes { POSTGRES_CONTROL_PLANE( ":system-tests:e2e-transfer-test:control-plane", - ":extensions:common:store:sql:edr-index-sql", - ":extensions:common:sql:sql-pool:sql-pool-apache-commons", - ":extensions:common:transaction:transaction-local", - ":extensions:control-plane:store:sql:control-plane-sql", - ":extensions:data-plane:data-plane-signaling:data-plane-signaling-client" + ":dist:bom:controlplane-feature-sql-bom" ), POSTGRES_DATA_PLANE( ":system-tests:e2e-transfer-test:data-plane", - ":extensions:data-plane:store:sql:data-plane-store-sql", - ":extensions:common:sql:sql-pool:sql-pool-apache-commons", - ":extensions:common:transaction:transaction-local", + ":dist:bom:dataplane-feature-sql-bom", ":extensions:data-plane-selector:data-plane-selector-client" ); diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java index d805f34de8b..691fb35e90e 100644 --- a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferEndToEndParticipant.java @@ -33,7 +33,6 @@ import static java.io.File.separator; import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.boot.BootServicesExtension.PARTICIPANT_ID; -import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.defaultDatasourceConfiguration; import static org.eclipse.edc.util.io.Ports.getFreePort; public class TransferEndToEndParticipant extends Participant { @@ -106,14 +105,6 @@ public Config dataPlaneConfig() { return ConfigFactory.fromMap(settings); } - public Config controlPlanePostgresConfig() { - return controlPlaneConfig().merge(postgresConfig()); - } - - public Config dataPlanePostgresConfig() { - return dataPlaneConfig().merge(postgresConfig()); - } - public Config controlPlaneEmbeddedDataPlaneConfig() { return controlPlaneConfig().merge(dataPlaneConfig()); } @@ -173,13 +164,6 @@ private String resourceAbsolutePath(String filename) { return System.getProperty("user.dir") + separator + "build" + separator + "resources" + separator + "test" + separator + filename; } - private Config postgresConfig() { - var settings = new HashMap(); - settings.put("edc.sql.schema.autocreate", "true"); - settings.putAll(defaultDatasourceConfiguration(getName())); - return ConfigFactory.fromMap(settings); - } - public static class Builder extends Participant.Builder { protected Builder() { diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java index 25ecf16b1cf..e0dcc511749 100644 --- a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPullEndToEndTest.java @@ -34,6 +34,7 @@ import org.eclipse.edc.spi.event.EventEnvelope; import org.eclipse.edc.spi.security.Vault; import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -71,7 +72,6 @@ import static org.eclipse.edc.http.client.testfixtures.HttpTestUtils.testHttpClient; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; -import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; import static org.eclipse.edc.util.io.Ports.getFreePort; import static org.mockserver.integration.ClientAndServer.startClientAndServer; import static org.mockserver.model.HttpRequest.request; @@ -451,7 +451,6 @@ protected Vault getDataplaneVault() { @EndToEndTest class InMemoryV2024Rev1 extends Tests { - @RegisterExtension static final RuntimeExtension CONSUMER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.IN_MEMORY_CONTROL_PLANE.create("consumer-control-plane") @@ -513,29 +512,36 @@ protected Vault getDataplaneVault() { @PostgresqlIntegrationTest class Postgres extends Tests { - @Order(0) // must be the first extension to be evaluated since it creates the database + @Order(0) + @RegisterExtension + static final PostgresqlEndToEndExtension POSTGRESQL_EXTENSION = new PostgresqlEndToEndExtension(); + + @Order(1) @RegisterExtension static final BeforeAllCallback CREATE_DATABASES = context -> { - createDatabase(CONSUMER.getName()); - createDatabase(PROVIDER.getName()); + POSTGRESQL_EXTENSION.createDatabase(CONSUMER.getName()); + POSTGRESQL_EXTENSION.createDatabase(PROVIDER.getName()); }; @RegisterExtension static final RuntimeExtension CONSUMER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_CONTROL_PLANE.create("consumer-control-plane") - .configurationProvider(CONSUMER::controlPlanePostgresConfig) + .configurationProvider(CONSUMER::controlPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(CONSUMER.getName())) ); @RegisterExtension static final RuntimeExtension PROVIDER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_CONTROL_PLANE.create("provider-control-plane") - .configurationProvider(PROVIDER::controlPlanePostgresConfig) + .configurationProvider(PROVIDER::controlPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(PROVIDER.getName())) ); @RegisterExtension static final RuntimeExtension PROVIDER_DATA_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_DATA_PLANE.create("provider-data-plane") - .configurationProvider(PROVIDER::dataPlanePostgresConfig) + .configurationProvider(PROVIDER::dataPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(PROVIDER.getName())) ); @Override diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPushEndToEndTest.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPushEndToEndTest.java index e88bf768715..723e95c936a 100644 --- a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPushEndToEndTest.java +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferPushEndToEndTest.java @@ -20,6 +20,7 @@ import org.eclipse.edc.junit.extensions.RuntimeExtension; import org.eclipse.edc.junit.extensions.RuntimePerClassExtension; import org.eclipse.edc.spi.security.Vault; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; @@ -39,7 +40,6 @@ import static org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcessStates.COMPLETED; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; -import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; import static org.eclipse.edc.util.io.Ports.getFreePort; import static org.mockserver.integration.ClientAndServer.startClientAndServer; import static org.mockserver.model.JsonBody.json; @@ -180,29 +180,36 @@ protected Vault getDataplaneVault() { @PostgresqlIntegrationTest class Postgres extends Tests { - @Order(0) // must be the first extension to be evaluated since it creates the database + @Order(0) + @RegisterExtension + static final PostgresqlEndToEndExtension POSTGRESQL_EXTENSION = new PostgresqlEndToEndExtension(); + + @Order(1) @RegisterExtension static final BeforeAllCallback CREATE_DATABASES = context -> { - createDatabase(CONSUMER.getName()); - createDatabase(PROVIDER.getName()); + POSTGRESQL_EXTENSION.createDatabase(CONSUMER.getName()); + POSTGRESQL_EXTENSION.createDatabase(PROVIDER.getName()); }; @RegisterExtension static final RuntimeExtension CONSUMER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_CONTROL_PLANE.create("consumer-control-plane") - .configurationProvider(CONSUMER::controlPlanePostgresConfig) + .configurationProvider(CONSUMER::controlPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(CONSUMER.getName())) ); @RegisterExtension static final RuntimeExtension PROVIDER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_CONTROL_PLANE.create("provider-control-plane") - .configurationProvider(PROVIDER::controlPlanePostgresConfig) + .configurationProvider(PROVIDER::controlPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(PROVIDER.getName())) ); @RegisterExtension static final RuntimeExtension PROVIDER_DATA_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_DATA_PLANE.create("provider-data-plane") - .configurationProvider(PROVIDER::dataPlanePostgresConfig) + .configurationProvider(PROVIDER::dataPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(PROVIDER.getName())) ); @Override diff --git a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferStreamingEndToEndTest.java b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferStreamingEndToEndTest.java index d88134570e7..05ee455d1f3 100644 --- a/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferStreamingEndToEndTest.java +++ b/system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/edc/test/e2e/TransferStreamingEndToEndTest.java @@ -25,6 +25,7 @@ import org.eclipse.edc.junit.extensions.RuntimeExtension; import org.eclipse.edc.junit.extensions.RuntimePerClassExtension; import org.eclipse.edc.spi.security.Vault; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Order; @@ -52,7 +53,6 @@ import static org.eclipse.edc.connector.controlplane.transfer.spi.types.TransferProcessStates.TERMINATED; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; -import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; import static org.eclipse.edc.util.io.Ports.getFreePort; import static org.mockserver.integration.ClientAndServer.startClientAndServer; import static org.mockserver.model.HttpRequest.request; @@ -110,28 +110,36 @@ class Postgres extends Tests { @Order(1) @RegisterExtension + static final PostgresqlEndToEndExtension POSTGRESQL_EXTENSION = new PostgresqlEndToEndExtension(); + + @Order(2) + @RegisterExtension static final BeforeAllCallback CREATE_DATABASES = context -> { - createDatabase(CONSUMER.getName()); - createDatabase(PROVIDER.getName()); + POSTGRESQL_EXTENSION.createDatabase(CONSUMER.getName()); + POSTGRESQL_EXTENSION.createDatabase(PROVIDER.getName()); }; + @RegisterExtension static final RuntimeExtension CONSUMER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_CONTROL_PLANE.create("consumer-control-plane") - .configurationProvider(CONSUMER::controlPlanePostgresConfig) + .configurationProvider(CONSUMER::controlPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(CONSUMER.getName())) ); @RegisterExtension static final RuntimeExtension PROVIDER_CONTROL_PLANE = new RuntimePerClassExtension( Runtimes.POSTGRES_CONTROL_PLANE.create("provider-control-plane") - .configurationProvider(PROVIDER::controlPlanePostgresConfig) + .configurationProvider(PROVIDER::controlPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(PROVIDER.getName())) ); private static final EmbeddedRuntime PROVIDER_DATA_PLANE_RUNTIME = Runtimes.POSTGRES_DATA_PLANE.create("provider-data-plane") - .configurationProvider(PROVIDER::dataPlanePostgresConfig); + .configurationProvider(PROVIDER::dataPlaneConfig) + .configurationProvider(() -> POSTGRESQL_EXTENSION.configFor(PROVIDER.getName())); @RegisterExtension - static final RuntimeExtension PROVIDER_DATA_PLANE = new RuntimePerClassExtension(PROVIDER_DATA_PLANE_RUNTIME); + static final RuntimeExtension PROVIDER_DATA_PLANE = new RuntimePerClassExtension(PROVIDER_DATA_PLANE_RUNTIME); @Override protected Vault getDataplaneVault() { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java index 4e492b92560..abc2ca1330b 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java @@ -22,9 +22,12 @@ import org.eclipse.edc.junit.annotations.EndToEndTest; import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.UUID; @@ -412,8 +415,15 @@ class InMemory extends Tests { @Nested @PostgresqlIntegrationTest - @ExtendWith(ManagementEndToEndExtension.Postgres.class) class Postgres extends Tests { + + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AuthConfigurationApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AuthConfigurationApiEndToEndTest.java index 9c3bcb04a1b..97c3e59d65d 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AuthConfigurationApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AuthConfigurationApiEndToEndTest.java @@ -94,7 +94,7 @@ private static ManagementEndToEndTestContext context() { ":extensions:common:auth:auth-tokenbased" ); - return new ManagementEndToEndTestContext(runtime, managementPort, protocolPort); + return new ManagementEndToEndTestContext(runtime); } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java index 70bbc3f7e47..a9b431e1887 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java @@ -27,9 +27,12 @@ import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.spi.query.Criterion; import org.eclipse.edc.spi.types.domain.DataAddress; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.Base64; import java.util.List; @@ -227,8 +230,15 @@ class InMemory extends Tests { @Nested @PostgresqlIntegrationTest - @ExtendWith(ManagementEndToEndExtension.Postgres.class) class Postgres extends Tests { + + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java index d5c0504ba9f..e3132639d9d 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java @@ -22,9 +22,12 @@ import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.List; import java.util.Set; @@ -154,7 +157,14 @@ class InMemory extends Tests { @Nested @PostgresqlIntegrationTest - @ExtendWith(ManagementEndToEndExtension.Postgres.class) class Postgres extends Tests { + + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java index 4123a5ea700..72b93e2549b 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java @@ -21,9 +21,12 @@ import org.eclipse.edc.connector.controlplane.contract.spi.types.offer.ContractDefinition; import org.eclipse.edc.junit.annotations.EndToEndTest; import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.UUID; @@ -224,9 +227,15 @@ class InMemory extends Tests { @Nested @PostgresqlIntegrationTest - @ExtendWith(ManagementEndToEndExtension.Postgres.class) class Postgres extends Tests { + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java index 56a5a6a239a..d383bf6e1d8 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java @@ -26,9 +26,12 @@ import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.List; import java.util.Map; @@ -245,8 +248,16 @@ private JsonObject createPolicy() { class InMemory extends Tests { } @Nested - @ExtendWith(ManagementEndToEndExtension.Postgres.class) @PostgresqlIntegrationTest - class Postgres extends Tests { } + class Postgres extends Tests { + + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + + } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/DataPlaneSelectorApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/DataPlaneSelectorApiEndToEndTest.java index 4db8aa98a32..dca9d111819 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/DataPlaneSelectorApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/DataPlaneSelectorApiEndToEndTest.java @@ -19,9 +19,12 @@ import org.eclipse.edc.connector.dataplane.selector.spi.store.DataPlaneInstanceStore; import org.eclipse.edc.junit.annotations.EndToEndTest; import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.greaterThan; @@ -36,8 +39,15 @@ class InMemory extends Tests { @Nested @PostgresqlIntegrationTest - @ExtendWith(ManagementEndToEndExtension.Postgres.class) class Postgres extends Tests { + + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + } private abstract static class Tests { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndExtension.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndExtension.java index 7fef971b22e..ea739198963 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndExtension.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndExtension.java @@ -18,16 +18,15 @@ import org.eclipse.edc.junit.extensions.RuntimePerClassExtension; import org.eclipse.edc.spi.system.configuration.Config; import org.eclipse.edc.spi.system.configuration.ConfigFactory; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolutionException; -import java.util.Map; +import java.util.HashMap; import java.util.function.Supplier; -import static java.util.Map.entry; -import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; import static org.eclipse.edc.util.io.Ports.getFreePort; public abstract class ManagementEndToEndExtension extends RuntimePerClassExtension { @@ -57,75 +56,60 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte return super.resolveParameter(parameterContext, extensionContext); } + public ManagementEndToEndExtension withConfig(Supplier configSupplier) { + context.runtime().configurationProvider(configSupplier); + return this; + } + static class InMemory extends ManagementEndToEndExtension { protected InMemory() { - super(context(ConfigFactory::empty)); - } - - protected InMemory(Supplier configProvider) { - super(context(configProvider)); - } - - public static InMemory withConfig(Supplier configProvider) { - return new InMemory(configProvider); + super(new ManagementEndToEndTestContext(runtime())); } - private static ManagementEndToEndTestContext context(Supplier config) { - var managementPort = getFreePort(); - var protocolPort = getFreePort(); - - var runtime = new EmbeddedRuntime("control-plane", - ":system-tests:management-api:management-api-test-runtime") - .configurationProvider(() -> ConfigFactory.fromMap(Map.of( - "web.http.protocol.path", "/protocol", - "web.http.protocol.port", String.valueOf(protocolPort), - "edc.dsp.callback.address", "http://localhost:" + protocolPort + "/protocol", - "web.http.management.path", "/management", - "web.http.management.port", String.valueOf(managementPort) - ))) - .configurationProvider(config); - - return new ManagementEndToEndTestContext(runtime, managementPort, protocolPort); + private static @NotNull EmbeddedRuntime runtime() { + return new EmbeddedRuntime("control-plane", ":system-tests:management-api:management-api-test-runtime") + .configurationProvider(ManagementEndToEndExtension::runtimeConfig); } - } static class Postgres extends ManagementEndToEndExtension { - protected Postgres() { - super(context()); + protected Postgres(PostgresqlEndToEndExtension postgres) { + super(new ManagementEndToEndTestContext(runtime().configurationProvider(postgres::config))); } - private static ManagementEndToEndTestContext context() { - var managementPort = getFreePort(); - var protocolPort = getFreePort(); - - var runtime = new EmbeddedRuntime("control-plane", + private static EmbeddedRuntime runtime() { + return new EmbeddedRuntime("control-plane", ":system-tests:management-api:management-api-test-runtime", - ":dist:bom:controlplane-feature-sql-bom") - .configurationProvider(() -> ConfigFactory.fromMap(Map.ofEntries( - entry("web.http.path", "/"), - entry("web.http.port", String.valueOf(getFreePort())), - entry("web.http.protocol.path", "/protocol"), - entry("web.http.protocol.port", String.valueOf(protocolPort)), - entry("web.http.control.port", String.valueOf(getFreePort())), - entry("edc.dsp.callback.address", "http://localhost:" + protocolPort + "/protocol"), - entry("web.http.management.path", "/management"), - entry("web.http.management.port", String.valueOf(managementPort)), - entry("edc.datasource.default.url", PostgresqlEndToEndInstance.JDBC_URL_PREFIX + "runtime"), - entry("edc.datasource.default.user", PostgresqlEndToEndInstance.USER), - entry("edc.datasource.default.password", PostgresqlEndToEndInstance.PASSWORD), - entry("edc.sql.schema.autocreate", "true") - ))); - - return new ManagementEndToEndTestContext(runtime, managementPort, protocolPort); + ":extensions:control-plane:store:sql:control-plane-sql", + ":extensions:policy-monitor:store:sql:policy-monitor-store-sql", + ":extensions:common:store:sql:edr-index-sql", + ":extensions:data-plane:store:sql:data-plane-store-sql", + ":extensions:common:sql:sql-pool:sql-pool-apache-commons", + ":extensions:common:transaction:transaction-local") + .configurationProvider(ManagementEndToEndExtension::runtimeConfig); } - @Override - public void beforeAll(ExtensionContext extensionContext) { - createDatabase("runtime"); - super.beforeAll(extensionContext); - } + } + + static Config runtimeConfig() { + var managementPort = getFreePort(); + var protocolPort = getFreePort(); + + var settings = new HashMap() { + { + put("web.http.path", "/"); + put("web.http.port", String.valueOf(getFreePort())); + put("web.http.protocol.path", "/protocol"); + put("web.http.protocol.port", String.valueOf(protocolPort)); + put("web.http.control.port", String.valueOf(getFreePort())); + put("edc.dsp.callback.address", "http://localhost:" + protocolPort + "/protocol"); + put("web.http.management.path", "/management"); + put("web.http.management.port", String.valueOf(managementPort)); + } + }; + + return ConfigFactory.fromMap(settings); } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndTestContext.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndTestContext.java index a3447daeb97..0b41dfcd268 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndTestContext.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ManagementEndToEndTestContext.java @@ -20,6 +20,7 @@ import jakarta.json.JsonValue; import org.eclipse.edc.junit.extensions.EmbeddedRuntime; import org.eclipse.edc.spi.query.Criterion; +import org.eclipse.edc.spi.system.configuration.Config; import java.util.Arrays; import java.util.Collection; @@ -32,17 +33,20 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VOCAB; import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE; -public record ManagementEndToEndTestContext(EmbeddedRuntime runtime, int managementPort, int protocolPort) { +public record ManagementEndToEndTestContext(EmbeddedRuntime runtime) { public RequestSpecification baseRequest() { + var managementPort = getConfig().getString("web.http.management.port"); + var managementPath = getConfig().getString("web.http.management.path"); return given() - .port(managementPort) - .baseUri("http://localhost:%s/management".formatted(managementPort)) + .baseUri("http://localhost:" + managementPort + managementPath) .when(); } public String providerProtocolUrl() { - return "http://localhost:" + protocolPort + "/protocol"; + var protocolPort = getConfig().getString("web.http.protocol.port"); + var protocolPath = getConfig().getString("web.http.protocol.path"); + return "http://localhost:" + protocolPort + protocolPath; } public JsonObject query(Criterion... criteria) { @@ -69,4 +73,8 @@ public JsonObject query(Criterion... criteria) { .build(); } + private Config getConfig() { + return runtime.getContext().getConfig(); + } + } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java index 351c2ffddd2..529d047f04c 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java @@ -21,7 +21,9 @@ import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.spi.system.configuration.ConfigFactory; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; @@ -401,17 +403,24 @@ class InMemory extends Tests { @Nested @PostgresqlIntegrationTest - @ExtendWith(ManagementEndToEndExtension.Postgres.class) class Postgres extends Tests { - } + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + } + + @EndToEndTest @Nested class ValidationTests { @RegisterExtension - static ManagementEndToEndExtension.InMemory runtime = ManagementEndToEndExtension.InMemory.withConfig(() -> - ConfigFactory.fromMap(Map.of("edc.policy.validation.enabled", "true"))); + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.InMemory() + .withConfig(() -> ConfigFactory.fromMap(Map.of("edc.policy.validation.enabled", "true"))); @Test void shouldNotStorePolicyDefinition_whenValidationFails(ManagementEndToEndTestContext context) { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/SerdeEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/SerdeEndToEndTest.java index fe8bf9f8ccb..7e0c9b40634 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/SerdeEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/SerdeEndToEndTest.java @@ -480,7 +480,7 @@ private static ManagementEndToEndTestContext context() { ":system-tests:management-api:management-api-test-runtime" ); - return new ManagementEndToEndTestContext(runtime, managementPort, protocolPort); + return new ManagementEndToEndTestContext(runtime); } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java index 90fee939b7e..e1eae8a6251 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java @@ -31,9 +31,12 @@ import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -313,8 +316,15 @@ class InMemory extends Tests { @Nested @PostgresqlIntegrationTest - @ExtendWith(ManagementEndToEndExtension.Postgres.class) class Postgres extends Tests { + + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgres = new PostgresqlEndToEndExtension(); + + @RegisterExtension + static ManagementEndToEndExtension runtime = new ManagementEndToEndExtension.Postgres(postgres); + } } diff --git a/system-tests/sts-api/sts-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/sts/api/StsApiEndToEndTest.java b/system-tests/sts-api/sts-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/sts/api/StsApiEndToEndTest.java index 6674f5e28dc..ffe24b827e2 100644 --- a/system-tests/sts-api/sts-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/sts/api/StsApiEndToEndTest.java +++ b/system-tests/sts-api/sts-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/sts/api/StsApiEndToEndTest.java @@ -20,15 +20,16 @@ import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; import org.eclipse.edc.junit.extensions.EmbeddedRuntime; import org.eclipse.edc.junit.extensions.RuntimePerClassExtension; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; +import org.eclipse.edc.spi.system.configuration.Config; +import org.eclipse.edc.spi.system.configuration.ConfigFactory; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndExtension; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.RegisterExtension; import java.io.IOException; import java.text.ParseException; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -43,7 +44,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.iam.identitytrust.spi.SelfIssuedTokenConstants.PRESENTATION_TOKEN_CLAIM; import static org.eclipse.edc.jwt.spi.JwtRegisteredClaimNames.CLIENT_ID; -import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; import static org.eclipse.edc.util.io.Ports.getFreePort; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -57,7 +57,7 @@ public class StsApiEndToEndTest { abstract static class Tests extends StsEndToEndTestBase { @Test - void requestToken() throws ParseException { + void requestToken() { var audience = "audience"; var clientSecret = "client_secret"; var expiresIn = 300; @@ -85,7 +85,7 @@ void requestToken() throws ParseException { .doesNotContainKey(CLIENT_ID) .containsKeys(JWT_ID, EXPIRATION_TIME, ISSUED_AT); } - + @Test void requestToken_withBearerScope() throws ParseException { var clientSecret = "client_secret"; @@ -200,18 +200,11 @@ protected RequestSpecification baseRequest() { class InMemory extends Tests { @RegisterExtension - static RuntimePerClassExtension sts = new RuntimePerClassExtension(new EmbeddedRuntime( - "sts", - new HashMap<>() { - { - put("web.http.path", "/"); - put("web.http.port", String.valueOf(getFreePort())); - put("web.http.sts.path", "/sts"); - put("web.http.sts.port", String.valueOf(PORT)); - } - }, - ":system-tests:sts-api:sts-api-test-runtime" - )); + static RuntimePerClassExtension sts = new RuntimePerClassExtension( + new EmbeddedRuntime("sts", + ":system-tests:sts-api:sts-api-test-runtime") + .configurationProvider(StsApiEndToEndTest::runtimeConfig) + ); @Override protected RuntimePerClassExtension getRuntime() { @@ -223,33 +216,21 @@ protected RuntimePerClassExtension getRuntime() { @PostgresqlIntegrationTest class Postgres extends Tests { + @RegisterExtension + @Order(0) + static PostgresqlEndToEndExtension postgresqlExtension = new PostgresqlEndToEndExtension(); + @RegisterExtension static RuntimePerClassExtension sts = new RuntimePerClassExtension(new EmbeddedRuntime( "sts", - new HashMap<>() { - { - put("web.http.path", "/"); - put("web.http.port", String.valueOf(getFreePort())); - put("web.http.sts.path", "/sts"); - put("web.http.sts.port", String.valueOf(PORT)); - put("edc.datasource.default.url", PostgresqlEndToEndInstance.JDBC_URL_PREFIX + "runtime"); - put("edc.datasource.default.user", PostgresqlEndToEndInstance.USER); - put("edc.datasource.default.password", PostgresqlEndToEndInstance.PASSWORD); - put("edc.sql.schema.autocreate", "true"); - } - }, ":system-tests:sts-api:sts-api-test-runtime", ":extensions:common:sql:sql-core", ":extensions:common:store:sql:sts-client-store-sql", ":extensions:common:sql:sql-pool:sql-pool-apache-commons", - ":extensions:common:transaction:transaction-local" - )) { - @Override - public void beforeAll(ExtensionContext extensionContext) { - createDatabase("runtime"); - super.beforeAll(extensionContext); - } - }; + ":extensions:common:transaction:transaction-local") + .configurationProvider(StsApiEndToEndTest::runtimeConfig) + .configurationProvider(postgresqlExtension::config) + ); @Override protected RuntimePerClassExtension getRuntime() { @@ -257,4 +238,13 @@ protected RuntimePerClassExtension getRuntime() { } } + private static Config runtimeConfig() { + return ConfigFactory.fromMap(Map.of( + "web.http.path", "/", + "web.http.port", String.valueOf(getFreePort()), + "web.http.sts.path", "/sts", + "web.http.sts.port", String.valueOf(PORT) + )); + } + }