GORA-669 Improve tests stability on Jenkins (#233)
* Synchronize Maven options in Github Actions (`.github/workflows/master-pr-build.yml`) and Jenkins build (`Jenkinsfile`)
* Upgrade testcontainers to 1.14.3
* Use upstream `MongoDBContainer` and remove our old `MongoContainer` implementation
* Rework our `*LogWaitStrategy` to reduce boilerplate code
* Improve stability of our `GoraMongodbAuthenticationTestDriver` by assuring that "waiting for connections" log message if present twice (because MongoDB docker container restart daemon itself)
* Reduce log verbosity of gora-solr tests
* Enforce a global `forkedProcessTimeoutInSeconds` of 40 minutes in pom.xml
diff --git a/.github/workflows/master-pr-build.yml b/.github/workflows/master-pr-build.yml
index 5d2a207..5ab3b17 100644
--- a/.github/workflows/master-pr-build.yml
+++ b/.github/workflows/master-pr-build.yml
@@ -21,6 +21,10 @@
pull_request:
branches:
- master
+
+env:
+ MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version --no-transfer-progress"
+
jobs:
build:
runs-on: ubuntu-latest
@@ -28,10 +32,14 @@
matrix:
java: [ '1.8' ]
steps:
- - uses: actions/checkout@v1
- - name: Set up JDK ${{ matrix.java }}
- uses: actions/setup-java@v1
- with:
- java-version: ${{ matrix.java }}
- - name: mvn sourcecheck
- run: mvn --no-transfer-progress --batch-mode clean install
\ No newline at end of file
+ - uses: actions/checkout@v2
+ - name: Set up JDK ${{ matrix.java }}
+ uses: actions/setup-java@v1
+ with:
+ java-version: ${{ matrix.java }}
+
+ - name: Build
+ run: mvn $MAVEN_CLI_OPTS -DskipTests clean install
+
+ - name: Test
+ run: mvn $MAVEN_CLI_OPTS verify
\ No newline at end of file
diff --git a/.github/workflows/master-push-build.yml b/.github/workflows/master-push-build.yml
index 3e3c627..517f455 100644
--- a/.github/workflows/master-push-build.yml
+++ b/.github/workflows/master-push-build.yml
@@ -21,6 +21,10 @@
push:
branches:
- master
+
+env:
+ MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version --no-transfer-progress"
+
jobs:
build:
runs-on: ubuntu-latest
@@ -28,10 +32,14 @@
matrix:
java: [ '1.8' ]
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- - name: mvn sourcecheck
- run: mvn --no-transfer-progress --batch-mode clean install
\ No newline at end of file
+
+ - name: Build
+ run: mvn $MAVEN_CLI_OPTS -DskipTests clean install
+
+ - name: Test
+ run: mvn $MAVEN_CLI_OPTS verify
\ No newline at end of file
diff --git a/Jenkinsfile b/Jenkinsfile
index b3eebee..cbae42f 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -50,7 +50,7 @@
// only keep the latest 10 builds
buildDiscarder logRotator(numToKeepStr: '10')
// cancel build if not complete within two hours of scheduling
- timeout time: 2, unit: 'HOURS'
+ timeout time: 3, unit: 'HOURS'
disableConcurrentBuilds()
}
@@ -86,7 +86,7 @@
post {
always {
- junit '**/target/surefire-reports/TEST-*.xml'
+ junit testResults: '**/target/surefire-reports/TEST-*.xml', testDataPublishers: [[$class: 'StabilityTestDataPublisher']]
}
}
}
diff --git a/gora-aerospike/src/test/java/org/apache/gora/aerospike/mapreduce/TestAerospikeStoreMapReduceSerialization.java b/gora-aerospike/src/test/java/org/apache/gora/aerospike/mapreduce/TestAerospikeStoreMapReduceSerialization.java
index b8f281e..58c1654 100644
--- a/gora-aerospike/src/test/java/org/apache/gora/aerospike/mapreduce/TestAerospikeStoreMapReduceSerialization.java
+++ b/gora-aerospike/src/test/java/org/apache/gora/aerospike/mapreduce/TestAerospikeStoreMapReduceSerialization.java
@@ -22,11 +22,10 @@
import org.apache.gora.mapreduce.MapReduceTestUtils;
import org.apache.gora.store.DataStoreFactory;
import org.apache.hadoop.conf.Configuration;
-import org.junit.Test;
-import org.junit.Before;
import org.junit.After;
+import org.junit.Before;
import org.junit.ClassRule;
-
+import org.junit.Test;
import org.testcontainers.containers.GenericContainer;
import java.time.Duration;
diff --git a/gora-aerospike/src/test/java/org/apache/gora/aerospike/store/AerospikeStartupLogWaitStrategy.java b/gora-aerospike/src/test/java/org/apache/gora/aerospike/store/AerospikeStartupLogWaitStrategy.java
index 8b9cf5e..4881f93 100644
--- a/gora-aerospike/src/test/java/org/apache/gora/aerospike/store/AerospikeStartupLogWaitStrategy.java
+++ b/gora-aerospike/src/test/java/org/apache/gora/aerospike/store/AerospikeStartupLogWaitStrategy.java
@@ -18,36 +18,17 @@
package org.apache.gora.aerospike.store;
-import org.testcontainers.containers.ContainerLaunchException;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.OutputFrame;
-import org.testcontainers.containers.output.WaitingConsumer;
+import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Predicate;
-
-public class AerospikeStartupLogWaitStrategy extends GenericContainer.AbstractWaitStrategy {
+public class AerospikeStartupLogWaitStrategy extends LogMessageWaitStrategy {
private static final String regEx = ".*heartbeat-received: self 0 foreign 0.*";
private int times = 2;
- protected void waitUntilReady() {
- WaitingConsumer waitingConsumer = new WaitingConsumer();
- this.container.followOutput(waitingConsumer);
- Predicate waitPredicate = (outputFrame) -> {
- String trimmedFrameText = ((OutputFrame) outputFrame).getUtf8String().replaceFirst("\n$", "");
- return trimmedFrameText.matches(regEx);
- };
-
- try {
- waitingConsumer.waitUntil(waitPredicate, this.startupTimeout.getSeconds(), TimeUnit.SECONDS,
- this.times);
- } catch (TimeoutException var4) {
- throw new ContainerLaunchException(
- "Timed out waiting for log output matching Aerospike server startup Log \'" + regEx
- + "\'");
- }
+ public AerospikeStartupLogWaitStrategy() {
+ withRegEx(regEx);
+ withTimes(times);
}
+
}
\ No newline at end of file
diff --git a/gora-benchmark/pom.xml b/gora-benchmark/pom.xml
index c8d6e9d..811cd68 100644
--- a/gora-benchmark/pom.xml
+++ b/gora-benchmark/pom.xml
@@ -188,9 +188,8 @@
</dependency>
<dependency>
- <groupId>org.apache.gora</groupId>
- <artifactId>gora-mongodb</artifactId>
- <type>test-jar</type>
+ <groupId>org.testcontainers</groupId>
+ <artifactId>mongodb</artifactId>
<scope>test</scope>
</dependency>
@@ -199,5 +198,6 @@
<groupId>org.ektorp</groupId>
<artifactId>org.ektorp</artifactId>
</dependency>
+
</dependencies>
</project>
diff --git a/gora-benchmark/src/test/java/org/apache/gora/benchmark/GoraClientTest.java b/gora-benchmark/src/test/java/org/apache/gora/benchmark/GoraClientTest.java
index 91a7c07..7ce0127 100644
--- a/gora-benchmark/src/test/java/org/apache/gora/benchmark/GoraClientTest.java
+++ b/gora-benchmark/src/test/java/org/apache/gora/benchmark/GoraClientTest.java
@@ -17,9 +17,7 @@
*/
package org.apache.gora.benchmark;
-import com.mongodb.ServerAddress;
import org.apache.gora.benchmark.generated.User;
-import org.apache.gora.mongodb.MongoContainer;
import org.apache.gora.store.DataStoreFactory;
import org.apache.gora.util.GoraException;
import org.junit.After;
@@ -27,6 +25,7 @@
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.MongoDBContainer;
import site.ycsb.ByteIterator;
import site.ycsb.Status;
import site.ycsb.StringByteIterator;
@@ -50,7 +49,7 @@
private static HashMap<String, ByteIterator> DATA_TO_UPDATE;
private static HashMap<String, ByteIterator> INTEGER_DATA;
private static boolean isMongoDBSetupDone = false;
- private static MongoContainer mongo;
+ private static MongoDBContainer mongo;
/**
* Setup MongoDB embed cluster. This function will auto provision a MongoDB
@@ -60,11 +59,10 @@
private void setupMongoDBCluster() {
try {
if (!isMongoDBSetupDone) {
- mongo = new MongoContainer("3.6");
+ mongo = new MongoDBContainer("mongo:3.6");
mongo.start();
}
- ServerAddress address = mongo.getServerAddress();
- LOG.info("Started MongoDB Server on " + address.getHost() + ":" + address.getPort());
+ LOG.info("Started MongoDB Server on " + mongo.getReplicaSetUrl());
isMongoDBSetupDone = true;
} catch (Exception e) {
LOG.info("Cannot Start MongoDB Server {}", e.getMessage(), e);
@@ -99,8 +97,7 @@
String dataStoreToTest = GoraBenchmarkUtils.getDataBase(dataStoreProperties);
if (Constants.MONGODB.equals(dataStoreToTest)) {
setupMongoDBCluster();
- ServerAddress address = mongo.getServerAddress();
- properties.setProperty("gora.mongodb.servers", address.getHost() + ":" + address.getPort());
+ properties.setProperty("gora.mongodb.servers", mongo.getContainerIpAddress() + ":" + mongo.getFirstMappedPort());
}
benchmarkClient = new GoraBenchmarkClient();
diff --git a/gora-couchdb/pom.xml b/gora-couchdb/pom.xml
index 4ff0b93..e1add43 100644
--- a/gora-couchdb/pom.xml
+++ b/gora-couchdb/pom.xml
@@ -154,12 +154,6 @@
</dependency>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-simple</artifactId>
- <scope>compile</scope>
- </dependency>
-
- <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>runtime</scope>
diff --git a/gora-couchdb/src/test/java/org/apache/gora/couchdb/CouchDBStartupLogWaitStrategy.java b/gora-couchdb/src/test/java/org/apache/gora/couchdb/CouchDBStartupLogWaitStrategy.java
index 7cd06cf..6fc043d 100644
--- a/gora-couchdb/src/test/java/org/apache/gora/couchdb/CouchDBStartupLogWaitStrategy.java
+++ b/gora-couchdb/src/test/java/org/apache/gora/couchdb/CouchDBStartupLogWaitStrategy.java
@@ -18,43 +18,19 @@
package org.apache.gora.couchdb;
-import org.testcontainers.containers.ContainerLaunchException;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.OutputFrame;
-import org.testcontainers.containers.output.WaitingConsumer;
+import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Predicate;
/**
* Log based CouchDB server startup wait strategy to sync server
* startup to test suit startup.
*/
-public class CouchDBStartupLogWaitStrategy extends GenericContainer.AbstractWaitStrategy {
+public class CouchDBStartupLogWaitStrategy extends LogMessageWaitStrategy {
private static final String regEx = ".*Apache CouchDB has started. Time to relax..*";
- private int times = 1;
-
- protected void waitUntilReady() {
- WaitingConsumer waitingConsumer = new WaitingConsumer();
- this.container.followOutput(waitingConsumer);
- Predicate waitPredicate = (outputFrame) -> {
- String trimmedFrameText = ((OutputFrame) outputFrame)
- .getUtf8String()
- .replaceFirst("\n$", "");
- return trimmedFrameText.matches(regEx);
- };
-
- try {
- waitingConsumer.waitUntil(waitPredicate, this.startupTimeout.getSeconds(), TimeUnit.SECONDS,
- this.times);
- } catch (TimeoutException var4) {
- throw new ContainerLaunchException(
- "Timed out waiting for log output matching CouchDB server startup Log \'" + regEx
- + "\'");
- }
+ public CouchDBStartupLogWaitStrategy() {
+ withRegEx(regEx);
}
}
\ No newline at end of file
diff --git a/gora-hive/src/test/java/org/apache/gora/hive/store/TestHiveStore.java b/gora-hive/src/test/java/org/apache/gora/hive/store/TestHiveStore.java
index 0d635f2..003d8ec 100644
--- a/gora-hive/src/test/java/org/apache/gora/hive/store/TestHiveStore.java
+++ b/gora-hive/src/test/java/org/apache/gora/hive/store/TestHiveStore.java
@@ -35,6 +35,7 @@
import org.apache.gora.util.GoraException;
import org.apache.gora.util.StringUtils;
import org.junit.Ignore;
+import org.junit.Test;
/**
* HiveStore Tests extending {@link DataStoreTestBase} which run the base JUnit test suite for
diff --git a/gora-mongodb/pom.xml b/gora-mongodb/pom.xml
index e802e0f..bd43ae5 100644
--- a/gora-mongodb/pom.xml
+++ b/gora-mongodb/pom.xml
@@ -193,6 +193,13 @@
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.testcontainers</groupId>
+ <artifactId>mongodb</artifactId>
+ <scope>test</scope>
+ </dependency>
+
<!-- END of Testing Dependencies -->
</dependencies>
diff --git a/gora-mongodb/src/test/conf/log4j.properties b/gora-mongodb/src/test/conf/log4j.properties
new file mode 100644
index 0000000..0256aa9
--- /dev/null
+++ b/gora-mongodb/src/test/conf/log4j.properties
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+log4j.rootLogger=INFO, Console
+
+log4j.logger.org.testcontainers=INFO
+log4j.logger.com.github.dockerjava=WARN
+
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.Console.layout.ConversionPattern=%d{ISO8601} %x %-5p [%c{3}] [%t] %m%n
+
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/GoraMongodbTestDriver.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/GoraMongodbTestDriver.java
index 73a60bb..f54b0bb 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/GoraMongodbTestDriver.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/GoraMongodbTestDriver.java
@@ -18,12 +18,12 @@
package org.apache.gora.mongodb;
import com.mongodb.MongoClient;
-import com.mongodb.ServerAddress;
import org.apache.gora.GoraTestDriver;
import org.apache.gora.mongodb.store.MongoStore;
import org.apache.gora.mongodb.store.MongoStoreParameters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.MongoDBContainer;
/**
* Driver to set up an embedded MongoDB database instance for use in our
@@ -34,13 +34,13 @@
private static Logger log = LoggerFactory
.getLogger(GoraMongodbTestDriver.class);
- private MongoContainer _container;
+ private MongoDBContainer _container;
private MongoClient _mongo;
/**
* Constructor for this class.
*/
- public GoraMongodbTestDriver(MongoContainer startedContainer) {
+ public GoraMongodbTestDriver(MongoDBContainer startedContainer) {
super(MongoStore.class);
this._container = startedContainer;
}
@@ -50,9 +50,8 @@
*/
@Override
public void setUpClass() {
- ServerAddress address = _container.getServerAddress();
- int port = address.getPort();
- String host = address.getHost();
+ int port = _container.getMappedPort(27017);
+ String host = _container.getContainerIpAddress();
// Store Mongo server "host:port" in Hadoop configuration
// so that MongoStore will be able to get it latter
@@ -64,8 +63,6 @@
*/
@Override
public void tearDownClass() {
- log.info("Shutting down mongodb server...");
- _container.stop();
}
}
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/MongoContainer.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/MongoContainer.java
deleted file mode 100644
index 231d82c..0000000
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/MongoContainer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.gora.mongodb;
-
-import com.mongodb.ServerAddress;
-import org.testcontainers.containers.GenericContainer;
-
-/**
- * Use {@link GenericContainer}
- * from <a href="https://www.testcontainers.org/">Testcontainers.org</a> project
- * to handle a MongoDB docker container.
- */
-public class MongoContainer extends GenericContainer<MongoContainer> {
-
- public static final int MONGO_PORT = 27017;
-
- public MongoContainer(String version) {
- super("mongo:" + version);
- withExposedPorts(MONGO_PORT);
- }
-
- public ServerAddress getServerAddress() {
- String ipAddress = getContainerIpAddress();
- int port = getMongoPort();
- return new ServerAddress(ipAddress, port);
- }
-
- public int getMongoPort() {
- return getMappedPort(MONGO_PORT);
- }
-}
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/GoraMongodbAuthenticationTestDriver.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/GoraMongodbAuthenticationTestDriver.java
index b7d2c9e..0195571 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/GoraMongodbAuthenticationTestDriver.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/GoraMongodbAuthenticationTestDriver.java
@@ -17,19 +17,13 @@
*/
package org.apache.gora.mongodb.authentications;
-import com.mongodb.ServerAddress;
import org.apache.gora.GoraTestDriver;
-import org.apache.gora.mongodb.MongoContainer;
import org.apache.gora.mongodb.store.MongoStore;
import org.apache.gora.mongodb.store.MongoStoreParameters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.Container;
-
-import java.io.IOException;
-import java.time.Duration;
-
-import static org.apache.commons.lang3.StringUtils.isEmpty;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
/**
* Driver to set up an embedded MongoDB database instance for use in our * unit tests.
@@ -37,54 +31,36 @@
*/
class GoraMongodbAuthenticationTestDriver extends GoraTestDriver {
private static final Logger log = LoggerFactory.getLogger(GoraMongodbAuthenticationTestDriver.class);
- private MongoContainer _container;
- private final String adminUsername = "madhawa";
- private final String adminPassword = "123";
- private final String useVersion;
+ private GenericContainer _container;
+ private static final String adminUsername = "madhawa";
+ private static final String adminPassword = "123";
private final String authMechanisms;
- GoraMongodbAuthenticationTestDriver(String authMechanisms, String useVersion) {
+ GoraMongodbAuthenticationTestDriver(String authMechanisms, GenericContainer container) {
super(MongoStore.class);
this.authMechanisms = authMechanisms;
- this.useVersion = useVersion;
+ this._container = container;
}
- private void doStart() throws Exception {
- try {
- log.info("Starting the embedded Mongodb server");
- startWithAuth();
- if (authMechanisms.equals("SCRAM-SHA-1")) {
- setSCRAM_SHA_1Credentials();
- }
- // Store Mongo server "host:port" in Hadoop configuration
- // so that MongoStore will be able to get it latter
- ServerAddress address = _container.getServerAddress();
- int port = address.getPort();
- String host = address.getHost();
+ @Override
+ public void setUpClass() throws Exception {
+ log.info("Starting the embedded Mongodb server");
- conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, host + ":" + port);
- conf.set(MongoStoreParameters.PROP_MONGO_DB, "admin");
- conf.set(MongoStoreParameters.PROP_MONGO_AUTHENTICATION_TYPE, authMechanisms);
- conf.set(MongoStoreParameters.PROP_MONGO_LOGIN, adminUsername);
- conf.set(MongoStoreParameters.PROP_MONGO_SECRET, adminPassword);
- } catch (Exception e) {
- log.error("Error starting embedded Mongodb server... tearing down test driver.");
- tearDownClass();
- }
+ // Store Mongo server "host:port" in Hadoop configuration
+ // so that MongoStore will be able to get it latter
+ int port = _container.getMappedPort(27017);
+ String host = _container.getContainerIpAddress();
+
+ conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, host + ":" + port);
+ conf.set(MongoStoreParameters.PROP_MONGO_DB, "admin");
+ conf.set(MongoStoreParameters.PROP_MONGO_AUTHENTICATION_TYPE, authMechanisms);
+ conf.set(MongoStoreParameters.PROP_MONGO_LOGIN, adminUsername);
+ conf.set(MongoStoreParameters.PROP_MONGO_SECRET, adminPassword);
}
- private void startWithAuth() throws IOException {
- try {
- prepareExecutable();
- _container.start();
- } catch (Exception e) {
- log.error("Error starting embedded Mongodb server... tearing down test driver.");
- tearDownClass();
- }
- }
+ public static GenericContainer mongoContainer(String authMechanisms, String useVersion) {
+ GenericContainer _container = new GenericContainer(useVersion).withExposedPorts(27017);
- private void prepareExecutable() throws IOException {
- _container = new MongoContainer(useVersion);
// https://hub.docker.com/_/mongo
// These variables, used in conjunction, create a new user and set that user's password.
// This user is created in the admin authentication database
@@ -93,43 +69,16 @@
_container.withEnv("MONGO_INITDB_ROOT_PASSWORD", adminPassword);
// To enable authentication, MongoDB will have to restart itself
- // so wait for at least 5 sec
- _container.withMinimumRunningDuration(Duration.ofSeconds(5));
+ int restartCount = 2;
+ _container.waitingFor(
+ Wait.forLogMessage("(?i).*waiting for connections.*", restartCount)
+ );
// https://docs.mongodb.com/manual/tutorial/enable-authentication/
// https://docs.mongodb.com/manual/reference/parameters/#param.authenticationMechanisms
_container.withCommand("--auth", "--setParameter", "authenticationMechanisms=" + authMechanisms);
- }
- private void setSCRAM_SHA_1Credentials() throws Exception {
- final String scriptText1 = "db.adminCommand({authSchemaUpgrade: 1});\n";
- runScriptAndWait(scriptText1, "admin", adminUsername, adminPassword);
- }
-
- private void runScriptAndWait(String scriptText, String dbName, String username, String password)
- throws InterruptedException, IOException {
- final StringBuilder builder = new StringBuilder("mongo --quiet");
- if (!isEmpty(username)) {
- builder.append(" --username ").append(username);
- }
- if (!isEmpty(password)) {
- builder.append(" --password ").append(password);
- }
- if (!isEmpty(dbName)) {
- builder.append(" ").append(dbName);
- }
- builder.append(" --eval '").append(scriptText).append("'");
-
- Container.ExecResult res = _container.execInContainer("/bin/bash", "-c", builder.toString());
- if (!isEmpty(res.getStderr())) {
- log.error("Unable to run script on Mongodb server {}: {}", scriptText, res.getStderr());
- throw new IOException(res.getStderr());
- }
- }
-
- @Override
- public void setUpClass() throws Exception {
- doStart();
+ return _container;
}
/**
@@ -137,7 +86,5 @@
*/
@Override
public void tearDownClass() {
- log.info("Shutting down mongodb server...");
- _container.stop();
}
}
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/PLAIN_AuthenticationTest.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/PLAIN_AuthenticationTest.java
index a44f70d..a393817 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/PLAIN_AuthenticationTest.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/PLAIN_AuthenticationTest.java
@@ -6,9 +6,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,20 +18,22 @@
package org.apache.gora.mongodb.authentications;
import org.apache.gora.mongodb.store.TestMongoStore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.junit.ClassRule;
+import org.testcontainers.containers.GenericContainer;
+
+import static org.apache.gora.mongodb.authentications.GoraMongodbAuthenticationTestDriver.mongoContainer;
/**
* Perform {@link TestMongoStore} tests on MongoDB 3.6.x server with Plain Authentication mechanism.
*/
public class PLAIN_AuthenticationTest extends TestMongoStore {
- private static Logger log = LoggerFactory
- .getLogger(PLAIN_AuthenticationTest.class);
- static {
- try {
- setTestDriver(new GoraMongodbAuthenticationTestDriver("PLAIN", "3.6"));
- } catch (Exception e) {
- log.error("MongoDb Test Driver initialization failed. "+ e.getMessage());
+
+ public static final String AUTH_MECHANISMS = "PLAIN";
+
+ @ClassRule
+ public final static GenericContainer container = mongoContainer(AUTH_MECHANISMS, "mongo:3.6");
+
+ static {
+ setTestDriver(new GoraMongodbAuthenticationTestDriver(AUTH_MECHANISMS, container));
}
- }
}
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/SCRAM_SHA_1_AuthenticationTest.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/SCRAM_SHA_1_AuthenticationTest.java
index c8e95fb..2346dfb 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/SCRAM_SHA_1_AuthenticationTest.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/authentications/SCRAM_SHA_1_AuthenticationTest.java
@@ -6,9 +6,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,16 +18,22 @@
package org.apache.gora.mongodb.authentications;
import org.apache.gora.mongodb.store.TestMongoStore;
+import org.junit.ClassRule;
+import org.testcontainers.containers.GenericContainer;
+
+import static org.apache.gora.mongodb.authentications.GoraMongodbAuthenticationTestDriver.mongoContainer;
/**
- * Perform {@link TestMongoStore} tests on MongoDB 3.6.x server with SCRAM-SHA-1 Authentication mechanism
+ * Perform {@link TestMongoStore} tests on MongoDB 4.2.x server with SCRAM-SHA-1 Authentication mechanism
*/
public class SCRAM_SHA_1_AuthenticationTest extends TestMongoStore {
- static {
- try {
- setTestDriver(new GoraMongodbAuthenticationTestDriver("SCRAM-SHA-1", "3.6"));
- } catch (Exception e) {
- log.error("MongoDb Test Driver initialization failed. "+ e.getMessage());
+
+ public static final String AUTH_MECHANISMS = "SCRAM-SHA-1";
+
+ @ClassRule
+ public final static GenericContainer container = mongoContainer(AUTH_MECHANISMS, "mongo:4.2");
+
+ static {
+ setTestDriver(new GoraMongodbAuthenticationTestDriver(AUTH_MECHANISMS, container));
}
- }
}
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/mapreduce/GoraMongoMapredTest.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/mapreduce/GoraMongoMapredTest.java
index 7315192..9b1fe1c 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/mapreduce/GoraMongoMapredTest.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/mapreduce/GoraMongoMapredTest.java
@@ -19,10 +19,10 @@
import org.apache.gora.GoraTestDriver;
import org.apache.gora.mongodb.GoraMongodbTestDriver;
-import org.apache.gora.mongodb.MongoContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
+import org.testcontainers.containers.MongoDBContainer;
/**
* Created by drazzib on 24/05/14.
@@ -30,7 +30,7 @@
public class GoraMongoMapredTest {
@ClassRule
- public final static MongoContainer container = new MongoContainer("3.6");
+ public final static MongoDBContainer container = new MongoDBContainer("mongo:3.6");
protected static GoraTestDriver testDriver = new GoraMongodbTestDriver(container);
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore34.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore34.java
index 5e54486..03c83d8 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore34.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore34.java
@@ -18,8 +18,8 @@
package org.apache.gora.mongodb.store;
import org.apache.gora.mongodb.GoraMongodbTestDriver;
-import org.apache.gora.mongodb.MongoContainer;
import org.junit.ClassRule;
+import org.testcontainers.containers.MongoDBContainer;
/**
* Perform {@link TestMongoStore} tests on MongoDB 3.4.x server.
@@ -27,7 +27,7 @@
public class TestMongoStore34 extends TestMongoStore {
@ClassRule
- public final static MongoContainer container = new MongoContainer("3.4");
+ public final static MongoDBContainer container = new MongoDBContainer("mongo:3.4");
static {
setTestDriver(new GoraMongodbTestDriver(container));
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore36.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore36.java
index dd69e42..0a4e7b5 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore36.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore36.java
@@ -18,8 +18,8 @@
package org.apache.gora.mongodb.store;
import org.apache.gora.mongodb.GoraMongodbTestDriver;
-import org.apache.gora.mongodb.MongoContainer;
import org.junit.ClassRule;
+import org.testcontainers.containers.MongoDBContainer;
/**
* Perform {@link TestMongoStore} tests on MongoDB 3.6.x server.
@@ -27,7 +27,7 @@
public class TestMongoStore36 extends TestMongoStore {
@ClassRule
- public final static MongoContainer container = new MongoContainer("3.6");
+ public final static MongoDBContainer container = new MongoDBContainer("mongo:3.6");
static {
setTestDriver(new GoraMongodbTestDriver(container));
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore40.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore40.java
index 6eb3d8b..ca94271 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore40.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore40.java
@@ -18,8 +18,8 @@
package org.apache.gora.mongodb.store;
import org.apache.gora.mongodb.GoraMongodbTestDriver;
-import org.apache.gora.mongodb.MongoContainer;
import org.junit.ClassRule;
+import org.testcontainers.containers.MongoDBContainer;
/**
* Perform {@link TestMongoStore} tests on MongoDB 4.0.x server.
@@ -27,7 +27,7 @@
public class TestMongoStore40 extends TestMongoStore {
@ClassRule
- public final static MongoContainer container = new MongoContainer("4.0");
+ public final static MongoDBContainer container = new MongoDBContainer("mongo:4.0");
static {
setTestDriver(new GoraMongodbTestDriver(container));
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore42.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore42.java
index 3d976c1..9d39589 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore42.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore42.java
@@ -18,8 +18,8 @@
package org.apache.gora.mongodb.store;
import org.apache.gora.mongodb.GoraMongodbTestDriver;
-import org.apache.gora.mongodb.MongoContainer;
import org.junit.ClassRule;
+import org.testcontainers.containers.MongoDBContainer;
/**
* Perform {@link TestMongoStore} tests on MongoDB 4.2.x server.
@@ -27,7 +27,7 @@
public class TestMongoStore42 extends TestMongoStore {
@ClassRule
- public final static MongoContainer container = new MongoContainer("4.2");
+ public final static MongoDBContainer container = new MongoDBContainer("mongo:4.2");
static {
setTestDriver(new GoraMongodbTestDriver(container));
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMappingFromProperties.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMappingFromProperties.java
index 550d25e..2a894e4 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMappingFromProperties.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMappingFromProperties.java
@@ -18,16 +18,14 @@
package org.apache.gora.mongodb.store;
-import com.mongodb.ServerAddress;
import junit.framework.Assert;
import org.apache.commons.io.IOUtils;
import org.apache.gora.examples.generated.Employee;
-import org.apache.gora.mongodb.MongoContainer;
import org.apache.gora.store.DataStoreFactory;
import org.apache.hadoop.conf.Configuration;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
+import org.testcontainers.containers.MongoDBContainer;
import java.io.IOException;
import java.nio.charset.Charset;
@@ -37,14 +35,9 @@
* Test case for loading mappings from properties
*/
public class TestMongoStoreMappingFromProperties {
- private MongoContainer _container;
- @Before
- public void setUp() {
- // Container for MongoStore
- this._container = new MongoContainer("4.2");
- _container.start();
- }
+ @ClassRule
+ public final static MongoDBContainer _container = new MongoDBContainer("mongo:4.2");
@Test
public void testInitialize() throws IOException {
@@ -57,9 +50,8 @@
"</gora-otd>";
// Initiate the MongoDB server on the default port
- ServerAddress address = _container.getServerAddress();
- int port = address.getPort();
- String host = address.getHost();
+ int port = _container.getFirstMappedPort();
+ String host = _container.getContainerIpAddress();
Properties prop = DataStoreFactory.createProps();
@@ -82,8 +74,4 @@
Assert.assertEquals(expectedMapping, actualMapping);
}
- @After
- public void tearDown() {
- _container.stop();
- }
}
diff --git a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMetadataAnalyzer.java b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMetadataAnalyzer.java
index 34f280d..92f1ed9 100644
--- a/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMetadataAnalyzer.java
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStoreMetadataAnalyzer.java
@@ -21,18 +21,17 @@
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import org.apache.gora.mongodb.GoraMongodbTestDriver;
-import org.apache.gora.mongodb.MongoContainer;
import org.apache.gora.store.DataStoreFactory;
import org.apache.gora.store.DataStoreMetadataFactory;
import org.apache.gora.store.impl.DataStoreMetadataAnalyzer;
import org.apache.gora.util.GoraException;
import org.apache.hadoop.conf.Configuration;
import org.bson.Document;
-import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
+import org.testcontainers.containers.MongoDBContainer;
import java.util.*;
@@ -44,7 +43,7 @@
private MongoDatabase mongoDatabase;
@ClassRule
- public final static MongoContainer container = new MongoContainer("4.2");
+ public final static MongoDBContainer container = new MongoDBContainer("mongo:4.2");
static {
setTestDriver(new GoraMongodbTestDriver(container));
diff --git a/gora-redis/src/test/java/org/apache/gora/redis/GoraRedisTestDriver.java b/gora-redis/src/test/java/org/apache/gora/redis/GoraRedisTestDriver.java
index 1180b23..ac6610d 100755
--- a/gora-redis/src/test/java/org/apache/gora/redis/GoraRedisTestDriver.java
+++ b/gora-redis/src/test/java/org/apache/gora/redis/GoraRedisTestDriver.java
@@ -17,8 +17,6 @@
*/
package org.apache.gora.redis;
-import java.io.IOException;
-import java.time.Duration;
import org.apache.gora.GoraTestDriver;
import org.apache.gora.redis.store.RedisStore;
import org.apache.gora.redis.util.RedisStartupLogWaitStrategy;
@@ -26,6 +24,9 @@
import org.apache.gora.redis.util.StorageMode;
import org.testcontainers.containers.GenericContainer;
+import java.io.IOException;
+import java.time.Duration;
+
/**
* Helper class to execute tests in a embedded instance of Redis.
*
diff --git a/gora-redis/src/test/java/org/apache/gora/redis/util/RedisStartupLogWaitStrategy.java b/gora-redis/src/test/java/org/apache/gora/redis/util/RedisStartupLogWaitStrategy.java
index b9857b1..f107c1d 100755
--- a/gora-redis/src/test/java/org/apache/gora/redis/util/RedisStartupLogWaitStrategy.java
+++ b/gora-redis/src/test/java/org/apache/gora/redis/util/RedisStartupLogWaitStrategy.java
@@ -17,38 +17,19 @@
*/
package org.apache.gora.redis.util;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Predicate;
-import org.testcontainers.containers.ContainerLaunchException;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.OutputFrame;
-import org.testcontainers.containers.output.WaitingConsumer;
+import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
/**
* Utility class for detecting when the docker container is ready.
*/
-public class RedisStartupLogWaitStrategy extends GenericContainer.AbstractWaitStrategy {
+public class RedisStartupLogWaitStrategy extends LogMessageWaitStrategy {
private static final String REGEX = ".*Background AOF rewrite finished successfully.*";
private final int times = 3;
- @Override
- protected void waitUntilReady() {
- WaitingConsumer waitingConsumer = new WaitingConsumer();
- this.container.followOutput(waitingConsumer);
- Predicate waitPredicate = (outputFrame) -> {
- String trimmedFrameText = ((OutputFrame) outputFrame).getUtf8String().replaceFirst("\n$", "");
- return trimmedFrameText.matches(REGEX);
- };
-
- try {
- waitingConsumer.waitUntil(waitPredicate, this.startupTimeout.getSeconds(), TimeUnit.SECONDS,
- this.times);
- } catch (TimeoutException var4) {
- throw new ContainerLaunchException(
- "Timed out waiting for log output matching Redis server startup Log \'" + REGEX
- + "\'");
- }
+ public RedisStartupLogWaitStrategy() {
+ withRegEx(REGEX);
+ withTimes(times);
}
+
}
diff --git a/gora-rethinkdb/src/test/java/org/apache/gora/rethinkdb/store/RethinkDBStartupWaitStrategy.java b/gora-rethinkdb/src/test/java/org/apache/gora/rethinkdb/store/RethinkDBStartupWaitStrategy.java
index 9c1939b..0425fcb 100644
--- a/gora-rethinkdb/src/test/java/org/apache/gora/rethinkdb/store/RethinkDBStartupWaitStrategy.java
+++ b/gora-rethinkdb/src/test/java/org/apache/gora/rethinkdb/store/RethinkDBStartupWaitStrategy.java
@@ -18,35 +18,14 @@
package org.apache.gora.rethinkdb.store;
-import org.testcontainers.containers.ContainerLaunchException;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.OutputFrame;
-import org.testcontainers.containers.output.WaitingConsumer;
+import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Predicate;
-
-public class RethinkDBStartupWaitStrategy extends GenericContainer.AbstractWaitStrategy {
+public class RethinkDBStartupWaitStrategy extends LogMessageWaitStrategy {
private static final String regEx = "Server ready,.*";
- private int times = 1;
-
- protected void waitUntilReady() {
- WaitingConsumer waitingConsumer = new WaitingConsumer();
- this.container.followOutput(waitingConsumer);
- Predicate waitPredicate = (outputFrame) -> {
- String trimmedFrameText = ((OutputFrame) outputFrame).getUtf8String().replaceFirst("\n$", "");
- return trimmedFrameText.matches(regEx);
- };
-
- try {
- waitingConsumer.waitUntil(waitPredicate, this.startupTimeout.getSeconds(), TimeUnit.SECONDS,
- this.times);
- } catch (TimeoutException var4) {
- throw new ContainerLaunchException(
- "Timed out waiting for log output matching RethinkDB server startup Log \'" + regEx + "\'");
- }
+ public RethinkDBStartupWaitStrategy() {
+ withRegEx(regEx);
}
+
}
\ No newline at end of file
diff --git a/gora-solr/src/test/conf/log4j.properties b/gora-solr/src/test/conf/log4j.properties
index 3094e6b..62f4caa 100644
--- a/gora-solr/src/test/conf/log4j.properties
+++ b/gora-solr/src/test/conf/log4j.properties
@@ -14,7 +14,7 @@
# limitations under the License.
# Set root logger level to error
-log4j.rootLogger=DEBUG, Console
+log4j.rootLogger=INFO, Console
log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN
diff --git a/pom.xml b/pom.xml
index 2f86e9d..18f2b94 100755
--- a/pom.xml
+++ b/pom.xml
@@ -622,6 +622,7 @@
<argLine>-Xmx512m</argLine>
<forkMode>always</forkMode>
<testFailureIgnore>false</testFailureIgnore>
+ <forkedProcessTimeoutInSeconds>2400</forkedProcessTimeoutInSeconds>
</configuration>
</plugin>
<plugin>
@@ -883,7 +884,7 @@
<!-- Testing Dependencies -->
<junit.version>4.10</junit.version>
- <test.container.version>1.4.2</test.container.version>
+ <test.container.version>1.14.3</test.container.version>
<!-- gora-benchmark and version dependencies -->
<site.ycsb.version>0.17.0</site.ycsb.version>
@@ -1828,8 +1829,10 @@
<dependency>
<groupId>org.testcontainers</groupId>
- <artifactId>testcontainers</artifactId>
+ <artifactId>testcontainers-bom</artifactId>
<version>${test.container.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
</dependency>
<!-- Gora Benchmark Dependencies -->