/* ====================================================================
*
* The ObjectStyle Group Software License, Version 1.0
*
* Copyright (c) 2002 The ObjectStyle Group
* and individual authors of the software. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* ObjectStyle Group (http://objectstyle.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "ObjectStyle Group" and "Cayenne"
* must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact andrus@objectstyle.org.
*
* 5. Products derived from this software may not be called "ObjectStyle"
* nor may "ObjectStyle" appear in their names without prior written
* permission of the ObjectStyle Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the ObjectStyle Group. For more
* information on the ObjectStyle Group, please see
* <http://objectstyle.org/>.
*
*/
package org.objectstyle.woproject.ant.functiontest;
import java.io.File;
import java.io.IOException;
import junit.framework.Assert;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Main;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
/**
* Provides testing framework for the functional tests of project building
* tasks.
*
* @author Andrei Adamchik
* @author Emily Bache
*/
public abstract class BuildTestCase extends TestCase {
private static Logger logger = Logger.getLogger(BuildTestCase.class);
private static File testDist;
static {
// initialize base directory
try {
testDist = new File("tests" + File.separator + "wo" + File.separator + "dist").getCanonicalFile();
} catch (IOException ioex) {
logger.warn("Error creation distribution directory object.", ioex);
throw new RuntimeException("Error creation distribution directory object.");
}
}
public BuildTestCase(String name) {
super(name);
}
public static final Project getProject(File projectBaseDir, File projectBuildFile) throws BuildException, ClassNotFoundException {
Project project = new Project();
project.setBaseDir(projectBaseDir);
project.init();
project.setUserProperty("ant.version", Main.getAntVersion());
project.setUserProperty("ant.file", projectBuildFile.getAbsolutePath());
Class.forName("javax.xml.parsers.SAXParserFactory");
ProjectHelper.configureProject(project, projectBuildFile);
return project;
}
public void assertStructure(ProjectStructure struct) throws AssertionFailedError {
String path = struct.getDirectoryPath();
File projDir = resolveDistPath(path);
Assert.assertTrue("Project directory is missing: " + projDir, projDir.isDirectory());
File res = new File(projDir, struct.getRelativeResourcesPath());
Assert.assertTrue("Resources directory is missing: " + res, res.isDirectory());
File info = new File(projDir, struct.getRelativeInfoPath() + "/Info.plist");
Assert.assertTrue("Info.plist is missing: " + info, info.isFile());
if (struct.hasWebServerResources()) {
File wsres = new File(projDir, struct.getRelativeWSResourcesPath());
Assert.assertTrue("WebServerResources directory is missing: " + wsres, wsres.isDirectory());
assertWsResources(wsres, struct.getWsResources());
}
if (struct.hasJava()) {
File javaDir = new File(projDir, struct.getRelativeResourcesPath() + "/Java");
Assert.assertTrue("Java directory is missing: " + javaDir, javaDir.isDirectory());
assertJars(javaDir, struct.getJars());
}
if (struct.hasWos()) {
assertWos(res, struct.getWocomps());
}
}
/**
* Returns a "canonical" file located at <code>path</code> relative to
* tests distribution directory. Note that when building a path, forward
* slash can be used as path separator even on Windows. This method will do
* all needed replacements.
*/
protected File resolveDistPath(String path) {
if (File.separator != "/") {
path = path.replace('/', File.separatorChar);
}
return new File(testDist, path);
}
protected void assertJars(File javaDir, String[] jars) throws AssertionFailedError {
for (int i = 0; i < jars.length; i++) {
File jar = new File(javaDir, jars[i] + ".jar");
Assert.assertTrue("Jar file is missing: " + jar, jar.isFile());
}
}
protected void assertWos(File resourceDir, String[] wos) throws AssertionFailedError {
for (int i = 0; i < wos.length; i++) {
File wo = new File(resourceDir, wos[i] + ".wo");
Assert.assertTrue("Component .wo directory is missing: " + wo, wo.isDirectory());
String compName = new File(wos[i]).getName();
File wod = new File(wo, compName + ".wod");
Assert.assertTrue("Component .wod file is missing: " + wod, wod.isFile());
File html = new File(wo, compName + ".html");
Assert.assertTrue("Component .html file is missing: " + html, html.isFile());
}
}
protected void assertWsResources(File resDir, String[] res) throws AssertionFailedError {
for (int i = 0; i < res.length; i++) {
String path = res[i].replace('/', File.separatorChar);
File wsfile = new File(resDir, path);
Assert.assertTrue("WebServerResource is missing: " + wsfile, wsfile.isFile());
}
}
}