/*******************************************************************************
* 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
*
* Minimal facade required to be binary-compatible with legacy Plexus API
*******************************************************************************/
package org.codehaus.plexus;
import java.io.File;
import java.io.InputStream;
import java.util.Map;
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.DefaultContext;
import junit.framework.TestCase;
public abstract class PlexusTestCase
extends TestCase
{
// ----------------------------------------------------------------------
// Constants
// ----------------------------------------------------------------------
private static final String PLEXUS_HOME = "plexus.home";
// ----------------------------------------------------------------------
// Initialization-on-demand
// ----------------------------------------------------------------------
private static final class Lazy
{
static
{
final String path = System.getProperty( "basedir" );
BASEDIR = null != path ? path : new File( "" ).getAbsolutePath();
}
static final String BASEDIR;
}
// ----------------------------------------------------------------------
// Utility methods
// ----------------------------------------------------------------------
public static String getBasedir()
{
return Lazy.BASEDIR;
}
public static File getTestFile( final String path )
{
return getTestFile( getBasedir(), path );
}
public static File getTestFile( final String basedir, final String path )
{
File root = new File( basedir );
if ( !root.isAbsolute() )
{
root = new File( getBasedir(), basedir );
}
return new File( root, path );
}
public static String getTestPath( final String path )
{
return getTestFile( path ).getAbsolutePath();
}
public static String getTestPath( final String basedir, final String path )
{
return getTestFile( basedir, path ).getAbsolutePath();
}
public static String getTestConfiguration( final Class<?> clazz )
{
// always use outermost class name
final String name = clazz.getName();
final int i = name.indexOf( '$' );
return ( i < 0 ? name : name.substring( 0, i ) ).replace( '.', '/' ) + ".xml";
}
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private volatile PlexusContainer container;
// ----------------------------------------------------------------------
// Public methods
// ----------------------------------------------------------------------
public final String getTestConfiguration()
{
return getTestConfiguration( getClass() );
}
// ----------------------------------------------------------------------
// Customizable methods
// ----------------------------------------------------------------------
protected void customizeContext( @SuppressWarnings( "unused" ) final Context context )
{
// place-holder for tests to customize
}
protected String getCustomConfigurationName()
{
return null; // place-holder for tests to customize
}
protected void customizeContainerConfiguration( @SuppressWarnings( "unused" ) final ContainerConfiguration configuration )
{
// place-holder for tests to customize
}
@Override
protected void setUp()
throws Exception
{
// place-holder for tests to customize
}
protected PlexusContainer getContainer()
{
if ( null == container )
{
setupContainer();
}
return container;
}
protected synchronized void setupContainer()
{
if ( null == container )
{
try
{
container = new DefaultPlexusContainer( config() );
}
catch ( final PlexusContainerException e )
{
throw new IllegalArgumentException( e );
}
}
}
protected synchronized void teardownContainer()
{
if ( null != container )
{
container.dispose();
container = null;
}
}
@Override
protected void tearDown()
throws Exception
{
if ( null != container )
{
teardownContainer();
}
}
// ----------------------------------------------------------------------
// Shared methods
// ----------------------------------------------------------------------
protected final String getConfigurationName( @SuppressWarnings( "unused" ) final String name )
{
return getTestConfiguration();
}
protected final ClassLoader getClassLoader()
{
return getClass().getClassLoader();
}
protected final InputStream getResourceAsStream( final String name )
{
return getClass().getResourceAsStream( name );
}
protected final Object lookup( final String role )
throws ComponentLookupException
{
return getContainer().lookup( role );
}
protected final Object lookup( final String role, final String hint )
throws ComponentLookupException
{
return getContainer().lookup( role, hint );
}
protected final <T> T lookup( final Class<T> role )
throws ComponentLookupException
{
return getContainer().lookup( role );
}
protected final <T> T lookup( final Class<T> role, final String hint )
throws ComponentLookupException
{
return getContainer().lookup( role, hint );
}
protected final void release( final Object component )
throws ComponentLifecycleException
{
getContainer().release( component );
}
// ----------------------------------------------------------------------
// Implementation methods
// ----------------------------------------------------------------------
private final ContainerConfiguration config()
{
final ContainerConfiguration config = new DefaultContainerConfiguration();
// Apply current test context
config.setName( "test" ).setContext( context() );
// Find per-test components XML
String path = getCustomConfigurationName();
if ( null == path )
{
path = getConfigurationName( null );
}
config.setContainerConfiguration( path );
// Per-test config customization
customizeContainerConfiguration( config );
return config;
}
private final Map<Object, Object> context()
{
final Context context = new DefaultContext();
context.put( "basedir", getBasedir() );
// Per-test context customization
customizeContext( context );
// Provide 'plexus.home' fall-back
if ( !context.contains( PLEXUS_HOME ) )
{
context.put( PLEXUS_HOME, plexusHome() );
}
return context.getContextData();
}
private static String plexusHome()
{
final File home = getTestFile( "target/plexus-home" );
if ( !home.isDirectory() )
{
home.mkdirs();
}
return home.getAbsolutePath();
}
}