* 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(); | |||
| } | |||
| } | |||