Browse Source

Changes to <property>:

* No longer implements Configurable, uses a set() method instead.

* The property value can be included as the text content of
  the <property> element.

* Added test-cases.

* Added some alternative executeTarget() methods to
  AbstractProjectTest, to expect a particular set of log messages,
  or a particular failure.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271567 13f79535-47bb-0310-9956-ffa450edef68
master
adammurdoch 23 years ago
parent
commit
939efc95cd
18 changed files with 589 additions and 104 deletions
  1. +4
    -0
      proposal/myrmidon/build.xml
  2. +44
    -0
      proposal/myrmidon/etc/testcases/org/apache/antlib/core/property.ant
  3. +26
    -38
      proposal/myrmidon/src/java/org/apache/antlib/core/Property.java
  4. +5
    -0
      proposal/myrmidon/src/manifest/testcases-ant-descriptor.xml
  5. +85
    -0
      proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTest.java
  6. +37
    -0
      proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTestType.java
  7. +7
    -1
      proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java
  8. +64
    -3
      proposal/myrmidon/src/test/org/apache/myrmidon/AbstractProjectTest.java
  9. +59
    -0
      proposal/myrmidon/src/test/org/apache/myrmidon/LogMessageTracker.java
  10. +0
    -24
      proposal/myrmidon/src/test/org/apache/myrmidon/TrackingProjectListener.java
  11. +3
    -5
      proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java
  12. +85
    -0
      proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTest.java
  13. +37
    -0
      proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTestType.java
  14. +7
    -1
      proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java
  15. +64
    -3
      proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractProjectTest.java
  16. +59
    -0
      proposal/myrmidon/src/testcases/org/apache/myrmidon/LogMessageTracker.java
  17. +0
    -24
      proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java
  18. +3
    -5
      proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java

+ 4
- 0
proposal/myrmidon/build.xml View File

@@ -454,6 +454,10 @@ Legal:
<fileset dir="${test.classes}" includes="org/apache/myrmidon/interfaces/type/MyType1.class"/> <fileset dir="${test.classes}" includes="org/apache/myrmidon/interfaces/type/MyType1.class"/>
</jar> </jar>


<!-- Prepare the project tests -->
<copy file="src/manifest/testcases-ant-descriptor.xml" tofile="${test.classes}/META-INF/ant-descriptor.xml"/>

<!-- Run all the tests -->
<junit printsummary="on" <junit printsummary="on"
fork="false"> fork="false">
<formatter type="brief" usefile="false"/> <formatter type="brief" usefile="false"/>


+ 44
- 0
proposal/myrmidon/etc/testcases/org/apache/antlib/core/property.ant View File

@@ -0,0 +1,44 @@
<project version="2.0">

<!-- Test setting property via attribute -->
<target name="set-attr">
<property name="test-prop" value="some value"/>
<log>test-prop = [${test-prop}]</log>
</target>

<!-- Test setting property via content -->
<target name="set-content">
<property name="test-prop2">some value</property>
<log>test-prop2 = [${test-prop2}]</log>
</target>

<!-- Test setting property via a nested element -->
<target name="set-element">
<property name="test-prop3">
<property-test-type value="some value"/>
</property>
<log>test-prop3 = [${test-prop3}]</log>
</target>

<!-- Test missing property name -->
<target name="missing-name">
<property value="some value"/>
</target>

<!-- Test missing property value -->
<target name="missing-value">
<property name="some-prop"/>
</target>

<!-- Test setting the value more than once -->
<target name="too-many-values1">
<property name="some-prop" value="some value">another value</property>
</target>

<!-- Test setting the value more than once -->
<target name="too-many-values2">
<property name="some-prop" value="some value">
<property-test-type value="value 2"/>
</property>
</target>
</project>

+ 26
- 38
proposal/myrmidon/src/java/org/apache/antlib/core/Property.java View File

@@ -9,12 +9,9 @@ package org.apache.antlib.core;


import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.myrmidon.api.AbstractTask;
import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.api.TaskContext;
import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.framework.AbstractContainerTask;
import org.apache.myrmidon.framework.DataType; import org.apache.myrmidon.framework.DataType;


