blob: a3c41973f73d7e74155152b3b94c52cefbe3cee1 [file] [log] [blame]
Fumitoshi Ukai119dc912015-03-30 16:52:41 +09001#!/usr/bin/env ruby
Shinichiro Hamaji913eb742016-04-28 17:31:24 +09002# coding: binary
Shinichiro Hamajib69bf8a2015-06-10 14:52:06 +09003#
4# Copyright 2015 Google Inc. All rights reserved
5#
6# Licensed under the Apache License, Version 2.0 (the "License");
7# you may not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS,
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090017
18require 'fileutils'
19
Stefan Beckere4e56f32016-04-27 11:16:39 +030020# suppress GNU make jobserver magic when calling "make"
21ENV.delete('MAKEFLAGS')
22ENV.delete('MAKELEVEL')
23
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +090024while true
25 if ARGV[0] == '-s'
26 test_serialization = true
27 ARGV.shift
28 elsif ARGV[0] == '-c'
29 ckati = true
30 ARGV.shift
31 ENV['KATI_VARIANT'] = 'c'
32 elsif ARGV[0] == '-n'
33 via_ninja = true
34 ARGV.shift
Colin Crossdf110442015-10-02 11:06:49 -070035 ENV['NINJA_STATUS'] = 'NINJACMD: '
Shinichiro Hamaji85620572015-10-03 11:25:15 +090036 elsif ARGV[0] == '-a'
37 gen_all_targets = true
38 ARGV.shift
Shinichiro Hamaji221a16b2015-09-10 12:40:14 +090039 elsif ARGV[0] == '-v'
40 show_failing = true
41 ARGV.shift
Sasha Smundakb4482cb2018-08-23 11:21:28 -070042 elsif ARGV[0] == "-q"
43 hide_passing = true
44 ARGV.shift
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +090045 else
46 break
47 end
Shinichiro Hamaji9f4f5d32015-04-28 03:53:49 +090048end
49
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090050def get_output_filenames
51 files = Dir.glob('*')
52 files.delete('Makefile')
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +090053 files.delete('build.ninja')
Colin Cross27df5312015-11-09 13:39:14 -080054 files.delete('env.sh')
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +090055 files.delete('ninja.sh')
Shinichiro Hamaji65489db2015-06-29 20:44:26 +090056 files.delete('gmon.out')
Shinichiro Hamaji91571ac2015-09-07 18:24:00 +090057 files.delete('submake')
Shinichiro Hamajib674d582015-04-28 03:40:57 +090058 files.reject!{|f|f =~ /\.json$/}
Fumitoshi Ukai6450d0f2015-07-10 16:34:06 +090059 files.reject!{|f|f =~ /^kati\.*/}
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090060 files
61end
62
63def cleanup
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +090064 (get_output_filenames + Dir.glob('.*')).each do |fname|
65 next if fname == '.' || fname == '..'
Shinichiro Hamajic6713602015-04-01 01:03:34 +090066 FileUtils.rm_rf fname
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090067 end
68end
69
Shinichiro Hamaji74a66002015-04-27 16:42:30 +090070def move_circular_dep(l)
71 # We don't care when circular dependency detection happens.
72 circ = ''
73 while l.sub!(/Circular .* dropped\.\n/, '') do
74 circ += $&
75 end
76 circ + l
77end
78
Shinichiro Hamajic6713602015-04-01 01:03:34 +090079expected_failures = []
80unexpected_passes = []
81failures = []
82passes = []
83
Shinichiro Hamajiec42b4e2015-05-14 16:20:03 +090084if !ARGV.empty?
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +090085 test_files = ARGV.map do |test|
86 "testcase/#{File.basename(test)}"
Shinichiro Hamajiec42b4e2015-05-14 16:20:03 +090087 end
88else
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +090089 test_files = Dir.glob('testcase/*.mk').sort
90 test_files += Dir.glob('testcase/*.sh').sort
Shinichiro Hamajiec42b4e2015-05-14 16:20:03 +090091end
92
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +090093def run_in_testdir(test_filename)
94 c = File.read(test_filename)
95 name = File.basename(test_filename)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090096 dir = "out/#{name}"
Shinichiro Hamaji52e42032015-03-31 23:20:13 +090097
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090098 FileUtils.mkdir_p(dir)
Shinichiro Hamaji52e42032015-03-31 23:20:13 +090099 Dir.glob("#{dir}/*").each do |fname|
100 FileUtils.rm_rf(fname)
101 end
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900102
103 Dir.chdir(dir) do
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900104 yield name
105 end
106end
107
Shinichiro Hamaji86e11332015-07-28 15:24:17 +0900108def normalize_ninja_log(log, mk)
Colin Crossdf110442015-10-02 11:06:49 -0700109 log.gsub!(/^NINJACMD: .*\n/, '')
Shinichiro Hamajicecc3582015-07-28 15:56:59 +0900110 log.gsub!(/^ninja: no work to do\.\n/, '')
Fumitoshi Ukai786846d2015-07-28 18:08:47 +0900111 log.gsub!(/^ninja: error: (.*, needed by .*),.*/,
112 '*** No rule to make target \\1.')
Dan Willemsenf3a4ced2015-08-25 14:22:35 -0700113 log.gsub!(/^ninja: warning: multiple rules generate (.*)\. builds involving this target will not be correct.*$/,
Shinichiro Hamaji3c60c122015-10-05 16:26:38 +0900114 'ninja: warning: multiple rules generate \\1.')
Shinichiro Hamaji38892d82016-05-09 18:51:35 +0900115
Shinichiro Hamaji86e11332015-07-28 15:24:17 +0900116 if mk =~ /err_error_in_recipe.mk/
117 # This test expects ninja fails. Strip ninja specific error logs.
Shinichiro Hamaji38892d82016-05-09 18:51:35 +0900118 ninja_failed_subst = ''
Shinichiro Hamajic3a48342016-03-15 08:27:43 +0900119 elsif mk =~ /\/fail_/
120 # Recipes in these tests fail.
Shinichiro Hamaji38892d82016-05-09 18:51:35 +0900121 ninja_failed_subst = "*** [test] Error 1\n"
122 end
123 if ninja_failed_subst
124 log.gsub!(/^FAILED: (.*\n\/bin\/bash)?.*\n/, ninja_failed_subst)
Shinichiro Hamajic3a48342016-03-15 08:27:43 +0900125 log.gsub!(/^ninja: .*\n/, '')
Shinichiro Hamaji86e11332015-07-28 15:24:17 +0900126 end
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +0900127 log
128end
129
Shinichiro Hamaji913eb742016-04-28 17:31:24 +0900130def normalize_quotes(log)
131 log.gsub!(/[`'"]/, '"')
132 # For recent GNU find, which uses Unicode characters.
133 log.gsub!(/(\xe2\x80\x98|\xe2\x80\x99)/, '"')
134 log
135end
136
Dan Willemsenf3a4ced2015-08-25 14:22:35 -0700137def normalize_make_log(expected, mk, via_ninja)
Shinichiro Hamaji913eb742016-04-28 17:31:24 +0900138 expected = normalize_quotes(expected)
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900139 expected.gsub!(/^make(?:\[\d+\])?: (Entering|Leaving) directory.*\n/, '')
140 expected.gsub!(/^make(?:\[\d+\])?: /, '')
141 expected = move_circular_dep(expected)
142
143 # Normalizations for old/new GNU make.
Shinichiro Hamajidc258cb2016-04-27 18:35:57 +0900144 expected.gsub!(' recipe for target ', ' commands for target ')
145 expected.gsub!(' recipe commences ', ' commands commence ')
146 expected.gsub!('missing rule before recipe.', 'missing rule before commands.')
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900147 expected.gsub!(' (did you mean TAB instead of 8 spaces?)', '')
148 expected.gsub!('Extraneous text after', 'extraneous text after')
149 # Not sure if this is useful.
150 expected.gsub!(/\s+Stop\.$/, '')
151 # GNU make 4.0 has this output.
152 expected.gsub!(/Makefile:\d+: commands for target ".*?" failed\n/, '')
153 # We treat some warnings as errors.
Shinichiro Hamaji2d2ed952016-04-28 16:50:46 +0900154 expected.gsub!(/^\/bin\/(ba)?sh: line 0: /, '')
Dan Willemsenf3a4ced2015-08-25 14:22:35 -0700155 # We print out some ninja warnings in some tests to match what we expect
156 # ninja to produce. Remove them if we're not testing ninja.
157 if !via_ninja
158 expected.gsub!(/^ninja: warning: .*\n/, '')
159 end
Shinichiro Hamajib7be8f12015-10-05 16:29:58 +0900160 # Normalization for "include foo" with C++ kati.
161 expected.gsub!(/(: )(\S+): (No such file or directory)\n\*\*\* No rule to make target "\2"./, '\1\2: \3')
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900162
163 expected
164end
165
166def normalize_kati_log(output)
Shinichiro Hamaji913eb742016-04-28 17:31:24 +0900167 output = normalize_quotes(output)
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900168 output = move_circular_dep(output)
Shinichiro Hamaji913eb742016-04-28 17:31:24 +0900169
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900170 # kati specific log messages.
171 output.gsub!(/^\*kati\*.*\n/, '')
Fumitoshi Ukaia43b96f2015-07-17 19:54:21 +0900172 output.gsub!(/^c?kati: /, '')
Fumitoshi Ukai08c1e942015-07-15 16:38:07 +0900173 output.gsub!(/\/bin\/sh: ([^:]*): command not found/,
174 "\\1: Command not found")
Shinichiro Hamajia06bee92015-08-05 17:13:05 +0900175 output.gsub!(/.*: warning for parse error in an unevaluated line: .*\n/, '')
Dan Willemsene41c7552017-02-22 14:31:16 -0800176 output.gsub!(/^([^ ]+: )?FindEmulator: /, '')
Fumitoshi Ukai2c6eff62015-08-11 17:50:56 +0900177 output.gsub!(/^\/bin\/sh: line 0: /, '')
Fumitoshi Ukaib0ede7d2015-07-29 10:19:05 +0900178 output.gsub!(/ (\.\/+)+kati\.\S+/, '') # kati log files in find_command.mk
179 output.gsub!(/ (\.\/+)+test\S+.json/, '') # json files in find_command.mk
Shinichiro Hamajib7be8f12015-10-05 16:29:58 +0900180 # Normalization for "include foo" with Go kati.
181 output.gsub!(/(: )open (\S+): n(o such file or directory)\nNOTE:.*/,
182 "\\1\\2: N\\3")
Dan Willemsene6ede252017-09-29 16:49:02 -0700183 # Bionic libc has different error messages than glibc
184 output.gsub!(/Too many symbolic links encountered/, 'Too many levels of symbolic links')
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900185 output
186end
187
Shinichiro Hamaji2d2ed952016-04-28 16:50:46 +0900188bash_var = ' SHELL=/bin/bash'
189
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900190run_make_test = proc do |mk|
191 c = File.read(mk)
Shinichiro Hamaji6a492922015-07-27 19:37:20 +0900192 expected_failure = false
Fumitoshi Ukaibfabe632015-07-28 15:26:56 +0900193 if c =~ /\A# TODO(?:\(([-a-z|]+)\))?/
Shinichiro Hamaji6a492922015-07-27 19:37:20 +0900194 if $1
195 todos = $1.split('|')
196 if todos.include?('go') && !ckati
197 expected_failure = true
198 end
199 if todos.include?('c') && ckati
200 expected_failure = true
201 end
Fumitoshi Ukaibfabe632015-07-28 15:26:56 +0900202 if todos.include?('go-ninja') && !ckati && via_ninja
203 expected_failure = true
204 end
205 if todos.include?('c-ninja') && ckati && via_ninja
206 expected_failure = true
207 end
Shinichiro Hamaji03fa3452016-04-27 17:08:32 +0900208 if todos.include?('c-exec') && ckati && !via_ninja
209 expected_failure = true
210 end
Shinichiro Hamaji6a492922015-07-27 19:37:20 +0900211 if todos.include?('ninja') && via_ninja
212 expected_failure = true
213 end
214 else
215 expected_failure = true
Shinichiro Hamajie919d002015-06-26 01:15:55 +0900216 end
217 end
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900218
219 run_in_testdir(mk) do |name|
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900220 File.open("Makefile", 'w') do |ofile|
221 ofile.print(c)
222 end
Shinichiro Hamaji91571ac2015-09-07 18:24:00 +0900223 File.symlink('../../testcase/submake', 'submake')
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900224
225 expected = ''
226 output = ''
227
Shinichiro Hamaji491e73f2015-04-07 12:41:59 +0900228 testcases = c.scan(/^test\d*/).sort.uniq
Shinichiro Hamaji497754d2015-03-31 02:02:11 +0900229 if testcases.empty?
230 testcases = ['']
231 end
Shinichiro Hamajie5be0142015-03-30 19:26:01 +0900232
Shinichiro Hamajib6a04542015-09-09 17:37:41 +0900233 is_silent_test = mk =~ /\/submake_/
234
Shinichiro Hamajie5be0142015-03-30 19:26:01 +0900235 cleanup
236 testcases.each do |tc|
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +0900237 cmd = 'make'
Shinichiro Hamajib6a04542015-09-09 17:37:41 +0900238 if via_ninja || is_silent_test
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +0900239 cmd += ' -s'
240 end
Shinichiro Hamaji2d2ed952016-04-28 16:50:46 +0900241 cmd += bash_var
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +0900242 cmd += " #{tc} 2>&1"
Shinichiro Hamaji913eb742016-04-28 17:31:24 +0900243 res = IO.popen(cmd, 'r:binary', &:read)
Dan Willemsenf3a4ced2015-08-25 14:22:35 -0700244 res = normalize_make_log(res, mk, via_ninja)
Shinichiro Hamaji74a66002015-04-27 16:42:30 +0900245 expected += "=== #{tc} ===\n" + res
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900246 expected_files = get_output_filenames
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900247 expected += "\n=== FILES ===\n#{expected_files * "\n"}\n"
Shinichiro Hamajie5be0142015-03-30 19:26:01 +0900248 end
249
250 cleanup
251 testcases.each do |tc|
Shinichiro Hamajic48d9ce2015-04-28 03:47:39 +0900252 json = "#{tc.empty? ? 'test' : tc}"
Fumitoshi Ukai0547db62015-07-29 16:20:59 +0900253 cmd = "../../kati -save_json=#{json}.json -log_dir=. --use_find_emulator"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900254 if ckati
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +0900255 cmd = "../../ckati --use_find_emulator"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900256 end
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +0900257 if via_ninja
258 cmd += ' --ninja'
259 end
Shinichiro Hamaji85620572015-10-03 11:25:15 +0900260 if gen_all_targets
261 if !ckati || !via_ninja
262 raise "-a should be used with -c -n"
263 end
264 cmd += ' --gen_all_targets'
265 end
Shinichiro Hamajib6a04542015-09-09 17:37:41 +0900266 if is_silent_test
267 cmd += ' -s'
268 end
Shinichiro Hamaji2d2ed952016-04-28 16:50:46 +0900269 cmd += bash_var
Shinichiro Hamaji6ff74ce2015-10-03 11:58:35 +0900270 if !gen_all_targets || mk =~ /makecmdgoals/
271 cmd += " #{tc}"
272 end
273 cmd += " 2>&1"
Shinichiro Hamajib674d582015-04-28 03:40:57 +0900274 res = IO.popen(cmd, 'r:binary', &:read)
Fumitoshi Ukai39837dd2015-07-28 12:25:56 +0900275 if via_ninja && File.exist?('build.ninja') && File.exists?('ninja.sh')
Shinichiro Hamaji85620572015-10-03 11:25:15 +0900276 cmd = './ninja.sh -j1 -v'
277 if gen_all_targets
278 cmd += " #{tc}"
279 end
280 cmd += ' 2>&1'
281 log = IO.popen(cmd, 'r:binary', &:read)
Shinichiro Hamaji86e11332015-07-28 15:24:17 +0900282 res += normalize_ninja_log(log, mk)
Shinichiro Hamaji8ac81712015-07-16 09:15:54 +0900283 end
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900284 res = normalize_kati_log(res)
Shinichiro Hamaji42f42e12015-04-13 14:26:45 +0900285 output += "=== #{tc} ===\n" + res
Shinichiro Hamajie5be0142015-03-30 19:26:01 +0900286 output_files = get_output_filenames
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900287 output += "\n=== FILES ===\n#{output_files * "\n"}\n"
288 end
289
290 File.open('out.make', 'w'){|ofile|ofile.print(expected)}
291 File.open('out.kati', 'w'){|ofile|ofile.print(output)}
292
Shinichiro Hamaji74c832f2015-04-09 14:54:39 +0900293 if expected =~ /FAIL/
294 puts %Q(#{name} has a string "FAIL" in its expectation)
295 exit 1
296 end
297
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900298 if expected != output
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +0900299 if expected_failure
Sasha Smundakb4482cb2018-08-23 11:21:28 -0700300 if !hide_passing
301 puts "#{name}: FAIL (expected)"
302 end
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900303 expected_failures << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +0900304 else
305 puts "#{name}: FAIL"
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900306 failures << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +0900307 end
Shinichiro Hamaji7f3a8702015-09-11 15:37:02 +0900308 if !expected_failure || show_failing
Shinichiro Hamaji221a16b2015-09-10 12:40:14 +0900309 puts `diff -u out.make out.kati`
310 end
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900311 else
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +0900312 if expected_failure
313 puts "#{name}: PASS (unexpected)"
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900314 unexpected_passes << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +0900315 else
Sasha Smundakb4482cb2018-08-23 11:21:28 -0700316 if !hide_passing
317 puts "#{name}: PASS"
318 end
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900319 passes << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +0900320 end
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900321 end
Shinichiro Hamajic48d9ce2015-04-28 03:47:39 +0900322
Shinichiro Hamajie666ac82015-04-28 04:18:13 +0900323 if name !~ /^err_/ && test_serialization && !expected_failure
Shinichiro Hamajic48d9ce2015-04-28 03:47:39 +0900324 testcases.each do |tc|
325 json = "#{tc.empty? ? 'test' : tc}"
Fumitoshi Ukai6450d0f2015-07-10 16:34:06 +0900326 cmd = "../../kati -save_json=#{json}_2.json -load_json=#{json}.json -n -log_dir=. #{tc} 2>&1"
Shinichiro Hamajic48d9ce2015-04-28 03:47:39 +0900327 res = IO.popen(cmd, 'r:binary', &:read)
328 if !File.exist?("#{json}.json") || !File.exist?("#{json}_2.json")
329 puts "#{name}##{json}: Serialize failure (not exist)"
Shinichiro Hamaji9f4f5d32015-04-28 03:53:49 +0900330 puts res
Shinichiro Hamajic48d9ce2015-04-28 03:47:39 +0900331 else
332 json1 = File.read("#{json}.json")
333 json2 = File.read("#{json}_2.json")
334 if json1 != json2
335 puts "#{name}##{json}: Serialize failure"
Shinichiro Hamaji9f4f5d32015-04-28 03:53:49 +0900336 puts res
Shinichiro Hamajic48d9ce2015-04-28 03:47:39 +0900337 end
338 end
339 end
340 end
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900341 end
342end
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900343
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900344run_shell_test = proc do |sh|
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900345 is_ninja_test = sh =~ /\/ninja_/
346 if is_ninja_test && (!ckati || !via_ninja)
347 next
348 end
349
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900350 run_in_testdir(sh) do |name|
351 cleanup
Sasha Smundake8f4d6d2018-07-27 10:34:04 -0700352 cmd = "bash ../../#{sh} make"
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900353 if is_ninja_test
354 cmd += ' -s'
355 end
Shinichiro Hamaji2d2ed952016-04-28 16:50:46 +0900356 cmd += bash_var
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900357 expected = IO.popen(cmd, 'r:binary', &:read)
358 cleanup
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900359
360 if is_ninja_test
361 if ckati
Sasha Smundake8f4d6d2018-07-27 10:34:04 -0700362 cmd = "bash ../../#{sh} ../../ckati --ninja --regen"
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900363 else
364 next
365 end
366 else
367 if ckati
Sasha Smundake8f4d6d2018-07-27 10:34:04 -0700368 cmd = "bash ../../#{sh} ../../ckati"
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900369 else
Sasha Smundake8f4d6d2018-07-27 10:34:04 -0700370 cmd = "bash ../../#{sh} ../../kati --use_cache -log_dir=."
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900371 end
372 end
Shinichiro Hamaji2d2ed952016-04-28 16:50:46 +0900373 cmd += bash_var
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900374
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900375 output = IO.popen(cmd, 'r:binary', &:read)
376
Dan Willemsenf3a4ced2015-08-25 14:22:35 -0700377 expected = normalize_make_log(expected, sh, is_ninja_test)
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900378 output = normalize_kati_log(output)
Shinichiro Hamaji09796ef2015-07-30 17:08:29 +0900379 if is_ninja_test
380 output = normalize_ninja_log(output, sh)
381 end
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900382 File.open('out.make', 'w'){|ofile|ofile.print(expected)}
383 File.open('out.kati', 'w'){|ofile|ofile.print(output)}
384
385 if expected != output
386 puts "#{name}: FAIL"
Shinichiro Hamaji39e62402015-05-20 19:34:58 +0900387 puts `diff -u out.make out.kati`
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900388 failures << name
389 else
Sasha Smundakb4482cb2018-08-23 11:21:28 -0700390 if !hide_passing
391 puts "#{name}: PASS"
392 end
Shinichiro Hamajia9bda7a2015-05-20 17:50:42 +0900393 passes << name
394 end
395 end
396end
397
398test_files.each do |test|
399 if /\.mk$/ =~ test
400 run_make_test.call(test)
401 elsif /\.sh$/ =~ test
402 run_shell_test.call(test)
403 else
404 raise "Unknown test type: #{test}"
405 end
406end
407
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900408puts
409
Sasha Smundakb4482cb2018-08-23 11:21:28 -0700410if !expected_failures.empty? && !hide_passing
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900411 puts "=== Expected failures ==="
412 expected_failures.each do |n|
413 puts n
414 end
415end
416
417if !unexpected_passes.empty?
418 puts "=== Unexpected passes ==="
419 unexpected_passes.each do |n|
420 puts n
421 end
422end
423
424if !failures.empty?
425 puts "=== Failures ==="
426 failures.each do |n|
427 puts n
428 end
429end
430
431puts
432
433if !unexpected_passes.empty? || !failures.empty?
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900434 puts "FAIL! (#{failures.size + unexpected_passes.size} fails #{passes.size} passes)"
Shinichiro Hamaji680e98b2015-10-05 17:30:43 +0900435 exit 1
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900436else
437 puts 'PASS!'
438end