=begin -------------------------------------------------------------------------------- Stop the Vitro application, delete all MySQL tables from the Vitro database, and start the application again. -------------------------------------------------------------------------------- Parameters: tomcat_stop_command A "shell" command that will stop the Tomcat server. tomcat_stop_delay Number of seconds to wait after the tomcat_stop_command returns before proceeding. tomcat_start_command A "shell" command that will start the Tomcat server. tomcat_start_delay Number of seconds to wait after the tomcat_start_command returns before proceeding. mysql_username A user account that has authority to drop the Vitro database in MySQL. mysql_password The password for mysql_username. database_name The name of the Vitro database in MySQL. -------------------------------------------------------------------------------- =end require 'date' require 'fileutils' require File.expand_path('output_suite_parser', File.dirname(File.expand_path(__FILE__))) require File.expand_path('output_summary_formatter', File.dirname(File.expand_path(__FILE__))) class TestInfo attr :test_name, true attr :suite_name, true attr :output_link, true attr :status, true end class SuiteInfo attr :name, true attr :output_link, true attr :status, true end class Status GOOD = 0 BAD = 1 FAIR = 2 def self.html_class(status) return %w{good bad fair}[status] end end class OutputManager # ------------------------------------------------------------------------------------ private # ------------------------------------------------------------------------------------ # # Confirm that the output directory parameter is reasonable. # def sanity_checks_on_parameters() if @output_directory == nil raise("Properties file must contain a value for 'output_directory'") end if !File.exist?(@output_directory) raise "Output directory '#{@output_directory}' does not exist." end if !File.readable?(@output_directory) raise "Output directory '#{@output_directory}' is not readable." end if !File.directory?(@output_directory) raise "Output directory '#{@output_directory}' is not a directory." end if !File.writable?(@output_directory) raise "Output directory '#{@output_directory}' is not writable." end end # The CSS file for the output summary exists in the script directory. # Copy it to the output directory. # def copy_css_file() source = File.expand_path('output_summary.css', File.dirname(File.expand_path(__FILE__))) dest = File.expand_path('summary.css', @output_directory) FileUtils::copy_file(source, dest) end # Write the beginning of the summary file. # This includes the HTML header, and the banner. # # f -- a file, already open for output. # def write_summary_header(f) if @osp.overall_status == Status::BAD overall_status = "FAILURE" else overall_status = "SUCCESS" end f.print < Summary of Acceptance Tests #{@osp.start_time}
Acceptance test results: 3:45 p.m. March 10, 2010
#{overall_status}
END_HEADER end # Write the first section of the summary file. This section contains # nested tables with fixed formats, containing overall stats. # # f -- a file, already open for output. # def write_summary_stats_section(f) how_many_tests = @osp.tests.length how_many_pass = 0 how_many_fail = 0 how_many_ignore = 0 @osp.tests.each do |t| how_many_pass += 1 if t.status == Status::GOOD how_many_ignore += 1 if t.status == Status::FAIR how_many_fail += 1 if t.status == Status::BAD end f.print <Summary
Start time:#{@osp.start_time}
End time#{@osp.end_time}
Elapsed time#{@osp.elapsed_time}
Suites#{@osp.suites.length}
Total tests#{@osp.tests.length}
Passing tests#{how_many_pass}
Failing tests#{how_many_fail}
Ignored tests#{how_many_ignore}
END_STATS end # Write a table of failed tests to the summary file, with links # to the detailed output for each test. # # f -- a file, already open for output. # def write_summary_failure_section(f) fails = [] @osp.tests.each do |t| fails << t if t.status == Status::BAD end f.print "
Failing tests
\n\n \n" f.print " \n" if fails.empty? f.print " \n" f.print " \n" f.print " \n" else fails.each do |t| f.print " \n" f.print " \n" f.print " \n" f.print " \n" end end f.print "
Suite nameTest name
No tests failed.
#{t.suite_name}#{t.test_name}
\n\n" end # Write a table of ignored tests to the summary file, with links # to the detailed output for each test. # # f -- a file, already open for output. # def write_summary_ignore_section(f) ignores = [] @osp.tests.each do |t| ignores << t if t.status == Status::FAIR end f.print "
Ignored tests
\n\n \n" f.print " \n" if ignores.empty? f.print " \n" f.print " \n" f.print " \n" else ignores.each do |t| f.print " \n" f.print " \n" f.print " \n" f.print " \n" end end f.print "
Suite nameTest name
No tests ignored.
#{t.suite_name}#{t.test_name}
\n\n" end # Write a table of any error messages or warnings found in the log file. # # f -- a file, already open for output. # def write_error_messages_section(f) f.print "
Errors and warnings
\n" f.print " " if @osp.errors.empty? && @osp.warnings.empty? f.print " " else @osp.errors.each() do |e| f.print " " end @osp.warnings.each() do |w| f.print " " end end f.print "
No errors or warnings
ERROR#{e}
WARN#{w}
\n\n" end # Write a table of the suites to the summary file, with links # to the detailed output for each suite. # # f -- a file, already open for output. # def write_summary_suites_section(f) f.print "
Suites
\n" f.print " \n" @osp.suites.each() do |s| f.print " \n" f.print " \n" f.print " \n" end f.print "
#{s.name}
\n\n" end # Write a table of all tests to the summary file, with links # to the detailed output for each test. # # f -- a file, already open for output. # def write_summary_all_tests_section(f) f.print "
All tests
\n\n \n" f.print " \n" if @osp.tests.empty? f.print " \n" f.print " \n" f.print " \n" else @osp.tests.each do |t| f.print " \n" f.print " \n" f.print " \n" f.print " \n" end end f.print "
Suite nameTest name
No tests.
#{t.suite_name}#{t.test_name}
\n\n" end # Copy the log to the summary file, and close the HTML tags. # # f -- a file, already open for output. # def write_summary_footer(f) f.print "
Log
\n
\n"
    File.open(@log_file) do |log|
      FileUtils::copy_stream(log, f)
    end
    f.print "  
\n\n\n\n" end # ------------------------------------------------------------------------------------ public # ------------------------------------------------------------------------------------ # Set up and get ready to process. # def initialize(properties) @output_directory = properties['output_directory'] sanity_checks_on_parameters() @log_file = File.expand_path("log_file.txt", @output_directory) FileUtils::remove_file(@log_file) if File.exist?(@log_file) @output_summary_file = File.expand_path("summary.html", @output_directory) FileUtils::remove_file(@output_summary_file) if File.exist?(@output_summary_file) end # Write a message to the log file # def log(level, message) File.open(@log_file, File::CREAT | File::APPEND | File::WRONLY) do |f| f.print("#{level} #{message}\n") end end def output_filename(suite_name) File.expand_path("#{suite_name}_output.html", @output_directory) end def ignore_test?(suite_name, test_name) false end def summarize() @osp = OutputSuiteParser.new(self, @log_file) @osp.parse() copy_css_file() File.open(@output_summary_file, File::CREAT | File::WRONLY) do |f| osf = OutputSummaryFormatter.new(@osp, @log_file) osf.format(f) write_summary_header(f) write_summary_stats_section(f) write_error_messages_section(f) write_summary_failure_section(f) write_summary_ignore_section(f) write_summary_suites_section(f) write_summary_all_tests_section(f) write_summary_footer(f) end end end