/** /**
@@ -27,8 +24,7 @@ import org.apache.myrmidon.framework.DataType;
* @ant:task name="property" * @ant:task name="property"
*/ */
public class Property public class Property
extends AbstractContainerTask
implements Configurable
extends AbstractTask
{ {
private final static Resources REZ = private final static Resources REZ =
ResourceManager.getPackageResources( Property.class ); ResourceManager.getPackageResources( Property.class );
@@ -37,40 +33,37 @@ public class Property
private Object m_value; private Object m_value;
private boolean m_localScope = true; private boolean m_localScope = true;


public void configure( final Configuration configuration )
throws ConfigurationException
public void setName( final String name )
{ {
final String[] attributes = configuration.getAttributeNames();
for( int i = 0; i < attributes.length; i++ )
{
final String name = attributes[ i ];
final String value = configuration.getAttribute( name );
configure( this, name, value );
}
m_name = name;
}


final Configuration[] children = configuration.getChildren();
for( int i = 0; i < children.length; i++ )
{
try
{
final String typeName = children[ i ].getName();
final DataType value = (DataType)newInstance( DataType.class, typeName );
configure( value, children[ i ] );
setValue( value );
}
catch( final Exception e )
{
final String message = REZ.getString( "property.no-set.error" );
throw new ConfigurationException( message, e );
}
}
public void setLocalScope( final boolean localScope )
{
m_localScope = localScope;
} }


public void setName( final String name )
/**
* Sets the property value from a nested element.
*/
public void set( final DataType value )
throws TaskException
{ {
m_name = name;
setValue( value );
}

/**
* Sets the property value from text content.
*/
public void addContent( final String value )
throws TaskException
{
setValue( value );
} }


/**
* Sets the property value from an attribute.
*/
public void setValue( final Object value ) public void setValue( final Object value )
throws TaskException throws TaskException
{ {
@@ -83,11 +76,6 @@ public class Property
m_value = value; m_value = value;
} }


public void setLocalScope( final boolean localScope )
{
m_localScope = localScope;
}

public void execute() public void execute()
throws TaskException throws TaskException
{ {


+ 5
- 0
proposal/myrmidon/src/manifest/testcases-ant-descriptor.xml View File

@@ -0,0 +1,5 @@
<ant-lib version="1.0">
<types>
<data-type name="property-test-type" classname="org.apache.antlib.core.PropertyTestType"/>
</types>
</ant-lib>

+ 85
- 0
proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTest.java View File

@@ -0,0 +1,85 @@
/*
* 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.antlib.core;

import java.io.File;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.myrmidon.AbstractProjectTest;
import org.apache.myrmidon.LogMessageTracker;
import org.apache.myrmidon.components.configurer.DefaultConfigurer;

/**
* Test cases for <property> task.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
public class PropertyTest
extends AbstractProjectTest
{
private final static Resources REZ
= ResourceManager.getPackageResources( PropertyTest.class );

public PropertyTest( final String name )
{
super( name );
}

/**
* Tests setting a property, using an attribute, text content, and
* nested element.
*/
public void testSetProperty()
throws Exception
{
final File projectFile = getTestResource( "property.ant" );

// Set by attribute
LogMessageTracker tracker = new LogMessageTracker();
tracker.addExpectedMessage( "set-attr", "test-prop = [some value]");
executeTarget( projectFile, "set-attr", tracker );

// Set by text content
tracker = new LogMessageTracker();
tracker.addExpectedMessage( "set-content", "test-prop2 = [some value]");
executeTarget( projectFile, "set-content", tracker );

// Set by nested element
tracker = new LogMessageTracker();
tracker.addExpectedMessage( "set-element", "test-prop3 = [value=[some value]]");
executeTarget( projectFile, "set-element", tracker );
}

/**
* Tests the validation performed by the propery task.
*/
public void testValidation()
throws Exception
{
final File projectFile = getTestResource( "property.ant" );

// Missing name
String message = REZ.getString( "property.no-name.error" );
executeTargetExpectError( projectFile, "missing-name", message );

// Missing value
message = REZ.getString( "property.no-value.error" );
executeTargetExpectError( projectFile, "missing-value", message );

// Too many values
String[] messages = {
null,
null,
REZ.getString( "property.multi-set.error" )
};
executeTargetExpectError( projectFile, "too-many-values1", messages );
executeTargetExpectError( projectFile, "too-many-values2", messages );
}

}

+ 37
- 0
proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTestType.java View File

@@ -0,0 +1,37 @@
/*
* 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.antlib.core;

import org.apache.myrmidon.framework.DataType;

/**
* A test data-type used by the property tests.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*
* @ant:data-type name="property-test-type"
*/
public class PropertyTestType
implements DataType
{
private String m_value;

public void setValue( final String value )
{
m_value = value;
}

/**
* Used in the test project file to check the value has been set.
*/
public String toString()
{
return "value=[" + m_value + "]";
}
}

+ 7
- 1
proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java View File

@@ -99,6 +99,9 @@ public abstract class AbstractMyrmidonTest


/** /**
* Asserts that an exception chain contains the expected messages. * Asserts that an exception chain contains the expected messages.
*
* @param messages The messages, in order. A null entry in this array
* indicates that the message should be ignored.
*/ */
protected void assertSameMessage( final String[] messages, final Throwable throwable ) protected void assertSameMessage( final String[] messages, final Throwable throwable )
{ {
@@ -107,7 +110,10 @@ public abstract class AbstractMyrmidonTest
{ {
String message = messages[ i ]; String message = messages[ i ];
assertNotNull( current ); assertNotNull( current );
assertEquals( message, current.getMessage() );
if( message != null )
{
assertEquals( message, current.getMessage() );
}


if( current instanceof CascadingThrowable ) if( current instanceof CascadingThrowable )
{ {


+ 64
- 3
proposal/myrmidon/src/test/org/apache/myrmidon/AbstractProjectTest.java View File

@@ -8,12 +8,13 @@
package org.apache.myrmidon; package org.apache.myrmidon;


import java.io.File; import java.io.File;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.components.embeddor.DefaultEmbeddor; import org.apache.myrmidon.components.embeddor.DefaultEmbeddor;
import org.apache.myrmidon.interfaces.embeddor.Embeddor; import org.apache.myrmidon.interfaces.embeddor.Embeddor;
import org.apache.myrmidon.interfaces.model.Project; import org.apache.myrmidon.interfaces.model.Project;
import org.apache.myrmidon.interfaces.workspace.Workspace; import org.apache.myrmidon.interfaces.workspace.Workspace;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.listeners.ProjectListener;


/** /**
* A base class for test cases which need to execute projects. * A base class for test cases which need to execute projects.
@@ -69,15 +70,75 @@ public class AbstractProjectTest
} }


/** /**
* Executes a target in a project, and asserts that it does not fail
* Executes a target in a project, and asserts that it fails with the
* given error message.
*/
protected void executeTargetExpectError( final File projectFile,
final String targetName,
final String message )
{
executeTargetExpectError( projectFile, targetName, new String[] { message } );
}

/**
* Executes a target in a project, and asserts that it fails with the
* given error messages.
*/
protected void executeTargetExpectError( final File projectFile,
final String targetName,
final String[] messages )
{
try
{
executeTarget( projectFile, targetName, null );
fail( "target execution did not fail" );
}
catch( Exception e )
{
assertSameMessage( messages, e );
}
}

/**
* Executes a target in a project, and asserts that it does not fail.
*/ */
protected void executeTarget( final File projectFile, final String targetName ) protected void executeTarget( final File projectFile, final String targetName )
throws Exception throws Exception
{ {
executeTarget( projectFile, targetName, null );
}

/**
* Executes a target in a project, and asserts that it does not fail.
*/
protected void executeTarget( final File projectFile,
final String targetName,
final ProjectListener listener )
throws Exception
{
// Create the project and workspace
final Embeddor embeddor = getEmbeddor(); final Embeddor embeddor = getEmbeddor();
final Project project = embeddor.createProject( projectFile.getAbsolutePath(), null, null ); final Project project = embeddor.createProject( projectFile.getAbsolutePath(), null, null );
final Workspace workspace = embeddor.createWorkspace( new Parameters() ); final Workspace workspace = embeddor.createWorkspace( new Parameters() );


// Add a listener to make sure all is good
final TrackingProjectListener tracker = new TrackingProjectListener();
workspace.addProjectListener( tracker );

// Add supplied listener
if( listener != null )
{
workspace.addProjectListener( listener );
}

// Now execute the target
workspace.executeProject( project, targetName ); workspace.executeProject( project, targetName );

// Make sure all expected events were delivered
tracker.assertComplete();
if( listener instanceof TrackingProjectListener )
{
( (TrackingProjectListener)listener ).assertComplete();
}
} }
} }

+ 59
- 0
proposal/myrmidon/src/test/org/apache/myrmidon/LogMessageTracker.java View File

@@ -0,0 +1,59 @@
/*
* 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.List;
import org.apache.myrmidon.listeners.LogEvent;

/**
* Asserts that log messages are delivered in the correct order.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
public class LogMessageTracker
extends TrackingProjectListener
{
private List m_targets = new ArrayList();
private List m_messages = new ArrayList();

/**
* Handles a log message.
*/
public void log( final LogEvent event )
{
super.log( event );

// Pop the next expected message off the list, and make sure it
// matches the message in the event
assertTrue( "Unexpected log message", m_targets.size() > 0 && m_messages.size() > 0 );
assertEquals( "Unexpected log message", m_targets.remove( 0 ), event.getTargetName() );
assertEquals( "Unexpected log message", m_messages.remove( 0 ), event.getMessage() );
}

/**
* Asserts that all the log messages were delivered.
*/
public void assertComplete()
{
super.assertComplete();

// Make sure that all log messages were delivered
assertTrue( "Log message not delivered", m_targets.size() == 0 && m_messages.size() == 0 );
}

/**
* Adds an expected log message.
*/
public void addExpectedMessage( String target, String message )
{
m_targets.add( target );
m_messages.add( message );
}
}

+ 0
- 24
proposal/myrmidon/src/test/org/apache/myrmidon/TrackingProjectListener.java View File

@@ -7,9 +7,6 @@
*/ */
package org.apache.myrmidon; package org.apache.myrmidon;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert; import junit.framework.Assert;
import org.apache.myrmidon.listeners.LogEvent; import org.apache.myrmidon.listeners.LogEvent;
import org.apache.myrmidon.listeners.ProjectEvent; import org.apache.myrmidon.listeners.ProjectEvent;
@@ -32,8 +29,6 @@ public class TrackingProjectListener
private String m_currentProject; private String m_currentProject;
private String m_currentTarget; private String m_currentTarget;
private String m_currentTask; private String m_currentTask;
private Map m_messages = new HashMap();
private ArrayList m_currentMsgs;


/** /**
* Notify the listener that a project is about to start. * Notify the listener that a project is about to start.
@@ -64,7 +59,6 @@ public class TrackingProjectListener
assertNull( "Target already started", m_currentTarget ); assertNull( "Target already started", m_currentTarget );
m_currentProject = event.getProjectName(); m_currentProject = event.getProjectName();
m_currentTarget = event.getTargetName(); m_currentTarget = event.getTargetName();
m_currentMsgs = (ArrayList)m_messages.get( m_currentTarget );
} }


/** /**
@@ -76,7 +70,6 @@ public class TrackingProjectListener
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() );
m_currentProject = null; m_currentProject = null;
m_currentTarget = null; m_currentTarget = null;
assertTrue( "Missing log messages for target", m_currentMsgs == null || m_currentMsgs.size() == 0 );


assertNull( "Task not finished", m_currentTask ); assertNull( "Task not finished", m_currentTask );
} }
@@ -112,9 +105,6 @@ public class TrackingProjectListener
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() );
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() );
assertEquals( "Mismatched task name", m_currentTask, event.getTaskName() ); 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() ); assertNull( "Unexpected build error", event.getThrowable() );
} }


@@ -128,18 +118,4 @@ public class TrackingProjectListener
assertNull( "Target not finished", m_currentProject ); assertNull( "Target not finished", m_currentProject );
assertNull( "Project not finished", m_rootProject ); 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 );
}
} }

+ 3
- 5
proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java View File

@@ -8,15 +8,13 @@
package org.apache.myrmidon.components.embeddor; package org.apache.myrmidon.components.embeddor;


import java.io.File; import java.io.File;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.AbstractMyrmidonTest;
import org.apache.myrmidon.TrackingProjectListener;
import org.apache.myrmidon.AbstractProjectTest; import org.apache.myrmidon.AbstractProjectTest;
import org.apache.myrmidon.LogMessageTracker;
import org.apache.myrmidon.interfaces.embeddor.Embeddor;
import org.apache.myrmidon.interfaces.model.Project; import org.apache.myrmidon.interfaces.model.Project;
import org.apache.myrmidon.interfaces.model.Target; import org.apache.myrmidon.interfaces.model.Target;
import org.apache.myrmidon.interfaces.workspace.Workspace; import org.apache.myrmidon.interfaces.workspace.Workspace;
import org.apache.myrmidon.interfaces.embeddor.Embeddor;
import org.apache.myrmidon.listeners.ProjectListener; import org.apache.myrmidon.listeners.ProjectListener;


/** /**
@@ -81,7 +79,7 @@ public class DefaultEmbeddorTest
final Workspace workspace = embeddor.createWorkspace( new Parameters() ); final Workspace workspace = embeddor.createWorkspace( new Parameters() );


// Install a listener // Install a listener
final TrackingProjectListener listener = new TrackingProjectListener();
final LogMessageTracker listener = new LogMessageTracker();
workspace.addProjectListener( listener ); workspace.addProjectListener( listener );


listener.addExpectedMessage( "main-target", "A log message" ); listener.addExpectedMessage( "main-target", "A log message" );


+ 85
- 0
proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTest.java View File

@@ -0,0 +1,85 @@
/*
* 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.antlib.core;

import java.io.File;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.myrmidon.AbstractProjectTest;
import org.apache.myrmidon.LogMessageTracker;
import org.apache.myrmidon.components.configurer.DefaultConfigurer;

/**
* Test cases for <property> task.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
public class PropertyTest
extends AbstractProjectTest
{
private final static Resources REZ
= ResourceManager.getPackageResources( PropertyTest.class );

public PropertyTest( final String name )
{
super( name );
}

/**
* Tests setting a property, using an attribute, text content, and
* nested element.
*/
public void testSetProperty()
throws Exception
{
final File projectFile = getTestResource( "property.ant" );

// Set by attribute
LogMessageTracker tracker = new LogMessageTracker();
tracker.addExpectedMessage( "set-attr", "test-prop = [some value]");
executeTarget( projectFile, "set-attr", tracker );

// Set by text content
tracker = new LogMessageTracker();
tracker.addExpectedMessage( "set-content", "test-prop2 = [some value]");
executeTarget( projectFile, "set-content", tracker );

// Set by nested element
tracker = new LogMessageTracker();
tracker.addExpectedMessage( "set-element", "test-prop3 = [value=[some value]]");
executeTarget( projectFile, "set-element", tracker );
}

/**
* Tests the validation performed by the propery task.
*/
public void testValidation()
throws Exception
{
final File projectFile = getTestResource( "property.ant" );

// Missing name
String message = REZ.getString( "property.no-name.error" );
executeTargetExpectError( projectFile, "missing-name", message );

// Missing value
message = REZ.getString( "property.no-value.error" );
executeTargetExpectError( projectFile, "missing-value", message );

// Too many values
String[] messages = {
null,
null,
REZ.getString( "property.multi-set.error" )
};
executeTargetExpectError( projectFile, "too-many-values1", messages );
executeTargetExpectError( projectFile, "too-many-values2", messages );
}

}

+ 37
- 0
proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTestType.java View File

@@ -0,0 +1,37 @@
/*
* 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.antlib.core;

import org.apache.myrmidon.framework.DataType;

/**
* A test data-type used by the property tests.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*
* @ant:data-type name="property-test-type"
*/
public class PropertyTestType
implements DataType
{
private String m_value;

public void setValue( final String value )
{
m_value = value;
}

/**
* Used in the test project file to check the value has been set.
*/
public String toString()
{
return "value=[" + m_value + "]";
}
}

+ 7
- 1
proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java View File

@@ -99,6 +99,9 @@ public abstract class AbstractMyrmidonTest


/** /**
* Asserts that an exception chain contains the expected messages. * Asserts that an exception chain contains the expected messages.
*
* @param messages The messages, in order. A null entry in this array
* indicates that the message should be ignored.
*/ */
protected void assertSameMessage( final String[] messages, final Throwable throwable ) protected void assertSameMessage( final String[] messages, final Throwable throwable )
{ {
@@ -107,7 +110,10 @@ public abstract class AbstractMyrmidonTest
{ {
String message = messages[ i ]; String message = messages[ i ];
assertNotNull( current ); assertNotNull( current );
assertEquals( message, current.getMessage() );
if( message != null )
{
assertEquals( message, current.getMessage() );
}


if( current instanceof CascadingThrowable ) if( current instanceof CascadingThrowable )
{ {


+ 64
- 3
proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractProjectTest.java View File

@@ -8,12 +8,13 @@
package org.apache.myrmidon; package org.apache.myrmidon;


import java.io.File; import java.io.File;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.components.embeddor.DefaultEmbeddor; import org.apache.myrmidon.components.embeddor.DefaultEmbeddor;
import org.apache.myrmidon.interfaces.embeddor.Embeddor; import org.apache.myrmidon.interfaces.embeddor.Embeddor;
import org.apache.myrmidon.interfaces.model.Project; import org.apache.myrmidon.interfaces.model.Project;
import org.apache.myrmidon.interfaces.workspace.Workspace; import org.apache.myrmidon.interfaces.workspace.Workspace;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.listeners.ProjectListener;


/** /**
* A base class for test cases which need to execute projects. * A base class for test cases which need to execute projects.
@@ -69,15 +70,75 @@ public class AbstractProjectTest
} }


/** /**
* Executes a target in a project, and asserts that it does not fail
* Executes a target in a project, and asserts that it fails with the
* given error message.
*/
protected void executeTargetExpectError( final File projectFile,
final String targetName,
final String message )
{
executeTargetExpectError( projectFile, targetName, new String[] { message } );
}

/**
* Executes a target in a project, and asserts that it fails with the
* given error messages.
*/
protected void executeTargetExpectError( final File projectFile,
final String targetName,
final String[] messages )
{
try
{
executeTarget( projectFile, targetName, null );
fail( "target execution did not fail" );
}
catch( Exception e )
{
assertSameMessage( messages, e );
}
}

/**
* Executes a target in a project, and asserts that it does not fail.
*/ */
protected void executeTarget( final File projectFile, final String targetName ) protected void executeTarget( final File projectFile, final String targetName )
throws Exception throws Exception
{ {
executeTarget( projectFile, targetName, null );
}

/**
* Executes a target in a project, and asserts that it does not fail.
*/
protected void executeTarget( final File projectFile,
final String targetName,
final ProjectListener listener )
throws Exception
{
// Create the project and workspace
final Embeddor embeddor = getEmbeddor(); final Embeddor embeddor = getEmbeddor();
final Project project = embeddor.createProject( projectFile.getAbsolutePath(), null, null ); final Project project = embeddor.createProject( projectFile.getAbsolutePath(), null, null );
final Workspace workspace = embeddor.createWorkspace( new Parameters() ); final Workspace workspace = embeddor.createWorkspace( new Parameters() );


// Add a listener to make sure all is good
final TrackingProjectListener tracker = new TrackingProjectListener();
workspace.addProjectListener( tracker );

// Add supplied listener
if( listener != null )
{
workspace.addProjectListener( listener );
}

// Now execute the target
workspace.executeProject( project, targetName ); workspace.executeProject( project, targetName );

// Make sure all expected events were delivered
tracker.assertComplete();
if( listener instanceof TrackingProjectListener )
{
( (TrackingProjectListener)listener ).assertComplete();
}
} }
} }

+ 59
- 0
proposal/myrmidon/src/testcases/org/apache/myrmidon/LogMessageTracker.java View File

@@ -0,0 +1,59 @@
/*
* 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.List;
import org.apache.myrmidon.listeners.LogEvent;

/**
* Asserts that log messages are delivered in the correct order.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision$ $Date$
*/
public class LogMessageTracker
extends TrackingProjectListener
{
private List m_targets = new ArrayList();
private List m_messages = new ArrayList();

/**
* Handles a log message.
*/
public void log( final LogEvent event )
{
super.log( event );

// Pop the next expected message off the list, and make sure it
// matches the message in the event
assertTrue( "Unexpected log message", m_targets.size() > 0 && m_messages.size() > 0 );
assertEquals( "Unexpected log message", m_targets.remove( 0 ), event.getTargetName() );
assertEquals( "Unexpected log message", m_messages.remove( 0 ), event.getMessage() );
}

/**
* Asserts that all the log messages were delivered.
*/
public void assertComplete()
{
super.assertComplete();

// Make sure that all log messages were delivered
assertTrue( "Log message not delivered", m_targets.size() == 0 && m_messages.size() == 0 );
}

/**
* Adds an expected log message.
*/
public void addExpectedMessage( String target, String message )
{
m_targets.add( target );
m_messages.add( message );
}
}

+ 0
- 24
proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java View File

@@ -7,9 +7,6 @@
*/ */
package org.apache.myrmidon; package org.apache.myrmidon;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert; import junit.framework.Assert;
import org.apache.myrmidon.listeners.LogEvent; import org.apache.myrmidon.listeners.LogEvent;
import org.apache.myrmidon.listeners.ProjectEvent; import org.apache.myrmidon.listeners.ProjectEvent;
@@ -32,8 +29,6 @@ public class TrackingProjectListener
private String m_currentProject; private String m_currentProject;
private String m_currentTarget; private String m_currentTarget;
private String m_currentTask; private String m_currentTask;
private Map m_messages = new HashMap();
private ArrayList m_currentMsgs;


/** /**
* Notify the listener that a project is about to start. * Notify the listener that a project is about to start.
@@ -64,7 +59,6 @@ public class TrackingProjectListener
assertNull( "Target already started", m_currentTarget ); assertNull( "Target already started", m_currentTarget );
m_currentProject = event.getProjectName(); m_currentProject = event.getProjectName();
m_currentTarget = event.getTargetName(); m_currentTarget = event.getTargetName();
m_currentMsgs = (ArrayList)m_messages.get( m_currentTarget );
} }


/** /**
@@ -76,7 +70,6 @@ public class TrackingProjectListener
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() );
m_currentProject = null; m_currentProject = null;
m_currentTarget = null; m_currentTarget = null;
assertTrue( "Missing log messages for target", m_currentMsgs == null || m_currentMsgs.size() == 0 );


assertNull( "Task not finished", m_currentTask ); assertNull( "Task not finished", m_currentTask );
} }
@@ -112,9 +105,6 @@ public class TrackingProjectListener
assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() ); assertEquals( "Mismatched project name", m_currentProject, event.getProjectName() );
assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() ); assertEquals( "Mismatched target name", m_currentTarget, event.getTargetName() );
assertEquals( "Mismatched task name", m_currentTask, event.getTaskName() ); 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() ); assertNull( "Unexpected build error", event.getThrowable() );
} }


@@ -128,18 +118,4 @@ public class TrackingProjectListener
assertNull( "Target not finished", m_currentProject ); assertNull( "Target not finished", m_currentProject );
assertNull( "Project not finished", m_rootProject ); 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 );
}
} }

+ 3
- 5
proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/DefaultEmbeddorTest.java View File

@@ -8,15 +8,13 @@
package org.apache.myrmidon.components.embeddor; package org.apache.myrmidon.components.embeddor;


import java.io.File; import java.io.File;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.AbstractMyrmidonTest;
import org.apache.myrmidon.TrackingProjectListener;
import org.apache.myrmidon.AbstractProjectTest; import org.apache.myrmidon.AbstractProjectTest;
import org.apache.myrmidon.LogMessageTracker;
import org.apache.myrmidon.interfaces.embeddor.Embeddor;
import org.apache.myrmidon.interfaces.model.Project; import org.apache.myrmidon.interfaces.model.Project;
import org.apache.myrmidon.interfaces.model.Target; import org.apache.myrmidon.interfaces.model.Target;
import org.apache.myrmidon.interfaces.workspace.Workspace; import org.apache.myrmidon.interfaces.workspace.Workspace;
import org.apache.myrmidon.interfaces.embeddor.Embeddor;
import org.apache.myrmidon.listeners.ProjectListener; import org.apache.myrmidon.listeners.ProjectListener;


/** /**
@@ -81,7 +79,7 @@ public class DefaultEmbeddorTest
final Workspace workspace = embeddor.createWorkspace( new Parameters() ); final Workspace workspace = embeddor.createWorkspace( new Parameters() );


// Install a listener // Install a listener
final TrackingProjectListener listener = new TrackingProjectListener();
final LogMessageTracker listener = new LogMessageTracker();
workspace.addProjectListener( listener ); workspace.addProjectListener( listener );


listener.addExpectedMessage( "main-target", "A log message" ); listener.addExpectedMessage( "main-target", "A log message" );


Loading…
Cancel
Save