diff --git a/core/pom.xml b/core/pom.xml
index 74d74b2e2ae..729f55bc3af 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -27,7 +27,7 @@
org.rnorth.duct-tape
duct-tape
- 1.0.5
+ 1.0.6
org.slf4j
diff --git a/modules/virtuoso/src/main/java/org/testcontainers/containers/VirtuosoContainer.java b/modules/virtuoso/src/main/java/org/testcontainers/containers/VirtuosoContainer.java
index 29865bec34c..3f601b22812 100644
--- a/modules/virtuoso/src/main/java/org/testcontainers/containers/VirtuosoContainer.java
+++ b/modules/virtuoso/src/main/java/org/testcontainers/containers/VirtuosoContainer.java
@@ -1,64 +1,106 @@
package org.testcontainers.containers;
-import org.testcontainers.containers.JdbcDatabaseContainer;
+import org.rnorth.ducttape.inconsistents.Inconsistents;
+import org.rnorth.ducttape.ratelimits.RateLimiter;
+import org.rnorth.ducttape.ratelimits.RateLimiterBuilder;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.concurrent.TimeUnit;
public class VirtuosoContainer> extends JdbcDatabaseContainer {
- public static final String NAME = "virtuoso";
- public static final String IMAGE = "tenforce/virtuoso";
- public static final Integer JDBC_PORT = 1111;
- public static final Integer SPARQL_SERVICE_PORT = 8890;
-
- public VirtuosoContainer() {
- super(IMAGE + ":latest");
- }
-
- public VirtuosoContainer(String dockerImageName) {
- super(dockerImageName);
- }
-
- @Override
- protected void configure() {
- addExposedPort(JDBC_PORT);
- addExposedPort(SPARQL_SERVICE_PORT);
- addEnv("DBA_PASSWORD", getPassword());
- addEnv("SPARQL_UPDATE", "true");
- addEnv("DEFAULT_GRAPH", "http://localhost:8890/DAV");
- addExposedPorts(JDBC_PORT, SPARQL_SERVICE_PORT);
- }
-
- @Override
- protected String getDriverClassName() {
- return "virtuoso.jdbc4.Driver";
- }
-
- @Override
- public String getJdbcUrl() {
- return "jdbc:virtuoso://" + getContainerIpAddress() + ":" + getMappedPort(JDBC_PORT);
- }
-
- public String getSparqlUrl() {
- return "http://" + getContainerIpAddress() + ":" + getMappedPort(SPARQL_SERVICE_PORT) + "/sparql";
- }
-
- @Override
- public String getUsername() {
- return "dba";
- }
-
- @Override
- public String getPassword() {
- return "myDbaPassword";
- }
-
- @Override
- protected String getTestQueryString() {
- return "SELECT 1";
- }
-
- @Override
- protected Integer getLivenessCheckPort() {
- return getMappedPort(JDBC_PORT);
- }
+ public static final String NAME = "virtuoso";
+ public static final String IMAGE = "tenforce/virtuoso";
+ public static final Integer JDBC_PORT = 1111;
+ public static final Integer SPARQL_SERVICE_PORT = 8890;
+ private static final RateLimiter LIVENESS_RATE_LIMITER = RateLimiterBuilder.newBuilder()
+ .withConstantThroughput()
+ .withRate(1, TimeUnit.SECONDS)
+ .build();
+
+ public VirtuosoContainer() {
+ super(IMAGE + ":1.0.0-virtuoso7.2.2");
+ }
+
+ public VirtuosoContainer(String dockerImageName) {
+ super(dockerImageName);
+ }
+
+ @Override
+ protected void configure() {
+ addExposedPort(JDBC_PORT);
+ addExposedPort(SPARQL_SERVICE_PORT);
+ addEnv("DBA_PASSWORD", getPassword());
+ addEnv("SPARQL_UPDATE", "true");
+ addEnv("DEFAULT_GRAPH", "http://localhost:8890/DAV");
+ addExposedPorts(JDBC_PORT, SPARQL_SERVICE_PORT);
+ }
+
+ @Override
+ protected String getDriverClassName() {
+ return "virtuoso.jdbc4.Driver";
+ }
+
+ @Override
+ public String getJdbcUrl() {
+ return "jdbc:virtuoso://" + getContainerIpAddress() + ":" + getMappedPort(JDBC_PORT);
+ }
+
+ public String getSparqlUrl() {
+ return "http://" + getContainerIpAddress() + ":" + getMappedPort(SPARQL_SERVICE_PORT) + "/sparql";
+ }
+
+ @Override
+ public String getUsername() {
+ return "dba";
+ }
+
+ @Override
+ public String getPassword() {
+ return "myDbaPassword";
+ }
+
+ @Override
+ protected String getTestQueryString() {
+ return "SELECT 1";
+ }
+
+ @Override
+ protected Integer getLivenessCheckPort() {
+ return getMappedPort(JDBC_PORT);
+ }
+
+ @Override
+ protected void waitUntilContainerStarted() {
+ // Repeatedly try and open a connection to the DB and execute a test query
+
+ logger().info("Waiting for database connection to become available at {} using query '{}'", getJdbcUrl(), getTestQueryString());
+
+ // Wait for consecutive JDBC connection successes over a period of time. The Virtuoso container seems
+ // to initially return a connection that fails on subsequent attempts, so wait for a consistently stable connection
+ Inconsistents.retryUntilConsistent(5, 120, TimeUnit.SECONDS, () -> {
+ //noinspection CodeBlock2Expr
+ return LIVENESS_RATE_LIMITER.getWhenReady(() -> {
+ if (!isRunning()) {
+ throw new ContainerLaunchException("Container failed to start");
+ }
+
+ try {
+ Connection connection = createConnection("");
+
+ boolean success = connection.createStatement().execute(this.getTestQueryString());
+ if (success) {
+ logger().info("Obtained a connection to container ({})", this.getJdbcUrl());
+ return true;
+ } else {
+ throw new SQLException("Failed to execute test query");
+ }
+ } catch (SQLException e) {
+ throw new ContainerLaunchException(e.getMessage());
+ }
+ });
+ });
+ }
}
diff --git a/modules/virtuoso/src/test/java/org/testcontainers/containers/VirtuosoJDBCDriverTest.java b/modules/virtuoso/src/test/java/org/testcontainers/containers/VirtuosoJDBCDriverTest.java
index fe52518d3cc..19edef04282 100644
--- a/modules/virtuoso/src/test/java/org/testcontainers/containers/VirtuosoJDBCDriverTest.java
+++ b/modules/virtuoso/src/test/java/org/testcontainers/containers/VirtuosoJDBCDriverTest.java
@@ -14,8 +14,8 @@
public class VirtuosoJDBCDriverTest {
@Test
- public void testVirtuosoWithNoSpecifiedVersion() throws SQLException {
- performSimpleTest("jdbc:tc:virtuoso://hostname/databasename");
+ public void testVirtuosoWithSpecifiedVersion() throws SQLException {
+ performSimpleTest("jdbc:tc:virtuoso:1.0.0-virtuoso7.2.2://hostname/databasename");
}
diff --git a/modules/virtuoso/src/test/resources/logback-test.xml b/modules/virtuoso/src/test/resources/logback-test.xml
index 4c96fd1b863..634cc113fd0 100644
--- a/modules/virtuoso/src/test/resources/logback-test.xml
+++ b/modules/virtuoso/src/test/resources/logback-test.xml
@@ -16,5 +16,6 @@
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index c1290556166..efd404073f1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -160,6 +160,7 @@
proprietary-deps
modules/oracle-xe
+ modules/virtuoso