package com.google.sitebricks.acceptance.util;
import java.io.File;
import java.lang.annotation.Annotation;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.name.Names;
import com.google.sitebricks.SitebricksModule;
/**
* Abstract TestNG/JUnit4 test that automatically binds and injects itself.
*/
public abstract class SitebricksServiceTest implements Module {
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private String basedir;
private Injector injector;
private Jetty server;
// ----------------------------------------------------------------------
// Setup
// ----------------------------------------------------------------------
@BeforeSuite
public void beforeSuite() throws Exception {
//
// Find a free port for the tests
//
server = new Jetty("src/test/webapp", 0);
server.start();
}
@AfterSuite
public void afterSuite() throws Exception {
server.stop();
}
@Before
@BeforeMethod
public void setUp() {
injector = Guice.createInjector(new SetUpModule(), sitebricksModule());
}
protected SitebricksModule sitebricksModule() {
return new SitebricksModule();
}
@After
@AfterMethod
public void tearDown() {
}
final class SetUpModule implements Module {
public void configure(final Binder binder) {
binder.install(SitebricksServiceTest.this);
binder.requestInjection(SitebricksServiceTest.this);
}
}
// ----------------------------------------------------------------------
// Container configuration methods
// ----------------------------------------------------------------------
/**
* Custom injection bindings.
*
* @param binder
* The Guice binder
*/
public void configure(final Binder binder) {
// place any per-test bindings here...
}
/**
* Custom property values.
*
* @param properties
* The test properties
*/
public void configure(final Properties properties) {
// put any per-test properties here...
}
// ----------------------------------------------------------------------
// Container lookup methods
// ----------------------------------------------------------------------
public final <T> T lookup(final Class<T> type) {
return lookup(Key.get(type));
}
public final <T> T lookup(final Class<T> type, final String name) {
return lookup(type, Names.named(name));
}
public final <T> T lookup(final Class<T> type, final Class<? extends Annotation> qualifier) {
return lookup(Key.get(type, qualifier));
}
public final <T> T lookup(final Class<T> type, final Annotation qualifier) {
return lookup(Key.get(type, qualifier));
}
// ----------------------------------------------------------------------
// Container resource methods
// ----------------------------------------------------------------------
public final String getBasedir() {
if (null == basedir) {
basedir = System.getProperty("basedir", new File("").getAbsolutePath());
}
return basedir;
}
// ----------------------------------------------------------------------
// Implementation methods
// ----------------------------------------------------------------------
private final <T> T lookup(final Key<T> key) {
return injector.getInstance(key);
}
protected String baseUrl() {
return "http://localhost:" + server.getListeningPort() + "/sitebricks";
}
}