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