/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2006-2008 Sun Microsystems, Inc.
*/
package org.opends.build.tools;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Arrays;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
public class PrepTestNG extends Task
{
/** Template for inserting children elements of default test tag */
static private final String DEFAULT_TAGS_TEMPLATE =
"<!-- DO NOT REMOVE! - GENERATED DEFAULT TAGS (see PrepTestNG class) -->";
/** Template for inserting global children elements of run tags */
static private final String GLOBAL_RUN_TAGS_TEMPLATE =
"<!-- DO NOT REMOVE! - GENERATED GLOBAL RUN TAGS (see PrepTestNG class) -->";
/** Indentation used in testng.xml */
static private final int INDENT = 4;
private String file;
private String toFile;
private String groupList;
private String packageList;
private String classList;
private String methodList;
public void setFile(String file)
{
this.file = file;
}
public void setToFile(String toFile)
{
this.toFile = toFile;
}
public void setGroupList(String groupList)
{
this.groupList = groupList;
}
public void setPackageList(String packageList)
{
this.packageList = packageList;
}
public void setClassList(String classList)
{
this.classList = classList;
}
public void setMethodList(String methodList)
{
this.methodList = methodList;
}
public void execute() throws BuildException
{
if(file == null)
{
throw new BuildException("Attribute file must be set to the orginal " +
"TestNG XML file");
}
if(toFile == null)
{
throw new BuildException("Attribute toFile must be set to the modified " +
"TestNG XML file");
}
BufferedReader reader;
FileOutputStream outFile;
PrintStream writer;
String line;
String[] groups;
String[] packages;
String[] classes;
String[] methods;
String[] groupLine;
String[] methodLine;
String methodClass;
String methodName;
int methodNameStartIdx;
int groupCount = 0;
int packageCount = 0;
int classCount = 0;
int methodCount = 0;
try
{
reader = new BufferedReader(new FileReader(file));
outFile = new FileOutputStream(toFile);
writer = new PrintStream(outFile);
line = reader.readLine();
if(groupList != null && !groupList.trim().equals("") &&
!groupList.startsWith("${"))
{
groups = groupList.split(",");
}
else
{
groups = new String[0];
}
if(packageList != null && !packageList.trim().equals("") &&
!packageList.startsWith("${"))
{
packages = packageList.split(",");
}
else
{
packages = new String[0];
}
if(classList != null && !classList.trim().equals("") &&
!classList.startsWith("${"))
{
classes = classList.split(",");
}
else
{
classes = new String[0];
}
if(methodList != null && !methodList.trim().equals("") &&
!methodList.startsWith("${"))
{
methods = methodList.split(";");
}
else
{
methods = new String[0];
}
while(line != null)
{
if(line.indexOf(DEFAULT_TAGS_TEMPLATE) >= 0)
{
int level = 2;
if(groups.length > 0)
{
boolean windowsClause = false;
println(writer, level, "<groups>");
println(writer, ++level, "<run>");
level++;
for(String group : groups)
{
groupLine = group.split("=");
if(groupLine.length == 2)
{
String inc_exc = groupLine[0].trim();
if (inc_exc == null ||
!("include".equals(inc_exc.toLowerCase()) ||
"exclude".equals(inc_exc.toLowerCase()))) {
System.out.println("Error: illegal group clause " + group);
} else {
String gr = groupLine[1].trim();
println(writer, level, "<" +inc_exc +" "+
"name=\""+gr+ "\" />");
windowsClause |= "windows".equals(gr);
groupCount++;
}
}
}
// Exclude windows specific tests if the user has not provided
// an explicit windows clause and we're not on windows.
if (!windowsClause && !isWindows()) {
println(writer, level, "<exclude name=\"windows\"/>");
groupCount++;
}
println(writer, --level, "</run>");
println(writer, --level, "</groups>");
} else {
// No explicit groups have been specified so see if we need
// to exclude the windows tests.
if (!isWindows()) {
println(writer, level, "<groups>");
println(writer, ++level, "<run>");
println(writer, ++level, "<exclude name=\"windows\"/>");
println(writer, --level, "</run>");
println(writer, --level, "</groups>");
groupCount++;
}
}
if(packages.length > 0)
{
println(writer, level, "<packages>");
level++;
for(String pkg : packages)
{
println(writer, level, "<package name=\"" + pkg.trim() + "\" />");
packageCount++;
}
println(writer, --level, "</packages>");
}
if(classes.length > 0 || methods.length > 0)
{
println(writer, level, "<classes>");
if(classes.length > 0)
{
level++;
for(String cls : classes)
{
println(writer, level, "<class name=\"" + cls.trim() + "\" />");
classCount++;
}
}
if(methods.length > 0)
{
level++;
for(String mhd : methods)
{
methodLine = mhd.split(",");
if(methodLine.length > 0)
{
// Allow class.method or class#method
methodNameStartIdx = methodLine[0].lastIndexOf("#");
if (methodNameStartIdx == -1)
{
methodNameStartIdx = methodLine[0].lastIndexOf(".");
}
methodClass = methodLine[0].substring(0,
methodNameStartIdx);
methodName = methodLine[0].substring(methodNameStartIdx + 1,
methodLine[0].length());
println(writer, level, "<class name=\"" +
methodClass.trim() + "\" >");
println(writer, ++level, "<methods>");
println(writer, ++level, "<include name=\"" +
methodName.trim() + "\" />");
methodCount++;
classCount++;
for(int i = 1; i < methodLine.length; i ++)
{
println(writer, level, "<include name=\"" +
methodLine[i].trim() + "\" />");
methodCount++;
}
println(writer, --level, "</methods>");
println(writer, --level, "</class>");
}
}
}
println(writer, --level, "</classes>");
}
}
else if (line.indexOf(GLOBAL_RUN_TAGS_TEMPLATE) != -1)
{
if (!isWindows()) {
int index = line.indexOf(GLOBAL_RUN_TAGS_TEMPLATE);
println(writer, levelForIndex(index),
"<exclude name=\"windows\"/>");
}
}
else
{
println(writer, 0, line);
}
line = reader.readLine();
}
System.out.println("Adding " + groupCount + " group tags, " +
packageCount + " package tags, " + classCount + " class tags, " +
methodCount + " method tags to " + toFile);
}
catch(Exception e)
{
throw new BuildException("File Error: " + e.toString());
}
}
static private boolean isWindows() {
String os = System.getProperty("os.name");
return (os != null && os.toLowerCase().indexOf("windows") != -1);
}
static private String indent(int indent) {
char[] blankArray = new char[indent];
Arrays.fill(blankArray, ' ');
return new String(blankArray);
}
static private void println(PrintStream writer, int level, String txt) {
writer.print(indent(INDENT * level));
writer.print(txt);
writer.print(System.getProperty("line.separator"));
}
static private int levelForIndex(int index) {
return index / INDENT;
}
}