From f32c25094986e239e07497725161c1d1cc5d2533 Mon Sep 17 00:00:00 2001
From: el_kaboing <el_kaboing@localhost>
Date: Thu, 01 Feb 2007 17:07:33 +0000
Subject: [PATCH] The new parsing tool for retrieving test specs from the test case comments and creating xml files with the test specifications.
---
opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/README | 194 ++++++
opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_int.java | 150 ++++
opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/TestFileList.java | 154 ++++
opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_xml.java | 166 +++++
opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ParseData.java | 236 +++++++
opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet_security.xml | 304 +++++++++
opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet.xml | 293 +++++++++
opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/GenerateOpenDSTestSpecs.java | 225 +++++++
opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ArrayData.java | 153 ++++
9 files changed, 1,875 insertions(+), 0 deletions(-)
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ArrayData.java b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ArrayData.java
new file mode 100644
index 0000000..a07e2ff
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ArrayData.java
@@ -0,0 +1,153 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+import java.io.*;
+import java.lang.*;
+import java.util.ArrayList;
+
+public class ArrayData
+{
+ private ArrayList <Object> testGroupName;
+ private ArrayList <Object> testGroupPurpose;
+ private ArrayList <Object> testSubgroupName;
+ private ArrayList <Object> testSuiteName;
+ private ArrayList <Object> testSuitePurpose;
+ private ArrayList <Object> testSuiteID;
+ private ArrayList <Object> testSuiteGroup;
+ private ArrayList <Object> testSuitePreamble;
+ private ArrayList <Object> testSuitePostamble;
+ private ArrayList <Object> testSuite;
+ private ArrayList <Object> testName;
+ private ArrayList <Object> testMarker;
+ private ArrayList <Object> testID;
+ private ArrayList <Object> testIssue;
+ private ArrayList <Object> testGroup;
+ private ArrayList <Object> testScript;
+ private ArrayList <Object> testHTMLLink;
+ private ArrayList <Object> testPurpose;
+ private ArrayList <Object> testPreamble;
+ private ArrayList <Object> testSteps;
+ private ArrayList <Object> testPostamble;
+ private ArrayList <Object> testResult;
+
+ public ArrayData()
+ {
+ testGroupName = new ArrayList<Object>();
+ testGroupPurpose = new ArrayList<Object>();
+ testSubgroupName = new ArrayList<Object>();
+ testSuiteName = new ArrayList<Object>();
+ testSuitePurpose = new ArrayList<Object>();
+ testSuiteID = new ArrayList<Object>();
+ testSuiteGroup = new ArrayList<Object>();
+ testSuitePreamble = new ArrayList<Object>();
+ testSuitePostamble = new ArrayList<Object>();
+ testSuite = new ArrayList<Object>();
+ testName = new ArrayList<Object>();
+ testMarker = new ArrayList<Object>();
+ testID = new ArrayList<Object>();
+ testIssue = new ArrayList<Object>();
+ testGroup = new ArrayList<Object>();
+ testScript = new ArrayList<Object>();
+ testHTMLLink = new ArrayList<Object>();
+ testPurpose = new ArrayList<Object>();
+ testPreamble = new ArrayList<Object>();
+ testSteps = new ArrayList<Object>();
+ testPostamble = new ArrayList<Object>();
+ testResult = new ArrayList<Object>();
+ }
+
+ public void setGroupName(String inGroupName){ testGroupName.add(inGroupName); }
+ public void setGroupPurpose(String inGroupPurpose){ testGroupPurpose.add(inGroupPurpose); }
+ public void setSubgroupName(String inSubgroupName){ testSubgroupName.add(inSubgroupName); }
+ public void setTestSuiteName(String inTestSuiteName){ testSuiteName.add(inTestSuiteName); }
+ public void setTestSuitePurpose(String inTestSuitePurpose){ testSuitePurpose.add(inTestSuitePurpose); }
+ public void setTestSuiteID(String inTestSuiteID){ testSuiteID.add(inTestSuiteID); }
+ public void setTestSuiteGroup(String inTestSuiteGroup){ testSuiteGroup.add(inTestSuiteGroup); }
+ public void setTestSuitePreamble(String inTestSuitePreamble){ testSuitePreamble.add(inTestSuitePreamble); }
+ public void setTestSuitePostamble(String inTestSuitePostamble){ testSuitePostamble.add(inTestSuitePostamble); }
+ public void setTestSuite(String inTestSuite){ testSuite.add(inTestSuite); }
+ public void setTestName(String inTestName){ testName.add(inTestName); }
+ public void setTestMarker(String inTestMarker){ testMarker.add(inTestMarker); }
+ public void setTestID(String inTestID){ testID.add(inTestID); }
+ public void setTestIssue(String inTestIssue){ testIssue.add(inTestIssue); }
+ public void setTestGroup(String inTestGroup){ testGroup.add(inTestGroup); }
+ public void setTestScript(String inTestScript){ testScript.add(inTestScript); }
+ public void setTestHTMLLink(String inTestHTMLLink){ testHTMLLink.add(inTestHTMLLink); }
+ public void setTestPurpose(String inTestPurpose){ testPurpose.add(inTestPurpose); }
+ public void setTestPreamble(String inTestPreamble){ testPreamble.add(inTestPreamble); }
+ public void setTestSteps(ArrayList inTestSteps){ testSteps.add(inTestSteps); }
+ public void setTestPostamble(String inTestPostamble){ testPostamble.add(inTestPostamble); }
+ public void setTestResult(String inTestResult){ testResult.add(inTestResult); }
+
+ public <Object> ArrayList getGroupName(){ return testGroupName; }
+ public <Object> ArrayList getGroupPurpose(){ return testGroupPurpose; }
+ public <Object> ArrayList getSubgroupName(){ return testSubgroupName; }
+ public <Object> ArrayList getTestSuiteName(){ return testSuiteName; }
+ public <Object> ArrayList getTestSuitePurpose(){ return testSuitePurpose; }
+ public <Object> ArrayList getTestSuiteID(){ return testSuiteID; }
+ public <Object> ArrayList getTestSuiteGroup(){ return testSuiteGroup; }
+ public <Object> ArrayList getTestSuitePreamble(){ return testSuitePreamble; }
+ public <Object> ArrayList getTestSuitePostamble(){ return testSuitePostamble; }
+ public <Object> ArrayList getTestSuite(){ return testSuite; }
+ public <Object> ArrayList getTestName(){ return testName; }
+ public <Object> ArrayList getTestMarker(){ return testMarker; }
+ public <Object> ArrayList getTestID(){ return testID; }
+ public <Object> ArrayList getTestIssue(){ return testIssue; }
+ public <Object> ArrayList getTestGroup(){ return testGroup; }
+ public <Object> ArrayList getTestScript(){ return testScript; }
+ public <Object> ArrayList getTestHTMLLink(){ return testHTMLLink; }
+ public <Object> ArrayList getTestPurpose(){ return testPurpose; }
+ public <Object> ArrayList getTestPreamble(){ return testPreamble; }
+ public <Object> ArrayList getTestSteps(){ return testSteps; }
+ public <Object> ArrayList getTestPostamble(){ return testPostamble; }
+ public <Object> ArrayList getTestResult(){ return testResult; }
+
+ public String getGroupName(int index){ if(testGroupName != null && index < testGroupName.size()) return (String)(testGroupName.get(index)); else return null;}
+ public String getGroupPurpose(int index){ if(testGroupPurpose != null && index < testGroupPurpose.size()) return (String)(testGroupPurpose.get(index)); else return null;}
+ public String getSubgroupName(int index){ if(testSubgroupName != null && index < testSubgroupName.size()) return (String)(testSubgroupName.get(index)); else return null;}
+ public String getTestSuiteName(int index){ if(testSuiteName != null && index < testSuiteName.size()) return (String)(testSuiteName.get(index)); else return null;}
+ public String getTestSuitePurpose(int index){ if(testSuitePurpose != null && index < testSuitePurpose.size()) return (String)(testSuitePurpose.get(index)); else return null;}
+ public String getTestSuiteID(int index){ if(testSuiteID != null && index < testSuiteID.size()) return (String)(testSuiteID.get(index)); else return null;}
+ public String getTestSuiteGroup(int index){ if(testSuiteGroup != null && index < testSuiteGroup.size()) return (String)(testSuiteGroup.get(index)); else return null;}
+ public String getTestSuitePreamble(int index){ if(testSuitePreamble != null && index < testSuitePreamble.size()) return (String)(testSuitePreamble.get(index)); else return null;}
+ public String getTestSuitePostamble(int index){ if(testSuitePostamble != null && index < testSuitePostamble.size()) return (String)(testSuitePostamble.get(index)); else return null;}
+ public String getTestSuite(int index){ if(testSuite != null && index < testSuite.size()) return (String)(testSuite.get(index)); else return null;}
+ public String getTestName(int index){ if(testName != null && index < testName.size()) return (String)(testName.get(index)); else return null;}
+ public String getTestMarker(int index){ if(testMarker != null && index < testMarker.size()) return (String)(testMarker.get(index)); else return null;}
+ public String getTestID(int index){ if(testID != null && index < testID.size()) return (String)(testID.get(index)); else return null;}
+ public String getTestIssue(int index){ if(testIssue != null && index < testIssue.size()) return (String)(testIssue.get(index)); else return null;}
+ public String getTestGroup(int index){ if(testGroup != null && index < testGroup.size()) return (String)(testGroup.get(index)); else return null;}
+ public String getTestScript(int index){ if(testScript != null && index < testScript.size()) return (String)(testScript.get(index)); else return null;}
+ public String getTestHTMLLink(int index){ if(testHTMLLink != null && index < testHTMLLink.size()) return (String)(testHTMLLink.get(index)); else return null;}
+ public String getTestPurpose(int index){ if(testPurpose != null && index < testPurpose.size()) return (String)(testPurpose.get(index)); else return null;}
+ public String getTestPreamble(int index){if(testPreamble != null && index < testPreamble.size()) return (String)(testPreamble.get(index)); else return null;}
+ public ArrayList<String> getTestSteps(int index){ if(testSteps != null && index < testSteps.size()) return (ArrayList<String>)(testSteps.get(index)); else return null;}
+ public String getTestPostamble(int index){ if(testPostamble != null && index < testPostamble.size()) return (String)(testPostamble.get(index)); else return null;}
+ public String getTestResult(int index){ if(testResult != null && index < testResult.size()) return (String)(testResult.get(index)); else return null;}
+
+ public int size(){ return testName.size(); }
+ public int sizeSuites(){ return testSuiteName.size(); }
+}
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/GenerateOpenDSTestSpecs.java b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/GenerateOpenDSTestSpecs.java
new file mode 100644
index 0000000..c881405
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/GenerateOpenDSTestSpecs.java
@@ -0,0 +1,225 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+import java.io.*;
+import java.lang.*;
+import java.util.ArrayList;
+
+public class GenerateOpenDSTestSpecs
+{
+ private static String strParentDirName;
+ private static String strOutputDirName;
+ private static String strFileFormat;
+ private static String strTestType;
+ private static File fileList;
+ private ArrayList <Object> arrayParsedData;
+
+ public GenerateOpenDSTestSpecs()
+ {
+ }
+
+ public static void main(String[] args)
+ {
+ // retrieve input
+ if(args.length == 3)
+ {
+ strParentDirName = new String(args[0]);
+ strOutputDirName = new String(args[1]);
+ strFileFormat = new String(args[2]);
+ }
+ else
+ {
+ usage();
+ System.exit(0);
+ }
+
+ // validate input
+ File fileDirName = new File(strParentDirName);
+ if(!fileDirName.isDirectory())
+ {
+ fatalMsg(fileDirName + " is not a directory.");
+ System.exit(0);
+ }
+ else
+ {
+ System.out.println("Using file directory, " + strParentDirName);
+ }
+
+ File outputDirName = new File(strOutputDirName);
+ if(!outputDirName.isDirectory())
+ {
+ fatalMsg(outputDirName + " is not a directory.");
+ System.exit(0);
+ }
+ else
+ {
+ System.out.println("Using output directory, " + strOutputDirName);
+ }
+
+ // java files are assumed to be from the unit-integration tests.
+ // xml files are assumed to be from the functional tests.
+ if((strFileFormat.startsWith("java")) || (strFileFormat.startsWith("xml")))
+ {
+ System.out.println("Using file format " + strFileFormat.toString());
+ if (strFileFormat.startsWith("java"))
+ strTestType = "Int";
+ else if (strFileFormat.startsWith("xml"))
+ strTestType = "Func";
+ }
+ else
+ {
+ fatalMsg(strFileFormat + " is not supported in this version");
+ System.exit(0);
+ }
+ System.out.println("Now running......");
+
+ // create list of files to parse
+ TestFileList listFiles = new TestFileList(strParentDirName);
+ listFiles.createFileArray();
+
+ // clean out the list of files
+ listFiles.purgeFilesWithSubstring("svn");
+ if(strFileFormat.startsWith("java"))
+ {
+ listFiles.keepFilesWithSubstring("java");
+ }
+ else if(strFileFormat.startsWith("xml"))
+ {
+ listFiles.keepFilesWithSubstring("xml");
+ }
+
+ // The ArrayList object, arrayFiles, contains the list of files that must be parsed.
+ ArrayList arrayFiles = listFiles.getFileArray();
+
+ // print out list of files
+ //for(int i=0; i<arrayFiles.size(); i++)
+ //{
+ // File gotFile = (File)(arrayFiles.get(i));
+ // System.out.println("File number " + Integer.toString(i) + " is " + gotFile.toString());
+ //}
+
+ // The ArrayList object, arrayDirs, contains the list of directories where the files will be found.
+ ArrayList arrayDirs = listFiles.getDirArray();
+ listFiles.purgeDirsWithSubstring("svn");
+
+ // print out list of directories
+ //for(int i=0; i<arrayDirs.size(); i++)
+ //{
+ // File gotDir = (File)(arrayDirs.get(i));
+ // System.out.println("Directory number " + Integer.toString(i) + " is " + gotDir.toString());
+ //}
+
+ // Assume each directory will result in an output xml file
+ // There will be one ParseData object for each directory.
+ // Each ParseData object holds the test specs for all tests in that directory.
+ // The ArrayList object, arrayTests, contains all the ParseData objects.
+ ArrayList <Object>arrayTests = new ArrayList<Object>();
+
+ // For each directory, parse out the data from each file within that directory.
+ for(int i=0; i<arrayDirs.size(); i++)
+ {
+ // parse out data from all java files in a directory
+ File gotDir = (File)(arrayDirs.get(i));
+ String parsedDir = parseSuite(gotDir, strParentDirName);
+ ParseData parseData = new ParseData(parsedDir, strFileFormat);
+
+ try
+ {
+ arrayTests.add((ArrayData)(parseData.ParseFile(parsedDir, arrayFiles, strParentDirName)));
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ System.exit(0);
+ }
+
+ }
+
+ // create the output xml files from the ParsedData objects
+ for(int i = 0; i < arrayTests.size(); i++)
+ {
+ ArrayData arrayData = (ArrayData)(arrayTests.get(i));
+ if(arrayData.size() > 0)
+ {
+ if(strFileFormat.startsWith("java"))
+ {
+ WriteXMLFile_int xmlFile = new WriteXMLFile_int(arrayData.getTestSuite(0));
+ try
+ {
+ xmlFile.MakeXMLFile(arrayData, strOutputDirName);
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ else if(strFileFormat.startsWith("xml"))
+ {
+ WriteXMLFile_xml xmlFile = new WriteXMLFile_xml(arrayData.getTestSuite(0));
+ try
+ {
+ xmlFile.MakeXMLFile(arrayData, strOutputDirName);
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ System.out.println("Files successfully written to the output directory.");
+
+ }
+
+ private static void usage()
+ {
+ System.out.println("Version 01202007");
+ System.out.println("This program will parse files that are used for testing and create an xml file that is used for generating test specification html pages.");
+ System.out.println("The program will recursively search for files from the directory that is passed in from the parameter.");
+ System.out.println("This version will only recursively search one or two levels below the \"directory to files\" which is passed in as a parameter.");
+ System.out.println("The file formats that are currently supported are \"java\" and \"xml\".");
+ System.out.println("Usage:");
+ System.out.println(" java GenerateOpenDSTestSpecs [directory to files] [directory for output files] [file format]");
+ }
+
+ private static void fatalMsg(String str)
+ {
+ System.out.println(str);
+ System.out.println("exiting.....");
+ }
+
+ private static String parseSuite(File inDir, String strParentDir)
+ {
+ String tmpStr = new String(inDir.toString());
+ int index = tmpStr.indexOf(strParentDir) + strParentDir.length() + 1;
+ String subStr = tmpStr.substring(index);
+
+ return subStr;
+
+ }
+
+}
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ParseData.java b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ParseData.java
new file mode 100644
index 0000000..1d3c1e3
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/ParseData.java
@@ -0,0 +1,236 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+import java.io.*;
+import java.lang.*;
+import java.util.ArrayList;
+
+public class ParseData
+{
+ private String suite;
+ private String fileFormat;
+ private ArrayData arrayData;
+
+ public ParseData(String inName, String inFileFormat)
+ {
+ suite = inName;
+ fileFormat = inFileFormat;
+ arrayData = new ArrayData();
+ }
+
+ // Parse out data from all the files in the directory.
+ // Place the data into an ArrayData object.
+ // Return the ArrayData object.
+ public ArrayData ParseFile(String fileDir, ArrayList arrayFiles, String strParentDirName) throws IOException
+ {
+ String currTestSuite = strParentDirName + "/" + fileDir;
+
+ for(int j=0; j<arrayFiles.size(); j++)
+ {
+ File currFile = (File)(arrayFiles.get(j));
+ if(currFile.toString().indexOf(currTestSuite) >= 0)
+ {
+ // synthesize the filename for the current file to parse
+ String filename = currTestSuite + "/" + currFile.getName();
+
+ File inputFile = new File(filename);
+
+ // Final check to make sure inputFile is a real file
+ if(inputFile.isFile())
+ {
+ FileInputStream fis = new FileInputStream(inputFile);
+ LineNumberReader fin = new LineNumberReader(new InputStreamReader(fis));
+
+ String tmpStr;
+ while((tmpStr = fin.readLine()) != null)
+ {
+ // First check the line to see if there is any QA test marker, #@, at all.
+ if(tmpStr.indexOf("#@") >= 0)
+ {
+ if(tmpStr.indexOf("#@TestSuiteName") >= 0)
+ {
+ arrayData.setTestSuiteName(StripSubstring(tmpStr, "#@TestSuiteName"));
+ //System.out.println("Test suite name is " + arrayData.getTestSuiteName());
+ }
+ else if(tmpStr.indexOf("#@TestGroupName") >= 0)
+ {
+ arrayData.setGroupName(StripSubstring(tmpStr, "#@TestGroupName"));
+ }
+ else if(tmpStr.indexOf("#@TestGroupPurpose") >= 0)
+ {
+ arrayData.setGroupPurpose(StripSubstring(tmpStr, "#@TestGroupPurpose"));
+ }
+ else if(tmpStr.indexOf("#@TestSubgroupName") >= 0)
+ {
+ arrayData.setSubgroupName(StripSubstring(tmpStr, "#@TestSubgroupName"));
+ }
+ else if(tmpStr.indexOf("#@TestSuitePurpose") >= 0)
+ {
+ arrayData.setTestSuitePurpose(StripSubstring(tmpStr, "#@TestSuitePurpose"));
+ }
+ else if(tmpStr.indexOf("#@TestSuiteID") >= 0)
+ {
+ arrayData.setTestSuiteID(StripSubstring(tmpStr, "#@TestSuiteID"));
+ }
+ else if(tmpStr.indexOf("#@TestSuiteGroup") >= 0)
+ {
+ arrayData.setTestSuiteGroup(StripSubstring(tmpStr, "#@TestSuiteGroup"));
+ }
+ else if(tmpStr.indexOf("#@TestSuitePreamble") >= 0)
+ {
+ arrayData.setTestSuitePreamble(StripSubstring(tmpStr, "#@TestSuitePreamble"));
+ }
+ else if(tmpStr.indexOf("#@TestSuitePostamble") >= 0)
+ {
+ arrayData.setTestSuitePostamble(StripSubstring(tmpStr, "#@TestSuitePostamble"));
+ }
+ else if(tmpStr.indexOf("#@TestName") >= 0)
+ {
+ arrayData.setTestName(StripSubstring(tmpStr, "#@TestName"));
+ arrayData.setTestSuite(fileDir);
+ }
+ else if(tmpStr.indexOf("#@TestMarker") >= 0)
+ {
+ arrayData.setTestMarker(StripSubstring(tmpStr, "#@TestMarker"));
+ }
+ else if(tmpStr.indexOf("#@TestID") >= 0)
+ {
+ arrayData.setTestID(StripSubstring(tmpStr, "#@TestID"));
+ }
+ else if(tmpStr.indexOf("#@TestIssue") >= 0)
+ {
+ arrayData.setTestIssue(StripSubstring(tmpStr, "#@TestIssue"));
+ }
+ else if(tmpStr.indexOf("#@TestGroup") >= 0)
+ {
+ arrayData.setTestGroup(StripSubstring(tmpStr, "#@TestGroup"));
+ }
+ else if(tmpStr.indexOf("#@TestScript") >= 0)
+ {
+ arrayData.setTestScript(StripSubstring(tmpStr, "#@TestScript"));
+ }
+ else if(tmpStr.indexOf("#@TestHTMLLink") >= 0)
+ {
+ arrayData.setTestHTMLLink(StripSubstring(tmpStr, "#@TestHTMLLink"));
+ }
+ else if(tmpStr.indexOf("#@TestPreamble") >= 0)
+ {
+ arrayData.setTestPreamble(StripSubstring(tmpStr, "#@TestPreamble"));
+ }
+ else if(tmpStr.indexOf("#@TestStep") >= 0)
+ {
+ ArrayList <String> strIndividualSteps = new ArrayList<String>();
+ fin.mark(1000);
+
+ while(tmpStr.indexOf("#@TestStep") >= 0)
+ {
+ String strStep = StripSubstring(tmpStr, "#@TestStep");
+ tmpStr = fin.readLine();
+
+ while((tmpStr.indexOf("#@")) < 0)
+ {
+ strStep = strStep + " " + tmpStr.toString();
+ tmpStr = fin.readLine();
+ }
+
+ strIndividualSteps.add(strStep);
+ }
+
+ arrayData.setTestSteps(strIndividualSteps);
+ fin.reset();
+ tmpStr = fin.readLine();
+ while(tmpStr.indexOf("#@") < 0 || tmpStr.indexOf("#@TestStep") >= 0)
+ {
+ fin.mark(100);
+ tmpStr = fin.readLine();
+ }
+ fin.reset();
+ }
+ else if(tmpStr.indexOf("#@TestPostamble") >= 0)
+ {
+ arrayData.setTestPostamble(StripSubstring(tmpStr, "#@TestPostamble"));
+ }
+ else if(tmpStr.indexOf("#@TestPurpose") >= 0)
+ {
+ arrayData.setTestPurpose(StripSubstring(tmpStr, "#@TestPurpose"));
+ }
+ else if(tmpStr.indexOf("#@TestResult") >= 0)
+ {
+ arrayData.setTestResult(StripSubstring(tmpStr, "#@TestResult"));
+
+ if(fileFormat.startsWith("java"))
+ {
+ // parse test purpose from java doc comments
+ fin.mark(1000);
+ String oneMoLine = new String(fin.readLine().trim());
+ while((oneMoLine.indexOf("/**")) < 0)
+ {
+ oneMoLine = new String(fin.readLine().trim());
+ }
+ oneMoLine = new String(fin.readLine().trim());
+
+ String strPurpose = StripSubstring(oneMoLine, "*");
+ oneMoLine = new String(fin.readLine().trim());
+ while((oneMoLine.indexOf("@")) < 0)
+ {
+ strPurpose += " ";
+ strPurpose += StripSubstring(oneMoLine.toString().trim(), "*");
+ oneMoLine = new String(fin.readLine().trim());
+ }
+ fin.reset();
+ int starIndex = strPurpose.lastIndexOf("*");
+ if(starIndex > 0)
+ {
+ String strPurpose2 = new String(strPurpose.substring(0, starIndex));
+ arrayData.setTestPurpose(strPurpose2.toString());
+ }
+ else
+ {
+ arrayData.setTestPurpose(strPurpose.toString());
+ }
+ }
+
+ }
+ }
+
+ }
+ fin.close();
+ }
+ }
+
+ }
+
+ return arrayData;
+ }
+
+ private String StripSubstring(String tmpStr, String subStr)
+ {
+ int index = tmpStr.indexOf(subStr);
+ String retStr = tmpStr.substring(index + subStr.length());
+ return (retStr.trim());
+ }
+
+}
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/README b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/README
new file mode 100644
index 0000000..f87cae7
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/README
@@ -0,0 +1,194 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+The purpose of the parsing tool is to parse comments from the functional test xml files.
+The comments must have preset tags in order for the them to be properly captured by the
+parsing tool. This README files will describe what is needed in the comments of
+the functional test xml files, and how to build and run the parsing tool.
+
+***Function Test XML Files - Test Group Tags***
+
+Each directory will be assumed to contain the tests within a test group.
+Each test group needs to have the following tags.......
+
+#@TestGroupName
+#@TestGroupPurpose
+#@TestSubgroupName [only necessary for some test groups, like Security]
+
+It is not critical in which xml file or where in the xml file these tags are located,
+as long as the xml file is in the proper directory for the test group. For convenience,
+the tags for the test group should be near the top of the xml file which is used
+for setting up for the test group test cases.
+
+The following is an example for the test group, functional-tests/testcases/security/pwd_storage,
+and is located in file, security_setup_pwd_storage.xml
+
+ <!---
+ Place group-specific test information here.
+ #@TestGroupName Security
+ #@TestGroupPurpose To test the security functionality.
+ #@TestSubgroupName Password Storage Schemes
+ -->
+
+Some test groups will not have the tag, #@TestSubgroupName.
+
+For instance, the test group tags for the Backend group are
+
+ <!--
+ Place group-specific test information here.
+ #@TestGroupName Backends
+ #@TestGroupPurpose To test the backend functionality.
+ -->
+
+***Function Test XML Files - Test Suite Tags***
+
+Each xml file will be treated as a test suite. Each file should contain the following tags......
+
+#@TestSuiteName
+#@TestSuitePurpose
+#@TestSuiteGroup
+#@TestScript
+
+The tags should be located near the top of each file. The exact location is not critical.
+
+The following example is from the test suite, MD5 Tests, which is located in
+functional-tests/testcases/security/pwd_storage/security_pwd_MD5.xml.
+
+ <!---
+ Place suite-specific test information here.
+ #@TestSuiteName MD5 Tests
+ #@TestSuitePurpose Test the MD5 storage scheme.
+ #@TestSuiteGroup MD5 Storage Scheme Tests
+ #@TestScript security_pwd_MD5.xml
+ -->
+
+***Function Test XML Files - Test Case Tags***
+
+Each functional test xml file will have multiple test cases.
+Each test case should have the following tags........
+
+#@TestMarker
+#@TestName
+#@TestIssue
+#@TestPurpose
+#@TestPreamble
+#@TestStep
+#@TestPostamble
+#@TestResult
+
+The tags should be located near the beginning of each test case.
+
+The #@TestMarker should match the value of #@TestSuiteName. The parsing tool needs this
+correlation to match each test case with the proper test suite.
+
+The #@TestIssue should be the number in IssueTracker that corresponds to the feature or defect
+which this test case is testing. Do not add the hyperlink to the issue web page.
+The parsing tool adds the hyperlink when it runs.
+
+As many #@TestStep tags may used to define the steps that are involved in each test case.
+There should be one #@TestStep tag for each step. There is no limit to the number of test
+steps which may be defined. Each test step may have multiple lines.
+
+The #@TestResult may have multiple lines.
+
+The following example is from the file,
+functional-tests/testcases/security/pwd_storage/security_pwd_MD5.xml
+
+ <!---
+ Place test-specific test information here.
+ The tag, TestMarker, must be the same as the tag, TestSuiteName.
+ #@TestMarker MD5 Tests
+ #@TestName MD5 Preamble
+ #@TestIssue 312
+ #@TestPurpose Change password storage scheme to MD5.
+ #@TestPreamble none
+ #@TestStep Client calls ldapmodify
+ with the filename to the appropriate file.
+ #@TestPostamble none
+ #@TestResult Success if OpenDS returns 0
+ -->
+
+The following is another example from the file,
+functional-tests/testcases/security/pwd_storage/security_pwd_MD5.xml
+Note that this example contains three test steps.
+
+ <!---
+ Place test-specific test information here.
+ The tag, TestMarker, must be the same as the tag, TestSuiteName.
+ #@TestMarker MD5 Tests
+ #@TestName MD5 Test 1
+ #@TestIssue 312
+ #@TestPurpose Test MD5 password storage scheme.
+ #@TestPreamble none
+ #@TestStep Admin changes a user's password to convert
+ so it is stored as MD5 scheme.
+ #@TestStep The user binds with the new password.
+ #@TestStep Admin retrieves the user's password and
+ checks for the required {MD5} prefix.
+ #@TestPostamble none
+ #@TestResult Success if OpenDS returns 0 for the ldap
+ operations and the password has the {MD5} prefix.
+ -->
+
+***Building the Parser Tool***
+
+No other packages are necessary for building the java files other than those
+that come with the jvm. Java version 1.5.0 was used to build the java files.
+
+Command line build while in the directory containing the java files.....
+javac *.java
+
+***Running the Parser Tool***
+
+Three parameters are required to run the parsing tool from the command line, directory-to-testcase-files,
+directory-for-output-files, and file format.
+
+Command line execution.....
+java -cp [path-to-class-files] GenerateOpenDSTestSpecs [directory-to-testcase-files] [directory-for-output-files] [file format]
+
+The directory-to-testcase-files is the directory from where the parsing tool will begin searching
+for functional test files to parse. The parsing tool will only search one or two levels below
+the value for this parameter.
+
+The directory-for-output-files is where the parsing tool will place the output xml files.
+
+The file format is necessary because the same code is used for the unit-integration tests where
+java files are parsed for test specifications rather than xml files. The file format must be
+"xml" for the functional tests.
+
+An example command line execution of the parsing tool would be
+java -cp /export/ParseTestCode GenerateOpenDSTestSpecs /export/src/opends/tests/functional-tests/testcases /export/testspecs xml
+
+where
+the class files for the parsing tool are in /export/ParseTestCode
+the directory-to-testcase-files is /export/src/opends/tests/functional-tests/testcases
+the directory-for-output-files is /export/testspecs
+the file format is xml.
+
+
+
+
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/TestFileList.java b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/TestFileList.java
new file mode 100644
index 0000000..a3162cb
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/TestFileList.java
@@ -0,0 +1,154 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+import java.io.*;
+import java.lang.*;
+import java.util.ArrayList;
+
+public class TestFileList
+{
+ private File fileParentDirName;
+ private ArrayList <Object> arrayFiles;
+ private ArrayList <Object> arrayDirs;
+
+ public TestFileList(String inParentDir)
+ {
+ fileParentDirName = new File(inParentDir);
+ }
+
+ public ArrayList createFileArray()
+ {
+ // Retrieve list of files to parse
+ File fileAndDirList[] = fileParentDirName.listFiles();
+
+ // create an array object that can be increased and decreased in size
+ arrayFiles = new ArrayList<Object>(fileAndDirList.length);
+ for(int i=0; i<fileAndDirList.length; i++)
+ {
+ arrayFiles.add((File)(fileAndDirList[i]));
+ }
+
+ // find the files in subdirectories
+ arrayDirs = new ArrayList<Object>();
+ int intStartNumElements = arrayFiles.size();
+ for(int i=0; i<intStartNumElements; i++)
+ {
+ File fileChildDirName = (File)(arrayFiles.get(i));
+ if(fileChildDirName.isDirectory())
+ {
+ arrayDirs.add((File)(fileChildDirName));
+ File fileTmpList[] = fileChildDirName.listFiles();
+ for(int j=0; j<fileTmpList.length; j++)
+ {
+ if(fileTmpList[j].isFile())
+ {
+ arrayFiles.add((File)(fileTmpList[j]));
+ }
+ else if(fileTmpList[j].isDirectory())
+ {
+ arrayDirs.add((File)(fileTmpList[j]));
+ File fileTmpList2[] = fileTmpList[j].listFiles();
+ for(int j2=0; j2<fileTmpList2.length; j2++)
+ {
+ if(fileTmpList2[j2].isFile())
+ {
+ arrayFiles.add((File)(fileTmpList2[j2]));
+ }
+ }
+
+ }
+ //System.out.println("Found " + fileTmpList[j].toString());
+ }
+ }
+
+ }
+
+ // clean out file array
+ for(int i=arrayFiles.size()-1; i>=0; i--)
+ {
+ File fileTmp = (File)(arrayFiles.get(i));
+ if(fileTmp.isDirectory())
+ arrayFiles.remove(i);
+ }
+
+ return arrayFiles;
+ }
+
+ public void purgeFilesWithSubstring(String subStr)
+ {
+ for(int i=arrayFiles.size()-1; i>=0; i--)
+ {
+ File fileTmp = (File)(arrayFiles.get(i));
+ if(fileTmp.toString().indexOf(subStr) >= 0)
+ arrayFiles.remove(i);
+ }
+
+ }
+
+ public void keepFilesWithSubstring(String subStr)
+ {
+ for(int i=arrayFiles.size()-1; i>=0; i--)
+ {
+ File fileTmp = (File)(arrayFiles.get(i));
+ if(fileTmp.toString().indexOf(subStr) < 0)
+ arrayFiles.remove(i);
+ }
+
+ }
+
+ public void purgeDirsWithSubstring(String subStr)
+ {
+ for(int i=arrayDirs.size()-1; i>=0; i--)
+ {
+ File fileTmp = (File)(arrayDirs.get(i));
+ if(fileTmp.toString().indexOf(subStr) >= 0)
+ arrayDirs.remove(i);
+ }
+
+ }
+
+ public void keepDirsWithSubstring(String subStr)
+ {
+ for(int i=arrayDirs.size()-1; i>=0; i--)
+ {
+ File fileTmp = (File)(arrayDirs.get(i));
+ if(fileTmp.toString().indexOf(subStr) < 0)
+ arrayDirs.remove(i);
+ }
+
+ }
+
+ public ArrayList getFileArray()
+ {
+ return arrayFiles;
+ }
+
+ public ArrayList getDirArray()
+ {
+ return arrayDirs;
+ }
+
+}
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_int.java b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_int.java
new file mode 100644
index 0000000..dc24e99
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_int.java
@@ -0,0 +1,150 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+import java.io.*;
+import java.lang.*;
+import java.util.ArrayList;
+
+public class WriteXMLFile_int
+{
+ private String group;
+ private ArrayData arrayData;
+
+ public WriteXMLFile_int(String inGroup)
+ {
+ group = inGroup;
+ }
+
+ public void MakeXMLFile(ArrayData arrayData, String strDir) throws IOException
+ {
+ //System.out.println("For " + group + " the number of suites is " + Integer.toString(arrayData.sizeSuites()));
+ //System.out.println("The number of tests is " + Integer.toString(arrayData.size()));
+
+ String strDirName = strDir + "/" + group;
+ File fileDirName = new File(strDirName);
+ if(!fileDirName.isDirectory())
+ {
+ if(!fileDirName.mkdirs())
+ {
+ System.out.println("Could not create directory, " + strDirName);
+ System.out.println("Exiting.....");
+ System.exit(0);
+ }
+ }
+
+ String strFilename = strDirName + "/" + group + ".xml";
+ File fileOutput = new File(strFilename);
+ FileWriter fwOutput = new FileWriter(fileOutput);
+
+ fwOutput.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
+ fwOutput.write("<?xml-stylesheet type=\"text/xsl\" href=\"" + group + ".xsl\"?>\n");
+ fwOutput.write("<qa xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"no-schema-yet.xsd\">\n\n");
+
+ fwOutput.write(" <!-- A section describing each product under test -->\n");
+ fwOutput.write(" <product name=\"OpenDS\">\n\n");
+
+ fwOutput.write(" <!-- A section describing each testgroup-->\n");
+ fwOutput.write(" <testgroup name=\"Integration\">\n");
+ fwOutput.write(" <category name=\"" + group + "\"/>\n");
+ fwOutput.write(" <groupid>" + group + "</groupid>\n");
+ fwOutput.write(" <purpose></purpose>\n");
+ fwOutput.write(" <version></version>\n");
+ fwOutput.write(" <url>http://samsonite.central.sun.com/" + group + "</url>\n\n");
+
+ fwOutput.write(" <!-- A section describing each testsuite-->\n");
+ for(int i = 0; i < arrayData.sizeSuites(); i++)
+ {
+ String currTestSuite = new String(arrayData.getTestSuiteName(i));
+ //System.out.println("currTestSuite is " + currTestSuite.toString());
+ String currTestGroup = arrayData.getTestGroup(i);
+ String currTestScript = arrayData.getTestScript(i);
+ String currTestHTMLLink = "";
+ //String currTestHTMLLink = arrayData.getTestHTMLLink(i);
+ fwOutput.write(" <testsuite name=\"" + currTestSuite + "\">\n");
+ fwOutput.write(" <purpose>" + arrayData.getTestSuitePurpose(i) + "</purpose>\n");
+ fwOutput.write(" <suiteid>" + arrayData.getTestSuiteID(i) + "</suiteid>\n");
+ fwOutput.write(" <group>" + arrayData.getTestSuiteGroup(i) + "</group>\n\n");
+
+ fwOutput.write(" <!-- A section describing each testcase-->\n");
+ //System.out.println("arrayData size is " + Integer.toString(arrayData.size()));
+ for(int j = 0; j < arrayData.size(); j++)
+ {
+ //System.out.println("Test Marker is\n" + arrayData.getTestMarker(j));
+ //System.out.println("currTestSuite is\n" + currTestSuite);
+ //System.out.println(" ");
+ if(currTestSuite.indexOf(arrayData.getTestMarker(j)) >= 0)
+ {
+ fwOutput.write(" <testcase name=\"" + arrayData.getTestName(j) + "\">\n");
+ fwOutput.write(" <testid>" + arrayData.getTestID(j) + "</testid>\n");
+ //fwOutput.write(" <testissue>" + arrayData.getTestIssue(j) + "</testissue>\n");
+ fwOutput.write(" <group>" + currTestGroup + "</group>\n");
+ fwOutput.write(" <suite>" + currTestSuite.toString() + "</suite>\n");
+ fwOutput.write(" <purpose>" + arrayData.getTestPurpose(j) + "</purpose>\n");
+ fwOutput.write(" <testscript>\n");
+ fwOutput.write(" <a href=\"" + currTestHTMLLink + "\">" + currTestScript + "</a>\n");
+ fwOutput.write(" </testscript>\n");
+ fwOutput.write(" <steps>\n");
+ fwOutput.write(" <step>\n");
+ fwOutput.write(" " + arrayData.getTestSteps(j) + "\n");
+ fwOutput.write(" </step>\n");
+ fwOutput.write(" </steps>\n");
+ String tmpString = new String(arrayData.getTestPreamble(j));
+ if(tmpString.length() == 0)
+ {
+ fwOutput.write(" <preamble>None</preamble>\n");
+ }
+ else
+ {
+ fwOutput.write(" <preamble>" + tmpString + "</preamble>\n");
+ }
+ tmpString = new String(arrayData.getTestPostamble(j));
+ if(tmpString.length() == 0)
+ {
+ fwOutput.write(" <postamble>None</postamble>\n");
+ }
+ else
+ {
+ fwOutput.write(" <postamble>" + tmpString + "</postamble>\n");
+ }
+ fwOutput.write(" <postamble>" + arrayData.getTestPostamble(j) + "</postamble>\n");
+ fwOutput.write(" <result>\n");
+ fwOutput.write(" " + arrayData.getTestResult(j) + "\n");
+ fwOutput.write(" </result>\n");
+ fwOutput.write(" </testcase>\n\n");
+ }
+ }
+ fwOutput.write(" </testsuite>\n\n");
+ }
+
+ fwOutput.write(" </testgroup>\n");
+ fwOutput.write(" </product>\n");
+ fwOutput.write("</qa>\n");
+
+ fwOutput.close();
+
+ }
+
+}
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_xml.java b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_xml.java
new file mode 100644
index 0000000..d176bf9
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/java/parsingtool/WriteXMLFile_xml.java
@@ -0,0 +1,166 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+import java.io.*;
+import java.lang.*;
+import java.util.ArrayList;
+
+public class WriteXMLFile_xml
+{
+ private String group;
+ private ArrayData arrayData;
+ private ArrayList <String> strIndividualSteps;
+
+ public WriteXMLFile_xml(String inGroup)
+ {
+ group = inGroup;
+ strIndividualSteps = null;
+ }
+
+ public void MakeXMLFile(ArrayData arrayData, String strDir) throws IOException
+ {
+ String strDirName = strDir + "/" + group;
+ File fileDirName = new File(strDirName);
+ if(!fileDirName.isDirectory())
+ {
+ if(!fileDirName.mkdirs())
+ {
+ System.out.println("Could not create directory, " + strDirName);
+ System.out.println("Exiting.....");
+ System.exit(0);
+ }
+ }
+
+ String strFilename;
+ if(group.indexOf("/") < 0)
+ {
+ strFilename = strDirName + "/" + group + ".xml";
+ }
+ else
+ {
+ String tmpStr = new String(group);
+ int index = tmpStr.indexOf("/") + 1;
+ String subStr = tmpStr.substring(index);
+ strFilename = strDirName + "/" + subStr + ".xml";
+ }
+
+ File fileOutput = new File(strFilename);
+ FileWriter fwOutput = new FileWriter(fileOutput);
+
+ fwOutput.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
+ fwOutput.write("<?xml-stylesheet type=\"text/xsl\" href=\"" + group + ".xsl\"?>\n");
+ fwOutput.write("<qa xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"no-schema-yet.xsd\">\n\n");
+
+ fwOutput.write(" <!-- A section describing each product under test -->\n");
+ fwOutput.write(" <product name=\"OpenDS\">\n\n");
+
+ fwOutput.write(" <!-- A section describing each testgroup-->\n");
+ fwOutput.write(" <testgroup name=\"Functional\">\n");
+
+ fwOutput.write(" <groupname>" + arrayData.getGroupName(0) + "</groupname>\n");
+ fwOutput.write(" <grouppurpose>" + arrayData.getGroupPurpose(0) + "</grouppurpose>\n");
+ fwOutput.write(" <subgroupname>" + arrayData.getSubgroupName(0) + "</subgroupname>\n");
+ fwOutput.write(" <category name=\"" + group + "\"/>\n");
+ fwOutput.write(" <groupid>" + group + "</groupid>\n");
+ fwOutput.write(" <purpose></purpose>\n");
+ fwOutput.write(" <version></version>\n");
+ fwOutput.write(" <url>https://opends.dev.java.net</url>\n\n");
+
+ fwOutput.write(" <!-- A section describing each testsuite-->\n");
+ for(int i = 0; i < arrayData.sizeSuites(); i++)
+ {
+ String currTestSuite = new String(arrayData.getTestSuiteName(i));
+ String currTestGroup = arrayData.getTestGroup(i);
+ String currTestScript = arrayData.getTestScript(i);
+ String currTestHTMLLink = "";
+ fwOutput.write(" <testsuite name=\"" + currTestSuite + "\">\n");
+ fwOutput.write(" <purpose>" + arrayData.getTestSuitePurpose(i) + "</purpose>\n");
+ fwOutput.write(" <suiteid>" + arrayData.getTestSuiteID(i) + "</suiteid>\n");
+ fwOutput.write(" <group>" + arrayData.getTestSuiteGroup(i) + "</group>\n");
+
+ fwOutput.write(" <!-- A section describing each testcase-->\n");
+
+ for(int j = 0; j < arrayData.size(); j++)
+ {
+ if(currTestSuite.indexOf(arrayData.getTestMarker(j)) == 0)
+ {
+ fwOutput.write(" <testcase name=\"" + arrayData.getTestName(j) + "\">\n");
+ fwOutput.write(" <testid>" + arrayData.getTestID(j) + "</testid>\n");
+ fwOutput.write(" <testissue>" + arrayData.getTestIssue(j) + "</testissue>\n");
+ fwOutput.write(" <group>" + currTestGroup + "</group>\n");
+ fwOutput.write(" <suite>" + currTestSuite.toString() + "</suite>\n");
+ fwOutput.write(" <purpose>" + arrayData.getTestPurpose(j) + "</purpose>\n");
+ fwOutput.write(" <testscript>" + currTestScript + "</testscript>\n");
+ fwOutput.write(" <steps>\n");
+ strIndividualSteps = arrayData.getTestSteps(j);
+
+ for(int j2=0; j2<strIndividualSteps.size(); j2++)
+ {
+ fwOutput.write(" <step>\n");
+ if(strIndividualSteps.size() > 1)
+ fwOutput.write( Integer.toString(j2+1) + ". " + strIndividualSteps.get(j2) + "\n");
+ else
+ fwOutput.write( strIndividualSteps.get(j2) + "\n");
+ fwOutput.write(" </step>\n");
+ }
+ fwOutput.write(" </steps>\n");
+ String tmpString = new String(arrayData.getTestPreamble(j));
+ if(tmpString.length() == 0)
+ {
+ fwOutput.write(" <preamble>None</preamble>\n");
+ }
+ else
+ {
+ fwOutput.write(" <preamble>" + tmpString + "</preamble>\n");
+ }
+ tmpString = new String(arrayData.getTestPostamble(j));
+ if(tmpString == null || tmpString.length() == 0)
+ {
+ fwOutput.write(" <postamble>None</postamble>\n");
+ }
+ else
+ {
+ fwOutput.write(" <postamble>" + tmpString + "</postamble>\n");
+ }
+ fwOutput.write(" <postamble>" + arrayData.getTestPostamble(j) + "</postamble>\n");
+ fwOutput.write(" <result>\n");
+ fwOutput.write(" " + arrayData.getTestResult(j) + "\n");
+ fwOutput.write(" </result>\n");
+ fwOutput.write(" </testcase>\n\n");
+ }
+ }
+ fwOutput.write(" </testsuite>\n\n");
+ }
+
+ fwOutput.write(" </testgroup>\n");
+ fwOutput.write(" </product>\n");
+ fwOutput.write("</qa>\n");
+
+ fwOutput.close();
+
+ }
+
+}
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet.xml b/opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet.xml
new file mode 100644
index 0000000..d337fbd
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet.xml
@@ -0,0 +1,293 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+
+<xsl:template match="/">
+
+ <xsl:element name="html">
+
+ <xsl:element name="body">
+
+ <xsl:variable name="spec" select="/group/@name"/>
+
+ <xsl:variable name="testgroup" select="document(concat('../docs/tests/specs/',$spec,'/',$spec,'.xml'))/qa/product/testgroup"/>
+
+ <xsl:for-each select="$testgroup">
+
+ <xsl:element name="title">
+ <xsl:value-of select="@name"/>
+ <xsl:value-of select="' Test Specification'"/>
+ </xsl:element>
+
+ <xsl:element name="h2">
+ <xsl:attribute name="align">center</xsl:attribute>
+ <xsl:value-of select="@name"/>
+ <xsl:value-of select="' Test Specification'"/>
+ </xsl:element>
+
+ <!-- Test Group Table -->
+ <xsl:element name="table">
+
+ <xsl:attribute name="border">1</xsl:attribute>
+ <xsl:attribute name="width">80%</xsl:attribute>
+
+ <xsl:element name="tr">
+ <xsl:attribute name="bgcolor">yellow</xsl:attribute>
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Group'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="groupname"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Purpose'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="grouppurpose"/>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+
+
+ <xsl:element name="br"/>
+
+ <!-- Test Suite List -->
+ <xsl:element name="ol">
+ <xsl:for-each select="testsuite">
+ <xsl:element name="li">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('#',@name)"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+ <xsl:value-of select="concat(' : ',purpose)"/>
+ </xsl:element>
+ </xsl:for-each>
+ </xsl:element>
+
+ <xsl:for-each select="testsuite">
+
+ <!-- Test Suite Header -->
+ <xsl:element name="h2">
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+
+ <!-- Test Suite Anchor -->
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@name"/>
+ </xsl:attribute>
+ </xsl:element>
+
+ <!-- Test Suite Table -->
+ <xsl:element name="table">
+
+ <xsl:attribute name="border">1</xsl:attribute>
+ <xsl:attribute name="width">80%</xsl:attribute>
+
+ <xsl:element name="tr">
+ <xsl:attribute name="bgcolor">aqua</xsl:attribute>
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Suite Name'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Purpose'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="purpose"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Suite Group'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="group"/>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+
+ <xsl:element name="br"/>
+
+ <xsl:for-each select="testcase">
+
+ <!-- Test Case Table -->
+ <xsl:element name="table">
+ <xsl:attribute name="border">1</xsl:attribute>
+ <xsl:attribute name="width">80%</xsl:attribute>
+
+ <!-- Test Name -->
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="testid"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:element name="tr">
+ <xsl:attribute name="bgcolor">lightblue</xsl:attribute>
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="a">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Name'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Purpose -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Purpose'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="purpose"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Script -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Script'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('https://opends.dev.java.net/source/browse/opends/trunk/opends/tests/functional-tests/testcases/',$spec,'/',testscript)"/>
+ </xsl:attribute>
+ <xsl:value-of select="testscript"/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Issue -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Issue'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('https://opends.dev.java.net/issues/show_bug.cgi?id=',testissue)"/>
+ </xsl:attribute>
+ <xsl:value-of select="testissue"/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Preamble -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Preamble'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="preamble"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Steps -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Steps'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:for-each select="steps/step">
+ <xsl:value-of select="."/>
+ <xsl:element name="br"/>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Postamble -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Postamble'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="postamble"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Result -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Result'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="result"/>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+
+ <xsl:element name="br"/>
+
+ </xsl:for-each>
+
+ </xsl:for-each>
+
+ </xsl:for-each>
+
+
+ </xsl:element>
+
+ </xsl:element>
+
+
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet_security.xml b/opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet_security.xml
new file mode 100644
index 0000000..10dbaa6
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/xsl/functestspec-stylesheet_security.xml
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+
+<xsl:template match="/">
+
+ <xsl:element name="html">
+
+ <xsl:element name="body">
+
+ <xsl:variable name="spec" select="/group/@name"/>
+
+ <xsl:variable name="testgroup" select="document(concat('../docs/tests/specs/security/',$spec,'/',$spec,'.xml'))/qa/product/testgroup"/>
+
+ <xsl:for-each select="$testgroup">
+
+ <xsl:element name="title">
+ <xsl:value-of select="@name"/>
+ <xsl:value-of select="' Test Specification'"/>
+ </xsl:element>
+
+ <xsl:element name="h2">
+ <xsl:attribute name="align">center</xsl:attribute>
+ <xsl:value-of select="@name"/>
+ <xsl:value-of select="' Test Specification'"/>
+ </xsl:element>
+
+ <!-- Test Group Table -->
+ <xsl:element name="table">
+
+ <xsl:attribute name="border">1</xsl:attribute>
+ <xsl:attribute name="width">80%</xsl:attribute>
+
+ <xsl:element name="tr">
+ <xsl:attribute name="bgcolor">yellow</xsl:attribute>
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Group'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="groupname"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Group Purpose'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="grouppurpose"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Subgroup'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="subgroupname"/>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+
+ <xsl:element name="br"/>
+
+ <!-- Test Suite List -->
+ <xsl:element name="ol">
+ <xsl:for-each select="testsuite">
+ <xsl:element name="li">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('#',@name)"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+ <xsl:value-of select="concat(' : ',purpose)"/>
+ </xsl:element>
+ </xsl:for-each>
+ </xsl:element>
+
+ <xsl:for-each select="testsuite">
+
+ <!-- Test Suite Header -->
+ <xsl:element name="h2">
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+
+ <!-- Test Suite Anchor -->
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@name"/>
+ </xsl:attribute>
+ </xsl:element>
+
+ <!-- Test Suite Table -->
+ <xsl:element name="table">
+
+ <xsl:attribute name="border">1</xsl:attribute>
+ <xsl:attribute name="width">80%</xsl:attribute>
+
+ <xsl:element name="tr">
+ <xsl:attribute name="bgcolor">aqua</xsl:attribute>
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Suite Name'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Purpose'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="purpose"/>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Suite Group'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="group"/>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+
+ <xsl:element name="br"/>
+
+ <xsl:for-each select="testcase">
+
+ <!-- Test Case Table -->
+ <xsl:element name="table">
+ <xsl:attribute name="border">1</xsl:attribute>
+ <xsl:attribute name="width">80%</xsl:attribute>
+
+ <!-- Test Name -->
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="testid"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:element name="tr">
+ <xsl:attribute name="bgcolor">lightblue</xsl:attribute>
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="a">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Name'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="@name"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Purpose -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Purpose'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="purpose"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Script -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Script'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('https://opends.dev.java.net/source/browse/opends/trunk/opends/tests/functional-tests/testcases/security/',$spec,'/',testscript)"/>
+ </xsl:attribute>
+ <xsl:value-of select="testscript"/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Issue -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Issue'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="concat('https://opends.dev.java.net/issues/show_bug.cgi?id=',testissue)"/>
+ </xsl:attribute>
+ <xsl:value-of select="testissue"/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Preamble -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Preamble'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="preamble"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Steps -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Steps'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:for-each select="steps/step">
+ <xsl:value-of select="."/>
+ <xsl:element name="br"/>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Postamble -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Postamble'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="postamble"/>
+ </xsl:element>
+ </xsl:element>
+
+ <!-- Test Result -->
+ <xsl:element name="tr">
+ <xsl:element name="td">
+ <xsl:attribute name="width">20%</xsl:attribute>
+ <xsl:element name="b">
+ <xsl:value-of select="'Test Result'"/>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:value-of select="result"/>
+ </xsl:element>
+ </xsl:element>
+
+ </xsl:element>
+
+ <xsl:element name="br"/>
+
+ </xsl:for-each>
+
+ </xsl:for-each>
+
+ </xsl:for-each>
+
+
+ </xsl:element>
+
+ </xsl:element>
+
+
+</xsl:template>
+
+
+</xsl:stylesheet>
--
Gitblit v1.10.0