diff --git a/proposal/myrmidon/build.xml b/proposal/myrmidon/build.xml index 67504647a..13a2e6ea1 100644 --- a/proposal/myrmidon/build.xml +++ b/proposal/myrmidon/build.xml @@ -384,6 +384,7 @@ Legal: + - + + + + + + @@ -455,7 +461,10 @@ Legal: - + + + + diff --git a/proposal/myrmidon/etc/testcases/org/apache/myrmidon/components/embeddor/project-builder.ant b/proposal/myrmidon/etc/testcases/org/apache/myrmidon/components/embeddor/project-builder.ant new file mode 100644 index 000000000..7f52d2702 --- /dev/null +++ b/proposal/myrmidon/etc/testcases/org/apache/myrmidon/components/embeddor/project-builder.ant @@ -0,0 +1,6 @@ + + + + A log message + + \ No newline at end of file diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java index 3e8acc84d..4705db242 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java @@ -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 ); } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/Resources.properties b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/Resources.properties index c565aea72..c2adbe1a5 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/Resources.properties @@ -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 \ No newline at end of file diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java index 133f07d2f..fca511ba5 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java @@ -134,7 +134,7 @@ public class DefaultWorkspace m_listenerSupport.projectStarted( project.getProjectName() ); - executeTarget( "", project.getImplicitTarget(), entry.getFrame() ); + executeTarget( project, "", 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(); } /** diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/ProjectListenerSupport.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/ProjectListenerSupport.java index 560006afe..9c4039898 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/ProjectListenerSupport.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/ProjectListenerSupport.java @@ -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++ ) diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java index 91e7311c6..553f3b6b6 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java @@ -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 ); } /** diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/TrackingProjectListener.java b/proposal/myrmidon/src/test/org/apache/myrmidon/TrackingProjectListener.java new file mode 100644 index 000000000..caa05b651 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/TrackingProjectListener.java @@ -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 Adam Murdoch + * @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 ); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java index fa3f48e56..b89ab71aa 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java @@ -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. */ diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java new file mode 100644 index 000000000..58ca0b134 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java @@ -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 Adam Murdoch + * @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(); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java index 91e7311c6..553f3b6b6 100644 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java @@ -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 ); } /** diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java new file mode 100644 index 000000000..caa05b651 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java @@ -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 Adam Murdoch + * @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 ); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java index fa3f48e56..b89ab71aa 100644 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java @@ -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. */ diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java new file mode 100644 index 000000000..58ca0b134 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java @@ -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 Adam Murdoch + * @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(); + } +}