/**
* Flexmojos is a set of maven goals to allow maven users to compile, optimize and test Flex SWF, Flex SWC, Air SWF and Air SWC.
* Copyright (C) 2008-2012 Marvin Froeder <marvin@flexmojos.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.codehaus.plexus;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.DefaultContext;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
public class PlexusTestNGCase
{
private PlexusContainer container;
private static String basedir;
@BeforeTest
public void start()
throws Exception
{
basedir = getBasedir();
}
@SuppressWarnings( "unchecked" )
protected void setupContainer()
{
// ----------------------------------------------------------------------------
// Context Setup
// ----------------------------------------------------------------------------
DefaultContext context = new DefaultContext();
context.put( "basedir", getBasedir() );
customizeContext( context );
boolean hasPlexusHome = context.contains( "plexus.home" );
if ( !hasPlexusHome )
{
File f = getTestFile( "target/plexus-home" );
if ( !f.isDirectory() )
{
f.mkdir();
}
context.put( "plexus.home", f.getAbsolutePath() );
}
// ----------------------------------------------------------------------------
// Configuration
// ----------------------------------------------------------------------------
String config = getCustomConfigurationName();
ContainerConfiguration containerConfiguration =
new DefaultContainerConfiguration().setName( "test" ).setContext( context.getContextData() );
if ( config != null )
{
containerConfiguration.setContainerConfiguration( config );
}
else
{
String resource = getConfigurationName( null );
containerConfiguration.setContainerConfiguration( resource );
}
customizeContainerConfiguration( containerConfiguration );
try
{
container = new DefaultPlexusContainer( containerConfiguration );
}
catch ( PlexusContainerException e )
{
e.printStackTrace();
Assert.fail( "Failed to create plexus container." );
}
}
/**
* Allow custom test case implementations do augment the default container configuration before executing tests.
*
* @param containerConfiguration
*/
protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
{
}
protected void customizeContext( Context context )
{
}
protected PlexusConfiguration customizeComponentConfiguration()
{
return null;
}
@AfterTest
public void stop()
throws Exception
{
if ( container != null )
{
container.dispose();
container = null;
}
}
protected PlexusContainer getContainer()
{
if ( container == null )
{
setupContainer();
}
return container;
}
protected InputStream getConfiguration()
throws Exception
{
return getConfiguration( null );
}
protected InputStream getConfiguration( String subname )
throws Exception
{
return getResourceAsStream( getConfigurationName( subname ) );
}
protected String getCustomConfigurationName()
{
return null;
}
/**
* Allow the retrieval of a container configuration that is based on the name of the test class being run. So if you
* have a test class called org.foo.FunTest, then this will produce a resource name of org/foo/FunTest.xml which
* would be used to configure the Plexus container before running your test.
*
* @param subname
* @return
*/
protected String getConfigurationName( String subname )
{
return getClass().getName().replace( '.', '/' ) + ".xml";
}
protected InputStream getResourceAsStream( String resource )
{
return getClass().getResourceAsStream( resource );
}
protected ClassLoader getClassLoader()
{
return getClass().getClassLoader();
}
// ----------------------------------------------------------------------
// Container access
// ----------------------------------------------------------------------
protected Object lookup( String componentKey )
throws Exception
{
return getContainer().lookup( componentKey );
}
protected Object lookup( String role, String roleHint )
throws Exception
{
return getContainer().lookup( role, roleHint );
}
protected <T> T lookup( Class<T> componentClass )
throws Exception
{
return getContainer().lookup( componentClass );
}
protected <T> T lookup( Class<T> componentClass, String roleHint )
throws Exception
{
return getContainer().lookup( componentClass, roleHint );
}
protected void release( Object component )
throws Exception
{
getContainer().release( component );
}
// ----------------------------------------------------------------------
// Helper methods for sub classes
// ----------------------------------------------------------------------
public static File getTestFile( String path )
{
return new File( getBasedir(), path );
}
public static File getTestFile( String basedir, String path )
{
File basedirFile = new File( basedir );
if ( !basedirFile.isAbsolute() )
{
basedirFile = getTestFile( basedir );
}
return new File( basedirFile, path );
}
public static String getTestPath( String path )
{
return getTestFile( path ).getAbsolutePath();
}
public static String getTestPath( String basedir, String path )
{
return getTestFile( basedir, path ).getAbsolutePath();
}
public static String getBasedir()
{
if ( basedir != null )
{
return basedir;
}
basedir = System.getProperty( "basedir" );
if ( basedir == null )
{
basedir = new File( "" ).getAbsolutePath();
}
return basedir;
}
public String getTestConfiguration()
{
return getTestConfiguration( getClass() );
}
public static String getTestConfiguration( Class<?> clazz )
{
String s = clazz.getName().replace( '.', '/' );
return s.substring( 0, s.indexOf( "$" ) ) + ".xml";
}
protected void set( Object obj, String field, Object value )
throws Exception
{
Field f = obj.getClass().getDeclaredField( field );
f.setAccessible( true );
f.set( obj, value );
}
}