From f4bfd3a5a9b64631ca28a90453eb71d80645b3c2 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Mon, 20 Mar 2023 16:09:14 +0200 Subject: [PATCH 01/10] Add CrateDB testcontainer Addresses: #6789 --- docs/modules/databases/cratedb.md | 26 ++++ docs/modules/databases/jdbc.md | 4 + modules/cratedb/build.gradle | 14 ++ .../containers/CrateDBContainer.java | 123 ++++++++++++++++++ .../containers/CrateDBContainerProvider.java | 34 +++++ ...s.containers.JdbcDatabaseContainerProvider | 1 + .../org/testcontainers/CrateDBTestImages.java | 7 + .../containers/CrateDBConnectionURLTest.java | 84 ++++++++++++ .../jdbc/cratedb/CrateDBJDBCDriverTest.java | 21 +++ .../junit/cratedb/SimpleCrateDBTest.java | 71 ++++++++++ .../src/test/resources/logback-test.xml | 16 +++ .../test/resources/somepath/init_cratedb.sql | 6 + 12 files changed, 407 insertions(+) create mode 100644 docs/modules/databases/cratedb.md create mode 100644 modules/cratedb/build.gradle create mode 100644 modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java create mode 100644 modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java create mode 100644 modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider create mode 100644 modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java create mode 100644 modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java create mode 100644 modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java create mode 100644 modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java create mode 100644 modules/cratedb/src/test/resources/logback-test.xml create mode 100644 modules/cratedb/src/test/resources/somepath/init_cratedb.sql diff --git a/docs/modules/databases/cratedb.md b/docs/modules/databases/cratedb.md new file mode 100644 index 00000000000..addf2b5f268 --- /dev/null +++ b/docs/modules/databases/cratedb.md @@ -0,0 +1,26 @@ +# Postgres Module + +See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. + +## Adding this module to your project dependencies + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +=== "Gradle" + ```groovy + testImplementation "org.testcontainers:cratedb:{{latest_version}}" + ``` +=== "Maven" + ```xml + + org.testcontainers + cratedb + {{latest_version}} + test + + ``` + +!!! hint + Adding this Testcontainers library JAR will not automatically add a database driver JAR to your project. You should ensure that your project also has a suitable database driver as a dependency. + + diff --git a/docs/modules/databases/jdbc.md b/docs/modules/databases/jdbc.md index 6cf4977ad96..0a753668d83 100644 --- a/docs/modules/databases/jdbc.md +++ b/docs/modules/databases/jdbc.md @@ -31,6 +31,10 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database `jdbc:tc:mysql:5.7.34:///databasename` +#### Using CrateDB + +`jdbc:tc:crate:5.2.3//localhost:5432/crate` + #### Using PostgreSQL `jdbc:tc:postgresql:9.6.8:///databasename` diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle new file mode 100644 index 00000000000..e0942e1cfd0 --- /dev/null +++ b/modules/cratedb/build.gradle @@ -0,0 +1,14 @@ +description = "Testcontainers :: JDBC :: PostgreSQL" + +dependencies { + annotationProcessor 'com.google.auto.service:auto-service:1.0.1' + compileOnly 'com.google.auto.service:auto-service:1.0.1' + + api project(':jdbc') + + testImplementation project(':jdbc-test') + testImplementation 'io.crate:crate-jdbc:2.6.0' + testImplementation 'org.postgresql:postgresql:42.5.4' + + compileOnly 'org.jetbrains:annotations:24.0.0' +} diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java new file mode 100644 index 00000000000..2b0fbf1c13d --- /dev/null +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java @@ -0,0 +1,123 @@ +package org.testcontainers.containers; + +import org.jetbrains.annotations.NotNull; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +import java.util.Set; + +public class CrateDBContainer> extends JdbcDatabaseContainer { + + public static final String NAME = "cratedb"; + + public static final String IMAGE = "crate"; + + public static final String DEFAULT_TAG = "latest"; + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("crate"); + + public static final Integer CRATEDB_PG_PORT = 5432; + + public static final Integer CRATEDB_HTTP_PORT = 4200; + + private String databaseName = "crate"; + + private String username = "crate"; + + private String password = "crate"; + + /** + * @deprecated use {@link #CrateDBContainer(DockerImageName)} or {@link #CrateDBContainer(String)} instead + */ + @Deprecated + public CrateDBContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + + public CrateDBContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public CrateDBContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + this.waitStrategy = Wait.forHttp("/").forPort(CRATEDB_HTTP_PORT).forStatusCode(200); + + addExposedPort(CRATEDB_PG_PORT); + addExposedPort(CRATEDB_HTTP_PORT); + } + + /** + * @return the ports on which to check if the container is ready + * @deprecated use {@link #getLivenessCheckPortNumbers()} instead + */ + @NotNull + @Override + @Deprecated + protected Set getLivenessCheckPorts() { + return super.getLivenessCheckPorts(); + } + + @Override + public String getDriverClassName() { + return "io.crate.client.jdbc.CrateDriver"; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters("?", "&"); + return ( + "jdbc:crate://" + + getHost() + + ":" + + getMappedPort(CRATEDB_PG_PORT) + + "/" + + databaseName + + additionalUrlParams + ); + } + + @Override + public String getDatabaseName() { + return databaseName; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getTestQueryString() { + return "SELECT 1"; + } + + @Override + public SELF withDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return self(); + } + + @Override + public SELF withUsername(final String username) { + this.username = username; + return self(); + } + + @Override + public SELF withPassword(final String password) { + this.password = password; + return self(); + } + + @Override + protected void waitUntilContainerStarted() { + getWaitStrategy().waitUntilReady(this); + } +} diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java new file mode 100644 index 00000000000..da2872ccf94 --- /dev/null +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java @@ -0,0 +1,34 @@ +package org.testcontainers.containers; + +import org.testcontainers.jdbc.ConnectionUrl; +import org.testcontainers.utility.DockerImageName; + +/** + * Factory for CrateDB containers using its JDBC driver. + */ +public class CrateDBContainerProvider extends JdbcDatabaseContainerProvider { + + public static final String USER_PARAM = "user"; + + public static final String PASSWORD_PARAM = "password"; + + @Override + public boolean supports(String databaseType) { + return databaseType.equals(CrateDBContainer.NAME); + } + + @Override + public JdbcDatabaseContainer newInstance() { + return newInstance(CrateDBContainer.DEFAULT_TAG); + } + + @Override + public JdbcDatabaseContainer newInstance(String tag) { + return new CrateDBContainer(DockerImageName.parse(CrateDBContainer.IMAGE).withTag(tag)); + } + + @Override + public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) { + return newInstanceFromConnectionUrl(connectionUrl, USER_PARAM, PASSWORD_PARAM); + } +} diff --git a/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider new file mode 100644 index 00000000000..e0a3c27a029 --- /dev/null +++ b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.containers.CrateDBContainerProvider diff --git a/modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java b/modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java new file mode 100644 index 00000000000..37db03004dd --- /dev/null +++ b/modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface CrateDBTestImages { + DockerImageName CRATEDB_TEST_IMAGE = DockerImageName.parse("crate:latest"); +} diff --git a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java new file mode 100644 index 00000000000..b0c0c078f75 --- /dev/null +++ b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java @@ -0,0 +1,84 @@ +package org.testcontainers.containers; + +import org.junit.Test; +import org.testcontainers.CrateDBTestImages; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; + +public class CrateDBConnectionURLTest { + + @Test + public void shouldCorrectlyAppendQueryString() { + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); + String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); + + assertThat(queryString) + .as("Query String contains expected params") + .contains("?stringtype=unspecified&stringtype=unspecified"); + assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); + assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); + } + + @Test + public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { + CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); + String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); + String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); + + assertThat(queryString) + .as("Query String contains expected params") + .contains("?stringtype=unspecified&stringtype=unspecified"); + assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); + assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); + } + + @Test + public void shouldReturnOriginalURLWhenEmptyQueryString() { + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + String connectionUrl = cratedb.constructUrlForConnection(""); + + assertThat(cratedb.getJdbcUrl()).as("Query String remains unchanged").isEqualTo(connectionUrl); + } + + @Test + public void shouldRejectInvalidQueryString() { + assertThat( + catchThrowable(() -> { + new NoParamsUrlCrateDBContainer().constructUrlForConnection("stringtype=unspecified"); + }) + ) + .as("Fails when invalid query string provided") + .isInstanceOf(IllegalArgumentException.class); + } + + static class FixedJdbcUrlCrateDBContainer extends CrateDBContainer { + + public FixedJdbcUrlCrateDBContainer() { + super(CrateDBTestImages.CRATEDB_TEST_IMAGE); + } + + @Override + public String getHost() { + return "localhost"; + } + + @Override + public Integer getMappedPort(int originalPort) { + return 5432; + } + } + + static class NoParamsUrlCrateDBContainer extends CrateDBContainer { + + public NoParamsUrlCrateDBContainer() { + super(CrateDBTestImages.CRATEDB_TEST_IMAGE); + } + + @Override + public String getJdbcUrl() { + return "jdbc:crate://host:port/database"; + } + } +} diff --git a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java new file mode 100644 index 00000000000..54ef9704ac5 --- /dev/null +++ b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java @@ -0,0 +1,21 @@ +package org.testcontainers.jdbc.cratedb; + +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.testcontainers.jdbc.AbstractJDBCDriverTest; + +import java.util.Arrays; +import java.util.EnumSet; + +@RunWith(Parameterized.class) +public class CrateDBJDBCDriverTest extends AbstractJDBCDriverTest { + + @Parameterized.Parameters(name = "{index} - {0}") + public static Iterable data() { + return Arrays.asList( + new Object[][] { + { "jdbc:tc:cratedb:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class) }, + } + ); + } +} diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java new file mode 100644 index 00000000000..80a234d1f6b --- /dev/null +++ b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java @@ -0,0 +1,71 @@ +package org.testcontainers.junit.cratedb; + +import org.junit.Test; +import org.testcontainers.CrateDBTestImages; +import org.testcontainers.containers.CrateDBContainer; +import org.testcontainers.db.AbstractContainerDatabaseTest; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.logging.Level; +import java.util.logging.LogManager; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleCrateDBTest extends AbstractContainerDatabaseTest { + static { + // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing + LogManager.getLogManager().getLogger("").setLevel(Level.OFF); + } + + @Test + public void testSimple() throws SQLException { + try (CrateDBContainer cratedb = new CrateDBContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE)) { + cratedb.start(); + + ResultSet resultSet = performQuery(cratedb, "SELECT 1"); + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); + assertHasCorrectExposedAndLivenessCheckPorts(cratedb); + } + } + + @Test + public void testCommandOverride() throws SQLException { + try ( + CrateDBContainer cratedb = new CrateDBContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + .withCommand("crate -C cluster.name=testcontainers") + ) { + cratedb.start(); + + ResultSet resultSet = performQuery(cratedb, "select name from sys.cluster"); + String result = resultSet.getString(1); + assertThat(result).as("cluster name should be overriden").isEqualTo("testcontainers"); + } + } + + @Test + public void testExplicitInitScript() throws SQLException { + try ( + CrateDBContainer cratedb = new CrateDBContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + .withInitScript("somepath/init_cratedb.sql") + ) { + cratedb.start(); + + ResultSet resultSet = performQuery(cratedb, "SELECT foo FROM bar"); + + String firstColumnValue = resultSet.getString(1); + assertThat(firstColumnValue).as("Value from init script should equal real value").isEqualTo("hello world"); + } + } + + private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBContainer cratedb) { + assertThat(cratedb.getExposedPorts()) + .containsExactly(CrateDBContainer.CRATEDB_PG_PORT, CrateDBContainer.CRATEDB_HTTP_PORT); + assertThat(cratedb.getLivenessCheckPortNumbers()) + .containsExactlyInAnyOrder( + cratedb.getMappedPort(CrateDBContainer.CRATEDB_PG_PORT), + cratedb.getMappedPort(CrateDBContainer.CRATEDB_HTTP_PORT) + ); + } +} diff --git a/modules/cratedb/src/test/resources/logback-test.xml b/modules/cratedb/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..83ef7a1a3ef --- /dev/null +++ b/modules/cratedb/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + + diff --git a/modules/cratedb/src/test/resources/somepath/init_cratedb.sql b/modules/cratedb/src/test/resources/somepath/init_cratedb.sql new file mode 100644 index 00000000000..4faa1ede65c --- /dev/null +++ b/modules/cratedb/src/test/resources/somepath/init_cratedb.sql @@ -0,0 +1,6 @@ +CREATE TABLE bar ( + foo STRING +); + +INSERT INTO bar (foo) VALUES ('hello world'); +REFRESH TABLE bar; From 31afe2a0ba359d82c7873152b54a9161d4f72134 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Mon, 20 Mar 2023 21:06:18 +0200 Subject: [PATCH 02/10] Allow `_` for db names in connection URL --- .../src/main/java/org/testcontainers/jdbc/ConnectionUrl.java | 2 +- .../test/java/org/testcontainers/jdbc/ConnectionUrlTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java index c5f2759f3b1..e8aee662f67 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java +++ b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java @@ -205,7 +205,7 @@ public Map getTmpfsOptions() { public interface Patterns { Pattern URL_MATCHING_PATTERN = Pattern.compile( "jdbc:tc:" + - "(?[a-z0-9]+)" + + "(?[a-z0-9_]+)" + "(:(?[^:]+))?" + "://" + "(?[^?]+)" + diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java index fa50dbbe76e..b8f311a54e4 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java @@ -13,10 +13,10 @@ public class ConnectionUrlTest { @Test public void testConnectionUrl1() { - String urlString = "jdbc:tc:mysql:5.7.34://somehostname:3306/databasename?a=b&c=d"; + String urlString = "jdbc:tc:my_db:5.7.34://somehostname:3306/databasename?a=b&c=d"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); - assertThat(url.getDatabaseType()).as("Database Type value is as expected").isEqualTo("mysql"); + assertThat(url.getDatabaseType()).as("Database Type value is as expected").isEqualTo("my_db"); assertThat(url.getImageTag()).as("Database Image tag value is as expected").contains("5.7.34"); assertThat(url.getDbHostString()) .as("Database Host String is as expected") From e5fe603fec9f576641941e91d616e001f87282bb Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Mon, 20 Mar 2023 20:57:54 +0200 Subject: [PATCH 03/10] Use two variants, one with CrateDB driver, one with PGSQL --- docs/modules/databases/cratedb.md | 1 + docs/modules/databases/jdbc.md | 2 +- .../containers/CrateDBContainer.java | 6 +- .../containers/CrateDBContainerProvider.java | 2 +- .../CrateDBLegacyDriverContainer.java | 31 +++++++ .../CrateDBLegacyDriverContainerProvider.java | 19 +++++ ...s.containers.JdbcDatabaseContainerProvider | 1 + .../containers/CrateDBConnectionURLTest.java | 2 +- .../CrateDBLegacyDriverConnectionURLTest.java | 84 +++++++++++++++++++ .../jdbc/cratedb/CrateDBJDBCDriverTest.java | 4 + .../SimpleCrateDBLegacyDriverTest.java | 76 +++++++++++++++++ 11 files changed, 222 insertions(+), 6 deletions(-) create mode 100644 modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java create mode 100644 modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java create mode 100644 modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java create mode 100644 modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java diff --git a/docs/modules/databases/cratedb.md b/docs/modules/databases/cratedb.md index addf2b5f268..8e9a9e52ccc 100644 --- a/docs/modules/databases/cratedb.md +++ b/docs/modules/databases/cratedb.md @@ -22,5 +22,6 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: !!! hint Adding this Testcontainers library JAR will not automatically add a database driver JAR to your project. You should ensure that your project also has a suitable database driver as a dependency. + If you'd like to use the PostgreSQL JDBC Driver, use `org.postgresql:postgresql`, if you'd like to use CrateDB's JDBC driver, use `io.crate:crate-jdbc`. diff --git a/docs/modules/databases/jdbc.md b/docs/modules/databases/jdbc.md index 0a753668d83..d98fb8062b9 100644 --- a/docs/modules/databases/jdbc.md +++ b/docs/modules/databases/jdbc.md @@ -33,7 +33,7 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database #### Using CrateDB -`jdbc:tc:crate:5.2.3//localhost:5432/crate` +`jdbc:tc:cratedb:5.2.3//localhost:5432/crate` or `jdbc:tc:cratedb_legacy:5.2.3//localhost:5432/crate` #### Using PostgreSQL diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java index 2b0fbf1c13d..19387973ee4 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java @@ -14,7 +14,7 @@ public class CrateDBContainer> extends JdbcD public static final String DEFAULT_TAG = "latest"; - private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("crate"); + protected static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("crate"); public static final Integer CRATEDB_PG_PORT = 5432; @@ -61,14 +61,14 @@ protected Set getLivenessCheckPorts() { @Override public String getDriverClassName() { - return "io.crate.client.jdbc.CrateDriver"; + return "org.postgresql.Driver"; } @Override public String getJdbcUrl() { String additionalUrlParams = constructUrlParameters("?", "&"); return ( - "jdbc:crate://" + + "jdbc:postgresql://" + getHost() + ":" + getMappedPort(CRATEDB_PG_PORT) + diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java index da2872ccf94..a390a68c241 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java @@ -4,7 +4,7 @@ import org.testcontainers.utility.DockerImageName; /** - * Factory for CrateDB containers using its JDBC driver. + * Factory for CrateDB containers using PostgreSQL JDBC driver. */ public class CrateDBContainerProvider extends JdbcDatabaseContainerProvider { diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java new file mode 100644 index 00000000000..e2478bb2330 --- /dev/null +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java @@ -0,0 +1,31 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +public class CrateDBLegacyDriverContainer> extends CrateDBContainer { + + public static final String NAME = "cratedb_legacy"; + + public CrateDBLegacyDriverContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + } + + @Override + public String getDriverClassName() { + return "io.crate.client.jdbc.CrateDriver"; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters("?", "&"); + return ( + "jdbc:crate://" + + getHost() + + ":" + + getMappedPort(CRATEDB_PG_PORT) + + "/" + + getDatabaseName() + + additionalUrlParams + ); + } +} diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java new file mode 100644 index 00000000000..b616768aedd --- /dev/null +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java @@ -0,0 +1,19 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +/** + * Factory for CrateDB containers using its own legacy JDBC driver. + */ +public class CrateDBLegacyDriverContainerProvider extends JdbcDatabaseContainerProvider { + + @Override + public boolean supports(String databaseType) { + return databaseType.equals(CrateDBLegacyDriverContainer.NAME); + } + + @Override + public JdbcDatabaseContainer newInstance(String tag) { + return new CrateDBLegacyDriverContainer<>(DockerImageName.parse(CrateDBContainer.IMAGE).withTag(tag)); + } +} diff --git a/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider index e0a3c27a029..67745735f2b 100644 --- a/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider +++ b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider @@ -1 +1,2 @@ org.testcontainers.containers.CrateDBContainerProvider +org.testcontainers.containers.CrateDBLegacyDriverContainerProvider diff --git a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java index b0c0c078f75..f665304920d 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java @@ -78,7 +78,7 @@ public NoParamsUrlCrateDBContainer() { @Override public String getJdbcUrl() { - return "jdbc:crate://host:port/database"; + return "jdbc:postgresql://host:port/database"; } } } diff --git a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java new file mode 100644 index 00000000000..624b39356c0 --- /dev/null +++ b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java @@ -0,0 +1,84 @@ +package org.testcontainers.containers; + +import org.junit.Test; +import org.testcontainers.CrateDBTestImages; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; + +public class CrateDBLegacyDriverConnectionURLTest { + + @Test + public void shouldCorrectlyAppendQueryString() { + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); + String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); + + assertThat(queryString) + .as("Query String contains expected params") + .contains("?stringtype=unspecified&stringtype=unspecified"); + assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); + assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); + } + + @Test + public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { + CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); + String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); + String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); + + assertThat(queryString) + .as("Query String contains expected params") + .contains("?stringtype=unspecified&stringtype=unspecified"); + assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); + assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); + } + + @Test + public void shouldReturnOriginalURLWhenEmptyQueryString() { + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + String connectionUrl = cratedb.constructUrlForConnection(""); + + assertThat(cratedb.getJdbcUrl()).as("Query String remains unchanged").isEqualTo(connectionUrl); + } + + @Test + public void shouldRejectInvalidQueryString() { + assertThat( + catchThrowable(() -> { + new NoParamsUrlCrateDBContainer().constructUrlForConnection("stringtype=unspecified"); + }) + ) + .as("Fails when invalid query string provided") + .isInstanceOf(IllegalArgumentException.class); + } + + static class FixedJdbcUrlCrateDBContainer extends CrateDBLegacyDriverContainer { + + public FixedJdbcUrlCrateDBContainer() { + super(CrateDBTestImages.CRATEDB_TEST_IMAGE); + } + + @Override + public String getHost() { + return "localhost"; + } + + @Override + public Integer getMappedPort(int originalPort) { + return 5432; + } + } + + static class NoParamsUrlCrateDBContainer extends CrateDBLegacyDriverContainer { + + public NoParamsUrlCrateDBContainer() { + super(CrateDBTestImages.CRATEDB_TEST_IMAGE); + } + + @Override + public String getJdbcUrl() { + return "jdbc:crate://host:port/database"; + } + } +} diff --git a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java index 54ef9704ac5..e89e41d5868 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java @@ -15,6 +15,10 @@ public static Iterable data() { return Arrays.asList( new Object[][] { { "jdbc:tc:cratedb:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class) }, + { + "jdbc:tc:cratedb_legacy:5.2.3://hostname/crate?user=crate&password=somepwd", + EnumSet.noneOf(Options.class), + }, } ); } diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java new file mode 100644 index 00000000000..7bcd2777cad --- /dev/null +++ b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java @@ -0,0 +1,76 @@ +package org.testcontainers.junit.cratedb; + +import org.junit.Test; +import org.testcontainers.CrateDBTestImages; +import org.testcontainers.containers.CrateDBContainer; +import org.testcontainers.containers.CrateDBLegacyDriverContainer; +import org.testcontainers.db.AbstractContainerDatabaseTest; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.logging.Level; +import java.util.logging.LogManager; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleCrateDBLegacyDriverTest extends AbstractContainerDatabaseTest { + static { + // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing + LogManager.getLogManager().getLogger("").setLevel(Level.OFF); + } + + @Test + public void testSimple() throws SQLException { + try ( + CrateDBLegacyDriverContainer cratedb = new CrateDBLegacyDriverContainer<>( + CrateDBTestImages.CRATEDB_TEST_IMAGE + ) + ) { + cratedb.start(); + + ResultSet resultSet = performQuery(cratedb, "SELECT 1"); + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); + assertHasCorrectExposedAndLivenessCheckPorts(cratedb); + } + } + + @Test + public void testCommandOverride() throws SQLException { + try ( + CrateDBContainer cratedb = new CrateDBLegacyDriverContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + .withCommand("crate -C cluster.name=testcontainers") + ) { + cratedb.start(); + + ResultSet resultSet = performQuery(cratedb, "select name from sys.cluster"); + String result = resultSet.getString(1); + assertThat(result).as("cluster name should be overriden").isEqualTo("testcontainers"); + } + } + + @Test + public void testExplicitInitScript() throws SQLException { + try ( + CrateDBContainer cratedb = new CrateDBLegacyDriverContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + .withInitScript("somepath/init_cratedb.sql") + ) { + cratedb.start(); + + ResultSet resultSet = performQuery(cratedb, "SELECT foo FROM bar"); + + String firstColumnValue = resultSet.getString(1); + assertThat(firstColumnValue).as("Value from init script should equal real value").isEqualTo("hello world"); + } + } + + private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBLegacyDriverContainer cratedb) { + assertThat(cratedb.getExposedPorts()) + .containsExactly(CrateDBContainer.CRATEDB_PG_PORT, CrateDBContainer.CRATEDB_HTTP_PORT); + assertThat(cratedb.getLivenessCheckPortNumbers()) + .containsExactlyInAnyOrder( + cratedb.getMappedPort(CrateDBContainer.CRATEDB_PG_PORT), + cratedb.getMappedPort(CrateDBContainer.CRATEDB_HTTP_PORT) + ); + } +} From abdb833f0984e09d97aec7919151eac2954e94a7 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Wed, 29 Mar 2023 17:40:54 +0300 Subject: [PATCH 04/10] Revert usage of _ in db name --- docs/modules/databases/jdbc.md | 2 +- .../containers/CrateDBLegacyDriverContainer.java | 2 +- .../testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java | 2 +- .../src/main/java/org/testcontainers/jdbc/ConnectionUrl.java | 2 +- .../test/java/org/testcontainers/jdbc/ConnectionUrlTest.java | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/modules/databases/jdbc.md b/docs/modules/databases/jdbc.md index d98fb8062b9..4bfa94308c1 100644 --- a/docs/modules/databases/jdbc.md +++ b/docs/modules/databases/jdbc.md @@ -33,7 +33,7 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database #### Using CrateDB -`jdbc:tc:cratedb:5.2.3//localhost:5432/crate` or `jdbc:tc:cratedb_legacy:5.2.3//localhost:5432/crate` +`jdbc:tc:cratedb:5.2.3//localhost:5432/crate` or `jdbc:tc:cratedblegacy:5.2.3//localhost:5432/crate` #### Using PostgreSQL diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java index e2478bb2330..dc008233dd9 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java @@ -4,7 +4,7 @@ public class CrateDBLegacyDriverContainer> extends CrateDBContainer { - public static final String NAME = "cratedb_legacy"; + public static final String NAME = "cratedblegacy"; public CrateDBLegacyDriverContainer(final DockerImageName dockerImageName) { super(dockerImageName); diff --git a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java index e89e41d5868..6f1d95128a2 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java @@ -16,7 +16,7 @@ public static Iterable data() { new Object[][] { { "jdbc:tc:cratedb:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class) }, { - "jdbc:tc:cratedb_legacy:5.2.3://hostname/crate?user=crate&password=somepwd", + "jdbc:tc:cratedblegacy:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class), }, } diff --git a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java index e8aee662f67..c5f2759f3b1 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java +++ b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java @@ -205,7 +205,7 @@ public Map getTmpfsOptions() { public interface Patterns { Pattern URL_MATCHING_PATTERN = Pattern.compile( "jdbc:tc:" + - "(?[a-z0-9_]+)" + + "(?[a-z0-9]+)" + "(:(?[^:]+))?" + "://" + "(?[^?]+)" + diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java index b8f311a54e4..fa50dbbe76e 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java @@ -13,10 +13,10 @@ public class ConnectionUrlTest { @Test public void testConnectionUrl1() { - String urlString = "jdbc:tc:my_db:5.7.34://somehostname:3306/databasename?a=b&c=d"; + String urlString = "jdbc:tc:mysql:5.7.34://somehostname:3306/databasename?a=b&c=d"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); - assertThat(url.getDatabaseType()).as("Database Type value is as expected").isEqualTo("my_db"); + assertThat(url.getDatabaseType()).as("Database Type value is as expected").isEqualTo("mysql"); assertThat(url.getImageTag()).as("Database Image tag value is as expected").contains("5.7.34"); assertThat(url.getDbHostString()) .as("Database Host String is as expected") From dbf63fb66c21a9a883a23ad4a0c8afaf7cfbef25 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Wed, 29 Mar 2023 17:50:47 +0300 Subject: [PATCH 05/10] Address comments #1 --- docs/modules/databases/cratedb.md | 2 +- modules/cratedb/build.gradle | 2 +- .../testcontainers/containers/CrateDBContainer.java | 10 +--------- .../java/org/testcontainers/CrateDBTestImages.java | 2 +- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/docs/modules/databases/cratedb.md b/docs/modules/databases/cratedb.md index 8e9a9e52ccc..b9a8a533a68 100644 --- a/docs/modules/databases/cratedb.md +++ b/docs/modules/databases/cratedb.md @@ -1,4 +1,4 @@ -# Postgres Module +# CrateDB Module See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index e0942e1cfd0..9cf7f19cba9 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -1,4 +1,4 @@ -description = "Testcontainers :: JDBC :: PostgreSQL" +description = "Testcontainers :: JDBC :: CrateDB" dependencies { annotationProcessor 'com.google.auto.service:auto-service:1.0.1' diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java index 19387973ee4..a135363ea3a 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java @@ -12,7 +12,7 @@ public class CrateDBContainer> extends JdbcD public static final String IMAGE = "crate"; - public static final String DEFAULT_TAG = "latest"; + public static final String DEFAULT_TAG = "5.2.5"; protected static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("crate"); @@ -26,14 +26,6 @@ public class CrateDBContainer> extends JdbcD private String password = "crate"; - /** - * @deprecated use {@link #CrateDBContainer(DockerImageName)} or {@link #CrateDBContainer(String)} instead - */ - @Deprecated - public CrateDBContainer() { - this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); - } - public CrateDBContainer(final String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java b/modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java index 37db03004dd..5025d409839 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java +++ b/modules/cratedb/src/test/java/org/testcontainers/CrateDBTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface CrateDBTestImages { - DockerImageName CRATEDB_TEST_IMAGE = DockerImageName.parse("crate:latest"); + DockerImageName CRATEDB_TEST_IMAGE = DockerImageName.parse("crate:5.2.5"); } From 95d491b762c28d66def16b47da061b0e917cdf06 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Wed, 29 Mar 2023 23:17:13 +0300 Subject: [PATCH 06/10] Add cratedb to gh actions and issue templates --- .github/ISSUE_TEMPLATE/bug_report.yaml | 1 + .github/ISSUE_TEMPLATE/enhancement.yaml | 1 + .github/ISSUE_TEMPLATE/feature.yaml | 1 + .github/dependabot.yml | 5 +++++ .github/labeler.yml | 2 ++ .github/settings.yml | 3 +++ mkdocs.yml | 1 + 7 files changed, 14 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index ab1de00f6f8..033fd19c49d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -20,6 +20,7 @@ body: - CockroachDB - Consul - Couchbase + - CrateDB - DB2 - Dynalite - Elasticsearch diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml index b80fa9387da..b9d67bc7d52 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ b/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -20,6 +20,7 @@ body: - CockroachDB - Consul - Couchbase + - CrateDB - DB2 - Dynalite - Elasticsearch diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 024d0414d2f..ffc1b19a6cb 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -18,6 +18,7 @@ body: - Cassandra - Clickhouse - CockroachDB + - CrateDB - Consul - Couchbase - DB2 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ecf473b2d65..e78603d163f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -62,6 +62,11 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + - package-ecosystem: "gradle" + directory: "/modules/cratedb" + schedule: + interval: "monthly" + open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/database-commons" schedule: diff --git a/.github/labeler.yml b/.github/labeler.yml index 55163e0d7c7..48238471563 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -19,6 +19,8 @@ - modules/consul/**/* "modules/couchbase": - modules/couchbase/**/* +"modules/cratedb": + - modules/cratedb/**/* "modules/db2": - modules/db2/**/* "modules/dynalite": diff --git a/.github/settings.yml b/.github/settings.yml index 7844182893b..7cc83a69524 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -124,6 +124,9 @@ labels: - name: modules/couchbase color: '#006b75' + - name: modules/cratedb + color: '#006b75' + - name: modules/db2 color: '#006b75' diff --git a/mkdocs.yml b/mkdocs.yml index 8da6fa584ac..72c457b9d5f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -53,6 +53,7 @@ nav: - modules/databases/cockroachdb.md - modules/databases/couchbase.md - modules/databases/clickhouse.md + - modules/databases/cratedb.md - modules/databases/db2.md - modules/databases/dynalite.md - modules/databases/influxdb.md From 265a2fa826da76594672da39cea59c19da3faad9 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Thu, 30 Mar 2023 00:19:56 +0300 Subject: [PATCH 07/10] Simplify container generics --- .../testcontainers/containers/CrateDBContainer.java | 8 ++++---- .../containers/CrateDBLegacyDriverContainer.java | 2 +- .../CrateDBLegacyDriverContainerProvider.java | 2 +- .../containers/CrateDBConnectionURLTest.java | 10 +++++----- .../CrateDBLegacyDriverConnectionURLTest.java | 10 +++++----- .../junit/cratedb/SimpleCrateDBLegacyDriverTest.java | 8 ++++---- .../junit/cratedb/SimpleCrateDBTest.java | 8 ++++---- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java index a135363ea3a..23a601a0256 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java @@ -6,7 +6,7 @@ import java.util.Set; -public class CrateDBContainer> extends JdbcDatabaseContainer { +public class CrateDBContainer extends JdbcDatabaseContainer { public static final String NAME = "cratedb"; @@ -91,19 +91,19 @@ public String getTestQueryString() { } @Override - public SELF withDatabaseName(final String databaseName) { + public CrateDBContainer withDatabaseName(final String databaseName) { this.databaseName = databaseName; return self(); } @Override - public SELF withUsername(final String username) { + public CrateDBContainer withUsername(final String username) { this.username = username; return self(); } @Override - public SELF withPassword(final String password) { + public CrateDBContainer withPassword(final String password) { this.password = password; return self(); } diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java index dc008233dd9..bdc23c77b4a 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java @@ -2,7 +2,7 @@ import org.testcontainers.utility.DockerImageName; -public class CrateDBLegacyDriverContainer> extends CrateDBContainer { +public class CrateDBLegacyDriverContainer extends CrateDBContainer { public static final String NAME = "cratedblegacy"; diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java index b616768aedd..c427467ac9c 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java +++ b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java @@ -14,6 +14,6 @@ public boolean supports(String databaseType) { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new CrateDBLegacyDriverContainer<>(DockerImageName.parse(CrateDBContainer.IMAGE).withTag(tag)); + return new CrateDBLegacyDriverContainer(DockerImageName.parse(CrateDBContainer.IMAGE).withTag(tag)); } } diff --git a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java index f665304920d..4afc5484ddc 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java @@ -10,7 +10,7 @@ public class CrateDBConnectionURLTest { @Test public void shouldCorrectlyAppendQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); @@ -23,7 +23,7 @@ public void shouldCorrectlyAppendQueryString() { @Test public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { - CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); + CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); @@ -36,7 +36,7 @@ public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { @Test public void shouldReturnOriginalURLWhenEmptyQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); String connectionUrl = cratedb.constructUrlForConnection(""); assertThat(cratedb.getJdbcUrl()).as("Query String remains unchanged").isEqualTo(connectionUrl); @@ -53,7 +53,7 @@ public void shouldRejectInvalidQueryString() { .isInstanceOf(IllegalArgumentException.class); } - static class FixedJdbcUrlCrateDBContainer extends CrateDBContainer { + static class FixedJdbcUrlCrateDBContainer extends CrateDBContainer { public FixedJdbcUrlCrateDBContainer() { super(CrateDBTestImages.CRATEDB_TEST_IMAGE); @@ -70,7 +70,7 @@ public Integer getMappedPort(int originalPort) { } } - static class NoParamsUrlCrateDBContainer extends CrateDBContainer { + static class NoParamsUrlCrateDBContainer extends CrateDBContainer { public NoParamsUrlCrateDBContainer() { super(CrateDBTestImages.CRATEDB_TEST_IMAGE); diff --git a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java index 624b39356c0..9d93be9d8c3 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java @@ -10,7 +10,7 @@ public class CrateDBLegacyDriverConnectionURLTest { @Test public void shouldCorrectlyAppendQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); @@ -23,7 +23,7 @@ public void shouldCorrectlyAppendQueryString() { @Test public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { - CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); + CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); @@ -36,7 +36,7 @@ public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { @Test public void shouldReturnOriginalURLWhenEmptyQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); + CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); String connectionUrl = cratedb.constructUrlForConnection(""); assertThat(cratedb.getJdbcUrl()).as("Query String remains unchanged").isEqualTo(connectionUrl); @@ -53,7 +53,7 @@ public void shouldRejectInvalidQueryString() { .isInstanceOf(IllegalArgumentException.class); } - static class FixedJdbcUrlCrateDBContainer extends CrateDBLegacyDriverContainer { + static class FixedJdbcUrlCrateDBContainer extends CrateDBLegacyDriverContainer { public FixedJdbcUrlCrateDBContainer() { super(CrateDBTestImages.CRATEDB_TEST_IMAGE); @@ -70,7 +70,7 @@ public Integer getMappedPort(int originalPort) { } } - static class NoParamsUrlCrateDBContainer extends CrateDBLegacyDriverContainer { + static class NoParamsUrlCrateDBContainer extends CrateDBLegacyDriverContainer { public NoParamsUrlCrateDBContainer() { super(CrateDBTestImages.CRATEDB_TEST_IMAGE); diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java index 7bcd2777cad..7eb4b6d54eb 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java @@ -22,7 +22,7 @@ public class SimpleCrateDBLegacyDriverTest extends AbstractContainerDatabaseTest @Test public void testSimple() throws SQLException { try ( - CrateDBLegacyDriverContainer cratedb = new CrateDBLegacyDriverContainer<>( + CrateDBLegacyDriverContainer cratedb = new CrateDBLegacyDriverContainer( CrateDBTestImages.CRATEDB_TEST_IMAGE ) ) { @@ -38,7 +38,7 @@ public void testSimple() throws SQLException { @Test public void testCommandOverride() throws SQLException { try ( - CrateDBContainer cratedb = new CrateDBLegacyDriverContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + CrateDBContainer cratedb = new CrateDBLegacyDriverContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) .withCommand("crate -C cluster.name=testcontainers") ) { cratedb.start(); @@ -52,7 +52,7 @@ public void testCommandOverride() throws SQLException { @Test public void testExplicitInitScript() throws SQLException { try ( - CrateDBContainer cratedb = new CrateDBLegacyDriverContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + CrateDBContainer cratedb = new CrateDBLegacyDriverContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) .withInitScript("somepath/init_cratedb.sql") ) { cratedb.start(); @@ -64,7 +64,7 @@ public void testExplicitInitScript() throws SQLException { } } - private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBLegacyDriverContainer cratedb) { + private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBLegacyDriverContainer cratedb) { assertThat(cratedb.getExposedPorts()) .containsExactly(CrateDBContainer.CRATEDB_PG_PORT, CrateDBContainer.CRATEDB_HTTP_PORT); assertThat(cratedb.getLivenessCheckPortNumbers()) diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java index 80a234d1f6b..680c14deab5 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java @@ -20,7 +20,7 @@ public class SimpleCrateDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (CrateDBContainer cratedb = new CrateDBContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE)) { + try (CrateDBContainer cratedb = new CrateDBContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE)) { cratedb.start(); ResultSet resultSet = performQuery(cratedb, "SELECT 1"); @@ -33,7 +33,7 @@ public void testSimple() throws SQLException { @Test public void testCommandOverride() throws SQLException { try ( - CrateDBContainer cratedb = new CrateDBContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + CrateDBContainer cratedb = new CrateDBContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) .withCommand("crate -C cluster.name=testcontainers") ) { cratedb.start(); @@ -47,7 +47,7 @@ public void testCommandOverride() throws SQLException { @Test public void testExplicitInitScript() throws SQLException { try ( - CrateDBContainer cratedb = new CrateDBContainer<>(CrateDBTestImages.CRATEDB_TEST_IMAGE) + CrateDBContainer cratedb = new CrateDBContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) .withInitScript("somepath/init_cratedb.sql") ) { cratedb.start(); @@ -59,7 +59,7 @@ public void testExplicitInitScript() throws SQLException { } } - private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBContainer cratedb) { + private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBContainer cratedb) { assertThat(cratedb.getExposedPorts()) .containsExactly(CrateDBContainer.CRATEDB_PG_PORT, CrateDBContainer.CRATEDB_HTTP_PORT); assertThat(cratedb.getLivenessCheckPortNumbers()) From 20763c6811cc3eb09fa13a84e2b9035b79659ad9 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Thu, 30 Mar 2023 11:47:35 +0300 Subject: [PATCH 08/10] remove legacy container/driver --- docs/modules/databases/cratedb.md | 2 - docs/modules/databases/jdbc.md | 8 +- modules/cratedb/build.gradle | 1 - .../CrateDBLegacyDriverContainer.java | 31 ------- .../CrateDBLegacyDriverContainerProvider.java | 19 ----- ...s.containers.JdbcDatabaseContainerProvider | 1 - .../CrateDBLegacyDriverConnectionURLTest.java | 84 ------------------- .../jdbc/cratedb/CrateDBJDBCDriverTest.java | 6 +- .../SimpleCrateDBLegacyDriverTest.java | 76 ----------------- 9 files changed, 5 insertions(+), 223 deletions(-) delete mode 100644 modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java delete mode 100644 modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java delete mode 100644 modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java delete mode 100644 modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java diff --git a/docs/modules/databases/cratedb.md b/docs/modules/databases/cratedb.md index b9a8a533a68..74ec23dda00 100644 --- a/docs/modules/databases/cratedb.md +++ b/docs/modules/databases/cratedb.md @@ -22,6 +22,4 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: !!! hint Adding this Testcontainers library JAR will not automatically add a database driver JAR to your project. You should ensure that your project also has a suitable database driver as a dependency. - If you'd like to use the PostgreSQL JDBC Driver, use `org.postgresql:postgresql`, if you'd like to use CrateDB's JDBC driver, use `io.crate:crate-jdbc`. - diff --git a/docs/modules/databases/jdbc.md b/docs/modules/databases/jdbc.md index 4bfa94308c1..020a96ff941 100644 --- a/docs/modules/databases/jdbc.md +++ b/docs/modules/databases/jdbc.md @@ -31,10 +31,6 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database `jdbc:tc:mysql:5.7.34:///databasename` -#### Using CrateDB - -`jdbc:tc:cratedb:5.2.3//localhost:5432/crate` or `jdbc:tc:cratedblegacy:5.2.3//localhost:5432/crate` - #### Using PostgreSQL `jdbc:tc:postgresql:9.6.8:///databasename` @@ -55,6 +51,10 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database `jdbc:tc:cockroach:v21.2.3:///databasename` +#### Using CrateDB + +`jdbc:tc:cratedb:5.2.3//localhost:5432/crate` + #### Using TiDB `jdbc:tc:tidb:v6.1.0:///databasename` diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index 9cf7f19cba9..d53031542f5 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -7,7 +7,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testImplementation 'io.crate:crate-jdbc:2.6.0' testImplementation 'org.postgresql:postgresql:42.5.4' compileOnly 'org.jetbrains:annotations:24.0.0' diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java deleted file mode 100644 index bdc23c77b4a..00000000000 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainer.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.testcontainers.containers; - -import org.testcontainers.utility.DockerImageName; - -public class CrateDBLegacyDriverContainer extends CrateDBContainer { - - public static final String NAME = "cratedblegacy"; - - public CrateDBLegacyDriverContainer(final DockerImageName dockerImageName) { - super(dockerImageName); - } - - @Override - public String getDriverClassName() { - return "io.crate.client.jdbc.CrateDriver"; - } - - @Override - public String getJdbcUrl() { - String additionalUrlParams = constructUrlParameters("?", "&"); - return ( - "jdbc:crate://" + - getHost() + - ":" + - getMappedPort(CRATEDB_PG_PORT) + - "/" + - getDatabaseName() + - additionalUrlParams - ); - } -} diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java b/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java deleted file mode 100644 index c427467ac9c..00000000000 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBLegacyDriverContainerProvider.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.testcontainers.containers; - -import org.testcontainers.utility.DockerImageName; - -/** - * Factory for CrateDB containers using its own legacy JDBC driver. - */ -public class CrateDBLegacyDriverContainerProvider extends JdbcDatabaseContainerProvider { - - @Override - public boolean supports(String databaseType) { - return databaseType.equals(CrateDBLegacyDriverContainer.NAME); - } - - @Override - public JdbcDatabaseContainer newInstance(String tag) { - return new CrateDBLegacyDriverContainer(DockerImageName.parse(CrateDBContainer.IMAGE).withTag(tag)); - } -} diff --git a/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider index 67745735f2b..e0a3c27a029 100644 --- a/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider +++ b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider @@ -1,2 +1 @@ org.testcontainers.containers.CrateDBContainerProvider -org.testcontainers.containers.CrateDBLegacyDriverContainerProvider diff --git a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java deleted file mode 100644 index 9d93be9d8c3..00000000000 --- a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBLegacyDriverConnectionURLTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.testcontainers.containers; - -import org.junit.Test; -import org.testcontainers.CrateDBTestImages; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.catchThrowable; - -public class CrateDBLegacyDriverConnectionURLTest { - - @Test - public void shouldCorrectlyAppendQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); - String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); - String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); - - assertThat(queryString) - .as("Query String contains expected params") - .contains("?stringtype=unspecified&stringtype=unspecified"); - assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); - assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); - } - - @Test - public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { - CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); - String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); - String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); - - assertThat(queryString) - .as("Query String contains expected params") - .contains("?stringtype=unspecified&stringtype=unspecified"); - assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); - assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); - } - - @Test - public void shouldReturnOriginalURLWhenEmptyQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); - String connectionUrl = cratedb.constructUrlForConnection(""); - - assertThat(cratedb.getJdbcUrl()).as("Query String remains unchanged").isEqualTo(connectionUrl); - } - - @Test - public void shouldRejectInvalidQueryString() { - assertThat( - catchThrowable(() -> { - new NoParamsUrlCrateDBContainer().constructUrlForConnection("stringtype=unspecified"); - }) - ) - .as("Fails when invalid query string provided") - .isInstanceOf(IllegalArgumentException.class); - } - - static class FixedJdbcUrlCrateDBContainer extends CrateDBLegacyDriverContainer { - - public FixedJdbcUrlCrateDBContainer() { - super(CrateDBTestImages.CRATEDB_TEST_IMAGE); - } - - @Override - public String getHost() { - return "localhost"; - } - - @Override - public Integer getMappedPort(int originalPort) { - return 5432; - } - } - - static class NoParamsUrlCrateDBContainer extends CrateDBLegacyDriverContainer { - - public NoParamsUrlCrateDBContainer() { - super(CrateDBTestImages.CRATEDB_TEST_IMAGE); - } - - @Override - public String getJdbcUrl() { - return "jdbc:crate://host:port/database"; - } - } -} diff --git a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java index 6f1d95128a2..c065423f209 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java @@ -14,11 +14,7 @@ public class CrateDBJDBCDriverTest extends AbstractJDBCDriverTest { public static Iterable data() { return Arrays.asList( new Object[][] { - { "jdbc:tc:cratedb:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class) }, - { - "jdbc:tc:cratedblegacy:5.2.3://hostname/crate?user=crate&password=somepwd", - EnumSet.noneOf(Options.class), - }, + { "jdbc:tc:cratedb:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class) } } ); } diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java deleted file mode 100644 index 7eb4b6d54eb..00000000000 --- a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBLegacyDriverTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.testcontainers.junit.cratedb; - -import org.junit.Test; -import org.testcontainers.CrateDBTestImages; -import org.testcontainers.containers.CrateDBContainer; -import org.testcontainers.containers.CrateDBLegacyDriverContainer; -import org.testcontainers.db.AbstractContainerDatabaseTest; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.logging.Level; -import java.util.logging.LogManager; - -import static org.assertj.core.api.Assertions.assertThat; - -public class SimpleCrateDBLegacyDriverTest extends AbstractContainerDatabaseTest { - static { - // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing - LogManager.getLogManager().getLogger("").setLevel(Level.OFF); - } - - @Test - public void testSimple() throws SQLException { - try ( - CrateDBLegacyDriverContainer cratedb = new CrateDBLegacyDriverContainer( - CrateDBTestImages.CRATEDB_TEST_IMAGE - ) - ) { - cratedb.start(); - - ResultSet resultSet = performQuery(cratedb, "SELECT 1"); - int resultSetInt = resultSet.getInt(1); - assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); - assertHasCorrectExposedAndLivenessCheckPorts(cratedb); - } - } - - @Test - public void testCommandOverride() throws SQLException { - try ( - CrateDBContainer cratedb = new CrateDBLegacyDriverContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) - .withCommand("crate -C cluster.name=testcontainers") - ) { - cratedb.start(); - - ResultSet resultSet = performQuery(cratedb, "select name from sys.cluster"); - String result = resultSet.getString(1); - assertThat(result).as("cluster name should be overriden").isEqualTo("testcontainers"); - } - } - - @Test - public void testExplicitInitScript() throws SQLException { - try ( - CrateDBContainer cratedb = new CrateDBLegacyDriverContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) - .withInitScript("somepath/init_cratedb.sql") - ) { - cratedb.start(); - - ResultSet resultSet = performQuery(cratedb, "SELECT foo FROM bar"); - - String firstColumnValue = resultSet.getString(1); - assertThat(firstColumnValue).as("Value from init script should equal real value").isEqualTo("hello world"); - } - } - - private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBLegacyDriverContainer cratedb) { - assertThat(cratedb.getExposedPorts()) - .containsExactly(CrateDBContainer.CRATEDB_PG_PORT, CrateDBContainer.CRATEDB_HTTP_PORT); - assertThat(cratedb.getLivenessCheckPortNumbers()) - .containsExactlyInAnyOrder( - cratedb.getMappedPort(CrateDBContainer.CRATEDB_PG_PORT), - cratedb.getMappedPort(CrateDBContainer.CRATEDB_HTTP_PORT) - ); - } -} From d4c1489a45bc47bcd9a7ec90db38211d39ba609f Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Thu, 30 Mar 2023 11:55:28 +0300 Subject: [PATCH 09/10] fix checkstyle --- .../org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java index c065423f209..54ef9704ac5 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java @@ -14,7 +14,7 @@ public class CrateDBJDBCDriverTest extends AbstractJDBCDriverTest { public static Iterable data() { return Arrays.asList( new Object[][] { - { "jdbc:tc:cratedb:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class) } + { "jdbc:tc:cratedb:5.2.3://hostname/crate?user=crate&password=somepwd", EnumSet.noneOf(Options.class) }, } ); } From 10d833fc261c9862239bb060a21be1c709942371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 31 Mar 2023 17:34:28 -0500 Subject: [PATCH 10/10] Polish --- .../CrateDBContainer.java | 15 ++-- .../CrateDBContainerProvider.java | 4 +- ...s.containers.JdbcDatabaseContainerProvider | 2 +- .../containers/CrateDBConnectionURLTest.java | 84 ------------------- .../junit/cratedb/SimpleCrateDBTest.java | 10 +-- 5 files changed, 15 insertions(+), 100 deletions(-) rename modules/cratedb/src/main/java/org/testcontainers/{containers => cratedb}/CrateDBContainer.java (85%) rename modules/cratedb/src/main/java/org/testcontainers/{containers => cratedb}/CrateDBContainerProvider.java (85%) delete mode 100644 modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java b/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainer.java similarity index 85% rename from modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java rename to modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainer.java index 23a601a0256..45cd03f460a 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainer.java +++ b/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainer.java @@ -1,6 +1,7 @@ -package org.testcontainers.containers; +package org.testcontainers.cratedb; import org.jetbrains.annotations.NotNull; +import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; @@ -8,17 +9,17 @@ public class CrateDBContainer extends JdbcDatabaseContainer { - public static final String NAME = "cratedb"; + static final String NAME = "cratedb"; - public static final String IMAGE = "crate"; + static final String IMAGE = "crate"; - public static final String DEFAULT_TAG = "5.2.5"; + static final String DEFAULT_TAG = "5.2.5"; - protected static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("crate"); + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("crate"); - public static final Integer CRATEDB_PG_PORT = 5432; + static final Integer CRATEDB_PG_PORT = 5432; - public static final Integer CRATEDB_HTTP_PORT = 4200; + static final Integer CRATEDB_HTTP_PORT = 4200; private String databaseName = "crate"; diff --git a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java b/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainerProvider.java similarity index 85% rename from modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java rename to modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainerProvider.java index a390a68c241..0bf80f051ec 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/containers/CrateDBContainerProvider.java +++ b/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainerProvider.java @@ -1,5 +1,7 @@ -package org.testcontainers.containers; +package org.testcontainers.cratedb; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.JdbcDatabaseContainerProvider; import org.testcontainers.jdbc.ConnectionUrl; import org.testcontainers.utility.DockerImageName; diff --git a/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider index e0a3c27a029..ddd58ec8794 100644 --- a/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider +++ b/modules/cratedb/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider @@ -1 +1 @@ -org.testcontainers.containers.CrateDBContainerProvider +org.testcontainers.cratedb.CrateDBContainerProvider diff --git a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java b/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java deleted file mode 100644 index 4afc5484ddc..00000000000 --- a/modules/cratedb/src/test/java/org/testcontainers/containers/CrateDBConnectionURLTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.testcontainers.containers; - -import org.junit.Test; -import org.testcontainers.CrateDBTestImages; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.catchThrowable; - -public class CrateDBConnectionURLTest { - - @Test - public void shouldCorrectlyAppendQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); - String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); - String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); - - assertThat(queryString) - .as("Query String contains expected params") - .contains("?stringtype=unspecified&stringtype=unspecified"); - assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); - assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); - } - - @Test - public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { - CrateDBContainer cratedb = new NoParamsUrlCrateDBContainer(); - String connectionUrl = cratedb.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); - String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); - - assertThat(queryString) - .as("Query String contains expected params") - .contains("?stringtype=unspecified&stringtype=unspecified"); - assertThat(queryString.indexOf('?')).as("Query String starts with '?'").isZero(); - assertThat(queryString.substring(1)).as("Query String does not contain extra '?'").doesNotContain("?"); - } - - @Test - public void shouldReturnOriginalURLWhenEmptyQueryString() { - CrateDBContainer cratedb = new FixedJdbcUrlCrateDBContainer(); - String connectionUrl = cratedb.constructUrlForConnection(""); - - assertThat(cratedb.getJdbcUrl()).as("Query String remains unchanged").isEqualTo(connectionUrl); - } - - @Test - public void shouldRejectInvalidQueryString() { - assertThat( - catchThrowable(() -> { - new NoParamsUrlCrateDBContainer().constructUrlForConnection("stringtype=unspecified"); - }) - ) - .as("Fails when invalid query string provided") - .isInstanceOf(IllegalArgumentException.class); - } - - static class FixedJdbcUrlCrateDBContainer extends CrateDBContainer { - - public FixedJdbcUrlCrateDBContainer() { - super(CrateDBTestImages.CRATEDB_TEST_IMAGE); - } - - @Override - public String getHost() { - return "localhost"; - } - - @Override - public Integer getMappedPort(int originalPort) { - return 5432; - } - } - - static class NoParamsUrlCrateDBContainer extends CrateDBContainer { - - public NoParamsUrlCrateDBContainer() { - super(CrateDBTestImages.CRATEDB_TEST_IMAGE); - } - - @Override - public String getJdbcUrl() { - return "jdbc:postgresql://host:port/database"; - } - } -} diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java index 680c14deab5..ea7bb1a4f10 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java @@ -2,7 +2,7 @@ import org.junit.Test; import org.testcontainers.CrateDBTestImages; -import org.testcontainers.containers.CrateDBContainer; +import org.testcontainers.cratedb.CrateDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -60,12 +60,8 @@ public void testExplicitInitScript() throws SQLException { } private void assertHasCorrectExposedAndLivenessCheckPorts(CrateDBContainer cratedb) { - assertThat(cratedb.getExposedPorts()) - .containsExactly(CrateDBContainer.CRATEDB_PG_PORT, CrateDBContainer.CRATEDB_HTTP_PORT); + assertThat(cratedb.getExposedPorts()).containsExactly(5432, 4200); assertThat(cratedb.getLivenessCheckPortNumbers()) - .containsExactlyInAnyOrder( - cratedb.getMappedPort(CrateDBContainer.CRATEDB_PG_PORT), - cratedb.getMappedPort(CrateDBContainer.CRATEDB_HTTP_PORT) - ); + .containsExactlyInAnyOrder(cratedb.getMappedPort(5432), cratedb.getMappedPort(4200)); } }