* Target start and finish events are now fired for a project's implicit target. * Unit tests now run against a dummy myrmidon install. * Tidy-up some error messages. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271443 13f79535-47bb-0310-9956-ffa450edef68master
@@ -384,6 +384,7 @@ Legal: | |||
<ant antfile="antlib.xml"> | |||
<property name="antlib.name" value="sound"/> | |||
</ant> | |||
<!-- | |||
<ant antfile="antlib.xml"> | |||
<property name="antlib.name" value="vfile"/> | |||
@@ -412,7 +413,7 @@ Legal: | |||
</target> | |||
<!-- Compiles and runs the unit tests --> | |||
<target name="test" depends="compile" if="junit.present" description="Runs the unit tests"> | |||
<target name="test" depends="dist-lite" if="junit.present" description="Runs the unit tests"> | |||
<!-- Compile the unit tests --> | |||
<mkdir dir="${test.classes}"/> | |||
<javac srcdir="src/testcases" | |||
@@ -429,6 +430,11 @@ Legal: | |||
<fileset dir="etc/testcases"/> | |||
</copy> | |||
<!-- Prepare a dummy installation --> | |||
<copy todir="${test.working.dir}/dist"> | |||
<fileset dir="${dist.dir}"/> | |||
</copy> | |||
<!-- Prepare the VFS tests --> | |||
<property name="test.vfs.dir" location="${test.working.dir}/org/apache/aut/vfs"/> | |||
<mkdir dir="${test.vfs.dir}/basedir/emptydir"/> | |||
@@ -455,7 +461,10 @@ Legal: | |||
<junit printsummary="on" | |||
fork="true"> | |||
<formatter type="brief" usefile="false"/> | |||
<classpath refid="project.class.path"/> | |||
<classpath> | |||
<fileset dir="${test.working.dir}/dist/bin/lib" includes="**/*.jar"/> | |||
<fileset dir="${test.working.dir}/dist/lib" includes="**/*.jar, **/*.atl"/> | |||
</classpath> | |||
<classpath location="${test.classes}"/> | |||
<!-- Pass config to the tests --> | |||
@@ -0,0 +1,6 @@ | |||
<project version="2.0" name="test-project" default="main-target"> | |||
<property name="some-prop" value="some-value"/> | |||
<target name="main-target"> | |||
<log>A log message</log> | |||
</target> | |||
</project> |
@@ -287,10 +287,10 @@ public class DefaultEmbeddor | |||
filepath = getParameter( "myrmidon.home" ); | |||
m_homeDir = ( new File( filepath ) ).getAbsoluteFile(); | |||
checkDirectory( m_homeDir, "home" ); | |||
checkDirectory( m_homeDir, "home-dir.name" ); | |||
filepath = getParameter( "myrmidon.lib.path" ); | |||
m_taskLibDir = resolveDirectory( filepath, "task-lib-dir" ); | |||
m_taskLibDir = resolveDirectory( filepath, "task-lib-dir.name" ); | |||
} | |||
/** | |||
@@ -339,12 +339,14 @@ public class DefaultEmbeddor | |||
{ | |||
if( !file.exists() ) | |||
{ | |||
final String message = REZ.getString( "file-no-exist.error", name, file ); | |||
final String nameStr = REZ.getString( name ); | |||
final String message = REZ.getString( "file-no-exist.error", nameStr, file ); | |||
throw new Exception( message ); | |||
} | |||
else if( !file.isDirectory() ) | |||
{ | |||
final String message = REZ.getString( "file-not-dir.error", name, file ); | |||
final String nameStr = REZ.getString( name ); | |||
final String message = REZ.getString( "file-not-dir.error", nameStr, file ); | |||
throw new Exception( message ); | |||
} | |||
} | |||
@@ -5,3 +5,5 @@ bad-ctor.error=Non-public constructor for {0} {1}. | |||
no-instantiate.error=Error instantiating class for {0} {1}. | |||
no-class.error=Could not find the class for {0} ({1}). | |||
bad-filename.error=Unable to retrieve filename for file {0}. | |||
home-dir.name=Myrmidon home directory | |||
task-lib-dir.name=Task library directory |
@@ -134,7 +134,7 @@ public class DefaultWorkspace | |||
m_listenerSupport.projectStarted( project.getProjectName() ); | |||
executeTarget( "<init>", project.getImplicitTarget(), entry.getFrame() ); | |||
executeTarget( project, "<init>", project.getImplicitTarget(), entry.getFrame() ); | |||
execute( project, target, entry ); | |||
@@ -370,13 +370,7 @@ public class DefaultWorkspace | |||
} | |||
} | |||
//notify listeners | |||
m_listenerSupport.targetStarted( project.getProjectName(), targetName ); | |||
executeTarget( targetName, target, entry.getFrame() ); | |||
//notify listeners | |||
m_listenerSupport.targetFinished(); | |||
executeTarget( project, targetName, target, entry.getFrame() ); | |||
} | |||
/** | |||
@@ -387,11 +381,15 @@ public class DefaultWorkspace | |||
* @param frame the frame in which to execute | |||
* @exception TaskException if an error occurs | |||
*/ | |||
private void executeTarget( final String name, | |||
private void executeTarget( final Project project, | |||
final String name, | |||
final Target target, | |||
final ExecutionFrame frame ) | |||
throws TaskException | |||
{ | |||
//notify listeners | |||
m_listenerSupport.targetStarted( project.getProjectName(), name ); | |||
//check the condition associated with target. | |||
//if it is not satisfied then skip target | |||
final Condition condition = target.getCondition(); | |||
@@ -426,6 +424,9 @@ public class DefaultWorkspace | |||
{ | |||
executeTask( tasks[ i ], frame ); | |||
} | |||
//notify listeners | |||
m_listenerSupport.targetFinished(); | |||
} | |||
/** | |||
@@ -110,7 +110,6 @@ public class ProjectListenerSupport | |||
{ | |||
m_projectName = projectName; | |||
m_targetName = targetName; | |||
; | |||
m_taskName = null; | |||
for( int i = 0; i < m_listeners.length; i++ ) | |||
@@ -7,8 +7,16 @@ | |||
*/ | |||
package org.apache.myrmidon; | |||
import junit.framework.TestCase; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
/** | |||
* A base class for Myrmidon tests. Provides utility methods for locating | |||
@@ -20,16 +28,20 @@ public abstract class AbstractMyrmidonTest | |||
extends TestCase | |||
{ | |||
private final File m_testBaseDir; | |||
private final File m_baseDir; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public AbstractMyrmidonTest( String name ) | |||
{ | |||
super( name ); | |||
final String baseDirProp = System.getProperty( "test.basedir" ); | |||
m_baseDir = new File( baseDirProp ); | |||
String packagePath = getClass().getName(); | |||
int idx = packagePath.lastIndexOf('.'); | |||
packagePath = packagePath.substring(0, idx); | |||
packagePath = packagePath.replace('.', File.separatorChar); | |||
m_testBaseDir = new File( baseDirProp, packagePath ).getAbsoluteFile(); | |||
m_testBaseDir = new File( m_baseDir, packagePath ); | |||
} | |||
/** | |||
@@ -37,7 +49,49 @@ public abstract class AbstractMyrmidonTest | |||
*/ | |||
protected File getTestResource( final String name ) | |||
{ | |||
return new File( m_testBaseDir, name ); | |||
final File file = new File( m_testBaseDir, name ); | |||
return getCanonicalFile( file ); | |||
} | |||
/** | |||
* Returns the directory containing a Myrmidon install. | |||
*/ | |||
protected File getHomeDirectory() | |||
{ | |||
final File file = new File( m_baseDir, "dist" ); | |||
return getCanonicalFile( file ); | |||
} | |||
/** | |||
* Makes a file canonical | |||
*/ | |||
private File getCanonicalFile( final File file ) | |||
{ | |||
try | |||
{ | |||
return file.getCanonicalFile(); | |||
} | |||
catch( IOException e ) | |||
{ | |||
return file.getAbsoluteFile(); | |||
} | |||
} | |||
/** | |||
* Creates a logger. | |||
*/ | |||
protected Logger createLogger() | |||
{ | |||
// Setup a logger | |||
final Priority priority = Priority.WARN; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
return new LogKitLogger( targetLogger ); | |||
} | |||
/** | |||
@@ -0,0 +1,145 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import junit.framework.Assert; | |||
import org.apache.myrmidon.listeners.LogEvent; | |||
import org.apache.myrmidon.listeners.ProjectEvent; | |||
import org.apache.myrmidon.listeners.ProjectListener; | |||
import org.apache.myrmidon.listeners.TargetEvent; | |||
import org.apache.myrmidon.listeners.TaskEvent; | |||
/** | |||
* A project listener that asserts that it receives a particular sequence of | |||
* events. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* @version $Revision$ $Date$ | |||
*/ | |||
public class TrackingProjectListener | |||
extends Assert | |||
implements ProjectListener | |||
{ | |||
private String m_rootProject; | |||
private String m_currentProject; | |||
private String m_currentTarget; | |||
private String m_currentTask; | |||
private Map m_messages = new HashMap(); | |||
private ArrayList m_currentMsgs; | |||
/** | |||
* Notify the listener that a project is about to start. | |||
*/ | |||
public void projectStarted( final ProjectEvent event ) | |||
{ | |||
assertNull( "Project already started", m_rootProject ); | |||
m_rootProject = event.getProjectName(); | |||
} | |||
/** | |||
* Notify the listener that a project has finished. | |||
*/ | |||
public void projectFinished( final ProjectEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_rootProject, event.getProjectName() ); | |||
m_rootProject = null; | |||
assertNull( "Target not started", m_currentTarget ); | |||
} | |||
/** | |||
* Notify the listener that a target is about to start. | |||
*/ | |||
public void targetStarted( final TargetEvent event ) | |||
{ | |||
assertNotNull( "Project not started", m_rootProject ); | |||
assertNull( "Target already started", m_currentTarget ); | |||
m_currentProject = event.getProjectName(); | |||
m_currentTarget = event.getTargetName(); | |||
m_currentMsgs = (ArrayList)m_messages.get( m_currentTarget ); | |||
} | |||
/** | |||
* Notify the listener that a target has finished. | |||
*/ | |||
public void targetFinished( final TargetEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
m_currentProject = null; | |||
m_currentTarget = null; | |||
assertTrue( "Missing log messages for target", m_currentMsgs == null || m_currentMsgs.size() == 0 ); | |||
assertNull( "Task not finished", m_currentTask ); | |||
} | |||
/** | |||
* Notify the listener that a task is about to start. | |||
*/ | |||
public void taskStarted( final TaskEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
assertNull( "Task already started", m_currentTask ); | |||
m_currentTask = event.getTaskName(); | |||
} | |||
/** | |||
* Notify the listener that a task has finished. | |||
*/ | |||
public void taskFinished( final TaskEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
assertEquals( "Mismatched task name", m_currentTask, event.getTaskName() ); | |||
m_currentTask = null; | |||
} | |||
/** | |||
* Notify listener of log message event. | |||
*/ | |||
public void log( final LogEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
assertEquals( "Mismatched task name", m_currentTask, event.getTaskName() ); | |||
assertNotNull( "Unexpected log message", m_currentMsgs ); | |||
assertTrue( "Unexpected log message", m_currentMsgs.size() > 0 ); | |||
assertEquals( "Unexpected log message", m_currentMsgs.remove( 0 ), event.getMessage() ); | |||
assertNull( "Unexpected build error", event.getThrowable() ); | |||
} | |||
/** | |||
* Asserts that the listener has finished. | |||
*/ | |||
public void assertComplete() | |||
{ | |||
assertNull( "Task not finished", m_currentTask ); | |||
assertNull( "Target not finished", m_currentTarget ); | |||
assertNull( "Target not finished", m_currentProject ); | |||
assertNull( "Project not finished", m_rootProject ); | |||
} | |||
/** | |||
* Adds an expected log message. | |||
*/ | |||
public void addExpectedMessage( String target, String message ) | |||
{ | |||
ArrayList targetMsgs = (ArrayList)m_messages.get( target ); | |||
if( targetMsgs == null ) | |||
{ | |||
targetMsgs = new ArrayList(); | |||
m_messages.put( target, targetMsgs ); | |||
} | |||
targetMsgs.add( message ); | |||
} | |||
} |
@@ -10,42 +10,35 @@ package org.apache.myrmidon.components; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.framework.component.Component; | |||
import org.apache.avalon.framework.component.ComponentException; | |||
import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.component.DefaultComponentManager; | |||
import org.apache.avalon.framework.logger.LogEnabled; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
import org.apache.myrmidon.AbstractMyrmidonTest; | |||
import org.apache.myrmidon.components.configurer.DefaultConfigurer; | |||
import org.apache.myrmidon.components.converter.DefaultConverterRegistry; | |||
import org.apache.myrmidon.components.converter.DefaultMasterConverter; | |||
import org.apache.myrmidon.components.deployer.DefaultDeployer; | |||
import org.apache.myrmidon.components.deployer.DefaultClassLoaderManager; | |||
import org.apache.myrmidon.components.deployer.ClassLoaderManager; | |||
import org.apache.myrmidon.components.deployer.DefaultClassLoaderManager; | |||
import org.apache.myrmidon.components.deployer.DefaultDeployer; | |||
import org.apache.myrmidon.components.extensions.DefaultExtensionManager; | |||
import org.apache.myrmidon.components.role.DefaultRoleManager; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.components.service.DefaultServiceManager; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
import org.apache.myrmidon.interfaces.converter.ConverterRegistry; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.extensions.ExtensionManager; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
import org.apache.myrmidon.interfaces.type.TypeException; | |||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
import org.apache.myrmidon.interfaces.service.ServiceManager; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.AbstractMyrmidonTest; | |||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
import org.apache.myrmidon.interfaces.type.TypeException; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
/** | |||
* A base class for tests for the default components. | |||
@@ -58,8 +51,6 @@ public abstract class AbstractComponentTest | |||
private DefaultComponentManager m_componentManager; | |||
private Logger m_logger; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public AbstractComponentTest( final String name ) | |||
{ | |||
super( name ); | |||
@@ -87,16 +78,7 @@ public abstract class AbstractComponentTest | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
// Setup a logger | |||
final Priority priority = Priority.DEBUG; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
m_logger = new LogKitLogger( targetLogger ); | |||
m_logger = createLogger(); | |||
// Create the components | |||
m_componentManager = new DefaultComponentManager(); | |||
@@ -162,6 +144,7 @@ public abstract class AbstractComponentTest | |||
} | |||
} | |||
/** | |||
* Utility method to register a Converter. | |||
*/ | |||
@@ -0,0 +1,123 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.embeddor; | |||
import java.io.File; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.avalon.framework.parameters.Parameters; | |||
import org.apache.myrmidon.AbstractMyrmidonTest; | |||
import org.apache.myrmidon.TrackingProjectListener; | |||
import org.apache.myrmidon.interfaces.model.Project; | |||
import org.apache.myrmidon.interfaces.model.Target; | |||
import org.apache.myrmidon.interfaces.workspace.Workspace; | |||
import org.apache.myrmidon.listeners.ProjectListener; | |||
/** | |||
* Test cases for the default embeddor. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* @version $Revision$ $Date$ | |||
*/ | |||
public class DefaultEmbeddorTest | |||
extends AbstractMyrmidonTest | |||
{ | |||
private DefaultEmbeddor m_embeddor; | |||
public DefaultEmbeddorTest( String name ) | |||
{ | |||
super( name ); | |||
} | |||
/** | |||
* Setup the test, by creating and initialising the embeddor. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
final Logger logger = createLogger(); | |||
m_embeddor = new DefaultEmbeddor(); | |||
m_embeddor.enableLogging( logger ); | |||
final Parameters params = new Parameters(); | |||
final File instDir = getHomeDirectory(); | |||
params.setParameter( "myrmidon.home", instDir.getAbsolutePath() ); | |||
m_embeddor.parameterize( params ); | |||
m_embeddor.initialize(); | |||
m_embeddor.start(); | |||
} | |||
/** | |||
* Tear-down the test. | |||
*/ | |||
protected void tearDown() throws Exception | |||
{ | |||
m_embeddor.dispose(); | |||
m_embeddor = null; | |||
} | |||
/** | |||
* Tests that a project is successfully built from a file. | |||
*/ | |||
public void testProjectBuilder() throws Exception | |||
{ | |||
final File projectFile = getTestResource( "project-builder.ant" ); | |||
assertTrue( "Project file \"" + projectFile + "\" does not exist.", projectFile.exists() ); | |||
// Build the project | |||
final Project project = m_embeddor.createProject( projectFile.getAbsolutePath(), null, null ); | |||
// Verify the project. | |||
assertEquals( "test-project", project.getProjectName() ); | |||
assertEquals( "main-target", project.getDefaultTargetName() ); | |||
assertEquals( projectFile.getParentFile(), project.getBaseDirectory() ); | |||
assertEquals( 0, project.getProjectNames().length ); | |||
assertEquals( 0, project.getTypeLibs().length ); | |||
assertEquals( 1, project.getTargetNames().length ); | |||
final Target implicitTarget = project.getImplicitTarget(); | |||
assertEquals( 1, implicitTarget.getTasks().length ); | |||
assertEquals( "property", implicitTarget.getTasks()[0].getName() ); | |||
final Target target = project.getTarget( "main-target" ); | |||
assertEquals( 1, target.getTasks().length ); | |||
assertEquals( "log", target.getTasks()[0].getName() ); | |||
} | |||
/** | |||
* Tests that a listener can be created. | |||
*/ | |||
public void testCreateListener() throws Exception | |||
{ | |||
final ProjectListener listener = m_embeddor.createListener( "default" ); | |||
} | |||
/** | |||
* Tests that a workspace can execute a project file. | |||
*/ | |||
public void testWorkspaceCreate() throws Exception | |||
{ | |||
// Build the project | |||
final File projectFile = getTestResource( "project-builder.ant" ); | |||
final Project project = m_embeddor.createProject( projectFile.getAbsolutePath(), null, null ); | |||
// Build the workspace | |||
final Workspace workspace = m_embeddor.createWorkspace( new Parameters() ); | |||
// Install a listener | |||
final TrackingProjectListener listener = new TrackingProjectListener(); | |||
workspace.addProjectListener( listener ); | |||
listener.addExpectedMessage( "main-target", "A log message" ); | |||
// Execute the default target | |||
final String target = project.getDefaultTargetName(); | |||
workspace.executeProject( project, target ); | |||
// Cleanup | |||
listener.assertComplete(); | |||
} | |||
} |
@@ -7,8 +7,16 @@ | |||
*/ | |||
package org.apache.myrmidon; | |||
import junit.framework.TestCase; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
/** | |||
* A base class for Myrmidon tests. Provides utility methods for locating | |||
@@ -20,16 +28,20 @@ public abstract class AbstractMyrmidonTest | |||
extends TestCase | |||
{ | |||
private final File m_testBaseDir; | |||
private final File m_baseDir; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public AbstractMyrmidonTest( String name ) | |||
{ | |||
super( name ); | |||
final String baseDirProp = System.getProperty( "test.basedir" ); | |||
m_baseDir = new File( baseDirProp ); | |||
String packagePath = getClass().getName(); | |||
int idx = packagePath.lastIndexOf('.'); | |||
packagePath = packagePath.substring(0, idx); | |||
packagePath = packagePath.replace('.', File.separatorChar); | |||
m_testBaseDir = new File( baseDirProp, packagePath ).getAbsoluteFile(); | |||
m_testBaseDir = new File( m_baseDir, packagePath ); | |||
} | |||
/** | |||
@@ -37,7 +49,49 @@ public abstract class AbstractMyrmidonTest | |||
*/ | |||
protected File getTestResource( final String name ) | |||
{ | |||
return new File( m_testBaseDir, name ); | |||
final File file = new File( m_testBaseDir, name ); | |||
return getCanonicalFile( file ); | |||
} | |||
/** | |||
* Returns the directory containing a Myrmidon install. | |||
*/ | |||
protected File getHomeDirectory() | |||
{ | |||
final File file = new File( m_baseDir, "dist" ); | |||
return getCanonicalFile( file ); | |||
} | |||
/** | |||
* Makes a file canonical | |||
*/ | |||
private File getCanonicalFile( final File file ) | |||
{ | |||
try | |||
{ | |||
return file.getCanonicalFile(); | |||
} | |||
catch( IOException e ) | |||
{ | |||
return file.getAbsoluteFile(); | |||
} | |||
} | |||
/** | |||
* Creates a logger. | |||
*/ | |||
protected Logger createLogger() | |||
{ | |||
// Setup a logger | |||
final Priority priority = Priority.WARN; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
return new LogKitLogger( targetLogger ); | |||
} | |||
/** | |||
@@ -0,0 +1,145 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import junit.framework.Assert; | |||
import org.apache.myrmidon.listeners.LogEvent; | |||
import org.apache.myrmidon.listeners.ProjectEvent; | |||
import org.apache.myrmidon.listeners.ProjectListener; | |||
import org.apache.myrmidon.listeners.TargetEvent; | |||
import org.apache.myrmidon.listeners.TaskEvent; | |||
/** | |||
* A project listener that asserts that it receives a particular sequence of | |||
* events. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* @version $Revision$ $Date$ | |||
*/ | |||
public class TrackingProjectListener | |||
extends Assert | |||
implements ProjectListener | |||
{ | |||
private String m_rootProject; | |||
private String m_currentProject; | |||
private String m_currentTarget; | |||
private String m_currentTask; | |||
private Map m_messages = new HashMap(); | |||
private ArrayList m_currentMsgs; | |||
/** | |||
* Notify the listener that a project is about to start. | |||
*/ | |||
public void projectStarted( final ProjectEvent event ) | |||
{ | |||
assertNull( "Project already started", m_rootProject ); | |||
m_rootProject = event.getProjectName(); | |||
} | |||
/** | |||
* Notify the listener that a project has finished. | |||
*/ | |||
public void projectFinished( final ProjectEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_rootProject, event.getProjectName() ); | |||
m_rootProject = null; | |||
assertNull( "Target not started", m_currentTarget ); | |||
} | |||
/** | |||
* Notify the listener that a target is about to start. | |||
*/ | |||
public void targetStarted( final TargetEvent event ) | |||
{ | |||
assertNotNull( "Project not started", m_rootProject ); | |||
assertNull( "Target already started", m_currentTarget ); | |||
m_currentProject = event.getProjectName(); | |||
m_currentTarget = event.getTargetName(); | |||
m_currentMsgs = (ArrayList)m_messages.get( m_currentTarget ); | |||
} | |||
/** | |||
* Notify the listener that a target has finished. | |||
*/ | |||
public void targetFinished( final TargetEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
m_currentProject = null; | |||
m_currentTarget = null; | |||
assertTrue( "Missing log messages for target", m_currentMsgs == null || m_currentMsgs.size() == 0 ); | |||
assertNull( "Task not finished", m_currentTask ); | |||
} | |||
/** | |||
* Notify the listener that a task is about to start. | |||
*/ | |||
public void taskStarted( final TaskEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
assertNull( "Task already started", m_currentTask ); | |||
m_currentTask = event.getTaskName(); | |||
} | |||
/** | |||
* Notify the listener that a task has finished. | |||
*/ | |||
public void taskFinished( final TaskEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
assertEquals( "Mismatched task name", m_currentTask, event.getTaskName() ); | |||
m_currentTask = null; | |||
} | |||
/** | |||
* Notify listener of log message event. | |||
*/ | |||
public void log( final LogEvent event ) | |||
{ | |||
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); | |||
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); | |||
assertEquals( "Mismatched task name", m_currentTask, event.getTaskName() ); | |||
assertNotNull( "Unexpected log message", m_currentMsgs ); | |||
assertTrue( "Unexpected log message", m_currentMsgs.size() > 0 ); | |||
assertEquals( "Unexpected log message", m_currentMsgs.remove( 0 ), event.getMessage() ); | |||
assertNull( "Unexpected build error", event.getThrowable() ); | |||
} | |||
/** | |||
* Asserts that the listener has finished. | |||
*/ | |||
public void assertComplete() | |||
{ | |||
assertNull( "Task not finished", m_currentTask ); | |||
assertNull( "Target not finished", m_currentTarget ); | |||
assertNull( "Target not finished", m_currentProject ); | |||
assertNull( "Project not finished", m_rootProject ); | |||
} | |||
/** | |||
* Adds an expected log message. | |||
*/ | |||
public void addExpectedMessage( String target, String message ) | |||
{ | |||
ArrayList targetMsgs = (ArrayList)m_messages.get( target ); | |||
if( targetMsgs == null ) | |||
{ | |||
targetMsgs = new ArrayList(); | |||
m_messages.put( target, targetMsgs ); | |||
} | |||
targetMsgs.add( message ); | |||
} | |||
} |
@@ -10,42 +10,35 @@ package org.apache.myrmidon.components; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.framework.component.Component; | |||
import org.apache.avalon.framework.component.ComponentException; | |||
import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.component.DefaultComponentManager; | |||
import org.apache.avalon.framework.logger.LogEnabled; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
import org.apache.myrmidon.AbstractMyrmidonTest; | |||
import org.apache.myrmidon.components.configurer.DefaultConfigurer; | |||
import org.apache.myrmidon.components.converter.DefaultConverterRegistry; | |||
import org.apache.myrmidon.components.converter.DefaultMasterConverter; | |||
import org.apache.myrmidon.components.deployer.DefaultDeployer; | |||
import org.apache.myrmidon.components.deployer.DefaultClassLoaderManager; | |||
import org.apache.myrmidon.components.deployer.ClassLoaderManager; | |||
import org.apache.myrmidon.components.deployer.DefaultClassLoaderManager; | |||
import org.apache.myrmidon.components.deployer.DefaultDeployer; | |||
import org.apache.myrmidon.components.extensions.DefaultExtensionManager; | |||
import org.apache.myrmidon.components.role.DefaultRoleManager; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.components.service.DefaultServiceManager; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
import org.apache.myrmidon.interfaces.converter.ConverterRegistry; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.extensions.ExtensionManager; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
import org.apache.myrmidon.interfaces.type.TypeException; | |||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
import org.apache.myrmidon.interfaces.service.ServiceManager; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.AbstractMyrmidonTest; | |||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
import org.apache.myrmidon.interfaces.type.TypeException; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
/** | |||
* A base class for tests for the default components. | |||
@@ -58,8 +51,6 @@ public abstract class AbstractComponentTest | |||
private DefaultComponentManager m_componentManager; | |||
private Logger m_logger; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public AbstractComponentTest( final String name ) | |||
{ | |||
super( name ); | |||
@@ -87,16 +78,7 @@ public abstract class AbstractComponentTest | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
// Setup a logger | |||
final Priority priority = Priority.DEBUG; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
m_logger = new LogKitLogger( targetLogger ); | |||
m_logger = createLogger(); | |||
// Create the components | |||
m_componentManager = new DefaultComponentManager(); | |||
@@ -162,6 +144,7 @@ public abstract class AbstractComponentTest | |||
} | |||
} | |||
/** | |||
* Utility method to register a Converter. | |||
*/ | |||
@@ -0,0 +1,123 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.embeddor; | |||
import java.io.File; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.avalon.framework.parameters.Parameters; | |||
import org.apache.myrmidon.AbstractMyrmidonTest; | |||
import org.apache.myrmidon.TrackingProjectListener; | |||
import org.apache.myrmidon.interfaces.model.Project; | |||
import org.apache.myrmidon.interfaces.model.Target; | |||
import org.apache.myrmidon.interfaces.workspace.Workspace; | |||
import org.apache.myrmidon.listeners.ProjectListener; | |||
/** | |||
* Test cases for the default embeddor. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* @version $Revision$ $Date$ | |||
*/ | |||
public class DefaultEmbeddorTest | |||
extends AbstractMyrmidonTest | |||
{ | |||
private DefaultEmbeddor m_embeddor; | |||
public DefaultEmbeddorTest( String name ) | |||
{ | |||
super( name ); | |||
} | |||
/** | |||
* Setup the test, by creating and initialising the embeddor. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
final Logger logger = createLogger(); | |||
m_embeddor = new DefaultEmbeddor(); | |||
m_embeddor.enableLogging( logger ); | |||
final Parameters params = new Parameters(); | |||
final File instDir = getHomeDirectory(); | |||
params.setParameter( "myrmidon.home", instDir.getAbsolutePath() ); | |||
m_embeddor.parameterize( params ); | |||
m_embeddor.initialize(); | |||
m_embeddor.start(); | |||
} | |||
/** | |||
* Tear-down the test. | |||
*/ | |||
protected void tearDown() throws Exception | |||
{ | |||
m_embeddor.dispose(); | |||
m_embeddor = null; | |||
} | |||
/** | |||
* Tests that a project is successfully built from a file. | |||
*/ | |||
public void testProjectBuilder() throws Exception | |||
{ | |||
final File projectFile = getTestResource( "project-builder.ant" ); | |||
assertTrue( "Project file \"" + projectFile + "\" does not exist.", projectFile.exists() ); | |||
// Build the project | |||
final Project project = m_embeddor.createProject( projectFile.getAbsolutePath(), null, null ); | |||
// Verify the project. | |||
assertEquals( "test-project", project.getProjectName() ); | |||
assertEquals( "main-target", project.getDefaultTargetName() ); | |||
assertEquals( projectFile.getParentFile(), project.getBaseDirectory() ); | |||
assertEquals( 0, project.getProjectNames().length ); | |||
assertEquals( 0, project.getTypeLibs().length ); | |||
assertEquals( 1, project.getTargetNames().length ); | |||
final Target implicitTarget = project.getImplicitTarget(); | |||
assertEquals( 1, implicitTarget.getTasks().length ); | |||
assertEquals( "property", implicitTarget.getTasks()[0].getName() ); | |||
final Target target = project.getTarget( "main-target" ); | |||
assertEquals( 1, target.getTasks().length ); | |||
assertEquals( "log", target.getTasks()[0].getName() ); | |||
} | |||
/** | |||
* Tests that a listener can be created. | |||
*/ | |||
public void testCreateListener() throws Exception | |||
{ | |||
final ProjectListener listener = m_embeddor.createListener( "default" ); | |||
} | |||
/** | |||
* Tests that a workspace can execute a project file. | |||
*/ | |||
public void testWorkspaceCreate() throws Exception | |||
{ | |||
// Build the project | |||
final File projectFile = getTestResource( "project-builder.ant" ); | |||
final Project project = m_embeddor.createProject( projectFile.getAbsolutePath(), null, null ); | |||
// Build the workspace | |||
final Workspace workspace = m_embeddor.createWorkspace( new Parameters() ); | |||
// Install a listener | |||
final TrackingProjectListener listener = new TrackingProjectListener(); | |||
workspace.addProjectListener( listener ); | |||
listener.addExpectedMessage( "main-target", "A log message" ); | |||
// Execute the default target | |||
final String target = project.getDefaultTargetName(); | |||
workspace.executeProject( project, target ); | |||
// Cleanup | |||
listener.assertComplete(); | |||
} | |||
} |