tests/run-all.rb
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 11 Feb 2014 16:29:28 +0000
branchdevelopment
changeset 3020 e7c286435bfe
parent 3000 08d798b4ef80
child 3299 61e9df43f8a4
permissions -rwxr-xr-x
Fixed tests'run-all.rb to run under Windows as well.

#!/usr/bin/ruby
require 'rbconfig'
require 'fileutils'

PACKAGES = [ 'stx:libjava', 'stx:libjava/mauve', 'stx:libjava/experiments', 'stx:libjava/tools' ]
PARAMS = {
	'STX_LIBJAVA_ENABLE_JIT' => [
		#'1',
		'0'
	],
	'STX_LIBJAVA_RELEASE' => [
		'JDK6',
		'JDK7'
	]
}

REPORT_DIR="results-#{Time.now.strftime("%Y-%m-%d-%H-%M-%S")}"


def win32?      
  return (Config::CONFIG['host_os'] =~ /mingw32/) != nil
end
 
def unix?     
  if win32_wine?
    return false
  end      
  return (Config::CONFIG['host_os'] =~ /linux|solaris/) != nil
end

if win32?
	REPORT_RUNNER = File.join(File.dirname(__FILE__), '..', '..', 'goodies', 'builder', 'reports' , 'report-runner.bat')
else
	REPORT_RUNNER = File.join(File.dirname(__FILE__), '..', '..', 'goodies', 'builder', 'reports' , 'report-runner.sh')	
end



def run_package(package, params = {})
	ident = []
	setup = 'Stdin close'
	params.keys.sort.each do | name |
		value = params[name]
		ident.push("#{name}=#{value}")
		ENV[name] = value
	end
	if ident.size > 0 then
		logf = File.join(REPORT_DIR, "#{package.tr(':/', '__')}-#{ident.join('-')}-Test.out")
		ident = "#{ident.join('-')}"
		cmd = %W[#{REPORT_RUNNER} -S #{setup} -D #{REPORT_DIR} -i #{ident} -r Builder::TestReport -p #{package}]
		#cmd = %W[#{REPORT_RUNNER} -S #{setup} -D #{REPORT_DIR} -i #{ident} -r Builder::TestReport ]
	else
		logf = File.join(REPORT_DIR, "#{package.tr(':/', '__')}-Test.out")
		ident = ''
		cmd = %W[#{REPORT_RUNNER} -S #{setup}  -D #{REPORT_DIR} -r Builder::TestReport -p #{package}]
	end

	puts "Running #{package} {#{ident}}"
	puts cmd.inspect
	pattern = /SUMMARY: (?<run>\d+) run, (?<passed>\d+) passed, (?<skipped>\d+) skipped, (?<failed>\d+) failed, (?<error>\d+) error/
	result = {
						'run' => '?',
						'passed' => '?',
						'skipped' => '?',
						'failed' => '?',
						'error' => '?'
					}	
	IO.popen(cmd + [ :err => [:child, :out]]) do | out |
		File.open(logf, "w") do | log |
			out.each do | line |
				log.puts line
				puts line
				match = pattern.match (line)
				if match then
					result = {
						'run' => match['run'],
						'passed' => match['passed'],
						'skipped' => match['skipped'],
						'failed' => match['failed'],
						'error' => match['error']
					}
				end
			end
		end
	end
	result['ident'] = ident
	result['package'] = package
	result['params'] = params
	return result
end

def combine(params, bound = {}, &block)
	if bound.size == params.size then
		yield bound
	else
		params_to_combine = params.keys.sort.select { | p | not bound.key? p }
		param = params_to_combine.to_a().first()
		values = params[param]
		values.each do | value |
			combined = bound.clone()
			combined[param] = value
			combine(params, combined, &block)
		end
	end
end


def write_results_txt_to_file(filename, results)
  File.open(filename, "a+") do |file|
    write_results_txt(file, results)
  end
end


def write_results_txt(file, results)
    file.write("\n")
    file.write(Time.now.to_s)
    file.write("\n")
    params = PARAMS.keys.sort
    values = [[ "Package"] + params + ['result', 'run', 'passed', 'skipped' , 'failed' , 'error']]
    results.each do | result |
      param_values = params.collect { | p | result['params'][p] }
      result_text = '?'
      if result['run'] != '0' then
	      if result['error'] != '0' then
	      	result_text = 'ERROR'
	      elsif result['failed'] != '0' then
	      	result_text = 'FAILED'
				else
					result_text = 'passed'
				end
			end

      row = [ result['package'] ] + param_values + [ result_text, result['run'], result['passed'], result['skipped'], result['failed'], result['error'] ]
      values.push(row)
    end
    max_lengths = values[0].map { |val| val.length }
    values.each do |row|
      row.each_with_index do |elem, index|
        elem_size = elem.size
        max_lengths[index] = elem_size if elem_size > max_lengths[index]
      end
    end
    values.each do |val|
      format = max_lengths.map { |length| "%#{length}s" }.join(" " * 3)
      file.write(format % val)
      file.write("\n")
    end
    file.write("--\n")

end


FileUtils.mkdir_p REPORT_DIR

results = []

combine(PARAMS) do | bound |
	PACKAGES.each do | package |
		results.push(run_package(package, bound))
	end
end

write_results_txt_to_file(File.join(REPORT_DIR, 'results.txt'), results)
write_results_txt(STDOUT, results)