16 import shutil |
16 import shutil |
17 import signal |
17 import signal |
18 import sys |
18 import sys |
19 import tempfile |
19 import tempfile |
20 import time |
20 import time |
|
21 |
|
22 # hghave reserved exit code to skip test |
|
23 SKIPPED_STATUS = 80 |
21 |
24 |
22 required_tools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"] |
25 required_tools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"] |
23 |
26 |
24 parser = optparse.OptionParser("%prog [options] [tests]") |
27 parser = optparse.OptionParser("%prog [options] [tests]") |
25 parser.add_option("-v", "--verbose", action="store_true", |
28 parser.add_option("-v", "--verbose", action="store_true", |
65 if last: |
68 if last: |
66 lines.append(last) |
69 lines.append(last) |
67 return lines |
70 return lines |
68 lines.append(text[i:n+1]) |
71 lines.append(text[i:n+1]) |
69 i = n + 1 |
72 i = n + 1 |
|
73 |
|
74 def extract_missing_features(lines): |
|
75 '''Extract missing/unknown features log lines as a list''' |
|
76 missing = [] |
|
77 for line in lines: |
|
78 if not line.startswith('hghave: '): |
|
79 continue |
|
80 line = line.splitlines()[0] |
|
81 missing.append(line[8:]) |
|
82 |
|
83 return missing |
70 |
84 |
71 def show_diff(expected, output): |
85 def show_diff(expected, output): |
72 for line in difflib.unified_diff(expected, output, |
86 for line in difflib.unified_diff(expected, output, |
73 "Expected output", "Test output"): |
87 "Expected output", "Test output"): |
74 sys.stdout.write(line) |
88 sys.stdout.write(line) |
281 vlog("# Ret was:", ret) |
295 vlog("# Ret was:", ret) |
282 |
296 |
283 if options.timeout > 0: |
297 if options.timeout > 0: |
284 signal.alarm(0) |
298 signal.alarm(0) |
285 |
299 |
|
300 skipped = (ret == SKIPPED_STATUS) |
286 diffret = 0 |
301 diffret = 0 |
287 # If reference output file exists, check test output against it |
302 # If reference output file exists, check test output against it |
288 if os.path.exists(ref): |
303 if os.path.exists(ref): |
289 f = open(ref, "r") |
304 f = open(ref, "r") |
290 ref_out = splitnewlines(f.read()) |
305 ref_out = splitnewlines(f.read()) |
291 f.close() |
306 f.close() |
292 else: |
307 else: |
293 ref_out = [] |
308 ref_out = [] |
294 if out != ref_out: |
309 if not skipped and out != ref_out: |
295 diffret = 1 |
310 diffret = 1 |
296 print "\nERROR: %s output changed" % (test) |
311 print "\nERROR: %s output changed" % (test) |
297 show_diff(ref_out, out) |
312 show_diff(ref_out, out) |
298 if ret: |
313 if skipped: |
|
314 missing = extract_missing_features(out) |
|
315 if not missing: |
|
316 missing = ['irrelevant'] |
|
317 print '\nSkipping %s: %s' % (test, missing[-1]) |
|
318 elif ret: |
299 print "\nERROR: %s failed with error code %d" % (test, ret) |
319 print "\nERROR: %s failed with error code %d" % (test, ret) |
300 elif diffret: |
320 elif diffret: |
301 ret = diffret |
321 ret = diffret |
302 |
322 |
303 if ret != 0: # Save errors to a file for diagnosis |
323 if ret != 0 and not skipped: |
|
324 # Save errors to a file for diagnosis |
304 f = open(err, "wb") |
325 f = open(err, "wb") |
305 for line in out: |
326 for line in out: |
306 f.write(line) |
327 f.write(line) |
307 f.close() |
328 f.close() |
308 |
329 |