blob: a6fa0f47e7c07e70978399df34dc7fa70e95b30b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-present Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stuart McCulloch (Sonatype, Inc.) - initial API and implementation
*******************************************************************************/
package org.eclipse.sisu.launch;
import java.io.File;
import java.lang.annotation.Annotation;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;
import javax.inject.Inject;
import org.eclipse.sisu.inject.MutableBeanLocator;
import org.eclipse.sisu.space.BeanScanning;
import org.eclipse.sisu.space.ClassSpace;
import org.eclipse.sisu.space.SpaceModule;
import org.eclipse.sisu.space.URLClassSpace;
import org.eclipse.sisu.wire.ParameterKeys;
import org.eclipse.sisu.wire.WireModule;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.name.Names;
import junit.framework.TestCase;
/**
* Abstract JUnit3 {@link TestCase} that automatically binds and injects itself.
*/
public abstract class InjectedTestCase
extends TestCase
implements Module
{
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private String basedir;
@Inject
private MutableBeanLocator locator;
// ----------------------------------------------------------------------
// Setup
// ----------------------------------------------------------------------
@Override
protected void setUp()
throws Exception
{
Guice.createInjector( new WireModule( new SetUpModule(), spaceModule() ) );
}
@Override
protected void tearDown()
throws Exception
{
locator.clear();
}
final class SetUpModule
implements Module
{
public void configure( final Binder binder )
{
binder.install( InjectedTestCase.this );
final Properties properties = new Properties();
properties.put( "basedir", getBasedir() );
InjectedTestCase.this.configure( properties );
binder.bind( ParameterKeys.PROPERTIES ).toInstance( properties );
binder.requestInjection( InjectedTestCase.this );
}
}
public SpaceModule spaceModule()
{
return new SpaceModule( space(), scanning() );
}
public ClassSpace space()
{
return new URLClassSpace( getClass().getClassLoader() );
}
public BeanScanning scanning()
{
return BeanScanning.CACHE;
}
// ----------------------------------------------------------------------
// 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 <T> T lookup( final Key<T> key )
{
final Iterator<? extends Entry<Annotation, T>> i = locator.locate( key ).iterator();
return i.hasNext() ? i.next().getValue() : null;
}
}