Author: tomdz
Date: Sun Oct 15 18:15:26 2006
New Revision: 464353

URL: http://svn.apache.org/viewvc?view=rev&rev=464353
Log:
Fixed tests and junit ant target
Added first version of the test summary task

Added:
    db/ddlutils/trunk/src/test/org/apache/ddlutils/TestSummaryCreatorTask.java
Modified:
    db/ddlutils/trunk/build.xml
    db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDatatypes.java

Modified: db/ddlutils/trunk/build.xml
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/build.xml?view=diff&rev=464353&r1=464352&r2=464353
==============================================================================
--- db/ddlutils/trunk/build.xml (original)
+++ db/ddlutils/trunk/build.xml Sun Oct 15 18:15:26 2006
@@ -211,9 +211,9 @@
   <!-- Runs the test cases                                                -->
   <!-- ================================================================== -->
   <target name="junit"
-          description="Runs the test cases against the default database 
(Hsqldb)">
-    <antcall target="junit-hsqldb"/>
-       </target>
+          description="Runs the test cases against no database or the one 
specified via -Djdbc.properties.file">
+    <antcall target="-junit-internal"/>
+  </target>
 
   <!-- ================================================================== -->
   <!-- Runs the test cases against HsqlDb                                 -->
@@ -241,7 +241,7 @@
   </target>
 
   <!-- ================================================================== -->
-  <!-- Runs the test cases against AxionDB                                -->
+  <!-- Runs the test cases against MySQL                                -->
   <!-- ================================================================== -->
   <target name="junit-mysql"
           description="Runs the test cases against mysql">
@@ -277,8 +277,9 @@
       <classpath refid="compilation-classpath"/>
       <batchtest todir="${build.test.dir}">
           <fileset dir="${src.test.dir}" includes="**/Test*.java">
-           <exclude name="**/TestDatabaseWriterBase.java"/>
-               <exclude name="**/TestPlatformBase.java"/>
+           <exclude name="**/Test*Base.java"/>
+               <exclude name="**/TestPlatform.java"/>
+               <exclude name="**/TestSummaryCreatorTask.java"/>
           </fileset>
       </batchtest>
     </junit>
@@ -296,6 +297,23 @@
       <report format="frames"
               todir="${build.test.dir}"/>
     </junitreport>
+  </target>
+
+  <!-- ================================================================== -->
+  <!-- Creates the test summary                                           -->
+  <!-- ================================================================== -->
+  <target name="junit-summary"
+             depends="compile-tests"
+          description="Creates a test summary">
+    <taskdef name="testSummary"
+             classname="org.apache.ddlutils.TestSummaryCreatorTask"
+             classpathref="compilation-classpath"/>
+    <testSummary>
+      <fileset dir="${build.test.dir}"
+              casesensitive="false">
+          <include name="test*.xml"/>
+      </fileset>
+    </testSummary>
   </target>
 
   <!-- ================================================================== -->

Added: 
db/ddlutils/trunk/src/test/org/apache/ddlutils/TestSummaryCreatorTask.java
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/TestSummaryCreatorTask.java?view=auto&rev=464353
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/TestSummaryCreatorTask.java 
(added)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/TestSummaryCreatorTask.java 
Sun Oct 15 18:15:26 2006
@@ -0,0 +1,415 @@
+package org.apache.ddlutils;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+import org.xml.sax.InputSource;
+
+/**
+ * Creates a test summary snippet that can be put onto the DdlUtils web site.
+ * 
+ * @version $Revision: $
+ */
+public class TestSummaryCreatorTask extends Task
+{
+    /** The file to write the snippet to. */
+    private File _outputFile = null;
+    /** The input files. */
+    private ArrayList _fileSets = new ArrayList();
+
+    /**
+     * Set the output file.
+     *
+     * @param outputFile The output file
+     */
+    public void setOutputFile(File outputFile)
+    {
+        _outputFile = outputFile;
+    }
+
+    /**
+     * Adds a fileset.
+     * 
+     * @param fileset The additional input files
+     */
+    public void addConfiguredFileset(FileSet fileset)
+    {
+        _fileSets.add(fileset);
+    }
+
+    /**
+     * Returns the list of input files ([EMAIL PROTECTED] java.io.File} 
objects) to process.
+     * Note that this does not check that the file is a valid and useful XML 
file.
+     * 
+     * @return The input files
+     */
+    private List getInputFiles()
+    {
+       ArrayList result = new ArrayList();
+
+        for (Iterator it = _fileSets.iterator(); it.hasNext();)
+        {
+            FileSet          fileSet    = (FileSet)it.next();
+            File             fileSetDir = fileSet.getDir(getProject());
+            DirectoryScanner scanner    = 
fileSet.getDirectoryScanner(getProject());
+            String[]         files      = scanner.getIncludedFiles();
+
+            for (int idx = 0; (files != null) && (idx < files.length); idx++)
+            {
+               File file = new File(fileSetDir, files[idx]);
+
+                if (file.isFile() && file.canRead())
+                {
+                       result.add(file);
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Processes all input files and gathers the relevant data.
+     * 
+     * @return The Dom4j document object containing the summary
+     */
+    private Document processInputFiles() throws IOException
+    {
+       Document summaryDoc = DocumentHelper.createDocument();
+
+       summaryDoc.addElement("summary");
+
+       for (Iterator it = getInputFiles().iterator(); it.hasNext();)
+       {
+               processInputFile(summaryDoc, (File)it.next());
+       }
+       return summaryDoc;
+    }
+
+    /**
+     * Returns the value of the specified attribute of the node determined by 
the given xpath.
+     * 
+     * @param doc      The XML document
+     * @param xpath    The xpath selecting the node whose attribute we want
+     * @param attrName The name of the attribute
+     * @return The attribute value
+     */
+    private String getAttrValue(Document doc, String xpath, String attrName)
+    {
+       Node node = doc.selectSingleNode(xpath);
+
+       if (node instanceof Attribute)
+       {
+               // we ignore the attribute name then
+               return ((Attribute)node).getValue();
+       }
+       else
+       {
+               return node.valueOf("@" + attrName);
+       }
+    }
+    
+    /**
+     * Processes the given input file.
+     * 
+     * @param summaryDoc The document object to add data to
+     * @param inputFile  The input file
+     */
+    private void processInputFile(Document summaryDoc, File inputFile) throws 
IOException
+    {
+       try
+       {
+               // First we check whether it is an XML file
+               SAXReader reader  = new SAXReader();
+            Document  testDoc = reader.read(new InputSource(new 
FileReader(inputFile)));
+
+               // Then we check whether it is one that we're interested in
+            if (testDoc.selectSingleNode("/testsuite") == null)
+            {
+               return;
+            }
+
+            // Ok, it is, so lets extract the data that we want:
+            Element generalElement   = 
(Element)summaryDoc.selectSingleNode("//general");
+            int     totalNumTests    = 0;
+            int     totalNumErrors   = 0;
+            int     totalNumFailures = 0;
+
+            if (generalElement == null)
+            {
+               generalElement = 
summaryDoc.getRootElement().addElement("general");
+
+               // General run info (we only need this once)
+               generalElement.addAttribute("date", getAttrValue(testDoc, 
"//[EMAIL PROTECTED]'TODAY']", "value"));
+               generalElement.addAttribute("lang", getAttrValue(testDoc, 
"//[EMAIL PROTECTED]'env.LANG']", "value"));
+               generalElement.addAttribute("jre",
+                                            getAttrValue(testDoc, "//[EMAIL 
PROTECTED]'java.runtime.name']", "value") + " " +
+                                            getAttrValue(testDoc, "//[EMAIL 
PROTECTED]'java.runtime.version']", "value") + " (" +
+                                            getAttrValue(testDoc, "//[EMAIL 
PROTECTED]'java.vendor']", "value") + ")");
+               generalElement.addAttribute("os",
+                                            getAttrValue(testDoc, "//[EMAIL 
PROTECTED]'os.name']", "value") + " " +
+                                            getAttrValue(testDoc, "//[EMAIL 
PROTECTED]'os.version']", "value") + ", arch " +
+                                            getAttrValue(testDoc, "//[EMAIL 
PROTECTED]'os.arch']", "value"));
+               addTargetDatabaseInfo(generalElement, getAttrValue(testDoc, 
"//[EMAIL PROTECTED]'jdbc.properties.file']", "value"));
+            }
+            else
+            {
+                totalNumTests    = 
Integer.parseInt(generalElement.attributeValue("tests"));
+                totalNumErrors   = 
Integer.parseInt(generalElement.attributeValue("errors"));
+                totalNumFailures = 
Integer.parseInt(generalElement.attributeValue("failures"));
+            }
+
+            int numTests    = Integer.parseInt(getAttrValue(testDoc, 
"/testsuite", "tests"));
+            int numErrors   = Integer.parseInt(getAttrValue(testDoc, 
"/testsuite", "errors"));
+            int numFailures = Integer.parseInt(getAttrValue(testDoc, 
"/testsuite", "failures"));
+
+            totalNumTests    += numTests;
+            totalNumErrors   += numErrors;
+            totalNumFailures += numFailures;
+
+            generalElement.addAttribute("tests", 
String.valueOf(totalNumTests));
+            generalElement.addAttribute("errors", 
String.valueOf(totalNumErrors));
+            generalElement.addAttribute("failures", 
String.valueOf(totalNumErrors));
+
+            if ((numErrors > 0) || (numFailures > 0))
+            {
+                Element testSuiteNode = 
(Element)testDoc.selectSingleNode("/testsuite");
+                String  testSuiteName = testSuiteNode.attributeValue("name");
+
+                // since tests have failed, we add it to the summary
+                for (Iterator it = testSuiteNode.elementIterator("testcase"); 
it.hasNext();)
+                {
+                    Element failedTestElement = (Element)it.next();
+                    Element newTestElement    = 
summaryDoc.getRootElement().addElement("failedTest");
+
+                    // Test setup failure, so the test was not actually run ?
+                    if 
(!failedTestElement.attributeValue("classname").startsWith("junit.framework.TestSuite"))
+                    {
+                        newTestElement.addAttribute("name", 
failedTestElement.attributeValue("classname") + "#" + 
failedTestElement.attributeValue("name"));
+                    }
+                    newTestElement.addAttribute("testsuite", testSuiteName);
+                }
+            }
+       }
+       catch (DocumentException ex)
+       {
+               // No, apparently it's not an XML document, so we ignore it
+       }
+    }
+
+    /**
+     * Reads the database properties from the used properties file.
+     * 
+     * @param element            The element to add the relevant database 
properties to
+     * @param jdbcPropertiesFile The path of the properties file
+     */
+    protected void addTargetDatabaseInfo(Element element, String 
jdbcPropertiesFile) throws IOException, BuildException
+    {
+        if (jdbcPropertiesFile == null)
+        {
+            return;
+        }
+
+        Properties       props    = new Properties();
+        Connection       conn     = null;
+        DatabaseMetaData metaData = null;
+
+        try
+        {
+            props.load(getClass().getResourceAsStream(jdbcPropertiesFile));
+        }
+        catch (Exception ex)
+        {
+            throw new BuildException("Cannot load database properties from 
file " + jdbcPropertiesFile);
+        }
+
+        try
+        {
+            String     dataSourceClass = 
props.getProperty(TestDatabaseWriterBase.DATASOURCE_PROPERTY_PREFIX + "class", 
BasicDataSource.class.getName());
+            DataSource dataSource      = 
(DataSource)Class.forName(dataSourceClass).newInstance();
+    
+            for (Iterator it = props.entrySet().iterator(); it.hasNext();)
+            {
+                Map.Entry entry    = (Map.Entry)it.next();
+                String    propName = (String)entry.getKey();
+    
+                if 
(propName.startsWith(TestDatabaseWriterBase.DATASOURCE_PROPERTY_PREFIX) && 
!propName.equals(TestDatabaseWriterBase.DATASOURCE_PROPERTY_PREFIX +"class"))
+                {
+                    BeanUtils.setProperty(dataSource,
+                                          
propName.substring(TestDatabaseWriterBase.DATASOURCE_PROPERTY_PREFIX.length()),
+                                          entry.getValue());
+                }
+            }
+
+            String platformName = 
props.getProperty(TestDatabaseWriterBase.PLATFORM_PROPERTY);
+
+            if (platformName == null)
+            {
+                platformName = new 
PlatformUtils().determineDatabaseType(dataSource);
+                if (platformName == null)
+                {
+                    throw new BuildException("Could not determine platform 
from datasource, please specify it in the jdbc.properties via the 
ddlutils.platform property");
+                }
+            }
+
+            element.addAttribute("platform", platformName);
+            element.addAttribute("dataSourceClass", dataSourceClass);
+
+            // TODO: we're also interested in the specific versions of the DB 
and the JDBC driver
+            //       used as well as the used data source
+            conn     = dataSource.getConnection();
+            metaData = conn.getMetaData();
+
+            try
+            {
+                element.addAttribute("dbProductName", 
metaData.getDatabaseProductName());
+            }
+            catch (Exception ex)
+            {
+                // we ignore it
+            }
+            try
+            {
+                element.addAttribute("dbProductVersion", 
metaData.getDatabaseProductVersion());
+            }
+            catch (Exception ex)
+            {
+                // we ignore it
+            }
+            try
+            {
+                int databaseMajorVersion = metaData.getDatabaseMajorVersion();
+                int databaseMinorVersion = metaData.getDatabaseMinorVersion();
+
+                element.addAttribute("dbVersion", databaseMajorVersion + "." + 
databaseMinorVersion);
+            }
+            catch (Exception ex)
+            {
+                // we ignore it
+            }
+            try
+            {
+                element.addAttribute("driverName", metaData.getDriverName());
+            }
+            catch (Exception ex)
+            {
+                // we ignore it
+            }
+            try
+            {
+                element.addAttribute("driverVersion", 
metaData.getDriverVersion());
+            }
+            catch (Exception ex)
+            {
+                // we ignore it
+            }
+            try
+            {
+                int jdbcMajorVersion = metaData.getJDBCMajorVersion();
+                int jdbcMinorVersion = metaData.getJDBCMinorVersion();
+
+                element.addAttribute("jdbcVersion", jdbcMajorVersion + "." + 
jdbcMinorVersion);
+            }
+            catch (Exception ex)
+            {
+                // we ignore it
+            }
+        }
+        catch (Exception ex)
+        {
+            throw new BuildException(ex);
+        }
+        finally
+        {
+            if (conn != null)
+            {
+                try
+                {
+                    conn.close();
+                }
+                catch (SQLException ex)
+                {
+                    // we ignore it
+                }
+            }
+        }
+    }
+    
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public void execute() throws BuildException
+    {
+        try
+        {
+            log("Processing test results", Project.MSG_INFO);
+
+            Document  doc    = processInputFiles();
+            XMLWriter writer = null;
+
+            if (_outputFile != null)
+            {
+                writer = new XMLWriter(new FileWriter(_outputFile), 
OutputFormat.createPrettyPrint());
+            }
+            else
+            {
+                writer = new XMLWriter(System.out, 
OutputFormat.createPrettyPrint());
+            }
+
+            writer.write(doc);
+            writer.close();
+
+            log("Processing finished", Project.MSG_INFO);
+        }
+        catch (Exception ex)
+        {
+            throw new BuildException("Error while processing the test results: 
"+ex.getLocalizedMessage(), ex);
+        }
+    }
+}

Modified: 
db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java?view=diff&rev=464353&r1=464352&r2=464353
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java 
(original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/RoundtripTestBase.java 
Sun Oct 15 18:15:26 2006
@@ -151,14 +151,14 @@
     }
 
     /**
-     * Retrieves all rows from the given table.
-     * 
-     * @param tableName The table
-     * @return The rows
+     * Returns a "SELECT * FROM [table name]" statement. It also takes
+     * delimited identifier mode into account if enabled.
+     *  
+     * @param table The table
+     * @return The statement
      */
-    protected List getRows(String tableName)
+    protected String getSelectQueryForAllString(Table table)
     {
-        Table        table = getModel().findTable(tableName, 
getPlatform().isDelimitedIdentifierModeOn());
         StringBuffer query = new StringBuffer();
 
         query.append("SELECT * FROM ");
@@ -171,8 +171,20 @@
         {
             query.append(getPlatformInfo().getDelimiterToken());
         }
+        return query.toString();
+    }
+    
+    /**
+     * Retrieves all rows from the given table.
+     * 
+     * @param tableName The table
+     * @return The rows
+     */
+    protected List getRows(String tableName)
+    {
+        Table table = getModel().findTable(tableName, 
getPlatform().isDelimitedIdentifierModeOn());
         
-        return getPlatform().fetch(getModel(), query.toString(), new Table[] { 
table });
+        return getPlatform().fetch(getModel(), 
getSelectQueryForAllString(table), new Table[] { table });
     }
 
     /**

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDatatypes.java
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDatatypes.java?view=diff&rev=464353&r1=464352&r2=464353
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDatatypes.java 
(original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDatatypes.java Sun 
Oct 15 18:15:26 2006
@@ -124,14 +124,16 @@
         dataWriter.writeDocumentStart();
         for (int idx = 0; idx < getModel().getTableCount(); idx++)
         {
-            Table[] tables = { (Table)getModel().getTable(idx) };
+            Table table = getModel().getTable(idx);
 
-            dataWriter.write(getPlatform().query(getModel(), "select * from " 
+ tables[0].getName(), tables));
+            dataWriter.write(getPlatform().query(getModel(), 
getSelectQueryForAllString(table), new Table[] { table }));
         }
         dataWriter.writeDocumentEnd();
 
         String dataSql = stringWriter.toString();
         
+        assertTrue((dataSql != null) && (dataSql.length() > 0));
+
         getPlatform().dropTables(getModel(), false);
 
         createDatabase(modelXml);


Reply via email to