#!/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)
    # TODO: Fix.
    if @name == 'android'
      log = log.gsub(/[ \t]+/, ' ')
      log = log.split("\n").sort.join("\n").sub(/ Stop\.$/, '')
      # This is a completely sane warning from kati for Android.
      log.sub!(%r(build/core/product_config.mk:152: warning: Unmatched parens: .*\n), '')
      # Not sure why the order can be inconsistent, but this would be OK.
      # TODO: Inevestigate.
      log.gsub!(/(\.mk\.PRODUCT_COPY_FILES := )(.*)/){$1 + $2.split.sort * ' '}
    end
    File.open(out, 'w') do |of|
      of.print log
    end
    log
  end

  def run
    @checkout.call(self)

    Dir.chdir(@name) do
      @prepare.call(self)

      [['make', 'make'], ['kati', '../../kati']].each do |n, cmd|
        @clean.call(self)
        print "Running #{n} for #{@name}..."
        STDOUT.flush
        started = Time.now
        system("#{cmd} #{@target} > #{n}.log 2>&1")
        elapsed = Time.now - started
        puts " %.2f secs" % elapsed
      end

      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

class AndroidTestCase < TestCase
  def initialize
    name = 'android'
    checkout = Proc.new{|tc|
      FileUtils.mkdir_p(@name)
      md5 = `md5sum android.tgz`
      need_update = true
      if File.exist?("#{@name}/STAMP")
        stamp = File.read("#{@name}/STAMP")
        if md5 == stamp
          need_update = false
        end
      end

      if need_update
        check_command("tar -xzf android.tgz")
        File.open("#{@name}/STAMP.tmp", 'w') do |ofile|
          ofile.print(md5)
        end
        File.rename("#{@name}/STAMP.tmp", "#{@name}/STAMP")
      end
    }

    super(name, checkout, DO_NOTHING, DO_NOTHING, 'dump-products')
  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,
                    ''),
   AndroidTestCase.new(),
]

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
