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/21 22:39:41 UTC

[gora] branch GORA-647-test-containers-mongo created (now 1d7b765)

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

drazzib pushed a change to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git.


      at 1d7b765  GORA-647 Refactor GoraMongodbAuthenticationTestDriver

This branch includes the following new commits:

     new caa53a5  GORA-647 Update gora-mongodb/pom.xml to use testcontainers
     new 26d0e52  GORA-647 Create MongoContainer based on GenericContainer
     new c14ef50  GORA-647 Use MongoContainer as JUnit @ClassRule
     new 6d6bc66  GORA-647 Add new test for MongoDB 4.2
     new 0b8dfa5  GORA-647 Refactor GoraMongodbTestDriver
     new 96179ea  GORA-647 Update gora-benchmark/pom.xml to depends on gora-mongodb:test-jar
     new 1d7b765  GORA-647 Refactor GoraMongodbAuthenticationTestDriver

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[gora] 03/07: GORA-647 Use MongoContainer as JUnit @ClassRule

Posted by dr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git

commit c14ef505000723af61e2d6384bdd80ca61339835
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sat Mar 21 23:32:34 2020 +0100

    GORA-647 Use MongoContainer as JUnit @ClassRule
---
 .../org/apache/gora/mongodb/mapreduce/GoraMongoMapredTest.java    | 8 +++++++-
 .../test/java/org/apache/gora/mongodb/store/TestMongoStore34.java | 8 ++++++--
 .../test/java/org/apache/gora/mongodb/store/TestMongoStore36.java | 8 ++++++--
 .../test/java/org/apache/gora/mongodb/store/TestMongoStore40.java | 8 ++++++--
 4 files changed, 25 insertions(+), 7 deletions(-)

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));
   }
 }


[gora] 06/07: GORA-647 Update gora-benchmark/pom.xml to depends on gora-mongodb:test-jar

Posted by dr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git

commit 96179eab6149f9640198953f54447da6936678ea
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sat Mar 21 23:36:39 2020 +0100

    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-benchmark/pom.xml                             |  7 +++
 .../org/apache/gora/benchmark/GoraClientTest.java  | 63 ++++++----------------
 pom.xml                                            |  6 +++
 3 files changed, 30 insertions(+), 46 deletions(-)

diff --git a/gora-benchmark/pom.xml b/gora-benchmark/pom.xml
index d804483..c8d6e9d 100644
--- a/gora-benchmark/pom.xml
+++ b/gora-benchmark/pom.xml
@@ -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/pom.xml b/pom.xml
index 5fbb8d3..eb8dc3d 100755
--- a/pom.xml
+++ b/pom.xml
@@ -1060,6 +1060,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>


[gora] 02/07: GORA-647 Create MongoContainer based on GenericContainer

Posted by dr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git

commit 26d0e526981e7fd6bfb9ea0e7f6b4456aa541bdc
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sat Mar 21 23:31:54 2020 +0100

    GORA-647 Create MongoContainer based on GenericContainer
---
 .../org/apache/gora/mongodb/MongoContainer.java    | 24 ++++++++++++++++++++++
 1 file changed, 24 insertions(+)

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..9890377
--- /dev/null
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/MongoContainer.java
@@ -0,0 +1,24 @@
+package org.apache.gora.mongodb;
+
+import com.mongodb.ServerAddress;
+import org.testcontainers.containers.FixedHostPortGenericContainer;
+
+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);
+    }
+}


[gora] 01/07: GORA-647 Update gora-mongodb/pom.xml to use testcontainers

Posted by dr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git

commit caa53a5cbc8692d06ab2b00726a584707e52ada8
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sat Mar 21 23:31:23 2020 +0100

    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-benchmark/pom.xml | 4 ++--
 gora-mongodb/pom.xml   | 6 ++----
 pom.xml                | 8 --------
 3 files changed, 4 insertions(+), 14 deletions(-)

diff --git a/gora-benchmark/pom.xml b/gora-benchmark/pom.xml
index 1128017..d804483 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>
 
diff --git a/gora-mongodb/pom.xml b/gora-mongodb/pom.xml
index e3c9566..94fbce4 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>
@@ -179,9 +178,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/pom.xml b/pom.xml
index 6710e88..5fbb8d3 100755
--- a/pom.xml
+++ b/pom.xml
@@ -867,7 +867,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 -->
@@ -1811,13 +1810,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>


[gora] 04/07: GORA-647 Add new test for MongoDB 4.2

Posted by dr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git

commit 6d6bc66f2f7f01f8b18de79b3da98754bb3514ac
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sat Mar 21 23:33:03 2020 +0100

    GORA-647 Add new test for MongoDB 4.2
---
 .../gora/mongodb/store/TestMongoStore42.java       | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)

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
new file mode 100644
index 0000000..3d976c1
--- /dev/null
+++ b/gora-mongodb/src/test/java/org/apache/gora/mongodb/store/TestMongoStore42.java
@@ -0,0 +1,35 @@
+/**
+ * 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.
+ */
+package org.apache.gora.mongodb.store;
+
+import org.apache.gora.mongodb.GoraMongodbTestDriver;
+import org.apache.gora.mongodb.MongoContainer;
+import org.junit.ClassRule;
+
+/**
+ * Perform {@link TestMongoStore} tests on MongoDB 4.2.x server.
+ */
+public class TestMongoStore42 extends TestMongoStore {
+
+  @ClassRule
+  public final static MongoContainer container = new MongoContainer("4.2");
+
+  static {
+    setTestDriver(new GoraMongodbTestDriver(container));
+  }
+}


[gora] 05/07: GORA-647 Refactor GoraMongodbTestDriver

Posted by dr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git

commit 0b8dfa51c17fde173b5501a240f36116b29aaf6a
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sat Mar 21 23:35:02 2020 +0100

    GORA-647 Refactor GoraMongodbTestDriver
    
    * Provided container (passed in constructor) to configure Gora properties
---
 .../apache/gora/mongodb/GoraMongodbTestDriver.java | 58 +++++-----------------
 1 file changed, 13 insertions(+), 45 deletions(-)

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..9859b1c 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,50 @@ 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);
+    String mongoServersProp = String.format("%s:%d", host, port);
+    conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, mongoServersProp);
 
     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 +75,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() {


[gora] 07/07: GORA-647 Refactor GoraMongodbAuthenticationTestDriver

Posted by dr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

drazzib pushed a commit to branch GORA-647-test-containers-mongo
in repository https://gitbox.apache.org/repos/asf/gora.git

commit 1d7b76548e085a6ad104c7eff646c7fdde7c1a3c
Author: Damien Raude-Morvan <dr...@drazzib.com>
AuthorDate: Sat Mar 21 23:39:15 2020 +0100

    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
---
 .../GoraMongodbAuthenticationTestDriver.java       | 194 ++++++---------------
 .../authentications/PLAIN_AuthenticationTest.java  |   6 +-
 .../SCRAM_SHA_1_AuthenticationTest.java            |   9 +-
 3 files changed, 56 insertions(+), 153 deletions(-)

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..b96fa7f 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,55 @@
  */
 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();
+            String mongoServersProp = String.format("%s:%d", host, port);
+
+            conf.set(MongoStoreParameters.PROP_MONGO_SERVERS, mongoServersProp);
             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 +76,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 +85,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 +139,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());
     }