FileDocCategorySizeDatePackage
XmlPropertyTest.javaAPI DocApache Ant 1.7012910Wed Dec 13 06:16:22 GMT 2006org.apache.tools.ant.taskdefs

XmlPropertyTest

public class XmlPropertyTest extends org.apache.tools.ant.BuildFileTest

Fields Summary
private static final org.apache.tools.ant.util.FileUtils
FILE_UTILS
Constructors Summary
public XmlPropertyTest(String name)


       
        super(name);
    
Methods Summary
private voiddoTest(java.lang.String msg, boolean keepRoot, boolean collapse, boolean semantic, boolean include, boolean localRoot)
Actually run a test, finding all input files (and corresponding goldfile)

        Enumeration iter =
            getFiles(new File(System.getProperty("root"), "src/etc/testcases/taskdefs/xmlproperty/inputs"));
        while (iter.hasMoreElements()) {
            File inputFile = (File) iter.nextElement();
            // What's the working directory?  If local, then its the
            // folder of the input file.  Otherwise, its the "current" dir..
            File workingDir;
            if ( localRoot ) {
                workingDir = inputFile.getParentFile();
            } else {
                workingDir = FILE_UTILS.resolveFile(new File("."), ".");
            }

            try {

                File propertyFile = getGoldfile(inputFile, keepRoot, collapse,
                                                semantic, include, localRoot);
                if (!propertyFile.exists()) {
//                    System.out.println("Skipping as "
//                                       + propertyFile.getAbsolutePath()
//                                       + ") doesn't exist.");
                    continue;
                }

                //                System.out.println(msg + " (" + propertyFile.getName() + ") in (" + workingDir + ")");

                Project p = new Project();

                XmlProperty xmlproperty = new XmlProperty();
                xmlproperty.setProject(p);
                xmlproperty.setFile(inputFile);

                xmlproperty.setKeeproot(keepRoot);
                xmlproperty.setCollapseAttributes(collapse);
                xmlproperty.setSemanticAttributes(semantic);
                xmlproperty.setIncludeSemanticAttribute(include);
                xmlproperty.setRootDirectory(workingDir);

                // Set a property on the project to make sure that loading
                // a property with the same name from an xml file will
                // *not* change it.
                p.setNewProperty("override.property.test", "foo");

                xmlproperty.execute();

                Properties props = new Properties();
                props.load(new FileInputStream(propertyFile));

                //printProperties(p.getProperties());

                ensureProperties(msg, inputFile, workingDir, p, props);
                ensureReferences(msg, inputFile, p.getReferences());

            } catch (IOException ex) {
                fail(ex.toString());
            }
        }
    
private static voidensureProperties(java.lang.String msg, java.io.File inputFile, java.io.File workingDir, org.apache.tools.ant.Project p, java.util.Properties properties)
Make sure every property loaded from the goldfile was also read from the XmlProperty. We could try and test the other way, but some other properties may get set in the XmlProperty due to generic Project/Task configuration.

        Hashtable xmlproperties = p.getProperties();
        // Every key identified by the Properties must have been loaded.
        Enumeration propertyKeyEnum = properties.propertyNames();
        while(propertyKeyEnum.hasMoreElements()){
            String currentKey = propertyKeyEnum.nextElement().toString();
            String assertMsg = msg + "-" + inputFile.getName()
                + " Key=" + currentKey;

            String propertyValue = properties.getProperty(currentKey);

            String xmlValue = (String)xmlproperties.get(currentKey);

            if ( propertyValue.indexOf("ID.") == 0 ) {
                // The property is an id's thing -- either a property
                // or a path.  We need to make sure
                // that the object was created with the given id.
                // We don't have an adequate way of testing the actual
                // *value* of the Path object, though...
                String id = currentKey;
                Object obj = p.getReferences().get(id);

                if ( obj == null ) {
                    fail(assertMsg + " Object ID does not exist.");
                }

                // What is the property supposed to be?
                propertyValue =
                    propertyValue.substring(3, propertyValue.length());
                if (propertyValue.equals("path")) {
                    if (!(obj instanceof Path)) {
                        fail(assertMsg + " Path ID is a "
                             + obj.getClass().getName());
                    }
                } else {
                    assertEquals(assertMsg, propertyValue, obj.toString());
                }

            } else {

                if (propertyValue.indexOf("FILE.") == 0) {
                    // The property is the name of a file.  We are testing
                    // a location attribute, so we need to resolve the given
                    // file name in the provided folder.
                    String fileName =
                        propertyValue.substring(5, propertyValue.length());
                    File f = new File(workingDir, fileName);
                    propertyValue = f.getAbsolutePath();
                }

                assertEquals(assertMsg, propertyValue, xmlValue);
            }

        }
    
