90 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| 
								 | 
							
								require 'rubygems'
							 | 
						||
| 
								 | 
							
								require 'rake' # for .ext()
							 | 
						||
| 
								 | 
							
								require 'constants'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								class GeneratorTestResults
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  constructor :configurator, :generator_test_results_sanity_checker, :yaml_wrapper
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								  def process_and_write_results(unity_shell_result, results_file, test_file)
							 | 
						||
| 
								 | 
							
								    output_file   = results_file
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    results = get_results_structure
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    results[:source][:path] = File.dirname(test_file)
							 | 
						||
| 
								 | 
							
								    results[:source][:file] = File.basename(test_file)
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    # process test statistics
							 | 
						||
| 
								 | 
							
								    if (unity_shell_result[:output] =~ TEST_STDOUT_STATISTICS_PATTERN)
							 | 
						||
| 
								 | 
							
								      results[:counts][:total]   = $1.to_i
							 | 
						||
| 
								 | 
							
								      results[:counts][:failed]  = $2.to_i
							 | 
						||
| 
								 | 
							
								      results[:counts][:ignored] = $3.to_i
							 | 
						||
| 
								 | 
							
								      results[:counts][:passed]  = (results[:counts][:total] - results[:counts][:failed] - results[:counts][:ignored])
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # remove test statistics lines
							 | 
						||
| 
								 | 
							
								    output_string = unity_shell_result[:output].sub(TEST_STDOUT_STATISTICS_PATTERN, '')
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    # bust up the output into individual lines
							 | 
						||
| 
								 | 
							
								    raw_unity_lines = output_string.split(/\n|\r\n/)
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    raw_unity_lines.each do |line|
							 | 
						||
| 
								 | 
							
								      # process unity output
							 | 
						||
| 
								 | 
							
								      case line
							 | 
						||
| 
								 | 
							
								      when /(:IGNORE)/
							 | 
						||
| 
								 | 
							
								        elements = extract_line_elements(line, results[:source][:file])
							 | 
						||
| 
								 | 
							
								        results[:ignores]   << elements[0]
							 | 
						||
| 
								 | 
							
								        results[:stdout]    << elements[1] if (!elements[1].nil?)
							 | 
						||
| 
								 | 
							
								      when /(:PASS$)/
							 | 
						||
| 
								 | 
							
								        elements = extract_line_elements(line, results[:source][:file])
							 | 
						||
| 
								 | 
							
								        results[:successes] << elements[0]
							 | 
						||
| 
								 | 
							
								        results[:stdout]    << elements[1] if (!elements[1].nil?)
							 | 
						||
| 
								 | 
							
								      when /(:FAIL)/
							 | 
						||
| 
								 | 
							
								        elements = extract_line_elements(line, results[:source][:file])
							 | 
						||
| 
								 | 
							
								        results[:failures]  << elements[0]
							 | 
						||
| 
								 | 
							
								        results[:stdout]    << elements[1] if (!elements[1].nil?)
							 | 
						||
| 
								 | 
							
								      else # collect up all other
							 | 
						||
| 
								 | 
							
								        results[:stdout] << line.chomp
							 | 
						||
| 
								 | 
							
								      end
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    @generator_test_results_sanity_checker.verify(results, unity_shell_result[:exit_code])
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    output_file = results_file.ext(@configurator.extension_testfail) if (results[:counts][:failed] > 0)
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    @yaml_wrapper.dump(output_file, results)
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    return { :result_file => output_file, :result => results }
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  private
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def get_results_structure
							 | 
						||
| 
								 | 
							
								    return {
							 | 
						||
| 
								 | 
							
								      :source    => {:path => '', :file => ''},
							 | 
						||
| 
								 | 
							
								      :successes => [],
							 | 
						||
| 
								 | 
							
								      :failures  => [],
							 | 
						||
| 
								 | 
							
								      :ignores   => [],
							 | 
						||
| 
								 | 
							
								      :counts    => {:total => 0, :passed => 0, :failed => 0, :ignored  => 0},
							 | 
						||
| 
								 | 
							
								      :stdout    => [],
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  def extract_line_elements(line, filename)
							 | 
						||
| 
								 | 
							
								    # handle anything preceding filename in line as extra output to be collected
							 | 
						||
| 
								 | 
							
								    stdout = nil
							 | 
						||
| 
								 | 
							
								    stdout_regex = /(.+)#{Regexp.escape(filename)}.+/i
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    if (line =~ stdout_regex)
							 | 
						||
| 
								 | 
							
								      stdout = $1.clone
							 | 
						||
| 
								 | 
							
								      line.sub!(/#{Regexp.escape(stdout)}/, '')
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    # collect up test results minus and extra output
							 | 
						||
| 
								 | 
							
								    elements = (line.strip.split(':'))[1..-1]
							 | 
						||
| 
								 | 
							
								    return {:test => elements[1], :line => elements[0].to_i, :message => (elements[3..-1].join(':')).strip}, stdout
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								end
							 |