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 <draz...@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>