private static voidensureReferences(java.lang.String msg, java.io.File inputFile, java.util.Hashtable references)
Ensure all references loaded by the project are valid.

        Enumeration referenceKeyEnum = references.keys();
        while(referenceKeyEnum.hasMoreElements()){
            String currentKey = referenceKeyEnum.nextElement().toString();
            Object currentValue = references.get(currentKey);

            if (currentValue instanceof Path) {
            } else if (currentValue instanceof String) {
            } else {
                if( ! currentKey.startsWith("ant.") ) {
                    fail(msg + "-" + inputFile.getName() + " Key="
                         + currentKey + " is not a recognized type.");
                }
            }
        }
    
private static java.util.EnumerationgetFiles(java.io.File startingDir)
Retrieve a list of xml files in the specified folder and below.

        Vector result = new Vector();
        getFiles(startingDir, result);
        return result.elements();
    
private static voidgetFiles(java.io.File startingDir, java.util.Vector collect)
Collect a list of xml files in the specified folder and below.

        FileFilter filter = new FileFilter() {
            public boolean accept (File file) {
                if (file.isDirectory()) {
                    return true;
                } else {
                    return (file.getPath().indexOf("taskdefs") > 0 &&
                            file.getPath().toLowerCase().endsWith(".xml") );
                }
            }
        };

        File[] files = startingDir.listFiles(filter);
        for (int i=0;i<files.length;i++) {
            File f = files[i];
            if (!f.isDirectory()) {
                collect.addElement(f);
            } else {
                getFiles(f, collect);
            }
        }
    
private static java.io.FilegetGoldfile(java.io.File input, boolean keepRoot, boolean collapse, boolean semantic, boolean include, boolean localRoot)
Munge the name of the input file to find an appropriate goldfile, based on hardwired naming conventions.

        // Substitute .xml with .properties
        String baseName = input.getName().toLowerCase();
        if (baseName.endsWith(".xml")) {
            baseName = baseName.substring(0, baseName.length() - 4)
                + ".properties";
        }

        File dir = input.getParentFile().getParentFile();

        String goldFileFolder = "goldfiles/";

        if (keepRoot) {
            goldFileFolder += "keeproot-";
        } else {
            goldFileFolder += "nokeeproot-";
        }

        if (semantic) {
            goldFileFolder += "semantic-";
            if (include) {
                goldFileFolder += "include-";
            }
        } else {
            if (collapse) {
                goldFileFolder += "collapse-";
            } else {
                goldFileFolder += "nocollapse-";
            }
        }

        return new File(dir, goldFileFolder + baseName);
    
private static voidprintProperties(java.util.Hashtable xmlproperties)
Debugging method to print the properties in the given hashtable

        Enumeration keyEnum = xmlproperties.keys();
        while (keyEnum.hasMoreElements()) {
            String currentKey = keyEnum.nextElement().toString();
            System.out.println(currentKey + " = "
                               + xmlproperties.get(currentKey));
        }
    
public voidsetUp()

        configureProject("src/etc/testcases/taskdefs/xmlproperty.xml");
    
public voidtestCollapse()

        doTest("testCollapse", false, true, false, false, false);
    
public voidtestCollapseSemantic()

        doTest("testCollapseSemantic", false, true, true, false, false);
    
public voidtestDTD()

        executeTarget("testdtd");
        assertEquals("Text", getProject().getProperty("root-tag.inner-tag"));
    
public voidtestFile()

        testProperties("test");
    
public voidtestInclude()

        doTest("testInclude", false, false, false, true, false);
    
public voidtestKeeproot()

        doTest("testKeeproot", true, false, false, false, false);
    
public voidtestKeeprootCollapse()

        doTest("testKeeprootCollapse", true, true, false, false, false);
    
public voidtestKeeprootCollapseSemantic()

        doTest("testKeeprootCollapseSemantic", true, true, true, false, false);
    
public voidtestKeeprootSemantic()

        doTest("testKeeprootSemantic", true, false, true, false, false);
    
public voidtestNeedsCatalog()

        executeTarget("testneedscat");
        assertEquals("true", getProject().getProperty("skinconfig.foo"));
    
public voidtestNone()

        doTest("testNone", false, false, false, false, false);
    
private voidtestProperties(java.lang.String target)

        executeTarget(target);
        assertEquals("true", getProject().getProperty("root-tag(myattr)"));
        assertEquals("Text", getProject().getProperty("root-tag.inner-tag"));
        assertEquals("val",
                     getProject().getProperty("root-tag.inner-tag(someattr)"));
        assertEquals("false", getProject().getProperty("root-tag.a2.a3.a4"));
        assertEquals("CDATA failed",
            "<test>", getProject().getProperty("root-tag.cdatatag"));
    
public voidtestResource()

        testProperties("testResource");
    
public voidtestSemantic()

        doTest("testSemantic", false, false, true, false, false);
    
public voidtestSemanticInclude()

        doTest("testSemanticInclude", false, false, true, true, false);
    
public voidtestSemanticLocal()

        doTest("testSemanticInclude", false, false, true, false, true);