blob: 3a5b7d069fdea9f4d8ff84bf14ae2784f1294019 [file] [log] [blame]
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +09001#!/usr/bin/env ruby
Shinichiro Hamajib69bf8a2015-06-10 14:52:06 +09002#
3# Copyright 2015 Google Inc. All rights reserved
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +090016
17require 'fileutils'
18
19FileUtils.mkdir_p('repo')
20Dir.chdir('repo')
21
22def check_command(cmd)
23 puts cmd
24 if !system(cmd)
25 puts "#{cmd} failed"
26 exit 1
27 end
28end
29
30class TestCase
31 attr_reader :name
32
33 def initialize(name, checkout, prepare, clean, target)
34 @name = name
35 @checkout = checkout
36 @prepare = prepare
37 @clean = clean
38 @target = target
39 end
40
Shinichiro Hamaji6990b732015-04-02 04:02:50 +090041 def normalize_log(log, out)
Shinichiro Hamaji0c8acad2015-04-13 01:16:31 +090042 # TODO: Fix.
43 if @name == 'android'
44 log = log.gsub(/[ \t]+/, ' ')
Shinichiro Hamajib9d22f02015-04-14 15:36:56 +090045 log = log.split("\n").sort.join("\n").sub(/ Stop\.$/, '')
46 # This is a completely sane warning from kati for Android.
47 log.sub!(%r(build/core/product_config.mk:152: warning: Unmatched parens: .*\n), '')
48 # Not sure why the order can be inconsistent, but this would be OK.
49 # TODO: Inevestigate.
50 log.gsub!(/(\.mk\.PRODUCT_COPY_FILES := )(.*)/){$1 + $2.split.sort * ' '}
Shinichiro Hamaji0c8acad2015-04-13 01:16:31 +090051 end
Shinichiro Hamaji6990b732015-04-02 04:02:50 +090052 File.open(out, 'w') do |of|
53 of.print log
54 end
55 log
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +090056 end
57
58 def run
59 @checkout.call(self)
60
61 Dir.chdir(@name) do
Shinichiro Hamaji6990b732015-04-02 04:02:50 +090062 @prepare.call(self)
63
Shinichiro Hamajia2574f42015-04-09 22:50:25 +090064 [['make', 'make'], ['kati', '../../kati']].each do |n, cmd|
65 @clean.call(self)
66 print "Running #{n} for #{@name}..."
67 STDOUT.flush
68 started = Time.now
69 system("#{cmd} #{@target} > #{n}.log 2>&1")
70 elapsed = Time.now - started
71 puts " %.2f secs" % elapsed
72 end
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +090073
74 make_log = File.read('make.log')
75 kati_log = File.read('kati.log')
76 kati_log.gsub!(/^\*kati\*.*\n/, '')
77
Shinichiro Hamaji6990b732015-04-02 04:02:50 +090078 make_log = normalize_log(make_log, 'make-normalized.log')
79 kati_log = normalize_log(kati_log, 'kati-normalized.log')
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +090080 if make_log == kati_log
81 puts "#{@name}: OK"
82 return true
83 else
84 puts "#{@name}: FAIL"
85 return false
86 end
87 end
88 end
89end
90
91class GitTestCase < TestCase
92 def initialize(name, repo, rev, prepare, clean, target)
93 checkout = Proc.new{|tc|
94 if !File.exist?(@name)
95 check_command("git clone #{repo}")
96 end
97 Dir.chdir(@name) {
98 check_command("git checkout #{rev}")
99 }
100 }
101
102 super(name, checkout, prepare, clean, target)
103 end
104end
105
Shinichiro Hamajib40f4a02015-04-09 18:33:52 +0900106class AndroidTestCase < TestCase
107 def initialize
108 name = 'android'
109 checkout = Proc.new{|tc|
110 FileUtils.mkdir_p(@name)
Shinichiro Hamaji9f25a3b2015-04-11 14:47:06 +0900111 md5 = `md5sum android.tgz`
112 need_update = true
113 if File.exist?("#{@name}/STAMP")
114 stamp = File.read("#{@name}/STAMP")
115 if md5 == stamp
116 need_update = false
117 end
118 end
119
120 if need_update
121 check_command("tar -xzf android.tgz")
122 File.open("#{@name}/STAMP.tmp", 'w') do |ofile|
123 ofile.print(md5)
124 end
125 File.rename("#{@name}/STAMP.tmp", "#{@name}/STAMP")
126 end
Shinichiro Hamajib40f4a02015-04-09 18:33:52 +0900127 }
128
129 super(name, checkout, DO_NOTHING, DO_NOTHING, 'dump-products')
130 end
131end
132
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +0900133DO_NOTHING = Proc.new{|tc|}
134MAKE_CLEAN = Proc.new{|tc|
135 check_command("make clean > /dev/null")
136}
Shinichiro Hamaji6990b732015-04-02 04:02:50 +0900137CONFIGURE = Proc.new{|tc|
138 check_command("./configure > /dev/null")
139}
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +0900140
141TESTS = [
142 GitTestCase.new('maloader',
143 'https://github.com/shinh/maloader.git',
144 '5d125933bc6c141bed05c309c2dc0e14ada6f5c7',
145 DO_NOTHING,
146 MAKE_CLEAN,
Shinichiro Hamaji6990b732015-04-02 04:02:50 +0900147 ''),
148 GitTestCase.new('glog',
149 'https://github.com/google/glog',
150 '1b0b08c8dda1659027677966b03a3ff3c488e549',
151 CONFIGURE,
152 MAKE_CLEAN,
153 ''),
Shinichiro Hamajib40f4a02015-04-09 18:33:52 +0900154 AndroidTestCase.new(),
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +0900155]
156
157fails = []
158TESTS.each do |tc|
Shinichiro Hamaji6990b732015-04-02 04:02:50 +0900159 if !ARGV.empty?
160 if !ARGV.include?(tc.name)
161 next
162 end
163 end
164
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +0900165 if !tc.run
166 fails << tc.name
167 end
168end
169
170puts
171
172if fails.empty?
173 puts "PASS!"
174else
175 puts "=== Failures ==="
176 fails.each do |n|
177 puts n
178 end
Shinichiro Hamaji6990b732015-04-02 04:02:50 +0900179 puts
Shinichiro Hamaji21b3d2b2015-04-02 03:38:32 +0900180
181 puts "FAIL!"
182end