package com.mastfrog.acteur.mongo; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.name.Named; import com.mastfrog.acteur.mongo.MongoModuleTest.MM; import com.mastfrog.giulius.Dependencies; import com.mastfrog.giulius.tests.GuiceRunner; import com.mastfrog.giulius.tests.TestWith; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.MongoClient; import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.concurrent.CountDownLatch; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.junit.runner.RunWith; /** * * @author tim */ @RunWith(GuiceRunner.class) @TestWith({MongoHarness.Module.class, MM.class}) public class MongoModuleTest { static class MM extends AbstractModule { @Override protected void configure() { MongoModule mod = new MongoModule("testit"); mod.bindCollection("users", "ttusers"); mod.bindCollection("capped", "cappedStuff"); install(mod); bind(Initializer.class).asEagerSingleton(); } } @Test public void testIt(MongoHarness mongo, MongoClient client, DB db, Fixture f, Dependencies deps) throws IOException, InterruptedException { assertNotNull(db); assertEquals("testit", db.getName()); assertNotNull(f.users); assertNotNull(f.capped); assertEquals("ttusers", f.users.getName()); assertEquals("cappedStuff", f.capped.getName()); assertTrue(f.capped.isCapped()); // // mongo.stop(); // // Ge ge = new Ge(deps); // Thread t = new Thread(ge); // t.setDaemon(true); // t.start(); // ge.await(); // Thread.yield(); // // mongo.start(); DB db3 = deps.getInstance(DB.class); assertNotNull(db3); Fixture f1 = deps.getInstance(Fixture.class); assertNotSame(f, f1); assertEquals("testit", db3.getName()); // assertNotNull(ge.db); // assertEquals(db3.getName(), ge.db.getName()); System.out.println("Test done"); } private static class Ge implements Runnable { private final CountDownLatch latch = new CountDownLatch(1); private final Dependencies deps; public Ge(Dependencies deps) { this.deps = deps; } void await() throws InterruptedException { latch.await(); } private DB db; public void run() { latch.countDown(); db = deps.getInstance(DB.class); } } static class Fixture { final DBCollection users; final DBCollection capped; @Inject Fixture(@Named("users") DBCollection users, @Named("capped") DBCollection capped) { this.users = users; this.capped = capped; } } static class Initializer extends MongoInitializer { volatile boolean created; Set<String> onCreateCalled = new HashSet<>(); Set<String> onBeforeCreateCalled = new HashSet<>(); @Inject public Initializer(Registry registry) { super(registry); } @Override protected void onMongoClientCreated(MongoClient client) { created = true; } @Override protected void onCreateCollection(DBCollection collection) { System.out.println("On create " + collection.getName()); onCreateCalled.add(collection.getName()); } @Override protected void onBeforeCreateCollection(String name, BasicDBObject params) { onBeforeCreateCalled.add(name); switch (name) { case "cappedStuff": System.out.println("Set up capped"); params.append("capped", true).append("size", 10000).append("max", 1000); } } } }