From: <mik...@us...> - 2009-10-27 13:57:27
|
Revision: 142 http://ogsa-dai.svn.sourceforge.net/ogsa-dai/?rev=142&view=rev Author: mikej888 Date: 2009-10-27 13:57:18 +0000 (Tue, 27 Oct 2009) Log Message: ----------- Added release build tests. Some tweaks to HTML method names. Modified Paths: -------------- test-framework/trunk/ogsadai/utils/TestSummaryHTMLBuilder.rb test-framework/trunk/runTests.rb Added Paths: ----------- test-framework/trunk/release.build.suite.txt Modified: test-framework/trunk/ogsadai/utils/TestSummaryHTMLBuilder.rb =================================================================== --- test-framework/trunk/ogsadai/utils/TestSummaryHTMLBuilder.rb 2009-10-27 12:52:22 UTC (rev 141) +++ test-framework/trunk/ogsadai/utils/TestSummaryHTMLBuilder.rb 2009-10-27 13:57:18 UTC (rev 142) @@ -18,13 +18,13 @@ module TestSummaryHTMLBuilder - # Get HTML page header. + # Get page header. # # Parameters # Date # User name # Returns HTML as a string. - def TestSummaryHTMLBuilder.getHTMLHeader(date, name) + def TestSummaryHTMLBuilder.getHeader(date, name) html = "<html>" html << "<head>" html << "<META http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\">" @@ -35,59 +35,57 @@ return html end - # Get HTML page footer. + # Get page footer. # # Returns HTML as a string. - def TestSummaryHTMLBuilder.getHTMLFooter() + def TestSummaryHTMLBuilder.getFooter() html = "</body>" html << "</html>\n" return html end - # Get HTML test results table header. + # Get test results table footer. # # Returns HTML as a string. - def TestSummaryHTMLBuilder.getHTMLTableHeader() - html = "<table width=\"95%\" cellspacing=\"2\" cellpadding=\"5\" border=\"0\" class=\"summary\">" - html << "<tr valign=\"top\"><th>Name</th><th>Tests</th><th>Fails</th><th>Errors</th><th>Success</th><th>Duration</th><th>Reports</th>\n" - return html - end - - # Get HTML test results table footer. - # - # Returns HTML as a string. - def TestSummaryHTMLBuilder.getHTMLTableFooter() + def TestSummaryHTMLBuilder.getTableFooter() html = "</table>\n" return html end - - # Get HTML test results table suite name row. + + # Get test suite heading. # - # Get HTML page header. # Parameters # Suite name. # Returns HTML as a string. - def TestSummaryHTMLBuilder.getHTMLSuiteRow(suite) - html = "<tr valign=\"top\"><th colspan=\"7\">Suite: " + suite.to_s + - "</th></tr>\n" + def TestSummaryHTMLBuilder.getSuiteHeading(suite) + html = "<h2>Suite: " + suite.to_s + "</h2>\n" puts "DEBUG: " + html return html end - # Get HTML test results table row. + # Get JUnit test summary table header. # + # Returns HTML as a string. + def TestSummaryHTMLBuilder.getJUnitTableHeader() + html = "<table width=\"95%\" cellspacing=\"2\" cellpadding=\"5\" border=\"0\" class=\"summary\">" + html << "<tr valign=\"top\"><th>Name</th><th>Tests</th><th>Fails</th><th>Errors</th><th>Success</th><th>Duration</th><th>Reports</th>\n" + return html + end + + # Get JUnit test summary table row. + # # Parameters - # Test results summary. Assumed to be an array with - # Test run name - # Number of tests run. - # Number of failures. - # Number of errors. - # Success rate. - # Duration + # Test results summary. Assumed to be an array + # Test run name - string + # Number of tests run - string + # Number of failures - string + # Number of errors - string + # Success rate - string + # Duration - string # Array of relative links to test reports. Each array member is an # array of two elements - a label and a hyperlink. # Returns HTML as a string. - def TestSummaryHTMLBuilder.getHTMLSummary(summary) + def TestSummaryHTMLBuilder.getJUnitRow(summary) name = summary[0] numTests = summary[1] numFails = summary[2] @@ -106,6 +104,8 @@ trClass = "Error" elsif (numFails.to_i > 0) trClass = "Fail" + elsif (numTests.to_i == 0) + trClass = "None" else trClass = "Pass" end @@ -124,23 +124,89 @@ return html end - # Get HTML test results table error row. + # Get JUnit test summary table error row. # # Get HTML page header. # Parameters # Test run name. # Error information. - # User name # Array of relative links to test reports. Each array member is an # array of two elements - a label and a hyperlink. # Returns HTML as a string. - def TestSummaryHTMLBuilder.getHTMLError(name, error, reports = nil) + def TestSummaryHTMLBuilder.getJUnitErrorRow(name, error, reports) + return getErrorRow(name, error, 5, reports) + end + + # Get simple test summary table header. + # + # Returns HTML as a string. + def TestSummaryHTMLBuilder.getSimpleTableHeader() + html = "<table width=\"95%\" cellspacing=\"2\" cellpadding=\"5\" border=\"0\" class=\"summary\">" + html << "<tr valign=\"top\"><th>Name</th><th>Result</th><th>Reports</th>\n" + return html + end + + # Get simple test summary table row. + # + # Parameters + # Test results summary. Assumed to be an array + # Pass or fail. + # Array of relative links to test reports. Each array member is an + # array of two elements - a label and a hyperlink. + # Returns HTML as a string. + def TestSummaryHTMLBuilder.getSimpleRow(name, result, reports) + puts "DEBUG: HTMLConvertor " + name.to_s + puts "DEBUG: HTMLConvertor " + result.to_s + puts "DEBUG: HTMLConvertor " + reports.to_s + if (result) + trClass = "Pass" + else + trClass = "Fail" + end + html = "<tr valign=\"top\" class=\"" + trClass + "\"><td>" + name + + "</td><td>" + result + + "</td><td>" + reports.each do |report| + html << "<a href=\"" + report[1] + "\">" + report[0] + "</a><br/>" + end + html << "</td></tr>\n" + puts "DEBUG: " + html + return html + end + + # Get simple test summary table error row. + # + # Get HTML page header. + # Parameters + # Test run name. + # Error information. + # Array of relative links to test reports. Each array member is an + # array of two elements - a label and a hyperlink. + # Returns HTML as a string. + def TestSummaryHTMLBuilder.getSimpleErrorRow(name, error, reports) + return getErrorRow(name, error, 1, reports) + end + + # Get test summary table error row. + # + # Get HTML page header. + # Parameters + # Test run name. + # Error information. + # Column span - number of columns error information is to span. + # Array of relative links to test reports. Each array member is an + # array of two elements - a label and a hyperlink. + # Returns HTML as a string. + def TestSummaryHTMLBuilder.getErrorRow(name, + error, + colSpan, + reports = nil) trClass = "Error" puts "DEBUG: HTMLConvertor " + name.to_s puts "DEBUG: HTMLConvertor " + error.to_s puts "DEBUG: HTMLConvertor " + reports.to_s html = "<tr valign=\"top\" class=\"" + trClass + "\"><td>" + name.to_s + - "</td><td colspan=\"5\">" + error.to_s + + "</td><td colspan=\"" + colSpan.to_s + "\">" + error.to_s + "</td><td>" if ! reports.nil? reports.each do |report| Added: test-framework/trunk/release.build.suite.txt =================================================================== --- test-framework/trunk/release.build.suite.txt (rev 0) +++ test-framework/trunk/release.build.suite.txt 2009-10-27 13:57:18 UTC (rev 142) @@ -0,0 +1,7 @@ +release-scripts/ogsa-dai/axis +release-scripts/ogsa-dai/globus/4.0 +release-scripts/ogsa-dai/globus/4.2 +# TODO user doc +# release-scripts/ogsa-dai/doc +# createHTMLConditional -Ddai.condition=daiaxis1 +# createHTMLConditional -Ddai.condition=daigt4 Modified: test-framework/trunk/runTests.rb =================================================================== --- test-framework/trunk/runTests.rb 2009-10-27 12:52:22 UTC (rev 141) +++ test-framework/trunk/runTests.rb 2009-10-27 13:57:18 UTC (rev 142) @@ -20,6 +20,12 @@ require 'ogsadai/junit/JUnitSummarizer' require 'ogsadai/utils/TestSummaryHTMLBuilder' +TODO_BAD_UNIT_ANT=false +TODO_BAD_RELEASE_ANT=false +TODO_SHORT_UNITS=false +TODO_DISABLE_UNIT_SUITE=false +TODO_DISABLE_RELEASE_SUITE=false + # Logger class. class Logger @@ -206,6 +212,11 @@ # Prefix to be used for any relative paths added to HTML results # summary. This can be assumed to point into the directory above. # Returns line of HTML representing a row of table results. + # <tr valign="top" class="Pass"><td>unitTests:extensions/xmldb/client</td><td>8</td><td>0</td><td>0</td><td>100.00%</td><td>0.909</td><td><a href="unitTests/extensions_xmldb_client/unit/overview-summary.html">JUnit reports</a> + # SuiteName:TestName | Tests | Fails | Errors | Success | Duration | Reports + # Errors, Success, Duration are optional. Replace with "-" if omitted. + # or, for errors, of form: + # <tr valign="top" class="Error"><td>unitTests:clients-tools/sampledata</td><td colspan="5">No such file or directory - File not found - /home/ogsadai-svn/test-framework/testReports/unitTests/clients-tools_sampledata/unit/overview-summary.html</td><td><a href="unitTests/clients-tools_sampledata/ant.output">ANT report</a><br/></td></tr> def self.runTest(moduleName, svn, target, @@ -242,25 +253,89 @@ if File.exist? logFile reportLinks << ["ANT report", logFileName] end - # Get summary of JUnit tests. - junitSummary = JUnitSummarizer::getJUnitSummary(junitSummaryFile) - # Add - reportLinks << ["JUnit report", junitReportsFile] + + # Are there tests of the given type? + if File.exist? File.join(svn, "src/test/" + testType) + # Get summary of JUnit tests. + junitSummary = JUnitSummarizer::getJUnitSummary(junitSummaryFile) + # Add + reportLinks << ["JUnit report", junitReportsFile] + else + junitSummary = ["0", "0", "0", "NaN", "0.000"] + end + # Add test run ID. + junitSummary.unshift(moduleName) + junitSummary << reportLinks + html = TestSummaryHTMLBuilder.getJUnitRow(junitSummary) + + rescue Errno::ENOENT => e + html = TestSummaryHTMLBuilder.getJUnitErrorRow(moduleName, e, reportLinks) + rescue MatchException => e + message = e.to_s + " in " + junitSummaryFile + html = TestSummaryHTMLBuilder.getJUnitErrorRow(moduleName, message, reportLinks) + rescue ANTException => e + # Save ANT log file. + if File.exist? logFile + reportLinks << ["ANT report", logFileName] + end + html = TestSummaryHTMLBuilder.getJUnitErrorRow(moduleName, "ANT problem when running " + e.target, reportLinks) + + end # begin + + return html + + end # def + + # Build a release. + # + # Parameters + # SVN module name. + # Absolute path to SVN module. + # ANT target to invoke. + # ANT properties to use when running target. + # Directory into which any reports are to be placed. + # Prefix to be used for any relative paths added to HTML results + # summary. This can be assumed to point into the directory above. + # Returns line of HTML representing a row of table results. + def self.buildRelease(moduleName, + svn, + target, + antProperties, + reports, + relativePathPrefix) + + # Absolute path for ANT log file. + logFile = File.join(reports, "ant.output") + # Relative path for ANT log file. + logFileName = File.join(relativePathPrefix, "ant.output") + + # Record of links to other files. Array of arrays, where each + # array consists of a label and a path relative to the parent of the + # test suite directory. + reportLinks = [] + + begin + + # Run ANT. + Utils.runANT(svn, target, antProperties, logFile) + # Save ANT log file. + if File.exist? logFile + reportLinks << ["ANT report", logFileName] + end + # Add test run ID. - junitSummary.unshift(moduleName) - junitSummary << reportLinks - html = TestSummaryHTMLBuilder.getHTMLSummary(junitSummary) + html = TestSummaryHTMLBuilder.getSimpleRow(moduleName, "Built!", reportLinks) rescue Errno::ENOENT => e - html = TestSummaryHTMLBuilder.getHTMLError(moduleName, e, reportLinks) + html = TestSummaryHTMLBuilder.getSimpleErrorRow(moduleName, e, reportLinks) rescue MatchException => e message = e.to_s + " in " + junitSummaryFile - html = TestSummaryHTMLBuilder.getHTMLError(moduleName, message, reportLinks) + html = TestSummaryHTMLBuilder.getSimpleErrorRow(moduleName, message, reportLinks) rescue ANTException => e # Save ANT log file. if File.exist? logFile reportLinks << ["ANT report", logFileName] end - html = TestSummaryHTMLBuilder.getHTMLError(moduleName, "ANT problem when running " + e.target, reportLinks) + html = TestSummaryHTMLBuilder.getSimpleErrorRow(moduleName, "ANT problem when running " + e.target, reportLinks) end # begin @@ -312,7 +387,8 @@ suiteSummary = File.join(suiteReports, "summary.html") # Add suite name. fileRef = File.new(suiteSummary, "a") - fileRef.write(TestSummaryHTMLBuilder.getHTMLSuiteRow(suite)) + fileRef.write(TestSummaryHTMLBuilder.getSuiteHeading(suite)) + fileRef.write(TestSummaryHTMLBuilder.getJUnitTableHeader()) fileRef.close # Iterate through modules and run unit tests for each one. @@ -331,13 +407,13 @@ # Run unit tests. target = "runUnitTests" - # TODO remove this. - # if moduleName == "core/server" - # target = "zonk" - # end + if TODO_BAD_UNIT_ANT + if moduleName == "core/server" + target = "zonk" + end + end html = Utils.runTest(moduleName, moduleDir, - # TODO restore this "runUnitTests" target, antProperties, "unit.test.report.html.dir", @@ -350,23 +426,106 @@ fileRef.write("\n") fileRef.close end + fileRef = File.new(suiteSummary, "a") + fileRef.write(TestSummaryHTMLBuilder.getTableFooter()) + fileRef.write("\n") + fileRef.close return suiteSummary end end # class +# Suite to build releases. + +class ReleaseBuildSuite + # Suite name. + attr :suite + + # Initialize. + # + # Parameters + # Suite name. + def initialize(suite) + @suite = suite + end + + # Run test suite. + # + # Parameters + # SVN directory. + # Dependencies directory. + # Packages directory. + # Test reports directory. + # Modules file - list of SVN modules relative to svn. + # Returns path to test results summary file. + def runTestSuite(svn, + dependencies, + packages, + reports, + modulesFile) + + # Create directory for suite test results. + suiteReports = File.join(reports, suite) + Utils.createDirectory(suiteReports) + # Set up ANT properties. + antProperties = + Utils.getDefaultANTProperties(dependencies, packages) + # Name of results file. + suiteSummary = File.join(suiteReports, "summary.html") + # Add suite name. + fileRef = File.new(suiteSummary, "a") + fileRef.write(TestSummaryHTMLBuilder.getSuiteHeading(suite)) + fileRef.write(TestSummaryHTMLBuilder.getSimpleTableHeader()) + fileRef.close + + # Iterate through modules and run tests for each one. + modules = Utils.readFileIntoArray(modulesFile) + modules.each do |moduleName| + + puts "DEBUG: ======== handling module " + moduleName + # Absolute path to moduleName's SVN directory. + moduleDir = File.join(svn, moduleName) + # Name of directory for this module's test results. + moduleReportsDirName = moduleName.gsub("/", "_") + # Absolute path. + moduleReportsDir = File.join(reports, suite, moduleReportsDirName) + # Create module's test results directory. + Utils.createDirectory(moduleReportsDir) + + target = "all" + if TODO_BAD_RELEASE_ANT + if moduleName == "release-scripts/ogsa-dai/globus/4.0" + target = "zonk" + end + end + html = Utils.buildRelease(moduleName, + moduleDir, + target, + antProperties, + moduleReportsDir, + File.join(suite, moduleReportsDirName)) + + # Append HTML to results file for the module. + fileRef = File.new(suiteSummary, "a") + fileRef.write(html) + fileRef.write("\n") + fileRef.close + end + fileRef = File.new(suiteSummary, "a") + fileRef.write(TestSummaryHTMLBuilder.getTableFooter()) + fileRef.write("\n") + fileRef.close + return suiteSummary + end + +end # class + ### RUN TEST SUITES ### # TestSuite API # runTestSuite(svn, dependencies, packages, reports,...) # Must create it's own sub-directory in reports. # Must return a reference to a file in this directory. -# File must contain lines of form: -# <tr valign="top" class="Pass"><td>unitTests:extensions/xmldb/client</td><td>8</td><td>0</td><td>0</td><td>100.00%</td><td>0.909</td><td><a href="unitTests/extensions_xmldb_client/unit/overview-summary.html">JUnit reports</a> -# SuiteName:TestName | Tests | Fails | Errors | Success | Duration | Reports -# Errors, Success, Duration are optional. Replace with "-" if omitted. -# or, for errors, of form: -# <tr valign="top" class="Error"><td>unitTests:clients-tools/sampledata</td><td colspan="5">No such file or directory - File not found - /home/ogsadai-svn/test-framework/testReports/unitTests/clients-tools_sampledata/unit/overview-summary.html</td><td><a href="unitTests/clients-tools_sampledata/ant.output">ANT report</a><br/></td></tr> # class=Pass|Fail|Error def runSuites(baseDir, packages, dependencies, svn, testProperties, reportsDir = nil) @@ -392,26 +551,40 @@ suiteSummaries = [] # Run a suite. - suite = "unitTests" - modulesFile = "unit.test.suite.txt" - # TODO remove - # modulesFile = "unit.test.suite.short.txt" - testSuite = UnitTestSuite.new(suite) - suiteSummary = testSuite.runTestSuite(svn, - dependencies, - packages, - reports, - testProperties, - modulesFile) - # Add to list of suite summary files. - suiteSummaries << suiteSummary - + if ! TODO_DISABLE_UNIT_SUITE + suite = "unitTests" + modulesFile = "unit.test.suite.txt" + if TODO_SHORT_UNITS + modulesFile = "unit.test.suite.short.txt" + end + testSuite = UnitTestSuite.new(suite) + suiteSummary = testSuite.runTestSuite(svn, + dependencies, + packages, + reports, + testProperties, + modulesFile) + # Add to list of suite summary files. + suiteSummaries << suiteSummary + end + # Run a suite. + if ! TODO_DISABLE_RELEASE_SUITE + suite = "releaseBuilds" + modulesFile = "release.build.suite.txt" + testSuite = ReleaseBuildSuite.new(suite) + suiteSummary = testSuite.runTestSuite(svn, + dependencies, + packages, + reports, + modulesFile) + # Add to list of suite summary files. + suiteSummaries << suiteSummary + end # Build results HTML page from results of suite summary files. FileUtils.cp("style.css", reports) testSummaryFile = File.join(reports, "index.html") file = File.new(testSummaryFile, "w") - file.write(TestSummaryHTMLBuilder.getHTMLHeader(niceDate, user)) - file.write(TestSummaryHTMLBuilder.getHTMLTableHeader()) + file.write(TestSummaryHTMLBuilder.getHeader(niceDate, user)) suiteSummaries.each do |suiteSummary| f = File.open(suiteSummary, "r") f.each_line do |line| @@ -419,14 +592,20 @@ end f.close end - file.write(TestSummaryHTMLBuilder.getHTMLTableFooter()) - file.write(TestSummaryHTMLBuilder.getHTMLFooter()) + file.write(TestSummaryHTMLBuilder.getFooter()) file.close end # def ##### MAIN ##### +if ARGV[0] == "zonk" + + # TODO REMOVE - this is for experiments. + +exit +end + if ARGV.size >= 1 baseDir = ARGV[0] packages = ARGV[1] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |