From bf73eb74a3cc2a1ecc3268c83e4158d1b027b2dc Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Sat, 23 Mar 2002 01:45:48 +0000 Subject: [PATCH] Renamed testcases hierarchy to test git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271958 13f79535-47bb-0310-9956-ffa450edef68 --- proposal/myrmidon/build.xml | 8 +- .../framework/conditions/IsSetCondition.java | 4 +- .../apache/aut/bzip2/test/BzipTestCase.java | 2 +- .../apache/antlib/core/test/IfTestCase.java | 100 -- .../antlib/core/test/PropertyTestCase.java | 116 --- .../antlib/core/test/PropertyTestType.java | 37 - .../org/apache/antlib/core/test/if.ant | 63 -- .../org/apache/antlib/core/test/property.ant | 65 -- .../vfile/test/CopyFilesTaskTestCase.java | 35 - .../org/apache/antlib/vfile/test/copy.ant | 8 - .../antlib/vfile/test/src/emptyFile.txt | 0 .../apache/antlib/vfile/test/src/file1.txt | 1 - .../vfile/test/src/subdir1/someFile.html | 5 - .../org/apache/aut/bzip2/asf-logo-huge.tar | Bin 3215360 -> 0 bytes .../apache/aut/bzip2/asf-logo-huge.tar.bz2 | Bin 58089 -> 0 bytes .../apache/aut/bzip2/test/BzipTestCase.java | 115 --- .../apache/aut/bzip2/test/asf-logo-huge.tar | Bin 3215360 -> 0 bytes .../aut/bzip2/test/asf-logo-huge.tar.bz2 | Bin 58089 -> 0 bytes .../vfs/test/AbstractFileSystemTestCase.java | 795 ---------------- .../AbstractReadOnlyFileSystemTestCase.java | 24 - .../AbstractWritableFileSystemTestCase.java | 259 ------ .../aut/vfs/test/FtpFileSystemTestCase.java | 45 - .../aut/vfs/test/LocalFileSystemTestCase.java | 60 -- .../vfs/test/NestedZipFileSystemTestCase.java | 43 - .../aut/vfs/test/SmbFileSystemTestCase.java | 44 - .../aut/vfs/test/ZipFileSystemTestCase.java | 37 - .../aut/vfs/test/basedir/dir1/file1.txt | 0 .../aut/vfs/test/basedir/dir1/file2.txt | 0 .../aut/vfs/test/basedir/dir1/file3.txt | 0 .../org/apache/aut/vfs/test/basedir/empty.txt | 0 .../org/apache/aut/vfs/test/basedir/file1.txt | 2 - .../apache/myrmidon/AbstractMyrmidonTest.java | 217 ----- .../apache/myrmidon/AbstractProjectTest.java | 144 --- .../myrmidon/DependencyMetricsTest.java | 293 ------ .../apache/myrmidon/LogMessageTracker.java | 59 -- .../myrmidon/TrackingProjectListener.java | 121 --- .../components/AbstractComponentTest.java | 207 ----- .../test/DefaultProjectBuilderTestCase.java | 302 ------ .../builder/test/bad-project-name.ant | 4 - .../builder/test/bad-target-name.ant | 5 - .../components/builder/test/bad-version.ant | 3 - .../components/builder/test/bad-xml.ant | 1 - .../components/builder/test/defaults.ant | 3 - .../builder/test/mismatched-version.ant | 3 - .../components/builder/test/no-version.ant | 3 - .../components/builder/test/set-base-dir.ant | 3 - .../builder/test/set-default-target.ant | 3 - .../builder/test/set-project-name.ant | 3 - .../test/ConfigTestConfigurable.java | 36 - .../test/DefaultConfigurerTestCase.java | 859 ------------------ .../components/configurer/test/MyRole1.java | 22 - .../configurer/test/MyRole1Adaptor.java | 34 - .../components/configurer/test/MyRole2.java | 18 - .../components/configurer/test/MyType1.java | 25 - .../components/configurer/test/MyType2.java | 25 - .../test/ObjectToMyRole1Converter.java | 34 - .../test/data/ConfigTestAttributeConvert.java | 46 - .../test/data/ConfigTestConfigAdder.java | 33 - .../test/data/ConfigTestContent.java | 42 - .../configurer/test/data/ConfigTestEmpty.java | 20 - .../test/data/ConfigTestIdResolve.java | 42 - .../data/ConfigTestIgnoreStringMethods.java | 105 --- .../test/data/ConfigTestInterfaceAdder.java | 33 - .../data/ConfigTestMismatchedRefType.java | 26 - .../data/ConfigTestMultipleTypedAdder.java | 28 - .../test/data/ConfigTestNestedErrors.java | 20 - .../data/ConfigTestNonInterfaceAdder.java | 23 - .../test/data/ConfigTestPropResolution.java | 41 - .../data/ConfigTestReferenceAttribute.java | 41 - .../data/ConfigTestReferenceConversion.java | 32 - .../test/data/ConfigTestReferenceElement.java | 37 - .../test/data/ConfigTestSetAndAdd.java | 50 - .../test/data/ConfigTestSetAttribute.java | 41 - .../test/data/ConfigTestSetElement.java | 47 - .../test/data/ConfigTestTypedAdder.java | 33 - .../data/ConfigTestTypedAdderConversion.java | 40 - .../data/ConfigTestTypedAdderReference.java | 33 - .../test/data/ConfigTestTypedAdderRole.java | 33 - .../test/data/ConfigTestTypedConfigAdder.java | 33 - .../test/data/ConfigTestUnknownReference.java | 23 - .../test/DefaultDeployerTestCase.java | 203 ----- .../deployer/test/TestConverter1.java | 29 - .../components/deployer/test/TestRole1.java | 18 - .../components/deployer/test/TestType1.java | 21 - .../deployer/test/ant-descriptor.xml | 18 - .../components/deployer/test/ant-roles.xml | 4 - .../embeddor/test/DefaultEmbeddorTest.java | 94 -- .../embeddor/test/project-builder.ant | 6 - .../AbstractPropertyResolverTestCase.java | 166 ---- .../test/ClassicPropertyResolverTestCase.java | 42 - .../test/DefaultPropertyResolverTestCase.java | 48 - .../role/test/DefaultRoleManagerTestCase.java | 182 ---- .../InstantiatingServiceManagerTestCase.java | 145 --- .../service/test/LifecycleValidator.java | 67 -- .../components/service/test/TestService.java | 19 - .../service/test/TestServiceFactory1.java | 30 - .../service/test/TestServiceFactory2.java | 34 - .../service/test/TestServiceImpl1.java | 24 - .../service/test/TestServiceImpl2.java | 27 - .../framework/file/test/PathTestCase.java | 99 -- .../framework/file/test/TestFileList.java | 42 - .../myrmidon/framework/file/test/path.ant | 67 -- .../test/DefaultNameValidatorTestCase.java | 123 --- .../interfaces/type/test/MyType1.java | 22 - .../interfaces/type/test/MyType2.java | 22 - .../type/test/TypeFactoryTestCase.java | 85 -- 106 files changed, 7 insertions(+), 6827 deletions(-) delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/core/test/IfTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestType.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/core/test/if.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/core/test/property.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/CopyFilesTaskTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/copy.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/emptyFile.txt delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/file1.txt delete mode 100644 proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/subdir1/someFile.html delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/bzip2/asf-logo-huge.tar delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/bzip2/asf-logo-huge.tar.bz2 delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/bzip2/test/BzipTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/bzip2/test/asf-logo-huge.tar delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/bzip2/test/asf-logo-huge.tar.bz2 delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractReadOnlyFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractWritableFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/FtpFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/LocalFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/NestedZipFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/SmbFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/ZipFileSystemTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file1.txt delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file2.txt delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file3.txt delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/empty.txt delete mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/file1.txt delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractProjectTest.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/LogMessageTracker.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/DefaultProjectBuilderTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-project-name.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-target-name.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-version.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-xml.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/defaults.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/mismatched-version.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/no-version.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-base-dir.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-default-target.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-project-name.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ConfigTestConfigurable.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/DefaultConfigurerTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1Adaptor.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole2.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType2.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ObjectToMyRole1Converter.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestAttributeConvert.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestConfigAdder.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestContent.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestEmpty.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIdResolve.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIgnoreStringMethods.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestInterfaceAdder.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMismatchedRefType.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMultipleTypedAdder.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNestedErrors.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNonInterfaceAdder.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestPropResolution.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceAttribute.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceConversion.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceElement.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAndAdd.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAttribute.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetElement.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdder.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderConversion.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderReference.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderRole.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedConfigAdder.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestUnknownReference.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/DefaultDeployerTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestConverter1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestRole1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestType1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-descriptor.xml delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-roles.xml delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/test/project-builder.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/ClassicPropertyResolverTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/DefaultPropertyResolverTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/role/test/DefaultRoleManagerTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/LifecycleValidator.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestService.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory2.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl2.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/PathTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/TestFileList.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/path.ant delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/model/test/DefaultNameValidatorTestCase.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType1.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType2.java delete mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/TypeFactoryTestCase.java diff --git a/proposal/myrmidon/build.xml b/proposal/myrmidon/build.xml index 90a08d6ae..139456060 100644 --- a/proposal/myrmidon/build.xml +++ b/proposal/myrmidon/build.xml @@ -64,7 +64,7 @@ Legal: - + @@ -516,7 +516,7 @@ Legal: - @@ -535,7 +535,7 @@ Legal: - + @@ -571,7 +571,7 @@ Legal: - + diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/conditions/IsSetCondition.java b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/conditions/IsSetCondition.java index 6c5d39348..ed20d4d82 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/conditions/IsSetCondition.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/conditions/IsSetCondition.java @@ -26,8 +26,8 @@ import org.apache.myrmidon.api.TaskException; public class IsSetCondition implements Condition { - private final static Resources REZ - = ResourceManager.getPackageResources( IsSetCondition.class ); + private final static Resources REZ = + ResourceManager.getPackageResources( IsSetCondition.class ); private String m_property; diff --git a/proposal/myrmidon/src/test/org/apache/aut/bzip2/test/BzipTestCase.java b/proposal/myrmidon/src/test/org/apache/aut/bzip2/test/BzipTestCase.java index 2bd65da42..fb3e0a07b 100644 --- a/proposal/myrmidon/src/test/org/apache/aut/bzip2/test/BzipTestCase.java +++ b/proposal/myrmidon/src/test/org/apache/aut/bzip2/test/BzipTestCase.java @@ -104,7 +104,7 @@ public class BzipTestCase private InputStream getInputStream( final String resource ) throws Exception { - final String filename = "src" + File.separator + "testcases" + File.separator + + final String filename = "src" + File.separator + "test" + File.separator + getClass().getName().replace( '.', File.separatorChar ); final String path = FileUtil.getPath( filename ); final File input = new File( path, resource ); diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/IfTestCase.java b/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/IfTestCase.java deleted file mode 100644 index b71d5fd4d..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/IfTestCase.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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.test; - -import java.io.File; -import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.myrmidon.AbstractProjectTest; -import org.apache.myrmidon.LogMessageTracker; - -/** - * Test cases for the task. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class IfTestCase - extends AbstractProjectTest -{ - private final static Resources REZ = getResourcesForTested( IfTestCase.class ); - - public IfTestCase( String name ) - { - super( name ); - } - - /** - * Test checking whether a property is set and not 'false'. - */ - public void testConditions() - throws Exception - { - final File projectFile = getTestResource( "if.ant" ); - - // Test when property is set to 'true' - LogMessageTracker listener = new LogMessageTracker(); - listener.addExpectedMessage( "true-prop", "test-prop is set" ); - executeTarget( projectFile, "true-prop", listener ); - - // Test when property is set to a value other than 'true' or 'false' - listener = new LogMessageTracker(); - listener.addExpectedMessage( "set-prop", "test-prop is set" ); - executeTarget( projectFile, "set-prop", listener ); - - // Test when property is set to 'false' - listener = new LogMessageTracker(); - listener.addExpectedMessage( "false-prop", "test-prop is not set" ); - executeTarget( projectFile, "false-prop", listener ); - - // Test when property is not set - listener = new LogMessageTracker(); - listener.addExpectedMessage( "not-set-prop", "test-prop is not set" ); - executeTarget( projectFile, "not-set-prop", listener ); - } - - /** - * Tests that the task can handle multiple nested tasks. - */ - public void testMultipleTasks() throws Exception - { - final File projectFile = getTestResource( "if.ant" ); - - // Test when property is not set - LogMessageTracker listener = new LogMessageTracker(); - listener.addExpectedMessage( "multiple-nested-tasks", "task 1" ); - listener.addExpectedMessage( "multiple-nested-tasks", "task 2" ); - listener.addExpectedMessage( "multiple-nested-tasks", "task 3" ); - listener.addExpectedMessage( "multiple-nested-tasks", "task 4" ); - executeTarget( projectFile, "multiple-nested-tasks", listener ); - } - - /** - * Tests validation. - */ - public void testValidation() throws Exception - { - final File projectFile = getTestResource( "if.ant" ); - - // Check for missing condition - String[] messages = { - null, - REZ.getString( "if.no-condition.error" ) - }; - executeTargetExpectError( projectFile, "no-condition", messages ); - - // Check for too many conditions - messages = new String[] - { - null, - null, - REZ.getString( "if.ifelse-duplicate.error" ) - }; - executeTargetExpectError( projectFile, "too-many-conditions", messages ); - } - -} diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestCase.java b/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestCase.java deleted file mode 100644 index b4f43f075..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestCase.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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.test; - -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.workspace.DefaultTaskContext; - -/** - * Test cases for task. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class PropertyTestCase - extends AbstractProjectTest -{ - private final static Resources REZ = getResourcesForTested( PropertyTestCase.class ); - - public PropertyTestCase( 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[] messages = - { - null, - REZ.getString( "property.no-name.error" ) - }; - executeTargetExpectError( projectFile, "missing-name", messages ); - - // Missing value - messages = new String[] - { - null, - REZ.getString( "property.no-value.error" ) - }; - executeTargetExpectError( projectFile, "missing-value", messages ); - - // Too many values - messages = new String[] - { - null, - null, - REZ.getString( "property.multi-set.error" ) - }; - executeTargetExpectError( projectFile, "too-many-values1", messages ); - executeTargetExpectError( projectFile, "too-many-values2", messages ); - executeTargetExpectError( projectFile, "too-many-values3", messages ); - } - - /** - * Tests basic validation of property names. - */ - public void testNameValidation() throws Exception - { - final File projectFile = getTestResource( "property.ant" ); - - final Resources contextResources - = ResourceManager.getPackageResources( DefaultTaskContext.class ); - - // Invalid names - String[] messages = new String[] - { - null, - contextResources.getString( "bad-property-name.error" ), - null - }; - executeTargetExpectError( projectFile, "bad-prop-name1", messages ); - executeTargetExpectError( projectFile, "bad-prop-name2", messages ); - executeTargetExpectError( projectFile, "bad-prop-name3", messages ); - } - -} diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestType.java b/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestType.java deleted file mode 100644 index c146a77df..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/PropertyTestType.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.test; - -import org.apache.myrmidon.framework.DataType; - -/** - * A test data-type used by the property tests. - * - * @author Adam Murdoch - * @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 + "]"; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/if.ant b/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/if.ant deleted file mode 100644 index b3caca2af..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/if.ant +++ /dev/null @@ -1,63 +0,0 @@ - - - - - test-prop is set - - - test-prop is not set - - - - - - - test-prop is set - - - test-prop is not set - - - - - - test-prop is set - - - test-prop is not set - - - - - - - test-prop is set - - - test-prop is not set - - - - - - - task 1 - task 2 - task 3 - task 4 - - - - - - no go - - - - - - no go - - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/property.ant b/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/property.ant deleted file mode 100644 index 03cad74a0..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/core/test/property.ant +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - test-prop = [${test-prop}] - - - - - some value - test-prop2 = [${test-prop2}] - - - - - - - - test-prop3 = [${test-prop3}] - - - - - - - - - - - - - - - another value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/CopyFilesTaskTestCase.java b/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/CopyFilesTaskTestCase.java deleted file mode 100644 index ad84a0219..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/CopyFilesTaskTestCase.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.vfile.test; - -import java.io.File; -import org.apache.myrmidon.AbstractProjectTest; - -/** - * Test cases for the task. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class CopyFilesTaskTestCase - extends AbstractProjectTest -{ - public CopyFilesTaskTestCase( String name ) - { - super( name ); - } - - /** - * A simple smoke test. - */ - public void testCopy() throws Exception - { - final File projectFile = getTestResource( "copy.ant" ); - executeTarget( projectFile, "copy" ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/copy.ant b/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/copy.ant deleted file mode 100644 index 18ea5067c..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/copy.ant +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/emptyFile.txt b/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/emptyFile.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/file1.txt b/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/file1.txt deleted file mode 100644 index 9ad7b1b57..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/file1.txt +++ /dev/null @@ -1 +0,0 @@ -A test file. \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/subdir1/someFile.html b/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/subdir1/someFile.html deleted file mode 100644 index c769030c0..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/antlib/vfile/test/src/subdir1/someFile.html +++ /dev/null @@ -1,5 +0,0 @@ - - -

Yo!

- - diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/asf-logo-huge.tar b/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/asf-logo-huge.tar deleted file mode 100644 index 3f92609782473ce883258bc08c0578d146350e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3215360 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 z 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 diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/asf-logo-huge.tar.bz2 b/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/asf-logo-huge.tar.bz2 deleted file mode 100644 index 7c2d2154a82fcf2c4fd4bef32fe7fcf0051a66f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58089 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 Donald - * @version $Revision$ $Date$ - */ -public class BzipTestCase - extends TestCase -{ - private final static byte[] HEADER = new byte[]{(byte)'B', (byte)'Z'}; - - public BzipTestCase( final String name ) - { - super( name ); - } - - public void testBzipOutputStream() - throws Exception - { - final InputStream input = getInputStream( "asf-logo-huge.tar" ); - final File outputFile = getOutputFile( ".tar.bz2" ); - final OutputStream output = new FileOutputStream( outputFile ); - final CBZip2OutputStream packedOutput = getPackedOutput( output ); - IOUtil.copy( input, packedOutput ); - IOUtil.shutdownStream( input ); - IOUtil.shutdownStream( packedOutput ); - IOUtil.shutdownStream( output ); - compareContents( "asf-logo-huge.tar.bz2", outputFile ); - FileUtil.forceDelete( outputFile ); - } - - public void testBzipInputStream() - throws Exception - { - final InputStream input = getInputStream( "asf-logo-huge.tar.bz2" ); - final File outputFile = getOutputFile( ".tar" ); - final OutputStream output = new FileOutputStream( outputFile ); - final CBZip2InputStream packedInput = getPackedInput( input ); - IOUtil.copy( packedInput, output ); - IOUtil.shutdownStream( input ); - IOUtil.shutdownStream( packedInput ); - IOUtil.shutdownStream( output ); - compareContents( "asf-logo-huge.tar", outputFile ); - FileUtil.forceDelete( outputFile ); - } - - private void compareContents( final String initial, final File generated ) - throws Exception - { - final InputStream input1 = getInputStream( initial ); - final InputStream input2 = new FileInputStream( generated ); - final boolean test = IOUtil.contentEquals( input1, input2 ); - IOUtil.shutdownStream( input1 ); - IOUtil.shutdownStream( input2 ); - assertTrue( "Contents of " + initial + " matches generated version " + generated, test ); - } - - private CBZip2InputStream getPackedInput( final InputStream input ) - throws IOException - { - final int b1 = input.read(); - final int b2 = input.read(); - assertEquals( "Equal header byte1", b1, 'B' ); - assertEquals( "Equal header byte2", b2, 'Z' ); - return new CBZip2InputStream( input ); - } - - private CBZip2OutputStream getPackedOutput( final OutputStream output ) - throws IOException - { - output.write( HEADER ); - return new CBZip2OutputStream( output ); - } - - private File getOutputFile( final String postfix ) - throws IOException - { - final File cwd = new File( "." ); - return File.createTempFile( "ant-test", postfix, cwd ); - } - - private InputStream getInputStream( final String resource ) - throws Exception - { - final String filename = "src" + File.separator + "testcases" + File.separator + - getClass().getName().replace( '.', File.separatorChar ); - final String path = FileUtil.getPath( filename ); - final File input = new File( path, resource ); - return new FileInputStream( input ); - //final ClassLoader loader = getClass().getClassLoader(); - //return loader.getResourceAsStream( resource ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/test/asf-logo-huge.tar b/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/test/asf-logo-huge.tar deleted file mode 100644 index 3f92609782473ce883258bc08c0578d146350e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3215360 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 z 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 diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/test/asf-logo-huge.tar.bz2 b/proposal/myrmidon/src/testcases/org/apache/aut/bzip2/test/asf-logo-huge.tar.bz2 deleted file mode 100644 index 7c2d2154a82fcf2c4fd4bef32fe7fcf0051a66f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58089 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 Murdoch - */ -public abstract class AbstractFileSystemTestCase - extends AbstractMyrmidonTest -{ - private final static Resources REZ - = ResourceManager.getPackageResources( AbstractFileObject.class ); - - protected FileObject m_baseFolder; - protected DefaultFileSystemManager m_manager; - - // Contents of "file1.txt" - private String m_charContent; - - public AbstractFileSystemTestCase( String name ) - { - super( name ); - } - - /** - * Builds the expected folder structure. - */ - private FileInfo buildExpectedStructure() - { - // Build the expected structure - final FileInfo base = new FileInfo( "test", FileType.FOLDER ); - base.addChild( new FileInfo( "file1.txt", FileType.FILE ) ); - base.addChild( new FileInfo( "empty.txt", FileType.FILE ) ); - base.addChild( new FileInfo( "emptydir", FileType.FOLDER ) ); - - final FileInfo dir = new FileInfo( "dir1", FileType.FOLDER ); - base.addChild( dir ); - dir.addChild( new FileInfo( "file1.txt", FileType.FILE ) ); - dir.addChild( new FileInfo( "file2.txt", FileType.FILE ) ); - dir.addChild( new FileInfo( "file3.txt", FileType.FILE ) ); - return base; - } - - /** - * Returns the base folder to run the tests against. - */ - protected abstract FileObject getBaseFolder() throws Exception; - - /** - * Sets up the test - */ - protected void setUp() throws Exception - { - // Create the file system manager - m_manager = new DefaultFileSystemManager(); - - // Locate the base folder - m_baseFolder = getBaseFolder(); - - // Make some assumptions absout the name - assertTrue( ! m_baseFolder.getName().getPath().equals( "/" ) ); - - // Build the expected content of "file1.txt" - final String eol = System.getProperty( "line.separator" ); - m_charContent = "This is a test file." + eol + "With 2 lines in it." + eol; - } - - /** - * Cleans-up test. - */ - protected void tearDown() throws Exception - { - m_manager.close(); - } - - /** - * Tests resolution of absolute URI. - */ - public void testAbsoluteURI() throws Exception - { - // Try fetching base folder again by its URI - final String uri = m_baseFolder.getName().getURI(); - final FileObject file = m_manager.resolveFile( uri ); - - assertSame( "file object", m_baseFolder, file ); - } - - /** - * Tests resolution of relative file names via the FS manager - */ - public void testRelativeURI() throws Exception - { - // Build base dir - m_manager.setBaseFile( m_baseFolder ); - - // Locate the base dir - FileObject file = m_manager.resolveFile( "." ); - assertSame( "file object", m_baseFolder, file ); - - // Locate a child - file = m_manager.resolveFile( "some-child" ); - assertSame( "file object", m_baseFolder, file.getParent() ); - - // Locate a descendent - file = m_manager.resolveFile( "some-folder/some-file" ); - assertSame( "file object", m_baseFolder, file.getParent().getParent() ); - - // Locate parent - file = m_manager.resolveFile( ".." ); - assertSame( "file object", m_baseFolder.getParent(), file ); - } - - /** - * Tests encoding of relative URI. - */ - public void testRelativeUriEncoding() throws Exception - { - // Build base dir - m_manager.setBaseFile( m_baseFolder ); - final String path = m_baseFolder.getName().getPath(); - - // Encode "some file" - FileObject file = m_manager.resolveFile( "%73%6f%6d%65%20%66%69%6c%65" ); - assertEquals( path + "/some file", file.getName().getPath() ); - - // Encode "." - file = m_manager.resolveFile( "%2e" ); - assertEquals( path, file.getName().getPath() ); - - // Encode '%' - file = m_manager.resolveFile( "a%25" ); - assertEquals( path + "/a%", file.getName().getPath() ); - - // Encode / - file = m_manager.resolveFile( "dir%2fchild" ); - assertEquals( path + "/dir/child", file.getName().getPath() ); - - // Encode \ - file = m_manager.resolveFile( "dir%5cchild" ); - assertEquals( path + "/dir/child", file.getName().getPath() ); - - // Use "%" literal - try - { - m_manager.resolveFile( "%" ); - fail(); - } - catch( FileSystemException e ) - { - } - - // Not enough digits in encoded char - try - { - m_manager.resolveFile( "%5" ); - fail(); - } - catch( FileSystemException e ) - { - } - - // Invalid digit in encoded char - try - { - m_manager.resolveFile( "%q" ); - fail(); - } - catch( FileSystemException e ) - { - } - } - - /** - * Tests the root file name. - */ - public void testRootFileName() throws Exception - { - // Locate the root file - final FileName rootName = m_baseFolder.getRoot().getName(); - - // Test that the root path is "/" - assertEquals( "root path", "/", rootName.getPath() ); - - // Test that the root basname is "" - assertEquals( "root base name", "", rootName.getBaseName() ); - - // Test that the root name has no parent - assertNull( "root parent", rootName.getParent() ); - } - - /** - * Tests child file names. - */ - public void testChildName() throws Exception - { - final FileName baseName = m_baseFolder.getName(); - final String basePath = baseName.getPath(); - final FileName name = baseName.resolveName( "some-child", NameScope.CHILD ); - - // Test path is absolute - assertTrue( "is absolute", basePath.startsWith( "/" ) ); - - // Test base name - assertEquals( "base name", "some-child", name.getBaseName() ); - - // Test absolute path - assertEquals( "absolute path", basePath + "/some-child", name.getPath() ); - - // Test parent path - assertEquals( "parent absolute path", basePath, name.getParent().getPath() ); - - // Try using a compound name to find a child - assertBadName( name, "a/b", NameScope.CHILD ); - - // Check other invalid names - checkDescendentNames( name, NameScope.CHILD ); - } - - /** - * Name resolution tests that are common for CHILD or DESCENDENT scope. - */ - private void checkDescendentNames( final FileName name, - final NameScope scope ) - throws Exception - { - // Make some assumptions about the name - assertTrue( !name.getPath().equals( "/" ) ); - assertTrue( !name.getPath().endsWith( "/a" ) ); - assertTrue( !name.getPath().endsWith( "/a/b" ) ); - - // Test names with the same prefix - String path = name.getPath() + "/a"; - assertSameName( path, name, path, scope ); - assertSameName( path, name, "../" + name.getBaseName() + "/a", scope ); - - // Test an empty name - assertBadName( name, "", scope ); - - // Test . name - assertBadName( name, ".", scope ); - assertBadName( name, "./", scope ); - - // Test ancestor names - assertBadName( name, "..", scope ); - assertBadName( name, "../a", scope ); - assertBadName( name, "../" + name.getBaseName() + "a", scope ); - assertBadName( name, "a/..", scope ); - - // Test absolute names - assertBadName( name, "/", scope ); - assertBadName( name, "/a", scope ); - assertBadName( name, "/a/b", scope ); - assertBadName( name, name.getPath(), scope ); - assertBadName( name, name.getPath() + "a", scope ); - } - - /** - * Checks that a relative name resolves to the expected absolute path. - * Tests both forward and back slashes. - */ - private void assertSameName( final String expectedPath, - final FileName baseName, - final String relName, - final NameScope scope ) - throws Exception - { - // Try the supplied name - FileName name = baseName.resolveName( relName, scope ); - assertEquals( expectedPath, name.getPath() ); - - // Replace the separators - relName.replace( '\\', '/' ); - name = baseName.resolveName( relName, scope ); - assertEquals( expectedPath, name.getPath() ); - - // And again - relName.replace( '/', '\\' ); - name = baseName.resolveName( relName, scope ); - assertEquals( expectedPath, name.getPath() ); - } - - /** - * Checks that a relative name resolves to the expected absolute path. - * Tests both forward and back slashes. - */ - private void assertSameName( String expectedPath, - FileName baseName, - String relName ) throws Exception - { - assertSameName( expectedPath, baseName, relName, NameScope.FILE_SYSTEM ); - } - - /** - * Tests relative name resolution, relative to the base folder. - */ - public void testNameResolution() throws Exception - { - final FileName baseName = m_baseFolder.getName(); - final String parentPath = baseName.getParent().getPath(); - final String path = baseName.getPath(); - final String childPath = path + "/some-child"; - - // Test empty relative path - assertSameName( path, baseName, "" ); - - // Test . relative path - assertSameName( path, baseName, "." ); - - // Test ./ relative path - assertSameName( path, baseName, "./" ); - - // Test .// relative path - assertSameName( path, baseName, ".//" ); - - // Test .///.///. relative path - assertSameName( path, baseName, ".///.///." ); - assertSameName( path, baseName, "./\\/.\\//." ); - - // Test /.. relative path - assertSameName( path, baseName, "a/.." ); - - // Test .. relative path - assertSameName( parentPath, baseName, ".." ); - - // Test ../ relative path - assertSameName( parentPath, baseName, "../" ); - - // Test ..//./ relative path - assertSameName( parentPath, baseName, "..//./" ); - assertSameName( parentPath, baseName, "..//.\\" ); - - // Test /../.. relative path - assertSameName( parentPath, baseName, "a/../.." ); - - // Test relative path - assertSameName( childPath, baseName, "some-child" ); - - // Test ./ relative path - assertSameName( childPath, baseName, "./some-child" ); - - // Test .// relative path - assertSameName( childPath, baseName, "./some-child/" ); - - // Test /././././ relative path - assertSameName( childPath, baseName, "./some-child/././././" ); - - // Test /../ relative path - assertSameName( childPath, baseName, "a/../some-child" ); - - // Test //../../ relative path - assertSameName( childPath, baseName, "a/b/../../some-child" ); - } - - /** - * Tests descendent name resolution. - */ - public void testDescendentName() - throws Exception - { - final FileName baseName = m_baseFolder.getName(); - - // Test direct child - String path = baseName.getPath() + "/some-child"; - assertSameName( path, baseName, "some-child", NameScope.DESCENDENT ); - - // Test compound name - path = path + "/grand-child"; - assertSameName( path, baseName, "some-child/grand-child", NameScope.DESCENDENT ); - - // Test relative names - assertSameName( path, baseName, "./some-child/grand-child", NameScope.DESCENDENT ); - assertSameName( path, baseName, "./nada/../some-child/grand-child", NameScope.DESCENDENT ); - assertSameName( path, baseName, "some-child/./grand-child", NameScope.DESCENDENT ); - - // Test badly formed descendent names - checkDescendentNames( baseName, NameScope.DESCENDENT ); - } - - /** - * Tests resolution of absolute names. - */ - public void testAbsoluteNames() throws Exception - { - // Test against the base folder - FileName name = m_baseFolder.getName(); - checkAbsoluteNames( name ); - - // Test against the root - name = m_baseFolder.getRoot().getName(); - checkAbsoluteNames( name ); - - // Test against some unknown file - name = name.resolveName( "a/b/unknown" ); - checkAbsoluteNames( name ); - } - - /** - * Tests resolution of absolute names. - */ - private void checkAbsoluteNames( final FileName name ) throws Exception - { - // Root - assertSameName( "/", name, "/" ); - assertSameName( "/", name, "//" ); - assertSameName( "/", name, "/." ); - assertSameName( "/", name, "/some file/.." ); - - // Some absolute names - assertSameName( "/a", name, "/a" ); - assertSameName( "/a", name, "/./a" ); - assertSameName( "/a", name, "/a/." ); - assertSameName( "/a/b", name, "/a/b" ); - - // Some bad names - assertBadName( name, "/..", NameScope.FILE_SYSTEM ); - assertBadName( name, "/a/../..", NameScope.FILE_SYSTEM ); - } - - /** - * Asserts that a particular relative name is invalid for a particular - * scope. - */ - private void assertBadName( final FileName name, - final String relName, - final NameScope scope ) - { - try - { - name.resolveName( relName, scope ); - fail( "expected failure" ); - } - catch( FileSystemException e ) - { - // TODO - should check error message - } - } - - /** - * Walks the base folder structure, asserting it contains exactly the - * expected files and folders. - */ - public void testStructure() throws Exception - { - final FileInfo baseInfo = buildExpectedStructure(); - assertSameStructure( m_baseFolder, baseInfo ); - } - - /** - * Walks a folder structure, asserting it contains exactly the - * expected files and folders. - */ - protected void assertSameStructure( final FileObject folder, - final FileInfo expected ) - throws Exception - { - // Setup the structure - final List queueExpected = new ArrayList(); - queueExpected.add( expected ); - - final List queueActual = new ArrayList(); - queueActual.add( folder ); - - while( queueActual.size() > 0 ) - { - final FileObject file = (FileObject)queueActual.remove( 0 ); - final FileInfo info = (FileInfo)queueExpected.remove( 0 ); - - // Check the type is correct - assertSame( file.getType(), info._type ); - - if( info._type == FileType.FILE ) - { - continue; - } - - // Check children - final FileObject[] children = file.getChildren(); - - // Make sure all children were found - assertNotNull( children ); - assertEquals( "count children of \"" + file.getName() + "\"", info._children.size(), children.length ); - - // Recursively check each child - for( int i = 0; i < children.length; i++ ) - { - final FileObject child = children[ i ]; - final FileInfo childInfo = (FileInfo)info._children.get( child.getName().getBaseName() ); - - // Make sure the child is expected - assertNotNull( childInfo ); - - // Add to the queue of files to check - queueExpected.add( childInfo ); - queueActual.add( child ); - } - } - } - - /** - * Tests existence determination. - */ - public void testExists() throws Exception - { - // Test a file - FileObject file = m_baseFolder.resolveFile( "file1.txt" ); - assertTrue( "file exists", file.exists() ); - - // Test a folder - file = m_baseFolder.resolveFile( "dir1" ); - assertTrue( "folder exists", file.exists() ); - - // Test an unknown file - file = m_baseFolder.resolveFile( "unknown-child" ); - assertTrue( "unknown file does not exist", !file.exists() ); - - // Test an unknown file in an unknown folder - file = m_baseFolder.resolveFile( "unknown-folder/unknown-child" ); - assertTrue( "unknown file does not exist", !file.exists() ); - } - - /** - * Tests type determination. - */ - public void testType() throws Exception - { - // Test a file - FileObject file = m_baseFolder.resolveFile( "file1.txt" ); - assertSame( FileType.FILE, file.getType() ); - - // Test a folder - file = m_baseFolder.resolveFile( "dir1" ); - assertSame( FileType.FOLDER, file.getType() ); - - // Test an unknown file - file = m_baseFolder.resolveFile( "unknown-child" ); - try - { - file.getType(); - fail(); - } - catch( FileSystemException e ) - { - final String message = REZ.getString( "get-type-no-exist.error", file ); - assertSameMessage( message, e ); - } - } - - /** - * Tests parent identity - */ - public void testParent() throws FileSystemException - { - // Test when both exist - FileObject folder = m_baseFolder.resolveFile( "dir1" ); - FileObject child = folder.resolveFile( "file3.txt" ); - assertTrue( "folder exists", folder.exists() ); - assertTrue( "child exists", child.exists() ); - assertSame( folder, child.getParent() ); - - // Test when file does not exist - child = folder.resolveFile( "unknown-file" ); - assertTrue( "folder exists", folder.exists() ); - assertTrue( "child does not exist", !child.exists() ); - assertSame( folder, child.getParent() ); - - // Test when neither exists - folder = m_baseFolder.resolveFile( "unknown-folder" ); - child = folder.resolveFile( "unknown-file" ); - assertTrue( "folder does not exist", !folder.exists() ); - assertTrue( "child does not exist", !child.exists() ); - assertSame( folder, child.getParent() ); - - // Test root of the file system has no parent - FileObject root = m_baseFolder.getRoot(); - assertNull( "root has null parent", root.getParent() ); - } - - /** - * Tests that children cannot be listed for non-folders. - */ - public void testChildren() throws FileSystemException - { - // Check for file - FileObject file = m_baseFolder.resolveFile( "file1.txt" ); - assertSame( FileType.FILE, file.getType() ); - try - { - file.getChildren(); - fail(); - } - catch( FileSystemException e ) - { - final String message = REZ.getString( "list-children-not-folder.error", file ); - assertSameMessage( message, e ); - } - - // Should be able to get child by name - file = file.resolveFile( "some-child" ); - assertNotNull( file ); - - // Check for unknown file - file = m_baseFolder.resolveFile( "unknown-file" ); - assertTrue( !file.exists() ); - try - { - file.getChildren(); - fail(); - } - catch( FileSystemException e ) - { - final String message = REZ.getString( "list-children-no-exist.error", file ); - assertSameMessage( message, e ); - } - - // Should be able to get child by name - FileObject child = file.resolveFile( "some-child" ); - assertNotNull( child ); - } - - /** - * Tests content. - */ - public void testContent() throws Exception - { - // Test non-empty file - FileObject file = m_baseFolder.resolveFile( "file1.txt" ); - FileContent content = file.getContent(); - assertSameContent( m_charContent, content ); - - // Test empty file - file = m_baseFolder.resolveFile( "empty.txt" ); - content = file.getContent(); - assertSameContent( "", content ); - } - - /** - * Asserts that the content of a file is the same as expected. Checks the - * length reported by getSize() is correct, then reads the content as - * a byte stream, and as a char stream, and compares the result with - * the expected content. Assumes files are encoded using UTF-8. - */ - protected void assertSameContent( final String expected, - final FileContent content ) - throws Exception - { - // Get file content as a binary stream - final byte[] expectedBin = expected.getBytes( "utf-8" ); - - // Check lengths - assertEquals( "same content length", expectedBin.length, content.getSize() ); - - // Read content into byte array - final InputStream instr = content.getInputStream(); - final ByteArrayOutputStream outstr; - try - { - outstr = new ByteArrayOutputStream(); - final byte[] buffer = new byte[ 256 ]; - int nread = 0; - while( nread >= 0 ) - { - outstr.write( buffer, 0, nread ); - nread = instr.read( buffer ); - } - } - finally - { - instr.close(); - } - - // Compare - assertTrue( "same binary content", Arrays.equals( expectedBin, outstr.toByteArray() ) ); - } - - /** - * Tests that folders and unknown files have no content. - */ - public void testNoContent() throws Exception - { - // Try getting the content of a folder - FileObject folder = m_baseFolder.resolveFile( "dir1" ); - try - { - folder.getContent(); - fail(); - } - catch( FileSystemException e ) - { - final String message = REZ.getString( "get-folder-content.error", folder ); - assertSameMessage( message, e ); - } - - // Try getting the content of an unknown file - FileObject unknownFile = m_baseFolder.resolveFile( "unknown-file" ); - FileContent content = unknownFile.getContent(); - try - { - content.getInputStream(); - fail(); - } - catch( FileSystemException e ) - { - final String message = REZ.getString( "read-no-exist.error", unknownFile ); - assertSameMessage( message, e ); - } - try - { - content.getSize(); - fail(); - } - catch( FileSystemException e ) - { - final String message = REZ.getString( "get-size-no-exist.error", unknownFile ); - assertSameMessage( message, e ); - } - } - - /** - * Tests that content and file objects are usable after being closed. - */ - public void testReuse() throws Exception - { - // Get the test file - FileObject file = m_baseFolder.resolveFile( "file1.txt" ); - assertEquals( FileType.FILE, file.getType() ); - - // Get the file content - FileContent content = file.getContent(); - assertSameContent( m_charContent, content ); - - // Read the content again - content = file.getContent(); - assertSameContent( m_charContent, content ); - - // Close the content + file - content.close(); - file.close(); - - // Read the content again - content = file.getContent(); - assertSameContent( m_charContent, content ); - } - - /** - * Info about a file. - */ - protected static final class FileInfo - { - String _baseName; - FileType _type; - Map _children = new HashMap(); - - public FileInfo( String name, FileType type ) - { - _baseName = name; - _type = type; - } - - /** Adds a child. */ - public void addChild( FileInfo child ) - { - _children.put( child._baseName, child ); - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractReadOnlyFileSystemTestCase.java b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractReadOnlyFileSystemTestCase.java deleted file mode 100644 index b415a6565..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractReadOnlyFileSystemTestCase.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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.aut.vfs.test; - -import org.apache.aut.vfs.test.AbstractFileSystemTestCase; - -/** - * File system tests which check that a read-only file system cannot be - * changed. - * - * @author Adam Murdoch - */ -public abstract class AbstractReadOnlyFileSystemTestCase extends AbstractFileSystemTestCase -{ - public AbstractReadOnlyFileSystemTestCase( String name ) - { - super( name ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractWritableFileSystemTestCase.java b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractWritableFileSystemTestCase.java deleted file mode 100644 index 06a73c132..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/AbstractWritableFileSystemTestCase.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * 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.aut.vfs.test; - -import java.io.OutputStream; -import java.util.HashSet; -import java.util.Set; -import org.apache.aut.vfs.test.AbstractFileSystemTestCase; -import org.apache.aut.vfs.FileObject; -import org.apache.aut.vfs.FileType; -import org.apache.aut.vfs.FileSystemException; - -/** - * File system test that check that a file system can be modified. - * - * @author Adam Murdoch - */ -public abstract class AbstractWritableFileSystemTestCase - extends AbstractFileSystemTestCase -{ - public AbstractWritableFileSystemTestCase( String name ) - { - super( name ); - } - - /** - * Returns the URI for the area to do tests in. - */ - protected abstract FileObject getWriteFolder() throws Exception; - - /** - * Sets up a scratch folder for the test to use. - */ - protected FileObject createScratchFolder() throws Exception - { - FileObject scratchFolder = getWriteFolder(); - - // Make sure the test folder is empty - scratchFolder.delete(); - scratchFolder.create( FileType.FOLDER ); - - return scratchFolder; - } - - /** - * Tests folder creation. - */ - public void testFolderCreate() throws Exception - { - FileObject scratchFolder = createScratchFolder(); - - // Create direct child of the test folder - FileObject folder = scratchFolder.resolveFile( "dir1" ); - assertTrue( !folder.exists() ); - folder.create( FileType.FOLDER ); - assertTrue( folder.exists() ); - assertEquals( 0, folder.getChildren().length ); - - // Create a descendant, where the intermediate folders don't exist - folder = scratchFolder.resolveFile( "dir2/dir1/dir1" ); - assertTrue( !folder.exists() ); - assertTrue( !folder.getParent().exists() ); - assertTrue( !folder.getParent().getParent().exists() ); - folder.create( FileType.FOLDER ); - assertTrue( folder.exists() ); - assertEquals( 0, folder.getChildren().length ); - assertTrue( folder.getParent().exists() ); - assertTrue( folder.getParent().getParent().exists() ); - - // Test creating a folder that already exists - folder.create( FileType.FOLDER ); - } - - /** - * Tests file creation - */ - public void testFileCreate() throws Exception - { - FileObject scratchFolder = createScratchFolder(); - - // Create direct child of the test folder - FileObject file = scratchFolder.resolveFile( "file1.txt" ); - assertTrue( !file.exists() ); - file.create( FileType.FILE ); - assertTrue( file.exists() ); - assertEquals( 0, file.getContent().getSize() ); - - // Create a descendant, where the intermediate folders don't exist - file = scratchFolder.resolveFile( "dir1/dir1/file1.txt" ); - assertTrue( !file.exists() ); - assertTrue( !file.getParent().exists() ); - assertTrue( !file.getParent().getParent().exists() ); - file.create( FileType.FILE ); - assertTrue( file.exists() ); - assertEquals( 0, file.getContent().getSize() ); - assertTrue( file.getParent().exists() ); - assertTrue( file.getParent().getParent().exists() ); - - // Test creating a file that already exists - file.create( FileType.FILE ); - } - - /** - * Tests file/folder creation with mismatched types. - */ - public void testFileCreateMismatched() throws Exception - { - FileObject scratchFolder = createScratchFolder(); - - // Create a test file and folder - FileObject file = scratchFolder.resolveFile( "dir1/file1.txt" ); - file.create( FileType.FILE ); - assertEquals( FileType.FILE, file.getType() ); - - FileObject folder = scratchFolder.resolveFile( "dir1/dir2" ); - folder.create( FileType.FOLDER ); - assertEquals( FileType.FOLDER, folder.getType() ); - - // Attempt to create a file that already exists as a folder - try - { - folder.create( FileType.FILE ); - assertTrue( false ); - } - catch( FileSystemException exc ) - { - } - - // Attempt to create a folder that already exists as a file - try - { - file.create( FileType.FOLDER ); - assertTrue( false ); - } - catch( FileSystemException exc ) - { - } - - // Attempt to create a folder as a child of a file - FileObject folder2 = file.resolveFile( "some-child" ); - try - { - folder2.create( FileType.FOLDER ); - assertTrue( false ); - } - catch( FileSystemException exc ) - { - } - } - - /** - * Tests deletion - */ - public void testDelete() throws Exception - { - // Set-up the test structure - FileObject folder = createScratchFolder(); - folder.resolveFile( "file1.txt" ).create( FileType.FILE ); - folder.resolveFile( "emptydir" ).create( FileType.FOLDER ); - folder.resolveFile( "dir1/file1.txt" ).create( FileType.FILE ); - folder.resolveFile( "dir1/dir2/file2.txt" ).create( FileType.FILE ); - - // Delete a file - FileObject file = folder.resolveFile( "file1.txt" ); - assertTrue( file.exists() ); - file.delete(); - assertTrue( !file.exists() ); - - // Delete an empty folder - file = folder.resolveFile( "emptydir" ); - assertTrue( file.exists() ); - file.delete(); - assertTrue( !file.exists() ); - - // Recursive delete - file = folder.resolveFile( "dir1" ); - FileObject file2 = file.resolveFile( "dir2/file2.txt" ); - assertTrue( file.exists() ); - assertTrue( file2.exists() ); - file.delete(); - assertTrue( !file.exists() ); - assertTrue( !file2.exists() ); - - // Delete a file that does not exist - file = folder.resolveFile( "some-folder/some-file" ); - assertTrue( !file.exists() ); - file.delete(); - assertTrue( !file.exists() ); - } - - /** - * Test that children are handled correctly by create and delete. - */ - public void testListChildren() throws Exception - { - FileObject folder = createScratchFolder(); - HashSet names = new HashSet(); - - // Make sure the folder is empty - assertEquals( 0, folder.getChildren().length ); - - // Create a child folder - folder.resolveFile( "dir1" ).create( FileType.FOLDER ); - names.add( "dir1" ); - assertSameFileSet( names, folder.getChildren() ); - - // Create a child file - folder.resolveFile( "file1.html" ).create( FileType.FILE ); - names.add( "file1.html" ); - assertSameFileSet( names, folder.getChildren() ); - - // Create a descendent - folder.resolveFile( "dir2/file1.txt" ).create( FileType.FILE ); - names.add( "dir2" ); - assertSameFileSet( names, folder.getChildren() ); - - // Create a child file via an output stream - OutputStream outstr = folder.resolveFile( "file2.txt" ).getContent().getOutputStream(); - outstr.close(); - names.add( "file2.txt" ); - assertSameFileSet( names, folder.getChildren() ); - - // Delete a child folder - folder.resolveFile( "dir1" ).delete(); - names.remove( "dir1" ); - assertSameFileSet( names, folder.getChildren() ); - - // Delete a child file - folder.resolveFile( "file1.html" ).delete(); - names.remove( "file1.html" ); - assertSameFileSet( names, folder.getChildren() ); - - // Recreate the folder - folder.delete(); - folder.create( FileType.FOLDER ); - assertEquals( 0, folder.getChildren().length ); - } - - /** - * Ensures the names of a set of files match an expected set. - */ - private void assertSameFileSet( Set names, FileObject[] files ) - { - // Make sure the sets are the same length - assertEquals( names.size(), files.length ); - - // Check for unexpected names - for( int i = 0; i < files.length; i++ ) - { - FileObject file = files[ i ]; - assertTrue( names.contains( file.getName().getBaseName() ) ); - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/FtpFileSystemTestCase.java b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/FtpFileSystemTestCase.java deleted file mode 100644 index 0788c6eed..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/FtpFileSystemTestCase.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.aut.vfs.test; - -import org.apache.aut.vfs.provider.ftp.FtpFileSystemProvider; -import org.apache.aut.vfs.test.AbstractWritableFileSystemTestCase; -import org.apache.aut.vfs.FileObject; - -/** - * Tests for FTP file systems. - * - * @author Adam Murdoch - */ -public class FtpFileSystemTestCase - extends AbstractWritableFileSystemTestCase -{ - public FtpFileSystemTestCase( String name ) - { - super( name ); - } - - /** - * Returns the URI for the base folder. - */ - protected FileObject getBaseFolder() throws Exception - { - final String uri = System.getProperty( "test.ftp.uri" ) + "/read-tests"; - m_manager.addProvider( "ftp", new FtpFileSystemProvider() ); - return m_manager.resolveFile( uri ); - } - - /** - * Returns the URI for the area to do tests in. - */ - protected FileObject getWriteFolder() throws Exception - { - final String uri = System.getProperty( "test.ftp.uri" ) + "/write-tests"; - return m_manager.resolveFile( uri ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/LocalFileSystemTestCase.java b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/LocalFileSystemTestCase.java deleted file mode 100644 index 540ec36f6..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/LocalFileSystemTestCase.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.aut.vfs.test; - -import java.io.File; -import org.apache.aut.vfs.test.AbstractWritableFileSystemTestCase; -import org.apache.aut.vfs.FileObject; - -/** - * Tests for the local file system. - * - * @author Adam Murdoch - */ -public class LocalFileSystemTestCase extends AbstractWritableFileSystemTestCase -{ - public LocalFileSystemTestCase( String name ) - { - super( name ); - } - - /** - * Returns the URI for the base folder. - */ - protected FileObject getBaseFolder() throws Exception - { - final File testDir = getTestResource( "basedir" ); - return m_manager.convert( testDir ); - } - - /** - * Returns the URI for the area to do tests in. - */ - protected FileObject getWriteFolder() throws Exception - { - final File testDir = getTestResource( "write-tests" ); - return m_manager.convert( testDir ); - } - - /** - * Tests resolution of an absolute file name. - */ - public void testAbsoluteFileName() throws Exception - { - // Locate file by absolute file name - String fileName = new File( "testdir" ).getAbsolutePath(); - FileObject absFile = m_manager.resolveFile( fileName ); - - // Locate file by URI - String uri = "file://" + fileName.replace( File.separatorChar, '/' ); - FileObject uriFile = m_manager.resolveFile( uri ); - - assertSame( "file object", absFile, uriFile ); - } - -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/NestedZipFileSystemTestCase.java b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/NestedZipFileSystemTestCase.java deleted file mode 100644 index 652dcf5b9..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/NestedZipFileSystemTestCase.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.aut.vfs.test; - -import org.apache.aut.vfs.provider.zip.ZipFileSystemProvider; -import org.apache.aut.vfs.test.AbstractReadOnlyFileSystemTestCase; -import org.apache.aut.vfs.FileObject; - -/** - * Tests for the Zip file system, using a zip file nested inside another zip file. - * - * @author Adam Murdoch - */ -public class NestedZipFileSystemTestCase - extends AbstractReadOnlyFileSystemTestCase -{ - public NestedZipFileSystemTestCase( String name ) - { - super( name ); - } - - /** - * Returns the URI for the base folder. - */ - protected FileObject getBaseFolder() throws Exception - { - m_manager.addProvider( "zip", new ZipFileSystemProvider() ); - - // Locate the base Zip file - final String zipFilePath = getTestResource( "nested.zip" ).getAbsolutePath(); - String uri = "zip:" + zipFilePath + "!/test.zip"; - final FileObject zipFile = m_manager.resolveFile( uri ); - - // Now build the nested file system - final FileObject nestedFS = m_manager.createFileSystem( "zip", zipFile ); - return nestedFS.resolveFile( "/basedir" ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/SmbFileSystemTestCase.java b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/SmbFileSystemTestCase.java deleted file mode 100644 index bf0402376..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/SmbFileSystemTestCase.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.aut.vfs.test; - -import org.apache.aut.vfs.provider.smb.SmbFileSystemProvider; -import org.apache.aut.vfs.test.AbstractWritableFileSystemTestCase; -import org.apache.aut.vfs.FileObject; - -/** - * Tests for the SMB file system. - * - * @author Adam Murdoch - */ -public class SmbFileSystemTestCase extends AbstractWritableFileSystemTestCase -{ - public SmbFileSystemTestCase( String name ) - { - super( name ); - } - - /** - * Returns the URI for the base folder. - */ - protected FileObject getBaseFolder() throws Exception - { - final String uri = System.getProperty( "test.smb.uri" ) + "/read-tests"; - m_manager.addProvider( "smb", new SmbFileSystemProvider() ); - return m_manager.resolveFile( uri ); - } - - /** - * Returns the URI for the area to do tests in. - */ - protected FileObject getWriteFolder() throws Exception - { - final String uri = System.getProperty( "test.smb.uri" ) + "/write-tests"; - return m_manager.resolveFile( uri ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/ZipFileSystemTestCase.java b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/ZipFileSystemTestCase.java deleted file mode 100644 index ded939ef6..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/ZipFileSystemTestCase.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.aut.vfs.test; - -import java.io.File; -import org.apache.aut.vfs.provider.zip.ZipFileSystemProvider; -import org.apache.aut.vfs.test.AbstractReadOnlyFileSystemTestCase; -import org.apache.aut.vfs.FileObject; - -/** - * Tests for the Zip file system. - * - * @author Adam Murdoch - */ -public class ZipFileSystemTestCase extends AbstractReadOnlyFileSystemTestCase -{ - public ZipFileSystemTestCase( String name ) - { - super( name ); - } - - /** - * Returns the URI for the base folder. - */ - protected FileObject getBaseFolder() throws Exception - { - File zipFile = getTestResource( "test.zip" ); - String uri = "zip:" + zipFile.getAbsolutePath() + "!basedir"; - m_manager.addProvider( "zip", new ZipFileSystemProvider() ); - return m_manager.resolveFile( uri ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file1.txt b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file1.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file2.txt b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file2.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file3.txt b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/dir1/file3.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/empty.txt b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/file1.txt b/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/file1.txt deleted file mode 100644 index e7dead2c1..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/aut/vfs/test/basedir/file1.txt +++ /dev/null @@ -1,2 +0,0 @@ -This is a test file. -With 2 lines in it. diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java deleted file mode 100644 index fbef96e5a..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractMyrmidonTest.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * 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.io.File; -import java.io.IOException; -import junit.framework.TestCase; -import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.excalibur.i18n.ResourceManager; -import org.apache.avalon.framework.ExceptionUtil; -import org.apache.avalon.framework.logger.Logger; -import org.apache.myrmidon.frontends.BasicLogger; - -/** - * A base class for Myrmidon tests. Provides utility methods for locating - * test resources. - * - * @author Adam Murdoch - */ -public abstract class AbstractMyrmidonTest - extends TestCase -{ - private final File m_testBaseDir; - private final File m_baseDir; - private Logger m_logger; - - protected static final Resources getResourcesForTested( final Class clazz ) - { - final Package pkg = clazz.getPackage(); - - String baseName; - if( null == pkg ) - { - final String name = clazz.getName(); - if( -1 == name.lastIndexOf( "." ) ) - { - baseName = ""; - } - else - { - baseName = name.substring( 0, name.lastIndexOf( "." ) ); - } - } - else - { - baseName = pkg.getName(); - } - - if( baseName.endsWith( ".test" ) ) - { - baseName = baseName.substring( 0, baseName.length() - 5 ); - } - - return ResourceManager.getBaseResources( baseName + ".Resources", AbstractMyrmidonTest.class.getClassLoader() ); - } - - public AbstractMyrmidonTest( String name ) - { - super( name ); - final String baseDirProp = System.getProperty( "test.basedir" ); - m_baseDir = getCanonicalFile( new File( baseDirProp ) ); - String packagePath = getClass().getName(); - int idx = packagePath.lastIndexOf( '.' ); - packagePath = packagePath.substring( 0, idx ); - packagePath = packagePath.replace( '.', File.separatorChar ); - m_testBaseDir = getCanonicalFile( new File( m_baseDir, packagePath ) ); - } - - /** - * Locates a test resource, and asserts that the resource exists - * - * @param name path of the resource, relative to this test's base directory. - */ - protected File getTestResource( final String name ) - { - return getTestResource( name, true ); - } - - /** - * Locates a test resource. - * - * @param name path of the resource, relative to this test's base directory. - */ - protected File getTestResource( final String name, final boolean mustExist ) - { - File file = new File( m_testBaseDir, name ); - file = getCanonicalFile( file ); - if( mustExist ) - { - assertTrue( "Test file \"" + file + "\" does not exist.", file.exists() ); - } - else - { - assertTrue( "Test file \"" + file + "\" should not exist.", !file.exists() ); - } - - return file; - } - - /** - * Locates the base directory for this test. - */ - protected File getTestDirectory() - { - return m_testBaseDir; - } - - /** - * Locates a test directory, creating it if it does not exist. - * - * @param name path of the directory, relative to this test's base directory. - */ - protected File getTestDirectory( final String name ) - { - File file = new File( m_testBaseDir, name ); - file = getCanonicalFile( file ); - assertTrue( "Test directory \"" + file + "\" does not exist or is not a directory.", - file.isDirectory() || file.mkdirs() ); - return 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 getLogger() - { - if( m_logger == null ) - { - m_logger = new BasicLogger( "[test]", BasicLogger.LEVEL_WARN ); - } - return m_logger; - } - - /** - * 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 ) - { - //System.out.println( "exception:" ); - //for( Throwable t = throwable; t != null; t = ExceptionUtil.getCause( t, true ) ) - //{ - // System.out.println( " " + t.getMessage() ); - //} - - Throwable current = throwable; - for( int i = 0; i < messages.length; i++ ) - { - String message = messages[ i ]; - assertNotNull( current ); - if( message != null ) - { - assertEquals( message, current.getMessage() ); - } - - // Get the next exception in the chain - current = ExceptionUtil.getCause( current, true ); - } - } - - /** - * Asserts that an exception contains the expected message. - */ - protected void assertSameMessage( final String message, final Throwable throwable ) - { - assertSameMessage( new String[]{message}, throwable ); - } - - /** - * Compares 2 objects for equality, nulls are equal. Used by the test - * classes' equals() methods. - */ - public static boolean equals( final Object o1, final Object o2 ) - { - if( o1 == null && o2 == null ) - { - return true; - } - if( o1 == null || o2 == null ) - { - return false; - } - return o1.equals( o2 ); - } - -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractProjectTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractProjectTest.java deleted file mode 100644 index 371e341da..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/AbstractProjectTest.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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.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.interfaces.embeddor.Embeddor; -import org.apache.myrmidon.interfaces.model.Project; -import org.apache.myrmidon.interfaces.workspace.Workspace; -import org.apache.myrmidon.listeners.ProjectListener; - -/** - * A base class for test cases which need to execute projects. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class AbstractProjectTest - extends AbstractMyrmidonTest -{ - private DefaultEmbeddor m_embeddor; - - public AbstractProjectTest( final String name ) - { - super( name ); - } - - /** - * Tear-down the test. - */ - protected void tearDown() throws Exception - { - if( m_embeddor != null ) - { - m_embeddor.dispose(); - m_embeddor = null; - } - } - - /** - * Returns an embeddor which can be used to build and execute projects. - */ - protected Embeddor getEmbeddor() throws Exception - { - if( m_embeddor == null ) - { - // Need to set the context classloader - The default embeddor uses it - Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); - - final Logger logger = getLogger(); - 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(); - } - - return m_embeddor; - } - - /** - * 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 ) - 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 Project project = embeddor.createProject( projectFile.getAbsolutePath(), null, null ); - 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 ); - - // Make sure all expected events were delivered - tracker.assertComplete(); - if( listener instanceof TrackingProjectListener ) - { - ( (TrackingProjectListener)listener ).assertComplete(); - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java deleted file mode 100644 index 63f37ee67..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/DependencyMetricsTest.java +++ /dev/null @@ -1,293 +0,0 @@ -/* - * 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.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import jdepend.framework.JDepend; -import jdepend.framework.JavaPackage; -import junit.framework.TestCase; - -/** - * An abstract Unit test that can be used to test Dependency metrics - * fall in acceptable limits. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class DependencyMetricsTest - extends TestCase -{ - private JDepend m_jDepend; - - public DependencyMetricsTest( final String name ) - { - super( name ); - } - - /** - * Sets up the test fixture. - * - * Called before every test case method. - */ - protected void setUp() - { - m_jDepend = new JDepend(); - - try - { - - m_jDepend.addDirectory( "src/java" ); - //m_jDepend.addDirectory( "src/main" ); - } - catch( final IOException ioe ) - { - fail( ioe.getMessage() ); - } - - m_jDepend.analyze(); - } - - /** - * Tears down the test fixture. - * - * Called after every test case method. - */ - protected void tearDown() - { - m_jDepend = null; - } - - /** - * Utility method to retrieve JDpenden instance that contains statistics. - */ - protected final JDepend getJDepend() - { - return m_jDepend; - } - - /** - * Make sure that the launcher classes in org.apache.myrmidon.launcher.* - * are completely decoupled from the rest of the system. - */ - public void testLauncherDecoupled() - { - final JDepend jDepend = getJDepend(); - final String name = "org.apache.myrmidon.launcher"; - final JavaPackage javaPackage = jDepend.getPackage( name ); - - final Collection efferentSet = javaPackage.getEfferents(); - final Iterator afferents = efferentSet.iterator(); - while( afferents.hasNext() ) - { - final JavaPackage efferent = (JavaPackage)afferents.next(); - final String efferentName = efferent.getName(); - if( ! isSubPackage( name, efferentName ) ) - { - fail( "The launcher package " + name + " depends on external classes " + - "contained in " + efferentName + ". No classes besides " + - "those in the launcher hierarchy should be referenced" ); - } - } - } - - /** - * Make sure that the implementations of the myrmidon kernel components - * (ie org.apache.myrmidon.component.X.*) are not referenced by anyone - * except by other objects in the same package or child packages. - */ - public void testNoComponentImplSharing() - { - final JDepend jDepend = getJDepend(); - final Collection packageSet = jDepend.getPackages(); - - final Iterator packages = packageSet.iterator(); - while( packages.hasNext() ) - { - final JavaPackage javaPackage = (JavaPackage)packages.next(); - final String name = javaPackage.getName(); - final String componentPackage = "org.apache.myrmidon.components."; - if( !name.startsWith( componentPackage ) ) - { - continue; - } - - // Extract the component package - final int start = componentPackage.length() + 1; - final int end = name.indexOf( '.', start ); - final String component; - if( end > -1 ) - { - component = name.substring( end ); - } - else - { - component = name; - } - - // Make sure that all the afferent packages of this package (i.e. - // those that refer to this package) are sub-packages of the - // component package - final Collection afferentSet = javaPackage.getAfferents(); - final Iterator afferents = afferentSet.iterator(); - while( afferents.hasNext() ) - { - final JavaPackage efferent = (JavaPackage)afferents.next(); - final String efferentName = efferent.getName(); - if( !isSubPackage( component, efferentName ) ) - { - fail( "The package " + name + " is referred to by classes " + - "contained in " + efferentName + ". No classes besides " + - "those part of the particular implementation of kernel " + - "component should reference the implementations" ); - } - } - } - } - - /** - * Make sure that aut does not depend on any other ant classes - * and thus can be cleanly decoupled. - */ - public void testAutDecoupled() - { - final String packageName = "org.apache.aut"; - final String[] badEfferents = new String[] - { - "org.apache.myrmidon", "org.apache.antlib", "org.apache.tools.ant" - }; - doTestDecoupled( packageName, badEfferents ); - } - - /** - * Make sure that myrmidon package does not have any - * unwanted dependencies. - */ - /* - public void testMyrmidonDecoupled() - { - final String packageName = "org.apache.myrmidon"; - final String[] badEfferents = new String[] - { - "org.apache.antlib", "org.apache.tools.ant" - }; - doTestDecoupled( packageName, badEfferents ); - } - */ - - /** - * Make sure that antlib package does not have any - * unwanted dependencies. - */ - /* - public void testAntlibDecoupled() - { - final String packageName = "org.apache.antlib"; - final String[] badEfferents = new String[] - { - "org.apache.tools.ant" - }; - doTestDecoupled( packageName, badEfferents ); - } - */ - /** - * Make sure there are no circular dependencies between packages because - * circular dependencies are evil!!! - */ - public void testNoCircularity() - { - final JDepend jDepend = getJDepend(); - final Collection packageSet = jDepend.getPackages(); - final Iterator packages = packageSet.iterator(); - while( packages.hasNext() ) - { - final JavaPackage javaPackage = (JavaPackage)packages.next(); - if( javaPackage.containsCycle() ) - { - final ArrayList cycle = new ArrayList(); - javaPackage.collectCycle( cycle ); - - final ArrayList names = getPackageNames( cycle ); - fail( "The package " + javaPackage.getName() + " contains a cycle " + - "with a path " + names ); - } - } - } - - private ArrayList getPackageNames( final ArrayList cycle ) - { - final ArrayList names = new ArrayList(); - - final int size = cycle.size(); - for( int i = 0; i < size; i++ ) - { - final JavaPackage javaPackage = (JavaPackage)cycle.get( i ); - names.add( javaPackage.getName() ); - } - - return names; - } - - /** - * Make sure that the specified package does not depend on any - * of the specified package hierarchies. - */ - private void doTestDecoupled( final String packageName, - final String[] invalidEfferents ) - { - final JDepend jDepend = getJDepend(); - final Collection packageSet = jDepend.getPackages(); - - final Iterator packages = packageSet.iterator(); - while( packages.hasNext() ) - { - final JavaPackage javaPackage = (JavaPackage)packages.next(); - final String name = javaPackage.getName(); - if( !isSubPackage( packageName, name ) ) - { - continue; - } - - final Collection efferentSet = javaPackage.getEfferents(); - final Iterator efferents = efferentSet.iterator(); - while( efferents.hasNext() ) - { - final JavaPackage efferent = (JavaPackage)efferents.next(); - final String efferentName = efferent.getName(); - for( int i = 0; i < invalidEfferents.length; i++ ) - { - final String other = invalidEfferents[ i ]; - if( isSubPackage( other, efferentName ) ) - { - fail( "The package " + name + " has an unwanted dependency " + - "on classes contained in " + efferentName ); - } - } - } - } - } - - /** - * Determines if a package is a sub-package of another package. - * - * @return true if subpackage is either the same package as - * basePackage, or a sub-package of it. - */ - private boolean isSubPackage( final String basePackage, - final String subpackage ) - { - if( ! subpackage.startsWith( basePackage ) ) - { - return false; - } - return ( subpackage.length() == basePackage.length() - || subpackage.charAt( basePackage.length() ) == '.' ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/LogMessageTracker.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/LogMessageTracker.java deleted file mode 100644 index be5f53b04..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/LogMessageTracker.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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 Adam Murdoch - * @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 ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java deleted file mode 100644 index 9ddf03f1f..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/TrackingProjectListener.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * 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 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; - - /** - * 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(); - } - - /** - * 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; - - 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() ); - 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 ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java deleted file mode 100644 index b50c65df9..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/AbstractComponentTest.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * 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; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import org.apache.aut.converter.Converter; -import org.apache.avalon.framework.logger.LogEnabled; -import org.apache.avalon.framework.logger.Logger; -import org.apache.avalon.framework.service.DefaultServiceManager; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.avalon.framework.service.Serviceable; -import org.apache.myrmidon.AbstractMyrmidonTest; -import org.apache.myrmidon.components.classloader.DefaultClassLoaderManager; -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.executor.DefaultExecutor; -import org.apache.myrmidon.components.extensions.DefaultExtensionManager; -import org.apache.myrmidon.components.property.DefaultPropertyResolver; -import org.apache.myrmidon.components.role.DefaultRoleManager; -import org.apache.myrmidon.components.type.DefaultTypeManager; -import org.apache.myrmidon.framework.DataType; -import org.apache.myrmidon.interfaces.classloader.ClassLoaderManager; -import org.apache.myrmidon.interfaces.configurer.Configurer; -import org.apache.myrmidon.interfaces.converter.ConverterRegistry; -import org.apache.myrmidon.interfaces.deployer.Deployer; -import org.apache.myrmidon.interfaces.executor.Executor; -import org.apache.myrmidon.interfaces.extensions.ExtensionManager; -import org.apache.myrmidon.interfaces.property.PropertyResolver; -import org.apache.myrmidon.interfaces.role.RoleInfo; -import org.apache.myrmidon.interfaces.role.RoleManager; -import org.apache.myrmidon.interfaces.service.ServiceFactory; -import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; -import org.apache.myrmidon.interfaces.type.TypeManager; - -/** - * A base class for tests for the default components. - * - * @author Adam Murdoch - */ -public abstract class AbstractComponentTest - extends AbstractMyrmidonTest -{ - private DefaultServiceManager m_serviceManager; - - public static final String DATA_TYPE_ROLE = "data-type"; - public static final String CONVERTER_ROLE = "converter"; - public static final String SERVICE_FACTORY_ROLE = "service-factory"; - - public AbstractComponentTest( final String name ) - { - super( name ); - } - - /** - * Returns the component manager containing the components to test. - */ - protected final ServiceManager getServiceManager() throws Exception - { - if( m_serviceManager == null ) - { - Logger logger = getLogger(); - - // Create the components - m_serviceManager = new DefaultServiceManager(); - List components = new ArrayList(); - - Object component = createComponent( Converter.ROLE, DefaultMasterConverter.class ); - m_serviceManager.put( Converter.ROLE, component ); - components.add( component ); - - component = createComponent( ConverterRegistry.ROLE, DefaultConverterRegistry.class ); - m_serviceManager.put( ConverterRegistry.ROLE, component ); - components.add( component ); - - component = createComponent( TypeManager.ROLE, DefaultTypeManager.class ); - m_serviceManager.put( TypeManager.ROLE, component ); - components.add( component ); - - component = createComponent( Configurer.ROLE, DefaultConfigurer.class ); - m_serviceManager.put( Configurer.ROLE, component ); - components.add( component ); - - component = createComponent( Deployer.ROLE, DefaultDeployer.class ); - m_serviceManager.put( Deployer.ROLE, component ); - components.add( component ); - - component = createComponent( Executor.ROLE, DefaultExecutor.class ); - m_serviceManager.put( Executor.ROLE, component ); - components.add( component ); - - final DefaultClassLoaderManager classLoaderMgr = new DefaultClassLoaderManager(); - classLoaderMgr.setBaseClassLoader( getClass().getClassLoader() ); - m_serviceManager.put( ClassLoaderManager.ROLE, classLoaderMgr ); - components.add( classLoaderMgr ); - - component = createComponent( ExtensionManager.ROLE, DefaultExtensionManager.class ); - m_serviceManager.put( ExtensionManager.ROLE, component ); - components.add( component ); - - component = createComponent( RoleManager.ROLE, DefaultRoleManager.class ); - m_serviceManager.put( RoleManager.ROLE, component ); - components.add( component ); - - component = createComponent( PropertyResolver.ROLE, DefaultPropertyResolver.class ); - m_serviceManager.put( PropertyResolver.ROLE, component ); - components.add( component ); - - // Log enable the components - for( Iterator iterator = components.iterator(); iterator.hasNext(); ) - { - Object obj = iterator.next(); - if( obj instanceof LogEnabled ) - { - final LogEnabled logEnabled = (LogEnabled)obj; - logEnabled.enableLogging( logger ); - } - } - - // Compose the components - for( Iterator iterator = components.iterator(); iterator.hasNext(); ) - { - Object obj = iterator.next(); - if( obj instanceof Serviceable ) - { - final Serviceable serviceable = (Serviceable)obj; - serviceable.service( m_serviceManager ); - } - } - - // Register some standard roles - // Add some core roles - final RoleManager roleManager = (RoleManager)getServiceManager().lookup( RoleManager.ROLE ); - roleManager.addRole( new RoleInfo( DataType.ROLE, DATA_TYPE_ROLE, DataType.class ) ); - roleManager.addRole( new RoleInfo( Converter.ROLE, CONVERTER_ROLE, Converter.class ) ); - roleManager.addRole( new RoleInfo( ServiceFactory.ROLE, SERVICE_FACTORY_ROLE, ServiceFactory.class ) ); - } - - return m_serviceManager; - } - - /** - * Creates an instance of a component. Sub-classes can override this - * method to add a particular implementation to the set of test components. - */ - protected Object createComponent( final String role, final Class defaultImpl ) - throws Exception - { - return defaultImpl.newInstance(); - } - - /** - * Returns the type manager. - */ - protected TypeManager getTypeManager() - throws Exception - { - return (TypeManager)getServiceManager().lookup( TypeManager.ROLE ); - } - - /** - * Utility method to register a role. - */ - protected void registerRole( final RoleInfo roleInfo ) - throws Exception - { - RoleManager roleMgr = (RoleManager)getServiceManager().lookup( RoleManager.ROLE ); - roleMgr.addRole( roleInfo ); - } - - /** - * Utility method to register a type. - */ - protected void registerType( final String roleName, - final String typeName, - final Class type ) - throws Exception - { - final ClassLoader loader = getClass().getClassLoader(); - final DefaultTypeFactory factory = new DefaultTypeFactory( loader ); - factory.addNameClassMapping( typeName, type.getName() ); - getTypeManager().registerType( roleName, typeName, factory ); - } - - /** - * Utility method to register a Converter. - */ - protected void registerConverter( final Class converterClass, - final Class sourceClass, - final Class destClass ) - throws Exception - { - ConverterRegistry converterRegistry = (ConverterRegistry)getServiceManager().lookup( ConverterRegistry.ROLE ); - converterRegistry.registerConverter( converterClass.getName(), sourceClass.getName(), destClass.getName() ); - DefaultTypeFactory factory = new DefaultTypeFactory( getClass().getClassLoader() ); - factory.addNameClassMapping( converterClass.getName(), converterClass.getName() ); - getTypeManager().registerType( Converter.ROLE, converterClass.getName(), factory ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/DefaultProjectBuilderTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/DefaultProjectBuilderTestCase.java deleted file mode 100644 index af901c97d..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/DefaultProjectBuilderTestCase.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * 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.builder.test; - -import java.io.File; -import java.util.Arrays; -import org.apache.avalon.excalibur.i18n.ResourceManager; -import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.excalibur.io.FileUtil; -import org.apache.myrmidon.AbstractMyrmidonTest; -import org.apache.myrmidon.components.builder.DefaultProjectBuilder; -import org.apache.myrmidon.components.builder.DefaultProject; -import org.apache.myrmidon.interfaces.builder.ProjectException; -import org.apache.myrmidon.interfaces.model.Project; - -/** - * Test cases for {@link org.apache.myrmidon.components.builder.DefaultProjectBuilder}. - * - * @author Darrell DeBoer - * @version $Revision$ $Date$ - */ -public class DefaultProjectBuilderTestCase - extends AbstractMyrmidonTest -{ - private final static Resources REZ = getResourcesForTested( DefaultProjectBuilderTestCase.class ); - - private DefaultProjectBuilder m_builder; - - public DefaultProjectBuilderTestCase( String name ) - { - super( name ); - } - - protected void setUp() throws Exception - { - super.setUp(); - m_builder = new DefaultProjectBuilder(); - m_builder.enableLogging( getLogger() ); - } - - /** - * Creates a project, with default values set. - */ - private DefaultProject createProject( final File projFile ) - { - final DefaultProject project = new DefaultProject(); - project.setProjectName( FileUtil.removeExtension( projFile.getName() ) ); - project.setBaseDirectory( getTestDirectory( "." ) ); - project.setDefaultTargetName( "main" ); - return project; - } - - /** - * Tests bad project file name. - */ - public void testProjectFileName() throws Exception - { - // Test with a file that does not exist - File projFile = getTestResource( "unknown.ant", false ); - - try - { - m_builder.build( projFile.getAbsolutePath() ); - fail(); - } - catch( ProjectException e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", projFile.getAbsolutePath() ), - REZ.getString( "ant.no-project-file.error" ) - }; - assertSameMessage( messages, e ); - } - - // Test with a directory - projFile = getTestDirectory( "some-dir" ); - - try - { - m_builder.build( projFile.getAbsolutePath() ); - fail(); - } - catch( ProjectException e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", projFile.getAbsolutePath() ), - REZ.getString( "ant.no-project-file.error" ) - }; - assertSameMessage( messages, e ); - } - } - - /** - * Tests error reporting when the project file contains badly formed XML. - */ - public void testBadlyFormedFile() throws Exception - { - final File projFile = getTestResource( "bad-xml.ant" ); - try - { - m_builder.build( projFile.getAbsolutePath() ); - fail(); - } - catch( ProjectException e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", projFile.getAbsolutePath() ), - REZ.getString( "ant.project-parse.error" ) - }; - assertSameMessage( messages, e ); - } - } - - /** - * Tests building a project with default values for project name, base dir - * and default target. - */ - public void testDefaults() throws Exception - { - // Build project - final File projFile = getTestResource( "defaults.ant" ); - Project project = m_builder.build( projFile.getAbsolutePath() ); - - // Compare against expected project - DefaultProject expected = createProject( projFile ); - assertSameProject( expected, project ); - } - - /** - * Tests setting the project name. - */ - public void testProjectName() throws Exception - { - // Build project - final File projFile = getTestResource( "set-project-name.ant" ); - Project project = m_builder.build( projFile.getAbsolutePath() ); - - // Compare against expected project - DefaultProject expected = createProject( projFile ); - expected.setProjectName( "some-project" ); - assertSameProject( expected, project ); - } - - /** - * Tests setting the base directory. - */ - public void testBaseDirectory() throws Exception - { - // Build project - final File projFile = getTestResource( "set-base-dir.ant" ); - Project project = m_builder.build( projFile.getAbsolutePath() ); - - // Compare against expected project - DefaultProject expected = createProject( projFile ); - final File baseDir = getTestDirectory( "other-base-dir" ); - expected.setBaseDirectory( baseDir ); - assertSameProject( expected, project ); - } - - /** - * Tests setting the default target name. - */ - public void testDefaultTarget() throws Exception - { - // Build project - final File projFile = getTestResource( "set-default-target.ant" ); - Project project = m_builder.build( projFile.getAbsolutePath() ); - - // Compare against expected project - DefaultProject expected = createProject( projFile ); - expected.setDefaultTargetName( "some-target" ); - assertSameProject( expected, project ); - } - - /** - * Tests missing, invalid and incompatible project version. - */ - public void testProjectVersion() throws Exception - { - // No version - File projFile = getTestResource( "no-version.ant" ); - try - { - m_builder.build( projFile.getAbsolutePath() ); - fail(); - } - catch( ProjectException e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", projFile.getAbsolutePath() ), - REZ.getString( "ant.version-missing.error" ) - }; - assertSameMessage( messages, e ); - } - - // Badly formed version - projFile = getTestResource( "bad-version.ant" ); - try - { - m_builder.build( projFile.getAbsolutePath() ); - fail(); - } - catch( ProjectException e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", projFile.getAbsolutePath() ), - REZ.getString( "ant.malformed.version", "ant2" ) - }; - assertSameMessage( messages, e ); - } - - // Incompatible version - projFile = getTestResource( "mismatched-version.ant" ); - try - { - m_builder.build( projFile.getAbsolutePath() ); - fail(); - } - catch( ProjectException e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", projFile.getAbsolutePath() ), - REZ.getString( "ant.bad-version.error", "2.0.0", "1.0.2" ) - }; - assertSameMessage( messages, e ); - } - } - - /** - * Asserts that 2 projects are identical. - */ - protected void assertSameProject( final Project expected, - final Project project ) - { - assertEquals( expected.getProjectName(), project.getProjectName() ); - assertEquals( expected.getBaseDirectory(), project.getBaseDirectory() ); - assertEquals( expected.getDefaultTargetName(), project.getDefaultTargetName() ); - - // TODO - make sure each of the projects are the same - assertTrue( Arrays.equals( expected.getProjectNames(), project.getProjectNames() ) ); - - // TODO - make sure the implicit targets are the same - - // TODO - make sure each of the targets are the same - assertTrue( Arrays.equals( expected.getTargetNames(), project.getTargetNames() ) ); - - // TODO - implement TypeLib.equals(), or use a comparator - assertTrue( Arrays.equals( expected.getTypeLibs(), project.getTypeLibs() ) ); - } - - /** - * Tests validation of project and target names. - */ - public void testNameValidation() throws Exception - { - // Check bad project name - final File badProjectFile = getTestResource( "bad-project-name.ant" ); - try - { - m_builder.build( badProjectFile.getAbsolutePath() ); - fail(); - } - catch( Exception e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", badProjectFile.getAbsolutePath() ), - REZ.getString( "ant.project-bad-name.error" ) - }; - assertSameMessage( messages, e ); - } - - // Check bad target name - final File badTargetFile = getTestResource( "bad-target-name.ant" ); - try - { - m_builder.build( badTargetFile.getAbsolutePath() ); - fail(); - } - catch( Exception e ) - { - final String[] messages = - { - REZ.getString( "ant.project-build.error", badTargetFile.getAbsolutePath() ), - // TODO - check error message - null - }; - assertSameMessage( messages, e ); - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-project-name.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-project-name.ant deleted file mode 100644 index 7b0ed6f75..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-project-name.ant +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-target-name.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-target-name.ant deleted file mode 100644 index 8c7186956..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-target-name.ant +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-version.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-version.ant deleted file mode 100644 index 922f14aee..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-version.ant +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-xml.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-xml.ant deleted file mode 100644 index 91717fd16..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/bad-xml.ant +++ /dev/null @@ -1 +0,0 @@ -this ain't xml. diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/defaults.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/defaults.ant deleted file mode 100644 index b36a5c7ce..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/defaults.ant +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/mismatched-version.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/mismatched-version.ant deleted file mode 100644 index b9176c9c0..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/mismatched-version.ant +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/no-version.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/no-version.ant deleted file mode 100644 index d1979fedf..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/no-version.ant +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-base-dir.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-base-dir.ant deleted file mode 100644 index 56fe72aa4..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-base-dir.ant +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-default-target.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-default-target.ant deleted file mode 100644 index f83f3bbeb..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-default-target.ant +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-project-name.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-project-name.ant deleted file mode 100644 index a8ae1a941..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/builder/test/set-project-name.ant +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ConfigTestConfigurable.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ConfigTestConfigurable.java deleted file mode 100644 index 4a1d5d628..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ConfigTestConfigurable.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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.configurer.test; - -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; - -/** - * Simple class to test {@link org.apache.avalon.framework.configuration.Configurable}. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestConfigurable - implements Configurable -{ - private Configuration m_configuration; - - public void configure( Configuration configuration ) - throws ConfigurationException - { - m_configuration = configuration; - } - - public boolean equals( final Object object ) - { - final ConfigTestConfigurable other = (ConfigTestConfigurable)object; - return m_configuration == other.m_configuration; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/DefaultConfigurerTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/DefaultConfigurerTestCase.java deleted file mode 100644 index b14a85966..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/DefaultConfigurerTestCase.java +++ /dev/null @@ -1,859 +0,0 @@ -/* - * 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.configurer.test; - -import java.io.File; -import org.apache.antlib.core.StringToIntegerConverter; -import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.framework.ExceptionUtil; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.configuration.DefaultConfiguration; -import org.apache.myrmidon.api.TaskContext; -import org.apache.myrmidon.components.AbstractComponentTest; -import org.apache.myrmidon.components.configurer.DefaultConfigurer; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestAttributeConvert; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestConfigAdder; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestContent; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestEmpty; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestIdResolve; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestIgnoreStringMethods; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestInterfaceAdder; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestMismatchedRefType; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestMultipleTypedAdder; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestNestedErrors; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestNonInterfaceAdder; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestPropResolution; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestReferenceAttribute; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestReferenceConversion; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestReferenceElement; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestSetAndAdd; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestSetAttribute; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestSetElement; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdder; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdderConversion; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdderReference; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdderRole; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedConfigAdder; -import org.apache.myrmidon.components.configurer.test.data.ConfigTestUnknownReference; -import org.apache.myrmidon.components.workspace.DefaultTaskContext; -import org.apache.myrmidon.framework.DataType; -import org.apache.myrmidon.interfaces.configurer.Configurer; -import org.apache.myrmidon.interfaces.role.RoleInfo; - -/** - * Test cases for the default configurer and related classes. - * - * @author Adam Murdoch - */ -public class DefaultConfigurerTestCase - extends AbstractComponentTest -{ - private final static Resources REZ = - getResourcesForTested( DefaultConfigurerTestCase.class ); - - private Configurer m_configurer; - private DefaultTaskContext m_context; - - public DefaultConfigurerTestCase( String name ) - { - super( name ); - } - - /** - * Setup the test case - prepares a set of components, including the - * configurer. - */ - protected void setUp() throws Exception - { - super.setUp(); - - // Find the configurer - m_configurer = (Configurer)getServiceManager().lookup( Configurer.ROLE ); - - // Setup a context - m_context = new DefaultTaskContext( null, getServiceManager(), getLogger() ); - final File baseDir = new File( "." ).getAbsoluteFile(); - m_context.setProperty( TaskContext.BASE_DIRECTORY, baseDir ); - } - - /** - * Creates an instance of a component. Sub-classes can override this - * method to add a particular implementation to the set of test components. - */ - protected Object createComponent( final String role, final Class defaultImpl ) - throws Exception - { - if( role.equals( Configurer.ROLE) ) - { - return new DefaultConfigurer(); - } - else - { - return super.createComponent( role, defaultImpl ); - } - } - - /** - * Tests setting an attribute, via a setter method. - */ - public void testSetAttribute() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final String value1 = "some value"; - config.setAttribute( "some-prop", value1 ); - - final ConfigTestSetAttribute test = new ConfigTestSetAttribute(); - - // Configure the object - configure( test, config ); - - // Check result - final ConfigTestSetAttribute expected = new ConfigTestSetAttribute(); - expected.setSomeProp( value1 ); - assertEquals( expected, test ); - } - - /** - * Tests attribute conversion. - */ - public void testAttributeConvert() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "int-prop", "90" ); - config.setAttribute( "integer-prop", "-401" ); - - // Register the converter - registerConverter( StringToIntegerConverter.class, String.class, Integer.class ); - - final ConfigTestAttributeConvert test = new ConfigTestAttributeConvert(); - - // Configure the object - configure( test, config ); - - // Check result - final ConfigTestAttributeConvert expected = new ConfigTestAttributeConvert(); - expected.setIntProp( 90 ); - expected.setIntegerProp( new Integer( -401 ) ); - assertEquals( expected, test ); - } - - /** - * Tests setting an unknown attribute. - */ - public void testSetUnknownAttribute() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "unknown", "some value" ); - - final ConfigTestEmpty test = new ConfigTestEmpty(); - - // Configure the object - try - { - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( final ConfigurationException ce ) - { - final String message = REZ.getString( "no-such-attribute.error", "test", "unknown" ); - assertSameMessage( message, ce ); - } - } - - /** - * Tests setting a nested element, via adder and setter methods. - */ - public void testSetElement() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child1 = new DefaultConfiguration( "prop", "test" ); - final String value1 = "some value"; - child1.setAttribute( "some-prop", value1 ); - config.addChild( child1 ); - final DefaultConfiguration child2 = new DefaultConfiguration( "prop", "test" ); - final String value2 = "another value"; - child2.setAttribute( "some-prop", value2 ); - config.addChild( child2 ); - - final ConfigTestSetElement test = new ConfigTestSetElement(); - - // Configure the object - configure( test, config ); - - // Check result - final ConfigTestSetElement expected = new ConfigTestSetElement(); - ConfigTestSetElement elem = new ConfigTestSetElement(); - elem.setSomeProp( value1 ); - expected.addProp( elem ); - elem = new ConfigTestSetElement(); - elem.setSomeProp( value2 ); - expected.addProp( elem ); - assertEquals( expected, test ); - } - - /** - * Tests setting an unknown element. - */ - public void testSetUnknownElement() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration elem = new DefaultConfiguration( "unknown", "test" ); - config.addChild( elem ); - - final ConfigTestEmpty test = new ConfigTestEmpty(); - - // Configure the object - try - { - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( final ConfigurationException ce ) - { - final String message = REZ.getString( "no-such-element.error", "test", "unknown" ); - assertSameMessage( message, ce ); - } - } - - /** - * Tests setting the content of an object. - */ - public void testContent() - throws Exception - { - // Create the test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final String value1 = "some value"; - config.setValue( value1 ); - - final ConfigTestContent test = new ConfigTestContent(); - - // Configure the object - configure( test, config ); - - // Check result - final ConfigTestContent expected = new ConfigTestContent(); - expected.addContent( value1 ); - assertEquals( expected, test ); - } - - /** - * Tests setting the content of an object that does not handle it. - */ - public void testUnexpectedContent() - throws Exception - { - // Create the test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setValue( "some value" ); - - final ConfigTestEmpty test = new ConfigTestEmpty(); - - // Configure the object - try - { - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( final ConfigurationException ce ) - { - final String message = REZ.getString( "no-content.error", "test" ); - assertSameMessage( message, ce ); - } - } - - /** - * Tests property resolution. - */ - public void testPropResolution() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "prop", "some ${prop-a} value" ); - - final ConfigTestPropResolution test = new ConfigTestPropResolution(); - - m_context.setProperty( "prop-a", "other" ); - - // Configure the object - configure( test, config ); - - // Check the configured object - final ConfigTestPropResolution expected = new ConfigTestPropResolution(); - expected.setProp( "some other value" ); - assertEquals( expected, test ); - } - - /** - * Tests reference resolution via an attribute. - */ - public void testReferenceAttribute() throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "some-prop-ref", "prop-a" ); - - final ConfigTestReferenceAttribute test = new ConfigTestReferenceAttribute(); - - m_context.setProperty( "prop-a", "some value" ); - - // Configure the object - configure( test, config ); - - // Check the configured object - final ConfigTestReferenceAttribute expected = new ConfigTestReferenceAttribute(); - expected.setSomeProp( "some value" ); - assertEquals( expected, test ); - } - - /** - * Tests reference resolution via a nested element. - */ - public void testReferenceElement() throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration elem = new DefaultConfiguration( "some-prop-ref", "test" ); - elem.setAttribute( "id", "prop-a" ); - config.addChild( elem ); - - final ConfigTestReferenceElement test = new ConfigTestReferenceElement(); - - m_context.setProperty( "prop-a", "some value" ); - - // Configure the object - m_configurer.configureElement( test, config, m_context ); - - // Check the configured object - final ConfigTestReferenceElement expected = new ConfigTestReferenceElement(); - expected.addSomeProp( "some value" ); - assertEquals( expected, test ); - } - - /** - * Tests that extra content is not allowed in a reference element. - */ - public void testReferenceElementExtra() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration elem = new DefaultConfiguration( "some-prop-ref", "test" ); - elem.setAttribute( "id", "prop-a" ); - elem.setAttribute( "extra-attr", "some value" ); - config.addChild( elem ); - - final ConfigTestReferenceElement test = new ConfigTestReferenceElement(); - - try - { - // Configure the object - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( ConfigurationException e ) - { - final String[] messages = new String[] - { - REZ.getString( "bad-configure-element.error", "some-prop-ref" ), - REZ.getString( "extra-config-for-ref.error" ) - }; - assertSameMessage( messages, e ); - } - } - - /** - * Tests reference type conversion. - */ - public void testReferenceConversion() throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "prop-a-ref", "id" ); - - final Integer refValue = new Integer( 21 ); - m_context.setProperty( "id", refValue ); - - registerConverter( ObjectToMyRole1Converter.class, Object.class, MyRole1.class ); - - final ConfigTestReferenceConversion test = new ConfigTestReferenceConversion(); - - // Configure - configure( test, config ); - - // Check result - final ConfigTestReferenceConversion expected = new ConfigTestReferenceConversion(); - expected.setPropA( new MyRole1Adaptor( refValue ) ); - assertEquals( expected, test ); - } - - /** - * Tests that the role's default type is used for interface typed - * elements. - */ - public void testInterfaceAdder() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child = new DefaultConfiguration( "prop-a", "test" ); - config.addChild( child ); - - registerRole( new RoleInfo( "myrole1", null, MyRole1.class, "default-type" ) ); - registerType( "myrole1", "default-type", MyType1.class ); - - final ConfigTestInterfaceAdder test = new ConfigTestInterfaceAdder(); - - // Configure object - configure( test, config ); - - // Check result - final ConfigTestInterfaceAdder expected = new ConfigTestInterfaceAdder(); - expected.addPropA( new MyType1() ); - assertEquals( expected, test ); - } - - /** - * Tests whether an object with a non-iterface typed adder causes an - * exception. - */ - public void testNonInterfaceTypedAdder() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - - final ConfigTestNonInterfaceAdder test = new ConfigTestNonInterfaceAdder(); - - try - { - // Configure the object - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( final ConfigurationException ce ) - { - final String[] messages = { - REZ.getString( "bad-configure-element.error", "test" ), - REZ.getString( "typed-adder-non-interface.error", - ConfigTestNonInterfaceAdder.class.getName(), - Integer.class.getName() ) - }; - assertSameMessage( messages, ce ); - } - } - - /** - * Tests whether an object with multiple typed adders causes an exception. - */ - public void testMultipleTypedAdder() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - - final ConfigTestMultipleTypedAdder test = new ConfigTestMultipleTypedAdder(); - - try - { - // Configure the object - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( final ConfigurationException ce ) - { - final String[] messages = new String[] - { - REZ.getString( "bad-configure-element.error", "test" ), - REZ.getString( "multiple-methods-for-element.error", - ConfigTestMultipleTypedAdder.class.getName(), - "add" ) - }; - assertSameMessage( messages, ce ); - } - } - - /** - * Tests to see if typed adder works, with iterface types. - */ - public void testTypedAdder() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child1 = new DefaultConfiguration( "my-type1", "test" ); - final DefaultConfiguration child2 = new DefaultConfiguration( "my-type2", "test" ); - config.addChild( child1 ); - config.addChild( child2 ); - - registerRole( new RoleInfo( MyRole1.ROLE, "my-role1", MyRole1.class ) ); - registerType( MyRole1.ROLE, "my-type1", MyType1.class ); - registerType( MyRole1.ROLE, "my-type2", MyType2.class ); - - final ConfigTestTypedAdder test = new ConfigTestTypedAdder(); - - // Configure the object - configure( test, config ); - - final ConfigTestTypedAdder expected = new ConfigTestTypedAdder(); - expected.add( new MyType1() ); - expected.add( new MyType2() ); - assertEquals( expected, test ); - } - - /** - * Tests to check that role is used for typed adder. - */ - public void testTypedAdderRole() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child1 = new DefaultConfiguration( "my-type1", "test" ); - config.addChild( child1 ); - - // Register incompatible types with the same name, as data-type and myrole1. - registerRole( new RoleInfo( "myrole1", "myrole1", MyRole1.class ) ); - registerType( "myrole1", "my-type1", MyType1.class ); - registerType( DataType.ROLE, "my-type1", StringBuffer.class ); - - final ConfigTestTypedAdderRole test = new ConfigTestTypedAdderRole(); - - // Configure the object - configure( test, config ); - - // Check the result - final ConfigTestTypedAdderRole expected = new ConfigTestTypedAdderRole(); - expected.add( new MyType1() ); - assertEquals( expected, test ); - } - - /** - * Tests conversion with a typed adder. - */ - public void testTypedAdderConversion() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child = new DefaultConfiguration( "some-type", "test" ); - child.setAttribute( "prop", "some value" ); - config.addChild( child ); - - registerType( DataType.ROLE, "some-type", ConfigTestTypedAdderConversion.class ); - registerConverter( ObjectToMyRole1Converter.class, Object.class, MyRole1.class ); - - final ConfigTestTypedAdderConversion test = new ConfigTestTypedAdderConversion(); - - // Configure the object - configure( test, config ); - - // Check the result - final ConfigTestTypedAdderConversion expected = new ConfigTestTypedAdderConversion(); - final ConfigTestTypedAdderConversion nested = new ConfigTestTypedAdderConversion(); - nested.setProp( "some value" ); - expected.add( new MyRole1Adaptor( nested ) ); - assertEquals( expected, test ); - } - - /** - * Tests to see if typed adder works, with Configuration type. - */ - public void testTypedConfigAdder() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child1 = new DefaultConfiguration( "my-type1", "test" ); - final DefaultConfiguration child2 = new DefaultConfiguration( "my-type2", "test" ); - config.addChild( child1 ); - config.addChild( child2 ); - - final ConfigTestTypedConfigAdder test = new ConfigTestTypedConfigAdder(); - - // Configure the object - configure( test, config ); - - final ConfigTestTypedConfigAdder expected = new ConfigTestTypedConfigAdder(); - expected.add( child1 ); - expected.add( child2 ); - assertEquals( expected, test ); - } - - /** - * Tests to see if adder works, with Configuration objects. - */ - public void testConfigAdder() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child1 = new DefaultConfiguration( "config", "test" ); - final DefaultConfiguration child2 = new DefaultConfiguration( "config", "test" ); - config.addChild( child1 ); - config.addChild( child2 ); - - final ConfigTestConfigAdder test = new ConfigTestConfigAdder(); - - // Configure the object - configure( test, config ); - - final ConfigTestConfigAdder expected = new ConfigTestConfigAdder(); - expected.addConfig( child1 ); - expected.addConfig( child2 ); - assertEquals( expected, test ); - } - - /** - * Tests to check that Configurable is handled properly. - */ - public void testConfigurable() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - - final ConfigTestConfigurable test = new ConfigTestConfigurable(); - - // Configure the object - m_configurer.configureElement( test, config, m_context ); - - final ConfigTestConfigurable expected = new ConfigTestConfigurable(); - expected.configure( config ); - assertEquals( expected, test ); - } - - /** - * Test resolving properties in an id. - */ - public void testIdResolve() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "some-prop-ref", "${id}" ); - - final ConfigTestIdResolve test = new ConfigTestIdResolve(); - - m_context.setProperty( "id", "prop-a" ); - m_context.setProperty( "prop-a", "some indirect value" ); - - // Configure the object - configure( test, config ); - - // Check the configured object - final ConfigTestIdResolve expected = new ConfigTestIdResolve(); - expected.setSomeProp( "some indirect value" ); - assertEquals( expected, test ); - } - - /** - * Tests an unknown reference. - */ - public void testUnknownReference() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "some-prop-ref", "unknown-prop" ); - - final ConfigTestUnknownReference test = new ConfigTestUnknownReference(); - - // Configure the object - try - { - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( ConfigurationException e ) - { - final String[] messages = new String[] - { - REZ.getString( "bad-set-attribute.error", "test", "some-prop-ref" ), - REZ.getString( "unknown-reference.error", "unknown-prop" ) - }; - assertSameMessage( messages, e ); - } - } - - /** - * Tests handling of mismatched reference type. - */ - public void testMismatchedRefType() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "some-prop-ref", "prop-a" ); - - final ConfigTestMismatchedRefType test = new ConfigTestMismatchedRefType(); - - m_context.setProperty( "prop-a", new Integer( 23 ) ); - - // Configure the object - try - { - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( ConfigurationException e ) - { - final String[] messages = new String[] - { - REZ.getString( "bad-set-attribute.error", "test", "some-prop-ref" ), - REZ.getString( "mismatch-ref-types.error", - "prop-a", - "some-prop" ) - }; - assertSameMessage( messages, e ); - } - } - - /** - * Tests using a reference with a typed adder. Tests using an attribute - * and a nested element. - */ - public void testTypedAdderReference() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration child = new DefaultConfiguration( "my-role1-ref", "test" ); - child.setAttribute( "id", "id2" ); - config.addChild( child ); - - // Add role mapping, and add to reference to context - registerRole( new RoleInfo( "my-role1", MyRole1.class ) ); - m_context.setProperty( "id2", new MyType2() ); - - final ConfigTestTypedAdderReference test = new ConfigTestTypedAdderReference(); - - // Configure the object - configure( test, config ); - - // Compare against expected value - final ConfigTestTypedAdderReference expected = new ConfigTestTypedAdderReference(); - expected.add( new MyType2() ); - assertEquals( expected, test ); - } - - /** - * Tests reporting of nested errors. - */ - public void testNestedErrors() throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - final DefaultConfiguration elem = new DefaultConfiguration( "prop", "test" ); - elem.setAttribute( "not-a-prop", "not-a-value" ); - config.addChild( elem ); - - final ConfigTestNestedErrors test = new ConfigTestNestedErrors(); - - try - { - // Configure the object - m_configurer.configureElement( test, config, m_context ); - fail(); - } - catch( ConfigurationException e ) - { - final String message = REZ.getString( "no-such-attribute.error", - "prop", - "not-a-prop" ); - assertSameMessage( message, e ); - } - } - - /** - * Tests that string setter/adder/creators are ignored when there - * are multiple. - */ - public void testIgnoreStringMethods() - throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "prop1", "some-value" ); - config.setValue( "99" ); - DefaultConfiguration elem = new DefaultConfiguration( "prop2", "test" ); - config.addChild( elem ); - elem = new DefaultConfiguration( "my-type1", "test" ); - config.addChild( elem ); - - registerConverter( ObjectToMyRole1Converter.class, String.class, MyRole1.class ); - registerConverter( StringToIntegerConverter.class, String.class, Integer.class ); - registerType( DataType.ROLE, "my-type1", MyType1.class ); - - final ConfigTestIgnoreStringMethods test = new ConfigTestIgnoreStringMethods(); - - // Configure the object - configure( test, config ); - - // Test expected value - final ConfigTestIgnoreStringMethods expected = new ConfigTestIgnoreStringMethods(); - expected.setProp1( new MyRole1Adaptor( "some-value" ) ); - expected.addProp2( new ConfigTestIgnoreStringMethods() ); - expected.add( new MyType1() ); - expected.addContent( 99 ); - assertEquals( expected, test ); - } - - /** - * Tests that a class with a setter and adder with the same property name - * is handled correctly. - */ - public void testSetAndAdd() throws Exception - { - // Setup test data - final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); - config.setAttribute( "prop", "some value" ); - DefaultConfiguration elem = new DefaultConfiguration( "prop", "test" ); - elem.setAttribute( "prop", "another value" ); - config.addChild( elem ); - - final ConfigTestSetAndAdd test = new ConfigTestSetAndAdd(); - - // Configure the object - configure( test, config ); - - // Test expected value - final ConfigTestSetAndAdd expected = new ConfigTestSetAndAdd(); - expected.setProp( "some value" ); - final ConfigTestSetAndAdd nested = new ConfigTestSetAndAdd(); - nested.setProp( "another value" ); - expected.addProp( nested ); - assertEquals( expected, test ); - } - - private void configure( final Object test, - final DefaultConfiguration config ) - throws ConfigurationException - { - try - { - m_configurer.configureElement( test, config, m_context ); - } - catch( final ConfigurationException ce ) - { - ExceptionUtil.printStackTrace( ce ); - throw ce; - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1.java deleted file mode 100644 index c7dc8ae9e..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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.configurer.test; - -import org.apache.myrmidon.framework.DataType; - -/** - * A basic interface to test configurer. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public interface MyRole1 - extends DataType -{ - String ROLE = MyRole1.class.getName(); -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1Adaptor.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1Adaptor.java deleted file mode 100644 index 4c8f448d7..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole1Adaptor.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.configurer.test; - -import org.apache.myrmidon.AbstractMyrmidonTest; -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * Adapts an Object to MyRole - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class MyRole1Adaptor - implements MyRole1 -{ - private final Object m_object; - - public MyRole1Adaptor( final Object o ) - { - m_object = o; - } - - public boolean equals( Object obj ) - { - final MyRole1Adaptor adaptor = (MyRole1Adaptor)obj; - return AbstractMyrmidonTest.equals( m_object, adaptor.m_object ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole2.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole2.java deleted file mode 100644 index e21a3ee95..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyRole2.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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.configurer.test; - -/** - * A basic interface to test configurer. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public interface MyRole2 -{ -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType1.java deleted file mode 100644 index a0b6b7b70..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType1.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.configurer.test; - -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * A basic implementation of MyRole1 to test configurer. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class MyType1 - implements MyRole1 -{ - public boolean equals( final Object object ) - { - return object.getClass() == getClass(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType2.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType2.java deleted file mode 100644 index a605ddeed..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/MyType2.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.configurer.test; - -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * A basic implementation of MyRole1 to test configurer. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class MyType2 - implements MyRole1 -{ - public boolean equals( final Object object ) - { - return object.getClass() == getClass(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ObjectToMyRole1Converter.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ObjectToMyRole1Converter.java deleted file mode 100644 index 06d74ea6e..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/ObjectToMyRole1Converter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.configurer.test; - -import org.apache.aut.converter.AbstractConverter; -import org.apache.aut.converter.ConverterException; -import org.apache.myrmidon.components.configurer.test.MyRole1; -import org.apache.myrmidon.components.configurer.test.MyRole1Adaptor; - -/** - * Converts from Object to MyRole1. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class ObjectToMyRole1Converter - extends AbstractConverter -{ - public ObjectToMyRole1Converter() - { - super( Object.class, MyRole1.class ); - } - - protected Object convert( Object original, Object context ) - throws ConverterException - { - return new MyRole1Adaptor( original ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestAttributeConvert.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestAttributeConvert.java deleted file mode 100644 index 840e6d43c..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestAttributeConvert.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.configurer.test.data; - -import org.apache.myrmidon.components.AbstractComponentTest; - -/** - * A class for testing conversion. - * - * @author Adam Murdoch - */ -public class ConfigTestAttributeConvert -{ - private int m_intProp; - private Integer m_integerProp; - - public void setIntProp( final int intProp ) - { - m_intProp = intProp; - } - - public void setIntegerProp( final Integer integerProp ) - { - m_integerProp = integerProp; - } - - public boolean equals( Object obj ) - { - ConfigTestAttributeConvert test = (ConfigTestAttributeConvert)obj; - if( m_intProp != test.m_intProp ) - { - return false; - } - if( !AbstractComponentTest.equals( m_integerProp, test.m_integerProp ) ) - { - return false; - } - - return true; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestConfigAdder.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestConfigAdder.java deleted file mode 100644 index 1568b4f28..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestConfigAdder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.avalon.framework.configuration.Configuration; - -/** - * Simple class to test adder for Configurations. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestConfigAdder -{ - private ArrayList m_configurations = new ArrayList(); - - public void addConfig( final Configuration configuration ) - { - m_configurations.add( configuration ); - } - - public boolean equals( final Object object ) - { - final ConfigTestConfigAdder other = (ConfigTestConfigAdder)object; - return m_configurations.equals( other.m_configurations ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestContent.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestContent.java deleted file mode 100644 index 0ab4e74c8..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestContent.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import java.util.List; -import org.apache.myrmidon.framework.DataType; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * A simple test class with string properties. - * - * @author Adam Murdoch - */ -public class ConfigTestContent - implements DataType -{ - private String m_content; - - public boolean equals( final Object obj ) - { - final ConfigTestContent test = (ConfigTestContent)obj; - if( !DefaultConfigurerTestCase.equals( m_content, test.m_content ) ) - { - return false; - } - else - { - return true; - } - } - - public void addContent( final String content ) - { - m_content = content; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestEmpty.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestEmpty.java deleted file mode 100644 index 7438e1b6b..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestEmpty.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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.configurer.test.data; - -import org.apache.myrmidon.framework.DataType; - -/** - * An empty class. - * - * @author Adam Murdoch - */ -public class ConfigTestEmpty - implements DataType -{ -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIdResolve.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIdResolve.java deleted file mode 100644 index 22fe5d770..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIdResolve.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import java.util.List; -import org.apache.myrmidon.framework.DataType; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * A simple test class with string properties. - * - * @author Adam Murdoch - */ -public class ConfigTestIdResolve - implements DataType -{ - private String m_someProp; - - public boolean equals( final Object obj ) - { - final ConfigTestIdResolve test = (ConfigTestIdResolve)obj; - if( !DefaultConfigurerTestCase.equals( m_someProp, test.m_someProp ) ) - { - return false; - } - else - { - return true; - } - } - - public void setSomeProp( final String value ) - { - m_someProp = value; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIgnoreStringMethods.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIgnoreStringMethods.java deleted file mode 100644 index 9ecd3d688..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestIgnoreStringMethods.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import junit.framework.AssertionFailedError; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * A test class with multiple setters/adders/creators for a property. - * - * @author Adam Murdoch - */ -public class ConfigTestIgnoreStringMethods -{ - private MyRole1 m_prop1; - private ArrayList m_prop2 = new ArrayList(); - private int m_content; - private ArrayList m_typed = new ArrayList(); - - public boolean equals( Object obj ) - { - ConfigTestIgnoreStringMethods test = (ConfigTestIgnoreStringMethods)obj; - if( !DefaultConfigurerTestCase.equals( m_prop1, test.m_prop1 ) ) - { - return false; - } - if( !m_prop2.equals( test.m_prop2 ) ) - { - return false; - } - if( m_content != test.m_content ) - { - return false; - } - if( !m_typed.equals( test.m_typed ) ) - { - return false; - } - return true; - } - - // - // Multiple Setters - // - - public void setProp1( final String value ) - { - throw new AssertionFailedError(); - } - - public void setProp1( final MyRole1 value ) - { - m_prop1 = value; - } - - // - // Multiple Adders - // - - public void addProp2( final String value ) - { - throw new AssertionFailedError(); - } - - public void addProp2( final ConfigTestIgnoreStringMethods value ) - { - m_prop2.add( value ); - } - - // - // Multiple typed adders - // - - public void add( final String value ) - { - throw new AssertionFailedError(); - } - - public void add( final MyRole1 value ) - { - m_typed.add( value ); - } - - // - // Multiple content setters - // - - public void addContent( final int value ) - { - m_content = value; - } - - public void addContent( final String value ) - { - throw new AssertionFailedError(); - } - -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestInterfaceAdder.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestInterfaceAdder.java deleted file mode 100644 index e622b15af..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestInterfaceAdder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * A test class with an interface property. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class ConfigTestInterfaceAdder -{ - private final ArrayList m_elems = new ArrayList(); - - public void addPropA( final MyRole1 role1 ) - { - m_elems.add( role1 ); - } - - public boolean equals( Object obj ) - { - final ConfigTestInterfaceAdder test = (ConfigTestInterfaceAdder)obj; - return m_elems.equals( test.m_elems ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMismatchedRefType.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMismatchedRefType.java deleted file mode 100644 index 940465036..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMismatchedRefType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import java.util.List; -import org.apache.myrmidon.framework.DataType; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * A simple test class with string properties. - * - * @author Adam Murdoch - */ -public class ConfigTestMismatchedRefType - implements DataType -{ - public void setSomeProp( final String value ) - { - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMultipleTypedAdder.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMultipleTypedAdder.java deleted file mode 100644 index 256aed403..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestMultipleTypedAdder.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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.configurer.test.data; - -import org.apache.myrmidon.components.configurer.test.MyRole1; -import org.apache.myrmidon.components.configurer.test.MyRole2; - -/** - * Simple class with more than one typed adder method. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestMultipleTypedAdder -{ - public void add( final MyRole1 role1 ) - { - } - - public void add( final MyRole2 role2 ) - { - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNestedErrors.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNestedErrors.java deleted file mode 100644 index e6f14a6d4..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNestedErrors.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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.configurer.test.data; - -/** - * A simple test class. - * - * @author Adam Murdoch - */ -public class ConfigTestNestedErrors -{ - public void addProp( final ConfigTestEmpty test ) - { - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNonInterfaceAdder.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNonInterfaceAdder.java deleted file mode 100644 index 432dd4e82..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestNonInterfaceAdder.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.configurer.test.data; - -/** - * Simple class to test typed adder. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestNonInterfaceAdder -{ - public void add( final Integer integer ) - { - System.out.println( "This should not have been called as " + - "Integer is not an interface" ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestPropResolution.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestPropResolution.java deleted file mode 100644 index 48c729af0..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestPropResolution.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.List; -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * Simple class to test typed adder. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestPropResolution -{ - private String m_prop; - - public boolean equals( final Object obj ) - { - final ConfigTestPropResolution test = (ConfigTestPropResolution)obj; - if( !DefaultConfigurerTestCase.equals( m_prop, test.m_prop ) ) - { - return false; - } - else - { - return true; - } - } - - public void setProp( final String value ) - { - m_prop = value; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceAttribute.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceAttribute.java deleted file mode 100644 index 5946cdcd7..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceAttribute.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.List; -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * Simple class to test typed adder. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestReferenceAttribute -{ - private String m_someProp; - - public boolean equals( final Object obj ) - { - final ConfigTestReferenceAttribute test = (ConfigTestReferenceAttribute)obj; - if( !DefaultConfigurerTestCase.equals( m_someProp, test.m_someProp ) ) - { - return false; - } - else - { - return true; - } - } - - public void setSomeProp( final String value ) - { - m_someProp = value; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceConversion.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceConversion.java deleted file mode 100644 index 4862d3d78..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceConversion.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * A simple test class. - * - * @author Adam Murdoch - */ -public class ConfigTestReferenceConversion -{ - private final ArrayList m_elems = new ArrayList(); - - public void setPropA( final MyRole1 role1 ) - { - m_elems.add( role1 ); - } - - public boolean equals( Object obj ) - { - final ConfigTestReferenceConversion test = (ConfigTestReferenceConversion)obj; - return m_elems.equals( test.m_elems ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceElement.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceElement.java deleted file mode 100644 index d6d1cd007..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestReferenceElement.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import java.util.List; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * A simple test class. - * - * @author Adam Murdoch - */ -public class ConfigTestReferenceElement -{ - private String m_someProp; - - public boolean equals( Object obj ) - { - ConfigTestReferenceElement test = (ConfigTestReferenceElement)obj; - if( !DefaultConfigurerTestCase.equals( m_someProp, test.m_someProp ) ) - { - return false; - } - return true; - } - - public void addSomeProp( final String value ) - { - m_someProp = value; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAndAdd.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAndAdd.java deleted file mode 100644 index 68ebb1d7a..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAndAdd.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.myrmidon.AbstractMyrmidonTest; - -/** - * A test class with a setter and adder with the same property name. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class ConfigTestSetAndAdd -{ - private String m_prop; - private ArrayList m_nested = new ArrayList(); - - public void setProp( final String prop ) - { - m_prop = prop; - } - - public void addProp( final ConfigTestSetAndAdd elem ) - { - m_nested.add( elem ); - } - - public boolean equals( final Object obj ) - { - ConfigTestSetAndAdd test = (ConfigTestSetAndAdd)obj; - if( ! AbstractMyrmidonTest.equals( m_prop, test.m_prop) ) - { - return false; - } - else if( ! m_nested.equals( test.m_nested ) ) - { - return false; - } - else - { - return true; - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAttribute.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAttribute.java deleted file mode 100644 index 4a933ef33..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetAttribute.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.List; -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * Simple class to test setter. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestSetAttribute -{ - private String m_someProp; - - public boolean equals( final Object obj ) - { - final ConfigTestSetAttribute test = (ConfigTestSetAttribute)obj; - if( !DefaultConfigurerTestCase.equals( m_someProp, test.m_someProp ) ) - { - return false; - } - else - { - return true; - } - } - - public void setSomeProp( final String value ) - { - m_someProp = value; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetElement.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetElement.java deleted file mode 100644 index d360a72ea..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestSetElement.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import java.util.List; -import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; - -/** - * A simple test class. - * - * @author Adam Murdoch - */ -public class ConfigTestSetElement -{ - private List m_propList = new ArrayList(); - private String m_someProp; - - public boolean equals( Object obj ) - { - ConfigTestSetElement test = (ConfigTestSetElement)obj; - if( !m_propList.equals( test.m_propList ) ) - { - return false; - } - else if( !DefaultConfigurerTestCase.equals( m_someProp, test.m_someProp ) ) - { - return false; - } - return true; - } - - public void setSomeProp( final String value ) - { - m_someProp = value; - } - - public void addProp( final ConfigTestSetElement test ) - { - m_propList.add( test ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdder.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdder.java deleted file mode 100644 index fdea6422b..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * Simple class to test adder for Configurations. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestTypedAdder -{ - private ArrayList m_roles = new ArrayList(); - - public void add( final MyRole1 role ) - { - m_roles.add( role ); - } - - public boolean equals( final Object object ) - { - final ConfigTestTypedAdder other = (ConfigTestTypedAdder)object; - return m_roles.equals( other.m_roles ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderConversion.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderConversion.java deleted file mode 100644 index 0aeb29d9b..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderConversion.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.MyRole1; -import org.apache.myrmidon.framework.DataType; - -/** - * Simple class to test typed adder. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestTypedAdderConversion - implements DataType -{ - private ArrayList m_roles = new ArrayList(); - private String m_prop; - - public void setProp( final String prop ) - { - m_prop = prop; - } - public void add( final MyRole1 role1 ) - { - m_roles.add( role1 ); - } - - public boolean equals( final Object object ) - { - final ConfigTestTypedAdderConversion other = (ConfigTestTypedAdderConversion)object; - return m_roles.equals( other.m_roles ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderReference.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderReference.java deleted file mode 100644 index 6ce6bc078..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderReference.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * Simple class to test typed adder. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestTypedAdderReference -{ - private ArrayList m_roles = new ArrayList(); - - public void add( final MyRole1 role1 ) - { - m_roles.add( role1 ); - } - - public boolean equals( final Object object ) - { - final ConfigTestTypedAdderReference other = (ConfigTestTypedAdderReference)object; - return m_roles.equals( other.m_roles ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderRole.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderRole.java deleted file mode 100644 index d8ac8d59e..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedAdderRole.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.myrmidon.components.configurer.test.MyRole1; - -/** - * Simple class to test typed adder. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestTypedAdderRole -{ - private ArrayList m_roles = new ArrayList(); - - public void add( final MyRole1 role1 ) - { - m_roles.add( role1 ); - } - - public boolean equals( final Object object ) - { - final ConfigTestTypedAdderRole other = (ConfigTestTypedAdderRole)object; - return m_roles.equals( other.m_roles ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedConfigAdder.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedConfigAdder.java deleted file mode 100644 index 2d7bcf02d..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestTypedConfigAdder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.configurer.test.data; - -import java.util.ArrayList; -import org.apache.avalon.framework.configuration.Configuration; - -/** - * Simple class to test adder for Configurations. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class ConfigTestTypedConfigAdder -{ - private ArrayList m_configurations = new ArrayList(); - - public void add( final Configuration configuration ) - { - m_configurations.add( configuration ); - } - - public boolean equals( final Object object ) - { - final ConfigTestTypedConfigAdder other = (ConfigTestTypedConfigAdder)object; - return m_configurations.equals( other.m_configurations ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestUnknownReference.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestUnknownReference.java deleted file mode 100644 index d304f1c4c..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/test/data/ConfigTestUnknownReference.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.configurer.test.data; - -import org.apache.myrmidon.framework.DataType; - -/** - * A simple test class with string properties. - * - * @author Adam Murdoch - */ -public class ConfigTestUnknownReference - implements DataType -{ - public void setSomeProp( final String value ) - { - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/DefaultDeployerTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/DefaultDeployerTestCase.java deleted file mode 100644 index 37247aea9..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/DefaultDeployerTestCase.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * 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.deployer.test; - -import java.io.File; -import org.apache.aut.converter.Converter; -import org.apache.aut.converter.ConverterException; -import org.apache.myrmidon.components.AbstractComponentTest; -import org.apache.myrmidon.components.deployer.DefaultDeployer; -import org.apache.myrmidon.framework.DataType; -import org.apache.myrmidon.interfaces.deployer.ConverterDefinition; -import org.apache.myrmidon.interfaces.deployer.Deployer; -import org.apache.myrmidon.interfaces.deployer.TypeDefinition; -import org.apache.myrmidon.interfaces.deployer.TypeDeployer; -import org.apache.myrmidon.interfaces.type.TypeException; -import org.apache.myrmidon.interfaces.type.TypeFactory; - -/** - * Test cases for the default deployer. - * - * @author Adam Murdoch - */ -public class DefaultDeployerTestCase - extends AbstractComponentTest -{ - private static final String TEST_TYPE1_NAME = "test-type1"; - - private Deployer m_deployer; - private Converter m_converter; - - public DefaultDeployerTestCase( final String name ) - { - super( name ); - } - - /** - * Setup the test case - prepares the set of components, including the - * deployer. - */ - protected void setUp() throws Exception - { - super.setUp(); - m_deployer = (Deployer)getServiceManager().lookup( Deployer.ROLE ); - m_converter = (Converter)getServiceManager().lookup( Converter.ROLE ); - } - - /** - * Creates an instance of a component. Sub-classes can override this - * method to add a particular implementation to the set of test components. - */ - protected Object createComponent( final String role, final Class defaultImpl ) - throws Exception - { - if( role.equals( Deployer.ROLE) ) - { - return new DefaultDeployer(); - } - else - { - return super.createComponent( role, defaultImpl ); - } - } - - /** - * Tests deployment of a single type from a ClassLoader. - */ - public void testSingleType() throws Exception - { - final String typeName = TEST_TYPE1_NAME; - final String classname = TestType1.class.getName(); - - // Determine the shorthand for the DataType role - - // Create the type definition - final TypeDefinition typeDef = new TypeDefinition( typeName, DATA_TYPE_ROLE, classname ); - - final ClassLoader classLoader = getClass().getClassLoader(); - final TypeDeployer typeDeployer = m_deployer.createDeployer( classLoader ); - - // Make sure the test types have not been deployed - assertTypesNotRegistered(); - - // Deploy the type - typeDeployer.deployType( typeDef ); - - // Check the type has been registered - final TypeFactory typeFactory = getTypeManager().getFactory( DataType.ROLE ); - final Object result = typeFactory.create( typeName ); - assertTrue( result instanceof TestType1 ); - } - - /** - * Tests deployment of a single converter from a ClassLoader. - */ - public void testSingleConverter() throws Exception - { - // Create the type definition - final String classname = TestConverter1.class.getName(); - final String source = "java.lang.String"; - final String destClass = TestType1.class.getName(); - - final ConverterDefinition typeDef = - new ConverterDefinition( classname, source, destClass ); - - final ClassLoader classLoader = getClass().getClassLoader(); - final TypeDeployer typeDeployer = m_deployer.createDeployer( classLoader ); - - // Make sure the test types have not been deployed - assertTypesNotRegistered(); - - // Deploy the type - typeDeployer.deployType( typeDef ); - - // Try to convert from string to test type - final Object result = m_converter.convert( TestType1.class, "some-string", null ); - assertTrue( result instanceof TestType1 ); - } - - /** - * Tests deployment of types from a typelib descriptor. - */ - public void testLibDescriptor() throws Exception - { - final File typelib = getTestResource( "test.atl" ); - final TypeDeployer typeDeployer = m_deployer.createDeployer( typelib ); - - // Make sure the test types have not been deployed - assertTypesNotRegistered(); - - // Deploy all the types from the descriptor - typeDeployer.deployAll(); - - // Make sure the test types have been deployed - assertTypesRegistered(); - } - - /** - * Ensures that the test types have not ben deployed. - */ - private void assertTypesNotRegistered() throws Exception - { - // Check the data-type - TypeFactory typeFactory = getTypeManager().getFactory( DataType.ROLE ); - try - { - typeFactory.create( TEST_TYPE1_NAME ); - fail(); - } - catch( TypeException e ) - { - // TODO - check error message - } - - // Check the custom role implementation - try - { - typeFactory = getTypeManager().getFactory( TestRole1.ROLE ); - typeFactory.create( TEST_TYPE1_NAME ); - fail(); - } - catch( TypeException e ) - { - // TODO - check error message - } - - // Check the converter - try - { - m_converter.convert( TestType1.class, "some string", null ); - fail(); - } - catch( ConverterException e ) - { - // TODO - check error message - } - } - - /** - * Ensures the types from the test typelib descriptor have been correctly - * deployed. - */ - private void assertTypesRegistered() throws Exception - { - // Check the data-type - TypeFactory typeFactory = getTypeManager().getFactory( DataType.ROLE ); - Object object = typeFactory.create( TEST_TYPE1_NAME ); - assertTrue( object instanceof TestType1 ); - - // Check the custom role implementation - typeFactory = getTypeManager().getFactory( TestRole1.ROLE ); - object = typeFactory.create( TEST_TYPE1_NAME ); - assertTrue( object instanceof TestType1 ); - - // Check the converter - object = m_converter.convert( TestType1.class, "some string", null ); - assertTrue( object instanceof TestType1 ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestConverter1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestConverter1.java deleted file mode 100644 index af61edaa2..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestConverter1.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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.deployer.test; - -import org.apache.aut.converter.Converter; -import org.apache.aut.converter.ConverterException; - -/** - * A test converter. - * - * @author Adam Murdoch - */ -public class TestConverter1 - implements Converter -{ - /** - * Convert original to destination type. - */ - public Object convert( Class destination, Object original, Object context ) - throws ConverterException - { - return new TestType1(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestRole1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestRole1.java deleted file mode 100644 index 60fc79166..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestRole1.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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.deployer.test; - -/** - * A test role interface. - * - * @author Adam Murdoch - */ -public interface TestRole1 -{ - String ROLE = TestRole1.class.getName(); -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestType1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestType1.java deleted file mode 100644 index 7cf53f163..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/TestType1.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * 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.deployer.test; - -import org.apache.myrmidon.framework.DataType; -import org.apache.myrmidon.components.deployer.test.TestRole1; - -/** - * A test data-type. - * - * @author Adam Murdoch - */ -public class TestType1 - implements DataType, TestRole1 -{ -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-descriptor.xml b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-descriptor.xml deleted file mode 100644 index 43d07cd67..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-descriptor.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-roles.xml b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-roles.xml deleted file mode 100644 index 86e6070ec..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/test/ant-roles.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java deleted file mode 100644 index 20d971643..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.test; - -import java.io.File; -import org.apache.avalon.framework.parameters.Parameters; -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.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 AbstractProjectTest -{ - public DefaultEmbeddorTest( String name ) - { - super( name ); - } - - /** - * Tests that a project is successfully built from a file. - */ - public void testProjectBuilder() throws Exception - { - // Build the project - final File projectFile = getTestResource( "project-builder.ant" ); - final Project project = getEmbeddor().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 = getEmbeddor().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 Embeddor embeddor = getEmbeddor(); - final Project project = embeddor.createProject( projectFile.getAbsolutePath(), null, null ); - - // Build the workspace - final Workspace workspace = embeddor.createWorkspace( new Parameters() ); - - // Install a listener - final LogMessageTracker listener = new LogMessageTracker(); - 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/components/embeddor/test/project-builder.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/test/project-builder.ant deleted file mode 100644 index 7f52d2702..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/embeddor/test/project-builder.ant +++ /dev/null @@ -1,6 +0,0 @@ - - - - A log message - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java deleted file mode 100644 index ad00470b6..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * 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.property.test; - -import java.io.File; -import java.util.Date; -import org.apache.antlib.core.ObjectToStringConverter; -import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.myrmidon.api.TaskContext; -import org.apache.myrmidon.api.TaskException; -import org.apache.myrmidon.components.AbstractComponentTest; -import org.apache.myrmidon.components.workspace.DefaultTaskContext; -import org.apache.myrmidon.interfaces.property.PropertyResolver; - -/** - * General-purpose property resolver test cases. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public abstract class AbstractPropertyResolverTestCase - extends AbstractComponentTest -{ - protected final static Resources REZ = getResourcesForTested( AbstractPropertyResolverTestCase.class ); - - protected PropertyResolver m_resolver; - protected DefaultTaskContext m_context; - - public AbstractPropertyResolverTestCase( final String name ) - { - super( name ); - } - - protected void setUp() throws Exception - { - m_resolver = (PropertyResolver)getServiceManager().lookup( PropertyResolver.ROLE ); - - m_context = new DefaultTaskContext( null, null, getLogger() ); - m_context.setProperty( "intProp", new Integer( 333 ) ); - m_context.setProperty( "stringProp", "String property" ); - - registerConverter( ObjectToStringConverter.class, Object.class, String.class ); - } - - /** - * Creates an instance of a component. Sub-classes can override this - * method to add a particular implementation to the set of test components. - */ - protected Object createComponent( String role, Class defaultImpl ) - throws Exception - { - if( role.equals( PropertyResolver.ROLE) ) - { - return createResolver(); - } - else - { - return super.createComponent( role, defaultImpl ); - } - } - - /** - * Creates the resolver to test. - */ - protected abstract PropertyResolver createResolver(); - - /** - * Test property resolution with various different typed properties. - */ - public void testPropertyTypes() throws Exception - { - testPropertyValue( new String( "String value" ) ); - testPropertyValue( new Date() ); - testPropertyValue( new Integer( Integer.MIN_VALUE ) ); - testPropertyValue( new Double( 24234.98453 ) ); - testPropertyValue( this.getClass() ); - testPropertyValue( File.createTempFile( "PropertyResolverTest", null ) ); - } - - /** - * Simple tests with property on it's own, and accompanied by text. - */ - private void testPropertyValue( final Object propObject ) - throws Exception - { - m_context.setProperty( "typedProp", propObject ); - final String propString = propObject.toString(); - - doTestResolution( "${typedProp}", propObject, m_context ); - doTestResolution( "${typedProp} with following text", - propString + " with following text", m_context ); - doTestResolution( "Preceding text with ${typedProp}", - "Preceding text with " + propString, m_context ); - } - - /** - * Tests multiple property declarations in a single value. - */ - public void testMultipleProperties() throws Exception - { - m_context.setProperty( "prop1", "value1" ); - m_context.setProperty( "prop2", "value2" ); - m_context.setProperty( "int1", new Integer( 123 ) ); - - doTestResolution( "${prop1}${prop2}", "value1value2", m_context ); - doTestResolution( "${prop1}${prop1}${prop1}", "value1value1value1", m_context ); - doTestResolution( "before ${prop2} between ${prop1} after", - "before value2 between value1 after", m_context ); - doTestResolution( "${prop1}-${int1}-${prop2}", "value1-123-value2", m_context ); - } - - /** - * Tests illegal property syntax. - */ - public void testInvalidTypeDeclarations() throws Exception - { - - doTestFailure( "${unclosed", - REZ.getString( "prop.mismatched-braces.error" ), - m_context ); - doTestFailure( "${", - REZ.getString( "prop.mismatched-braces.error" ), - m_context ); - - /* TODO - need to handle these cases. */ - // testFailure( "${bad${}", "", m_context ); - // testFailure( "${ }", "", m_context ); - } - - /** - * Resolves the property using the supplied context, and checks the result. - */ - protected void doTestResolution( final String value, - final Object expected, - final TaskContext context ) - throws Exception - { - final Object resolved = m_resolver.resolveProperties( value, context ); - - assertEquals( expected, resolved ); - } - - /** - * Attempts to resolve the value using the supplied context, expecting to - * fail with the supplied error message. - */ - protected void doTestFailure( final String value, - final String expectedErrorMessage, - final TaskContext context ) - { - try - { - m_resolver.resolveProperties( value, context ); - fail( "Unexpected sucess - test should have failed." ); - } - catch( TaskException e ) - { - assertSameMessage( expectedErrorMessage, e ); - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/ClassicPropertyResolverTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/ClassicPropertyResolverTestCase.java deleted file mode 100644 index 12eef075a..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/ClassicPropertyResolverTestCase.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.property.test; - -import org.apache.myrmidon.interfaces.property.PropertyResolver; -import org.apache.myrmidon.components.property.test.AbstractPropertyResolverTestCase; -import org.apache.myrmidon.components.property.ClassicPropertyResolver; - -/** - * A test for {@link org.apache.myrmidon.components.property.ClassicPropertyResolver}. - * - * @author Darrell DeBoer - * @version $Revision$ $Date$ - */ -public class ClassicPropertyResolverTestCase - extends AbstractPropertyResolverTestCase -{ - public ClassicPropertyResolverTestCase( String name ) - { - super( name ); - } - - protected PropertyResolver createResolver() - { - return new ClassicPropertyResolver(); - } - - /** - * Tests handing undefined property. - */ - public void testUndefinedProp() throws Exception - { - final String undefinedProp = "undefinedProperty"; - final String propRef = "${" + undefinedProp + "}"; - doTestResolution( propRef, propRef, m_context ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/DefaultPropertyResolverTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/DefaultPropertyResolverTestCase.java deleted file mode 100644 index 0183adea8..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/DefaultPropertyResolverTestCase.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.property.test; - -import org.apache.myrmidon.interfaces.property.PropertyResolver; -import org.apache.myrmidon.components.property.test.AbstractPropertyResolverTestCase; -import org.apache.myrmidon.components.property.DefaultPropertyResolver; - -/** - * Functional tests for {@link org.apache.myrmidon.components.property.DefaultPropertyResolver}. - * - * @author Darrell DeBoer - * @version $Revision$ $Date$ - */ -public class DefaultPropertyResolverTestCase - extends AbstractPropertyResolverTestCase -{ - public DefaultPropertyResolverTestCase( final String name ) - { - super( name ); - } - - protected PropertyResolver createResolver() - { - return new DefaultPropertyResolver(); - } - - /** - * Tests handing undefined property. - */ - public void testUndefinedProp() throws Exception - { - final String undefinedProp = "undefinedProperty"; - doTestFailure( "${" + undefinedProp + "}", - REZ.getString( "prop.missing-value.error", undefinedProp ), - m_context ); - - //TODO - "" should be disallowed as a property name - doTestFailure( "${}", - REZ.getString( "prop.missing-value.error", "" ), - m_context ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/role/test/DefaultRoleManagerTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/role/test/DefaultRoleManagerTestCase.java deleted file mode 100644 index ba68eb68c..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/role/test/DefaultRoleManagerTestCase.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * 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.role.test; - -import org.apache.avalon.excalibur.i18n.ResourceManager; -import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.myrmidon.AbstractMyrmidonTest; -import org.apache.myrmidon.components.role.DefaultRoleManager; -import org.apache.myrmidon.api.Task; -import org.apache.myrmidon.interfaces.role.RoleException; -import org.apache.myrmidon.interfaces.role.RoleInfo; -import org.apache.myrmidon.interfaces.role.RoleManager; - -/** - * Test cases for the DefaultRoleManager. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class DefaultRoleManagerTestCase - extends AbstractMyrmidonTest -{ - private final static Resources REZ = getResourcesForTested( DefaultRoleManagerTestCase.class ); - - private RoleManager m_roleManager; - - public DefaultRoleManagerTestCase( String name ) - { - super( name ); - } - - protected void setUp() throws Exception - { - m_roleManager = new DefaultRoleManager(); - } - - /** - * Tests looking up a role by name, shorthand and type. - */ - public void testLookup() throws Exception - { - final String roleName = "role-name"; - final String shorthand = "role-shorthand"; - final RoleInfo origRole = new RoleInfo( roleName, shorthand, Task.class ); - m_roleManager.addRole( origRole ); - - // Lookup the role - RoleInfo role = m_roleManager.getRole( roleName ); - assertTrue( origRole.equals( role ) ); - - // Lookup the role by shorthand - role = m_roleManager.getRoleByShorthandName( shorthand ); - assertTrue( origRole.equals( role ) ); - - // Lookup the role by type - role = m_roleManager.getRoleByType( Task.class ); - assertTrue( origRole.equals( role ) ); - - // Lookup an unknown role - RoleInfo unknownRole = m_roleManager.getRole( "unknown" ); - assertNull( unknownRole ); - - // Lookup an unknown shorthand - unknownRole = m_roleManager.getRoleByShorthandName( "unknown" ); - assertNull( unknownRole ); - - // Lookup an unknown role - unknownRole = m_roleManager.getRoleByType( DefaultRoleManagerTestCase.class ); - assertNull( unknownRole ); - } - - /** - * Tests inheriting roles from parent role manager. - */ - public void testParent() throws Exception - { - final String roleName = "role-name"; - final String shorthand = "shorthand"; - final RoleInfo origRole = new RoleInfo( roleName, shorthand, Task.class ); - m_roleManager.addRole( origRole ); - final RoleManager roleManager = new DefaultRoleManager( m_roleManager ); - - // Lookup by name - RoleInfo roleInfo = roleManager.getRole( roleName ); - assertTrue( origRole.equals( roleInfo ) ); - - // Lookup by shorthand - roleInfo = roleManager.getRoleByShorthandName( shorthand ); - assertTrue( origRole.equals( roleInfo ) ); - - // Lookup by type - roleInfo = roleManager.getRoleByType( Task.class ); - assertTrue( origRole.equals( roleInfo ) ); - } - - /** - * Tests overriding a role in a child role manager. - */ - public void testOverrideName() throws Exception - { - final String roleName = "role-name"; - final String shorthand = "shorthand"; - - // Add original role - final RoleInfo origRole = new RoleInfo( roleName, shorthand, Task.class ); - m_roleManager.addRole( origRole ); - - // Override role - final RoleManager roleManager = new DefaultRoleManager( m_roleManager ); - final RoleInfo overrideNameRole = new RoleInfo( roleName, "shorthand1" ); - roleManager.addRole( overrideNameRole ); - final RoleInfo overrideShorthandRole = new RoleInfo( "role2", shorthand ); - roleManager.addRole( overrideShorthandRole ); - final RoleInfo overrideTypeRole = new RoleInfo( "role3", "shorthand3", Task.class ); - roleManager.addRole( overrideTypeRole ); - - // Lookup role by name - RoleInfo roleInfo = roleManager.getRole( roleName ); - assertTrue( overrideNameRole.equals( roleInfo ) ); - - // Lookup role by shorthand - roleInfo = roleManager.getRoleByShorthandName( shorthand ); - assertTrue( overrideShorthandRole.equals( roleInfo ) ); - - // Lookup role by type - roleInfo = roleManager.getRoleByType( Task.class ); - assertTrue( overrideTypeRole.equals( roleInfo ) ); - } - - /** - * Tests adding duplicate roles. - */ - public void testDuplicate() throws Exception - { - final String roleName = "role-name"; - final String shorthand = "shorthand"; - final RoleInfo origRole = new RoleInfo( roleName, shorthand, Task.class ); - m_roleManager.addRole( origRole ); - - // Duplicate role name - try - { - m_roleManager.addRole( new RoleInfo( roleName ) ); - fail(); - } - catch( RoleException exc ) - { - final String message = REZ.getString( "duplicate-role.error", roleName ); - assertSameMessage( message, exc ); - } - - // Duplicate shorthand - try - { - m_roleManager.addRole( new RoleInfo( "another-role", shorthand ) ); - fail(); - } - catch( RoleException exc ) - { - final String message = REZ.getString( "duplicate-shorthand.error", shorthand ); - assertSameMessage( message, exc ); - } - - // Duplicate type - try - { - m_roleManager.addRole( new RoleInfo( null, Task.class ) ); - fail(); - } - catch( RoleException exc ) - { - final String message = REZ.getString( "duplicate-type.error", Task.class.getName() ); - assertSameMessage( message, exc ); - } - } - -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java deleted file mode 100644 index 932978376..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * 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.service.test; - -import org.apache.avalon.excalibur.i18n.ResourceManager; -import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.framework.parameters.Parameters; -import org.apache.avalon.framework.service.ServiceException; -import org.apache.myrmidon.components.AbstractComponentTest; -import org.apache.myrmidon.components.service.InstantiatingServiceManager; -import org.apache.myrmidon.interfaces.role.RoleInfo; -import org.apache.myrmidon.interfaces.role.RoleManager; -import org.apache.myrmidon.interfaces.service.ServiceFactory; -import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; -import org.apache.myrmidon.interfaces.type.TypeManager; - -/** - * Test cases for the default service manager. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class InstantiatingServiceManagerTestCase - extends AbstractComponentTest -{ - private final static Resources REZ = getResourcesForTested( InstantiatingServiceManagerTestCase.class ); - - private InstantiatingServiceManager m_serviceManager; - private Parameters m_parameters = new Parameters(); - - public InstantiatingServiceManagerTestCase( final String name ) - { - super( name ); - } - - /** - * Setup the test case - prepares the set of components. - */ - protected void setUp() - throws Exception - { - // Set-up the service manager - m_serviceManager = new InstantiatingServiceManager(); - m_serviceManager.enableLogging( getLogger() ); - m_serviceManager.service( getServiceManager() ); - m_serviceManager.parameterize( m_parameters ); - } - - /** - * Tests service instantiation. - */ - public void testCreateService() throws Exception - { - final String serviceRoleName = "test-service"; - - // Setup the test service - registerFactory( serviceRoleName, TestService.class, TestServiceFactory1.class ); - - // Create the service - Object service = m_serviceManager.lookup( serviceRoleName ); - - // Check service is of the expected class (don't use instanceof) - assertTrue( service.getClass() == TestServiceImpl1.class ); - } - - /** - * Tests service lookup. - */ - public void testLookup() throws Exception - { - final String serviceRoleName = "test-service"; - - // Setup the test service - registerFactory( serviceRoleName, TestService.class, TestServiceFactory1.class ); - - // Check whether the service can be instantiated - boolean hasService = m_serviceManager.hasService( serviceRoleName ); - assertTrue( hasService ); - } - - /** - * Tests that a service factory and service instance are taken through - * the lifecycle steps. - */ - public void testLifecycle() throws Exception - { - final String serviceRoleName = "test-service"; - - // Setup the test service - registerFactory( serviceRoleName, TestService.class, TestServiceFactory2.class ); - - // Create the service - TestService service = (TestService)m_serviceManager.lookup( serviceRoleName ); - - // Check service is of the expected class (don't use instanceof) - assertTrue( service.getClass() == TestServiceImpl2.class ); - - // Assert the service has been setup correctly - service.doWork(); - } - - /** - * Tests looking up an unknown service. - */ - public void testUnknownService() throws Exception - { - // Make sure that hasService() works correctly - final String serviceRole = "some-unknown-service"; - assertTrue( !m_serviceManager.hasService( serviceRole ) ); - - // Make sure that lookup() fails - try - { - m_serviceManager.lookup( serviceRole ); - fail(); - } - catch( ServiceException e ) - { - final String message = REZ.getString( "create-service.error", serviceRole ); - assertSameMessage( message, e ); - } - } - - /** - * Registers a service factory. - */ - private void registerFactory( final String serviceRoleName, - final Class serviceType, - final Class factoryClass ) - throws Exception - { - // TODO - add stuff to TypeDeployer to do this instead - final RoleManager roleManager = (RoleManager)getServiceManager().lookup( RoleManager.ROLE ); - roleManager.addRole( new RoleInfo( serviceRoleName, null, serviceType ) ); - final DefaultTypeFactory typeFactory = new DefaultTypeFactory( getClass().getClassLoader() ); - typeFactory.addNameClassMapping( serviceRoleName, factoryClass.getName() ); - final TypeManager typeManager = (TypeManager)getServiceManager().lookup( TypeManager.ROLE ); - typeManager.registerType( ServiceFactory.ROLE, serviceRoleName, typeFactory ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/LifecycleValidator.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/LifecycleValidator.java deleted file mode 100644 index b95ac5ffe..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/LifecycleValidator.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.service.test; - -import junit.framework.Assert; -import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.logger.LogEnabled; -import org.apache.avalon.framework.logger.Logger; -import org.apache.avalon.framework.parameters.ParameterException; -import org.apache.avalon.framework.parameters.Parameterizable; -import org.apache.avalon.framework.parameters.Parameters; -import org.apache.avalon.framework.service.ServiceException; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.avalon.framework.service.Serviceable; - -/** - * A basic class that asserts that the object is correctly set-up. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class LifecycleValidator - extends Assert - implements LogEnabled, Serviceable, Parameterizable, Initializable -{ - private String m_state = STATE_NOT_INIT; - - private final static String STATE_NOT_INIT = "not-prepared"; - private final static String STATE_LOG_ENABLED = "log-enabled"; - private final static String STATE_SERVICED = "serviced"; - private final static String STATE_PARAMETERISED = "parameterised"; - protected final static String STATE_INITIALISED = "initialised"; - - public void enableLogging( final Logger logger ) - { - assertEquals( STATE_NOT_INIT, m_state ); - m_state = STATE_LOG_ENABLED; - } - - public void service( final ServiceManager serviceManager ) throws ServiceException - { - assertEquals( STATE_LOG_ENABLED, m_state ); - m_state = STATE_SERVICED; - } - - public void parameterize( Parameters parameters ) throws ParameterException - { - assertEquals( STATE_SERVICED, m_state ); - m_state = STATE_PARAMETERISED; - } - - public void initialize() throws Exception - { - assertEquals( STATE_PARAMETERISED, m_state ); - m_state = STATE_INITIALISED; - } - - protected void assertSetup() - { - assertEquals( STATE_INITIALISED, m_state ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestService.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestService.java deleted file mode 100644 index 302c2a5b3..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestService.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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.service.test; - -/** - * A service interface. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public interface TestService -{ - void doWork(); -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory1.java deleted file mode 100644 index 10e0f69bc..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory1.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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.service.test; - -import org.apache.myrmidon.interfaces.service.AntServiceException; -import org.apache.myrmidon.interfaces.service.ServiceFactory; - -/** - * A test service factory. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class TestServiceFactory1 - implements ServiceFactory -{ - /** - * Create a service that coresponds to this factory. - */ - public Object createService() - throws AntServiceException - { - return new TestServiceImpl1(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory2.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory2.java deleted file mode 100644 index 524d3cc04..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceFactory2.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.service.test; - -import org.apache.myrmidon.interfaces.service.AntServiceException; -import org.apache.myrmidon.interfaces.service.ServiceFactory; -import org.apache.myrmidon.components.service.test.LifecycleValidator; - -/** - * A test service factory, which asserts that the factory has been properly - * set-up before it is used. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class TestServiceFactory2 - extends LifecycleValidator - implements ServiceFactory -{ - /** - * Create a service that corresponds to this factory. - */ - public Object createService() - throws AntServiceException - { - assertSetup(); - return new TestServiceImpl2(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl1.java deleted file mode 100644 index c22e4d0a7..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl1.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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.service.test; - -import org.apache.myrmidon.components.service.test.TestService; - -/** - * A test service implementation. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class TestServiceImpl1 - implements TestService -{ - public void doWork() - { - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl2.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl2.java deleted file mode 100644 index 933d76383..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/service/test/TestServiceImpl2.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.service.test; - -import org.apache.myrmidon.components.service.test.LifecycleValidator; -import org.apache.myrmidon.components.service.test.TestService; - -/** - * A test service that asserts it has been set-up correctly. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class TestServiceImpl2 - extends LifecycleValidator - implements TestService -{ - public void doWork() - { - assertSetup(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/PathTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/PathTestCase.java deleted file mode 100644 index 36b391051..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/PathTestCase.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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.framework.file.test; - -import java.io.File; -import org.apache.avalon.excalibur.io.FileUtil; -import org.apache.myrmidon.AbstractProjectTest; -import org.apache.myrmidon.LogMessageTracker; - -/** - * Test-cases for the data type. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - */ -public class PathTestCase - extends AbstractProjectTest -{ - public PathTestCase( final String name ) - { - super( name ); - } - - /** - * Tests setting the location attribute. - */ - public void testLocationAttribute() throws Exception - { - testPathContent( "set-location", new String[] { "location" } ); - } - - /** - * Tests setting the path attribute. - */ - public void testPathAttribute() throws Exception - { - // Test a path with a single file - testPathContent( "set-path", new String[] { "single-file" } ); - - // Test a path with several files, using ; separator - testPathContent( "set-multi-path", new String[] { "file1", "file2", ".." } ); - - // Test a path with several files, using : separator - testPathContent( "set-multi-path2", new String[] { "file1", "file2", ".." } ); - } - - /** - * Test using nested elements. - */ - public void testPathElement() throws Exception - { - testPathContent( "nested-path", new String[] { "some-file" } ); - testPathContent( "mixed-path", new String[] { "file1", "file2", "file3", "file4", "file5" } ); - } - - /** - * Test using nested elements. - */ - public void testFilesetElement() throws Exception - { - testPathContent( "set-fileset", new String[] { "path.ant" } ); - } - - /** - * Test using a nested custom file list implementation. - */ - public void testCustomFileList() throws Exception - { - testPathContent( "test-custom-file-list", new String[] { "file1" } ); - } - - /** - * Executes a target, and asserts that a particular list of file names - * is logged. - */ - private void testPathContent( final String targetName, - final String[] files ) throws Exception - { - final File projectFile = getTestResource( "path.ant" ); - final File baseDir = projectFile.getParentFile(); - - // Add each of the expected file names - final LogMessageTracker listener = new LogMessageTracker(); - for( int i = 0; i < files.length; i++ ) - { - final String fileName = files[ i ]; - final File file = FileUtil.resolveFile( baseDir, fileName ); - listener.addExpectedMessage( targetName, file.getAbsolutePath() ); - } - - // Execute the target - executeTarget( projectFile, targetName, listener ); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/TestFileList.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/TestFileList.java deleted file mode 100644 index c5984de5b..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/TestFileList.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.framework.file.test; - -import org.apache.myrmidon.framework.file.FileList; -import org.apache.myrmidon.api.TaskContext; -import org.apache.myrmidon.api.TaskException; -import java.io.File; - -/** - * A test FileList implementation. - * - * @author Adam Murdoch - * @version $Revision$ $Date$ - * - * @ant:type type="path" name="test-file-list" - */ -public class TestFileList - implements FileList -{ - private String m_name; - - public void setName( final String name ) - { - m_name = name; - } - - /** - * Returns the files in this list. - */ - public String[] listFiles( final TaskContext context ) - throws TaskException - { - final File file = context.resolveFile( m_name ); - return new String[] { file.getAbsolutePath() }; - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/path.ant b/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/path.ant deleted file mode 100644 index 319f92336..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/framework/file/test/path.ant +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/model/test/DefaultNameValidatorTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/model/test/DefaultNameValidatorTestCase.java deleted file mode 100644 index ff3368e19..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/model/test/DefaultNameValidatorTestCase.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * 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.interfaces.model.test; - -import org.apache.myrmidon.AbstractMyrmidonTest; -import org.apache.myrmidon.interfaces.model.DefaultNameValidator; - -/** - * TestCases for {@link org.apache.myrmidon.interfaces.model.DefaultNameValidator}. - * - * @author Darrell DeBoer - * @version $Revision$ $Date$ - */ -public class DefaultNameValidatorTestCase - extends AbstractMyrmidonTest -{ - private DefaultNameValidator m_validator = new DefaultNameValidator(); - - public DefaultNameValidatorTestCase( String name ) - { - super( name ); - } - - /** - * Test valid names for the default validator. - */ - public void testValidNames() throws Exception - { - testValid( "aName" ); - testValid( "123456" ); - testValid( "s p a ce s" ); - testValid( "d-a-s-h-e-s-" ); - testValid( "d.o.t.s." ); - testValid( "_u_n_d_e_r_s_c_o_r_e_s" ); - testValid( "a" ); - testValid( "1" ); - testValid( "_" ); - - } - - /** - * Test invalid names for the default validator. - */ - public void testInvalidNames() throws Exception - { - testInvalid( "" ); - testInvalid( " " ); - testInvalid( " " ); - testInvalid( " bad" ); - testInvalid( "bad " ); - testInvalid( " bad " ); - testInvalid( "-dashfirst" ); - testInvalid( ".dotfirst" ); - testInvalid( "question?" ); - } - - /** - * Test that certain characters are disallowed in the default validator. - */ - public void testReservedChars() throws Exception - { - String reserved = "!@#$%^&*()+=~`{}[]|\\/?<>,:;"; - - for( int pos = 0; pos < reserved.length(); pos++ ) - { - char chr = reserved.charAt( pos ); - testReservedChar( chr ); - } - } - - private void testReservedChar( char chr ) throws Exception - { - String test = "a" + String.valueOf( chr ); - testInvalid( test ); - } - - /** - * Test validation using a restrictive set of validation rules. - */ - public void testStrictNames() throws Exception - { - m_validator = new DefaultNameValidator( false, false, "", false, false, "." ); - - testValid( "name" ); - testValid( "a" ); - testValid( "yep.ok" ); - - testInvalid( "_nogood" ); - testInvalid( "no_good" ); - testInvalid( "nope1" ); - testInvalid( "123" ); - testInvalid( "not ok" ); - } - - private void testValid( String name ) - { - try - { - m_validator.validate( name ); - } - catch( Exception e ) - { - fail( e.getMessage() ); - } - } - - private void testInvalid( String name ) - { - try - { - m_validator.validate( name ); - fail( "Name \"" + name + "\" should be invalid." ); - } - catch( Exception e ) - { - } - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType1.java deleted file mode 100644 index 226b9a3bb..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType1.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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.interfaces.type.test; - -/** - * A basic implementation of a type to test the type factory. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class MyType1 -{ - public boolean equals( final Object object ) - { - return object.getClass() == getClass(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType2.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType2.java deleted file mode 100644 index a9418f1ae..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/MyType2.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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.interfaces.type.test; - -/** - * A basic implementation of a type to test the type factory. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class MyType2 -{ - public boolean equals( final Object object ) - { - return object.getClass() == getClass(); - } -} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/TypeFactoryTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/TypeFactoryTestCase.java deleted file mode 100644 index 62ed33a88..000000000 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/interfaces/type/test/TypeFactoryTestCase.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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.interfaces.type.test; - -import java.io.File; -import java.net.URL; -import org.apache.myrmidon.AbstractMyrmidonTest; -import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; -import org.apache.myrmidon.interfaces.type.ReloadingTypeFactory; -import org.apache.myrmidon.interfaces.type.TypeException; - -/** - * These are unit tests that test the basic operation of TypeFactories. - * - * @author Peter Donald - * @version $Revision$ $Date$ - */ -public class TypeFactoryTestCase - extends AbstractMyrmidonTest -{ - private final static String TYPE_NAME1 = "my-type1"; - private final static String TYPE_NAME2 = "my-type2"; - private final static Class TYPE_CLASS1 = MyType1.class; - private final static Class TYPE_CLASS2 = MyType2.class; - private final static String TYPE_CLASSNAME1 = TYPE_CLASS1.getName(); - private final static String TYPE_CLASSNAME2 = TYPE_CLASS2.getName(); - - public TypeFactoryTestCase( final String name ) - { - super( name ); - } - - /** - * Make sure that you can load a basic type from DefaultTypeManager. - */ - public void testBasicType() - { - final ClassLoader classLoader = getClass().getClassLoader(); - final DefaultTypeFactory factory = new DefaultTypeFactory( classLoader ); - factory.addNameClassMapping( TYPE_NAME2, TYPE_CLASSNAME2 ); - - try - { - final Object type = factory.create( TYPE_NAME2 ); - final Class typeClass = type.getClass(); - assertEquals( "The type loaded for factory should be same class as in current classloader", - typeClass, TYPE_CLASS2 ); - } - catch( TypeException e ) - { - fail( "Unable to create Type due to " + e ); - } - } - - /** - * Make sure that when you load a type from a RelaodableTypeFactory - * that it is actually reloaded. - */ - public void testReloadingTypeFactory() - throws Exception - { - final File file = getTestResource( "types.jar" ); - final URL[] classpath = new URL[]{file.toURL()}; - final ReloadingTypeFactory factory = new ReloadingTypeFactory( classpath, null ); - factory.addNameClassMapping( TYPE_NAME1, TYPE_CLASSNAME1 ); - - try - { - final Object type = factory.create( TYPE_NAME1 ); - final Class typeClass = type.getClass(); - final boolean sameClass = typeClass == TYPE_CLASS1; - assertTrue( "The type loaded for factory should not be same class as in current classloader", - !sameClass ); - } - catch( TypeException e ) - { - fail( "Unable to create Type due to " + e ); - } - } -}