| #!/usr/bin/env ruby |
| |
| require 'fileutils' |
| |
| FileUtils.mkdir_p('repo') |
| Dir.chdir('repo') |
| |
| def check_command(cmd) |
| puts cmd |
| if !system(cmd) |
| puts "#{cmd} failed" |
| exit 1 |
| end |
| end |
| |
| class TestCase |
| attr_reader :name |
| |
| def initialize(name, checkout, prepare, clean, target) |
| @name = name |
| @checkout = checkout |
| @prepare = prepare |
| @clean = clean |
| @target = target |
| end |
| |
| def normalize_log(log, out) |
| log = log.gsub(/[ \t]+/, ' ').split("\n").sort.join("\n") |
| File.open(out, 'w') do |of| |
| of.print log |
| end |
| log |
| end |
| |
| def run |
| @checkout.call(self) |
| |
| Dir.chdir(@name) do |
| @prepare.call(self) |
| |
| @clean.call(self) |
| puts "Running make for #{@name}..." |
| system("make #{@target} > make.log 2>&1") |
| |
| @clean.call(self) |
| puts "Running kati for #{@name}..." |
| system("../../kati #{@target} > kati.log 2>&1") |
| |
| make_log = File.read('make.log') |
| kati_log = File.read('kati.log') |
| kati_log.gsub!(/^\*kati\*.*\n/, '') |
| |
| make_log = normalize_log(make_log, 'make-normalized.log') |
| kati_log = normalize_log(kati_log, 'kati-normalized.log') |
| if make_log == kati_log |
| puts "#{@name}: OK" |
| return true |
| else |
| puts "#{@name}: FAIL" |
| return false |
| end |
| end |
| end |
| end |
| |
| class GitTestCase < TestCase |
| def initialize(name, repo, rev, prepare, clean, target) |
| checkout = Proc.new{|tc| |
| if !File.exist?(@name) |
| check_command("git clone #{repo}") |
| end |
| Dir.chdir(@name) { |
| check_command("git checkout #{rev}") |
| } |
| } |
| |
| super(name, checkout, prepare, clean, target) |
| end |
| end |
| |
| DO_NOTHING = Proc.new{|tc|} |
| MAKE_CLEAN = Proc.new{|tc| |
| check_command("make clean > /dev/null") |
| } |
| CONFIGURE = Proc.new{|tc| |
| check_command("./configure > /dev/null") |
| } |
| |
| TESTS = [ |
| GitTestCase.new('maloader', |
| 'https://github.com/shinh/maloader.git', |
| '5d125933bc6c141bed05c309c2dc0e14ada6f5c7', |
| DO_NOTHING, |
| MAKE_CLEAN, |
| ''), |
| GitTestCase.new('glog', |
| 'https://github.com/google/glog', |
| '1b0b08c8dda1659027677966b03a3ff3c488e549', |
| CONFIGURE, |
| MAKE_CLEAN, |
| ''), |
| ] |
| |
| fails = [] |
| TESTS.each do |tc| |
| if !ARGV.empty? |
| if !ARGV.include?(tc.name) |
| next |
| end |
| end |
| |
| if !tc.run |
| fails << tc.name |
| end |
| end |
| |
| puts |
| |
| if fails.empty? |
| puts "PASS!" |
| else |
| puts "=== Failures ===" |
| fails.each do |n| |
| puts n |
| end |
| puts |
| |
| puts "FAIL!" |
| end |