You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gora.apache.org by dr...@apache.org on 2020/03/29 12:54:14 UTC

[gora] branch master updated: GORA-647 Use Testcontainers for MongoDB integration tests (#206)

This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/gora.git


The following commit(s) were added to refs/heads/master by this push:
     new e24756f  GORA-647 Use Testcontainers for MongoDB integration tests (#206)
e24756f is described below

commit e24756f6441bf00c25d245e3ef37798ca9acacce
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sun Mar 29 14:54:07 2020 +0200

    GORA-647 Use Testcontainers for MongoDB integration tests (#206)
    
    * GORA-647 Update gora-mongodb/pom.xml to use testcontainers
      Remove de.flapdoodle.embed.mongo dependency
      Remove mongo.embed.version property
      Add testcontainers dependency
    * GORA-647 Create MongoContainer based on GenericContainer
    * GORA-647 Use MongoContainer as JUnit @ClassRule
    * GORA-647 Add new test for MongoDB 4.2
    * GORA-647 Refactor GoraMongodbTestDriver
      Provided container (passed in constructor) to configure Gora properties
    * GORA-647 Update gora-benchmark/pom.xml to depends on gora-mongodb:test-jar
      We can import MongoContainer in GoraClientTest
      (with fixed MongoDB port on localhost)
    * GORA-647 Refactor GoraMongodbAuthenticationTestDriver
      Use MongoDB docker container feature to initialize superuser (via env)
      Pass --auth and --setParameter authenticationMechanisms as commands
      Use mongo shell CLI - inside container - to execute script
    * GORA-647 Avoid using String.format
    * GORA-647 Generate test-jar artifact in gora-mongodb
    * GORA-647 Add apache licence headers
---
 gora-benchmark/pom.xml                             |  11 +-
 .../org/apache/gora/benchmark/GoraClientTest.java  |  63 ++-----
 gora-mongodb/pom.xml                               |  17 +-
 .../apache/gora/mongodb/GoraMongodbTestDriver.java |  57 ++----
 .../org/apache/gora/mongodb/MongoContainer.java    |  46 +++++
 .../GoraMongodbAuthenticationTestDriver.java       | 193 ++++++---------------
 .../authentications/PLAIN_AuthenticationTest.java  |   6 +-
 .../SCRAM_SHA_1_AuthenticationTest.java            |   9 +-
 .../mongodb/mapreduce/GoraMongoMapredTest.java     |   8 +-
 .../gora/mongodb/store/TestMongoStore34.java       |   8 +-
 .../gora/mongodb/store/TestMongoStore36.java       |   8 +-
 .../gora/mongodb/store/TestMongoStore40.java       |   8 +-
 ...TestMongoStore40.java => TestMongoStore42.java} |  12 +-
 pom.xml                                            |  14 +-
 14 files changed, 191 insertions(+), 269 deletions(-)

diff --git a/gora-benchmark/pom.xml b/gora-benchmark/pom.xml
index 1128017..c8d6e9d 100644
--- a/gora-benchmark/pom.xml
+++ b/gora-benchmark/pom.xml
@@ -175,8 +175,8 @@
     </dependency>
 
     <dependency>
-      <groupId>de.flapdoodle.embed</groupId>
-      <artifactId>de.flapdoodle.embed.mongo</artifactId>
+      <groupId>org.testcontainers</groupId>
+      <artifactId>testcontainers</artifactId>
       <scope>test</scope>
     </dependency>
 
@@ -187,6 +187,13 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.gora</groupId>
+      <artifactId>gora-mongodb</artifactId>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+
     <!-- Apache CouchDB java client -->
     <dependency>
       <groupId>org.ektorp</groupId>
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 321d151..b6a5cce 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,19 +17,9 @@
  */
 package org.apache.gora.benchmark;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Vector;
-
+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;
@@ -37,22 +27,19 @@ import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import com.mongodb.MongoClient;
-
-import de.flapdoodle.embed.mongo.MongodExecutable;
-import de.flapdoodle.embed.mongo.MongodProcess;
-import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.IMongodConfig;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.runtime.Network;
 import site.ycsb.ByteIterator;
 import site.ycsb.Status;
 import site.ycsb.StringByteIterator;
 import site.ycsb.workloads.CoreWorkload;
 
+import java.io.File;
+import java.util.*;
+
+import static org.apache.gora.mongodb.MongoContainer.MONGO_PORT;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 /**
  * The Class GoraClientTest.
  */
@@ -63,9 +50,6 @@ public class GoraClientTest {
   private static HashMap<String, ByteIterator> DATA_TO_INSERT;
   private static HashMap<String, ByteIterator> DATA_TO_UPDATE;
   private static HashMap<String, ByteIterator> INTEGER_DATA;
-  private MongodExecutable mongodExecutable;
-  private MongodProcess mongodProcess;
-  private MongoClient mongoClient;
   private static boolean isMongoDBSetupDone = false;
 
   /**
@@ -74,28 +58,15 @@ public class GoraClientTest {
    * {@link setUp() class} which is executed testUpdate after each test.
    */
   private void setupMongoDBCluster() {
-    MongodStarter starter = MongodStarter.getDefaultInstance();
-    String bindIp = Constants.LOCALHOST;
-    int port = Constants.MONGO_DEFAULT_PORT;
-    IMongodConfig mongodConfig = null;
-    try {
-      mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
-          .net(new Net(bindIp, port, Network.localhostIsIPv6())).build();
-    } catch (IOException e) {
-      LOG.info("There is a problem in configuring MongoDB", e.getMessage(), e);
-    }
-    this.mongodExecutable = starter.prepare(mongodConfig);
     try {
-      LOG.info("Starting MongDB Server on port " + bindIp + ":" + port);
-      this.mongodProcess = mongodExecutable.start();
-    } catch (IOException e) {
-      LOG.info("Cannot Start MongDB Server on port " + bindIp + ":" + port, e.getMessage(), e);
-      this.mongodProcess.stop();
-      this.mongodExecutable.stop();
-      if (this.mongoClient != null)
-        this.mongoClient.close();
+      MongoContainer mongo = new MongoContainer("3.6")
+              .withFixedExposedPort(MONGO_PORT, MONGO_PORT);
+      mongo.start();
+      ServerAddress address = mongo.getServerAddress();
+      LOG.info("Started MongoDB Server on " + address.getHost() + ":" + address.getPort());
+    } catch (Exception e) {
+      LOG.info("Cannot Start MongoDB Server {}", e.getMessage(), e);
     }
-    this.mongoClient = new MongoClient(bindIp, port);
   }
 
   /**
diff --git a/gora-mongodb/pom.xml b/gora-mongodb/pom.xml
index e3c9566..e802e0f 100644
--- a/gora-mongodb/pom.xml
+++ b/gora-mongodb/pom.xml
@@ -52,7 +52,6 @@
   <properties>
     <osgi.import>*</osgi.import>
     <osgi.export>org.apache.gora.mongodb*;version="${project.version}";-noimport:=true</osgi.export>
-    <mongo.embed.version>2.2.0</mongo.embed.version>
   </properties>
 
   <build>
@@ -73,6 +72,17 @@
     </testResources>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>build-helper-maven-plugin</artifactId>
         <version>${build-helper-maven-plugin.version}</version>
@@ -179,9 +189,8 @@
     </dependency>
 
     <dependency>
-      <groupId>de.flapdoodle.embed</groupId>
-      <artifactId>de.flapdoodle.embed.mongo</artifactId>
-      <version>${mongo.embed.version}</version>
+      <groupId>org.testcontainers</groupId>
+      <artifactId>testcontainers</artifactId>
       <scope>test</scope>
     </dependency>
     <!-- END of Testing Dependencies -->
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 a7fe2cf..df6e4ed 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
@@ -19,81 +19,49 @@ package org.apache.gora.mongodb;
 
 import com.mongodb.Mongo;
 import com.mongodb.MongoClient;
-import de.flapdoodle.embed.mongo.Command;
-import de.flapdoodle.embed.mongo.MongodExecutable;
-import de.flapdoodle.embed.mongo.MongodProcess;
-import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.IMongodConfig;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
-import de.flapdoodle.embed.mongo.config.RuntimeConfigBuilder;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.config.IRuntimeConfig;
-import de.flapdoodle.embed.process.config.io.ProcessOutput;
-import de.flapdoodle.embed.process.runtime.Network;
+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 java.io.IOException;
-
 /**
  * Driver to set up an embedded MongoDB database instance for use in our
- * unit tests. We use embedded mongodb which is available from
- * https://github.com/flapdoodle-oss/embedmongo.flapdoodle.de
+ * unit tests. We use testcontainers.org project.
  */
 public class GoraMongodbTestDriver extends GoraTestDriver {
 
   private static Logger log = LoggerFactory
           .getLogger(GoraMongodbTestDriver.class);
 
-  private MongodExecutable _mongodExe;
-  private MongodProcess _mongod;
+  private MongoContainer _container;
   private MongoClient _mongo;
-  private final Version.Main version;
 
   /**
    * Constructor for this class.
    */
-  public GoraMongodbTestDriver() {
-    this(Version.Main.PRODUCTION);
-  }
-
-  public GoraMongodbTestDriver(Version.Main version) {
+  public GoraMongodbTestDriver(MongoContainer startedContainer) {
     super(MongoStore.class);
-    this.version = version;
+    this._container = startedContainer;
   }
 
   /**
    * Initiate the MongoDB server on the default port
    */
   @Override
-  public void setUpClass() throws IOException {
-    IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
-            .defaultsWithLogger(Command.MongoD, log)
-            .processOutput(ProcessOutput.getDefaultInstanceSilent())
-            .build();
-
-    MongodStarter runtime = MongodStarter.getInstance(runtimeConfig);
-
-    int port = Network.getFreeServerPort();
-    IMongodConfig mongodConfig = new MongodConfigBuilder()
-            .version(version)
-            .net(new Net(port, Network.localhostIsIPv6())).build();
+  public void setUpClass() {
+    ServerAddress address = _container.getServerAddress();
+    int port = address.getPort();
+    String host = address.getHost();
 
     // Store Mongo server "host:port" in Hadoop configuration
     // so that MongoStore will be able to get it latter
-    conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, "127.0.0.1:" + port);
+    conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, host + ":" + port);
 
     log.info("Starting embedded Mongodb server on {} port.", port);
     try {
-
-      _mongodExe = runtime.prepare(mongodConfig);
-      _mongod = _mongodExe.start();
-
-      _mongo = new MongoClient("localhost", port);
+      _mongo = new MongoClient(address);
     } catch (Exception e) {
       log.error("Error starting embedded Mongodb server... tearing down test driver.");
       tearDownClass();
@@ -106,8 +74,7 @@ public class GoraMongodbTestDriver extends GoraTestDriver {
   @Override
   public void tearDownClass() {
     log.info("Shutting down mongodb server...");
-    _mongod.stop();
-    _mongodExe.stop();
+    _container.stop();
   }
 
   public Mongo getMongo() {
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
new file mode 100644
index 0000000..9abf2a9
--- /dev/null
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/MongoContainer.java
@@ -0,0 +1,46 @@
+/**
+ * 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.FixedHostPortGenericContainer;
+
+/**
+ * Use {@link FixedHostPortGenericContainer}
+ * from <a href="https://www.testcontainers.org/">Testcontainers.org</a> project
+ * to handle a MongoDB docker container.
+ */
+public class MongoContainer extends FixedHostPortGenericContainer<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 38e8616..b7d2c9e 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,91 +17,54 @@
  */
 package org.apache.gora.mongodb.authentications;
 
-import de.flapdoodle.embed.mongo.*;
-import de.flapdoodle.embed.mongo.config.*;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.config.IRuntimeConfig;
-import de.flapdoodle.embed.process.config.io.ProcessOutput;
-import de.flapdoodle.embed.process.io.IStreamProcessor;
-import de.flapdoodle.embed.process.io.LogWatchStreamProcessor;
-import de.flapdoodle.embed.process.io.NamedOutputStreamProcessor;
-import de.flapdoodle.embed.process.runtime.Network;
+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.File;
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Collections;
-import java.util.HashSet;
+import java.time.Duration;
 
-import static de.flapdoodle.embed.process.io.Processors.console;
-import static de.flapdoodle.embed.process.io.Processors.namedConsole;
-import static java.util.Arrays.asList;
 import static org.apache.commons.lang3.StringUtils.isEmpty;
 
 /**
  * Driver to set up an embedded MongoDB database instance for use in our  * unit tests.
  * This class is specially written to automate authentication mechanisms.
- * We use embedded mongodb which is available from
- * https://github.com/flapdoodle-oss/embedmongo.flapdoodle.de
  */
 class GoraMongodbAuthenticationTestDriver extends GoraTestDriver {
     private static final Logger log = LoggerFactory.getLogger(GoraMongodbAuthenticationTestDriver.class);
-    private static final int INIT_TIMEOUT_MS = 30000;
-    private static final String USER_ADDED_TOKEN = "Successfully added user";
-    private ThreadLocal<Boolean> started = new ThreadLocal<>();
-    private int port;
-    private MongodExecutable _mongodExe;
-    private MongodProcess _mongod;
-    private MongodStarter runtime;
-    private IMongodConfig mongodConfig;
-    private String adminUsername = "madhawa";
-    private String adminPassword = "123";
-    private Version.Main useVersion;
-    private String authMechanisms;
-    private boolean auth = false;
-
-    GoraMongodbAuthenticationTestDriver(String authMechanisms, Version.Main useVersion) throws IOException {
+    private MongoContainer _container;
+    private final String adminUsername = "madhawa";
+    private final String adminPassword = "123";
+    private final String useVersion;
+    private final String authMechanisms;
+
+    GoraMongodbAuthenticationTestDriver(String authMechanisms, String useVersion) {
         super(MongoStore.class);
         this.authMechanisms = authMechanisms;
         this.useVersion = useVersion;
-        started.set(false);
-        if (!this.authMechanisms.equals("MONGODB-CR")) {
-            auth = true;
-        }
-
     }
 
     private void doStart() throws Exception {
-        IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
-                .defaultsWithLogger(Command.MongoD, log)
-                .processOutput(ProcessOutput.getDefaultInstanceSilent())
-                .build();
-        runtime = MongodStarter.getInstance(runtimeConfig);
         try {
-            log.info("Starting the mongo server without authentications");
+            log.info("Starting the embedded Mongodb server");
             startWithAuth();
-            log.info("Adding admin user");
-            addAdmin();
-            if (this.authMechanisms.equals("SCRAM-SHA-1")) {
+            if (authMechanisms.equals("SCRAM-SHA-1")) {
                 setSCRAM_SHA_1Credentials();
             }
-            if (this.authMechanisms.equals("MONGODB-CR")) {
-                setMongoDB_CRCredentials();
-                tearDownClass();
-                auth = true;
-                startWithAuth();
-                addAdmin();
-            }
             // Store Mongo server "host:port" in Hadoop configuration
             // so that MongoStore will be able to get it latter
-            conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, "127.0.0.1:" + port);
+            ServerAddress address = _container.getServerAddress();
+            int port = address.getPort();
+            String host = address.getHost();
+
+            conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, host + ":" + port);
             conf.set(MongoStoreParameters.PROP_MONGO_DB, "admin");
-            conf.set(MongoStoreParameters.PROP_MONGO_AUTHENTICATION_TYPE, this.authMechanisms);
+            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) {
@@ -112,11 +75,8 @@ class GoraMongodbAuthenticationTestDriver extends GoraTestDriver {
 
     private void startWithAuth() throws IOException {
         try {
-            if(!started.get()) {
-                prepareExecutable();
-                _mongod = _mongodExe.start();
-                started.set(true);
-            }
+            prepareExecutable();
+            _container.start();
         } catch (Exception e) {
             log.error("Error starting embedded Mongodb server... tearing down test driver.");
             tearDownClass();
@@ -124,96 +84,51 @@ class GoraMongodbAuthenticationTestDriver extends GoraTestDriver {
     }
 
     private void prepareExecutable() throws IOException {
-        final MongoCmdOptionsBuilder cmdBuilder = new MongoCmdOptionsBuilder();
-        cmdBuilder.enableAuth(auth);
-        final IMongoCmdOptions cmdOptions = cmdBuilder.build();
-        MongodConfigBuilder builder = new MongodConfigBuilder()
-                .version(useVersion)
-                .cmdOptions(cmdOptions)
-                .net(new Net(port, Network.localhostIsIPv6()));
-        if (auth) {
-            builder.setParameter("authenticationMechanisms", authMechanisms);
-        }
-
-        mongodConfig = builder.build();
-        _mongodExe = runtime.prepare(mongodConfig);
-    }
-
-    private void addAdmin() throws IOException, InterruptedException {
-        final String scriptText = "db.createUser(\n" +
-                "  {\n" +
-                "    user: \"madhawa\",\n" +
-                "    pwd: \"123\",\n" +
-                "    roles: [ { role: \"root\", db: \"admin\" } ]\n" +
-                "  }\n" +
-                ");";
-        runScriptAndWait(scriptText, USER_ADDED_TOKEN, new String[]{"couldn't add user", "failed to load", "login failed"}, "admin", null, null);
-    }
-
-    private void setMongoDB_CRCredentials() throws Exception {
-        final String scriptText1 = "var schema = db.system.version.findOne({\"_id\" : \"authSchema\"});\nschema.currentVersion = 3;\ndb.system.version.save(schema);\n";
-      //  final String scriptText1 = "db.system.version.remove({});\ndb.system.version.insert({ \"_id\" : \"authSchema\", \"currentVersion\" : 3 });";
-        runScriptAndWait(scriptText1, "Successfully added authSchema", null, "admin", adminUsername, adminPassword);
+        _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
+        // and given the role of root, which is a "superuser" role.
+        _container.withEnv("MONGO_INITDB_ROOT_USERNAME", adminUsername);
+        _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));
+
+        // 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, "Successfully added authSchema", null, "admin", adminUsername, adminPassword);
+        runScriptAndWait(scriptText1, "admin", adminUsername, adminPassword);
     }
 
-    private void runScriptAndWait(String scriptText, String token, String[] failures, String dbName, String username, String password) throws IOException {
-        IStreamProcessor mongoOutput;
-        if (!isEmpty(token)) {
-            mongoOutput = new LogWatchStreamProcessor(
-                    token,
-                    (failures != null) ? new HashSet<>(asList(failures)) : Collections.emptySet(),
-                    namedConsole("[mongo shell output]"));
-        } else {
-            mongoOutput = new NamedOutputStreamProcessor("[mongo shell output]", console());
-        }
-        IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
-                .defaults(Command.Mongo)
-                .processOutput(new ProcessOutput(
-                        mongoOutput,
-                        namedConsole("[mongo shell error]"),
-                        console()))
-                .build();
-        MongoShellStarter starter = MongoShellStarter.getInstance(runtimeConfig);
-
-        final File scriptFile = writeTmpScriptFile(scriptText);
-        final MongoShellConfigBuilder builder = new MongoShellConfigBuilder();
-        if (!isEmpty(dbName)) {
-            builder.dbName(dbName);
-        }
+    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.username(username);
+            builder.append(" --username ").append(username);
         }
         if (!isEmpty(password)) {
-            builder.password(password);
+            builder.append(" --password ").append(password);
         }
-        starter.prepare(builder
-                .scriptName(scriptFile.getAbsolutePath())
-                .version(mongodConfig.version())
-                .net(mongodConfig.net())
-                .build()).start();
-        if (mongoOutput instanceof LogWatchStreamProcessor) {
-            ((LogWatchStreamProcessor) mongoOutput).waitForResult(INIT_TIMEOUT_MS);
+        if (!isEmpty(dbName)) {
+            builder.append(" ").append(dbName);
         }
-    }
+        builder.append(" --eval '").append(scriptText).append("'");
 
-    private File writeTmpScriptFile(String scriptText) throws IOException {
-        File scriptFile = File.createTempFile("tempfile", ".js");
-        scriptFile.deleteOnExit();
-        PrintWriter writer = new PrintWriter(scriptFile, "UTF-8");
-        writer.write(scriptText);
-        writer.close();
-        return scriptFile;
+        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 {
-        port = Network.getFreeServerPort();
-        log.info("Starting embedded Mongodb server on {} port.", port);
         doStart();
     }
 
@@ -223,12 +138,6 @@ class GoraMongodbAuthenticationTestDriver extends GoraTestDriver {
     @Override
     public void tearDownClass() {
         log.info("Shutting down mongodb server...");
-        if(started.get()) {
-            _mongod.stop();
-            _mongodExe.stop();
-            started.set(false);
-        }
+        _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 efd14fc..a44f70d 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
@@ -17,21 +17,19 @@
  */
 package org.apache.gora.mongodb.authentications;
 
-import de.flapdoodle.embed.mongo.distribution.Version;
-import org.apache.gora.mongodb.GoraMongodbTestDriver;
 import org.apache.gora.mongodb.store.TestMongoStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Perform {@link TestMongoStore} tests on MongoDB 3.2.x server with Plain Authentication mechanism.
+ * 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", Version.Main.V3_4));
+      setTestDriver(new GoraMongodbAuthenticationTestDriver("PLAIN", "3.6"));
     } catch (Exception e) {
       log.error("MongoDb Test Driver initialization failed. "+ e.getMessage());
     }
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 c7fd045..c8e95fb 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
@@ -17,20 +17,15 @@
  */
 package org.apache.gora.mongodb.authentications;
 
-import de.flapdoodle.embed.mongo.distribution.Version;
 import org.apache.gora.mongodb.store.TestMongoStore;
 
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
-
 /**
- * Perform {@link TestMongoStore} tests on MongoDB 3.2.x server with SCRAM-SHA-1 Authentication mechanism
+ * Perform {@link TestMongoStore} tests on MongoDB 3.6.x server with SCRAM-SHA-1 Authentication mechanism
  */
 public class SCRAM_SHA_1_AuthenticationTest extends TestMongoStore {
   static {
     try {
-      setTestDriver(new GoraMongodbAuthenticationTestDriver("SCRAM-SHA-1", Version.Main.V3_4));
+      setTestDriver(new GoraMongodbAuthenticationTestDriver("SCRAM-SHA-1", "3.6"));
     } catch (Exception e) {
       log.error("MongoDb Test Driver initialization failed. "+ e.getMessage());
     }
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 77cfc0d..7315192 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,14 +19,20 @@ package org.apache.gora.mongodb.mapreduce;
 
 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;
 
 /**
  * Created by drazzib on 24/05/14.
  */
 public class GoraMongoMapredTest {
-    protected static GoraTestDriver testDriver = new GoraMongodbTestDriver();
+
+    @ClassRule
+    public final static MongoContainer container = new MongoContainer("3.6");
+
+    protected static GoraTestDriver testDriver = new GoraMongodbTestDriver(container);
 
     @BeforeClass
     public static void setUpClass() throws Exception {
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 90c0359..5e54486 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
@@ -17,15 +17,19 @@
  */
 package org.apache.gora.mongodb.store;
 
-import de.flapdoodle.embed.mongo.distribution.Version;
 import org.apache.gora.mongodb.GoraMongodbTestDriver;
+import org.apache.gora.mongodb.MongoContainer;
+import org.junit.ClassRule;
 
 /**
  * Perform {@link TestMongoStore} tests on MongoDB 3.4.x server.
  */
 public class TestMongoStore34 extends TestMongoStore {
 
+  @ClassRule
+  public final static MongoContainer container = new MongoContainer("3.4");
+
   static {
-    setTestDriver(new GoraMongodbTestDriver(Version.Main.V3_4));
+    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 7b5d0aa..dd69e42 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
@@ -17,15 +17,19 @@
  */
 package org.apache.gora.mongodb.store;
 
-import de.flapdoodle.embed.mongo.distribution.Version;
 import org.apache.gora.mongodb.GoraMongodbTestDriver;
+import org.apache.gora.mongodb.MongoContainer;
+import org.junit.ClassRule;
 
 /**
  * Perform {@link TestMongoStore} tests on MongoDB 3.6.x server.
  */
 public class TestMongoStore36 extends TestMongoStore {
 
+  @ClassRule
+  public final static MongoContainer container = new MongoContainer("3.6");
+
   static {
-    setTestDriver(new GoraMongodbTestDriver(Version.Main.V3_6));
+    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 6cc9163..6eb3d8b 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
@@ -17,15 +17,19 @@
  */
 package org.apache.gora.mongodb.store;
 
-import de.flapdoodle.embed.mongo.distribution.Version;
 import org.apache.gora.mongodb.GoraMongodbTestDriver;
+import org.apache.gora.mongodb.MongoContainer;
+import org.junit.ClassRule;
 
 /**
  * Perform {@link TestMongoStore} tests on MongoDB 4.0.x server.
  */
 public class TestMongoStore40 extends TestMongoStore {
 
+  @ClassRule
+  public final static MongoContainer container = new MongoContainer("4.0");
+
   static {
-    setTestDriver(new GoraMongodbTestDriver(Version.Main.V4_0));
+    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/TestMongoStore42.java
similarity index 73%
copy from gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore40.java
copy to gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore42.java
index 6cc9163..3d976c1 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/TestMongoStore42.java
@@ -17,15 +17,19 @@
  */
 package org.apache.gora.mongodb.store;
 
-import de.flapdoodle.embed.mongo.distribution.Version;
 import org.apache.gora.mongodb.GoraMongodbTestDriver;
+import org.apache.gora.mongodb.MongoContainer;
+import org.junit.ClassRule;
 
 /**
- * Perform {@link TestMongoStore} tests on MongoDB 4.0.x server.
+ * Perform {@link TestMongoStore} tests on MongoDB 4.2.x server.
  */
-public class TestMongoStore40 extends TestMongoStore {
+public class TestMongoStore42 extends TestMongoStore {
+
+  @ClassRule
+  public final static MongoContainer container = new MongoContainer("4.2");
 
   static {
-    setTestDriver(new GoraMongodbTestDriver(Version.Main.V4_0));
+    setTestDriver(new GoraMongodbTestDriver(container));
   }
 }
diff --git a/pom.xml b/pom.xml
index 8f82b20..a375b96 100755
--- a/pom.xml
+++ b/pom.xml
@@ -869,7 +869,6 @@
     <couchdb.version>1.4.2</couchdb.version>
 
     <!-- MongoDB Dependencies -->
-    <mongo.embed.version>2.0.0</mongo.embed.version>
     <mongo.driver.version>3.12.2</mongo.driver.version>
 
     <!-- HiveStore Dependencies -->
@@ -1069,6 +1068,12 @@
         <artifactId>gora-mongodb</artifactId>
         <version>${project.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.gora</groupId>
+        <artifactId>gora-mongodb</artifactId>
+        <version>${project.version}</version>
+        <type>test-jar</type>
+      </dependency>
 
       <!--Kudu DataStore dependencies -->
       <dependency>
@@ -1825,13 +1830,6 @@
 
       <!-- Gora MongoDB Dependencies -->
       <dependency>
-        <groupId>de.flapdoodle.embed</groupId>
-        <artifactId>de.flapdoodle.embed.mongo</artifactId>
-        <version>${mongo.embed.version}</version>
-        <scope>test</scope>
-      </dependency>
-
-      <dependency>
         <groupId>org.mongodb</groupId>
         <artifactId>mongo-java-driver</artifactId>
         <version>${mongo.driver.version}</version>