package fr.lemerdy.eric; import com.mongodb.\*; import org.fest.util.Files; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.fail; import static org.fest.assertions.Assertions.assertThat; public class AbstractMongoTest { @BeforeClass public static void start_database_as_a_forked_process() throws IOException, InterruptedException { File dbPath = ensureDbPathDoesNotExits(); assertThat(dbPath.mkdir()).isTrue(); List lines = startMongoDBAsADaemon(); assertThat(lines.get(0)).startsWith("forked process: "); assertThat(lines.get(1)).startsWith("all output going to: ").endsWith("logpath"); assertThat(lines).hasSize(2); assertThatConnectionToMongodbIsPossible(); } private static List startMongoDBAsADaemon() throws IOException, InterruptedException { ProcessBuilder processBuilder = new ProcessBuilder("../../mongodb-osx-x86_64-2.0.3/bin/mongod", "--dbpath", "dbpath", "--fork", "--logpath", "logpath"); processBuilder.directory(new File("target")); processBuilder.redirectErrorStream(true); Process pwd = processBuilder.start(); BufferedReader outputReader = new BufferedReader(new InputStreamReader(pwd.getInputStream())); String output; List lines = new ArrayList(); while ((output = outputReader.readLine()) != null) { lines.add(output.toString()); } pwd.waitFor(); assertThat(pwd.exitValue()).isEqualTo(0); return lines; } private static void assertThatConnectionToMongodbIsPossible() throws InterruptedException, UnknownHostException { Mongo server = null; try { while (server == null) { Thread.sleep(250); server = new MongoURI("mongodb://127.0.0.1").connect(); } assertThat(server.getDatabaseNames()).hasSize(1); } finally { server.close(); } } private static File ensureDbPathDoesNotExits() throws IOException { File dbPath = new File("target/dbpath"); if (dbPath.exists()) { Files.delete(dbPath); assertThat(dbPath.exists()).isFalse(); } return dbPath; } @Test public void should_connect_to_the_test_database() throws Exception { Mongo mongo = new Mongo(); try { DB test = mongo.getDB("test"); assertThat(test.getCollectionNames()).isNotNull(); } finally { mongo.close(); } } @AfterClass public static void shutdown_mongodb() throws IOException { Mongo mongo = new Mongo(); try { DB db = mongo.getDB("admin"); CommandResult shutdownResult = db.command(new BasicDBObject("shutdown", 1)); shutdownResult.throwOnError(); fail("Expecting to loose mongodb connection on shutdown."); } catch (Throwable e) { assertThat(e.getMessage()).isEqualTo("can't call something : /127.0.0.1:27017/admin"); } finally { mongo.close(); ensureDbPathDoesNotExits(); } } }
Edit:
A github project has been created
Thanks to Florent Ramière, an elegant solution based on Rules has been provided. I am grateful to him.