* 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-ffa450edef68master
@@ -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"/> | ||||
@@ -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> |
@@ -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 | ||||
{ | { | ||||
@@ -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> |
@@ -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 ); | |||||
} | |||||
} |
@@ -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 + "]"; | |||||
} | |||||
} |
@@ -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 ) | ||||
{ | { | ||||
@@ -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(); | |||||
} | |||||
} | } | ||||
} | } |
@@ -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 ); | |||||
} | |||||
} |
@@ -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 ); | |||||
} | |||||
} | } |
@@ -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" ); | ||||
@@ -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 ); | |||||
} | |||||
} |
@@ -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 + "]"; | |||||
} | |||||
} |
@@ -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 ) | ||||
{ | { | ||||
@@ -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(); | |||||
} | |||||
} | } | ||||
} | } |
@@ -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 ); | |||||
} | |||||
} |
@@ -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 ); | |||||
} | |||||
} | } |
@@ -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" ); | ||||