Mercurial > hg
comparison tests/run-tests.py @ 6244:b36774d0fce1
run-tests.py: add a summary of failed tests at the end
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Thu, 13 Mar 2008 17:39:30 +0100 |
parents | e75aab656f46 |
children | 1f9be57a6d6a |
comparison
equal
deleted
inserted
replaced
6243:437eef39458d | 6244:b36774d0fce1 |
---|---|
265 ret = signal.SIGTERM << 8 | 265 ret = signal.SIGTERM << 8 |
266 output += ("\n### Abort: timeout after %d seconds.\n" | 266 output += ("\n### Abort: timeout after %d seconds.\n" |
267 % options.timeout) | 267 % options.timeout) |
268 return ret, splitnewlines(output) | 268 return ret, splitnewlines(output) |
269 | 269 |
270 def run_one(test, skips): | 270 def run_one(test, skips, fails): |
271 '''tristate output: | 271 '''tristate output: |
272 None -> skipped | 272 None -> skipped |
273 True -> passed | 273 True -> passed |
274 False -> failed''' | 274 False -> failed''' |
275 | 275 |
276 def skip(msg): | 276 def skip(msg): |
277 if not verbose: | 277 if not verbose: |
278 skips.append((test, msg)) | 278 skips.append((test, msg)) |
279 else: | 279 else: |
280 print "\nSkipping %s: %s" % (test, msg) | 280 print "\nSkipping %s: %s" % (test, msg) |
281 return None | |
282 | |
283 def fail(msg): | |
284 fails.append((test, msg)) | |
285 print "\nERROR: %s %s" % (test, msg) | |
281 return None | 286 return None |
282 | 287 |
283 vlog("# Test", test) | 288 vlog("# Test", test) |
284 | 289 |
285 # create a fresh hgrc | 290 # create a fresh hgrc |
350 f.close() | 355 f.close() |
351 else: | 356 else: |
352 ref_out = [] | 357 ref_out = [] |
353 if not skipped and out != ref_out: | 358 if not skipped and out != ref_out: |
354 diffret = 1 | 359 diffret = 1 |
355 print "\nERROR: %s output changed" % (test) | 360 fail("output changed") |
356 show_diff(ref_out, out) | 361 show_diff(ref_out, out) |
357 if skipped: | 362 if skipped: |
358 missing = extract_missing_features(out) | 363 missing = extract_missing_features(out) |
359 if not missing: | 364 if not missing: |
360 missing = ['irrelevant'] | 365 missing = ['irrelevant'] |
361 skip(missing[-1]) | 366 skip(missing[-1]) |
362 elif ret: | 367 elif ret: |
363 print "\nERROR: %s failed with error code %d" % (test, ret) | 368 fail("returned error code %d" % ret) |
364 elif diffret: | 369 elif diffret: |
365 ret = diffret | 370 ret = diffret |
366 | 371 |
367 if not verbose: | 372 if not verbose: |
368 sys.stdout.write(skipped and 's' or '.') | 373 sys.stdout.write(skipped and 's' or '.') |
472 fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r') | 477 fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r') |
473 os.close(wfd) | 478 os.close(wfd) |
474 failures = 0 | 479 failures = 0 |
475 tested, skipped, failed = 0, 0, 0 | 480 tested, skipped, failed = 0, 0, 0 |
476 skips = [] | 481 skips = [] |
482 fails = [] | |
477 while fps: | 483 while fps: |
478 pid, status = os.wait() | 484 pid, status = os.wait() |
479 fp = fps.pop(pid) | 485 fp = fps.pop(pid) |
480 l = fp.read().splitlines() | 486 l = fp.read().splitlines() |
481 test, skip, fail = map(int, l[:3]) | 487 test, skip, fail = map(int, l[:3]) |
482 for s in l[3:]: | 488 split = -fail or len(l) |
489 for s in l[3:split]: | |
483 skips.append(s.split(" ", 1)) | 490 skips.append(s.split(" ", 1)) |
491 for s in l[split:]: | |
492 fails.append(s.split(" ", 1)) | |
484 tested += test | 493 tested += test |
485 skipped += skip | 494 skipped += skip |
486 failed += fail | 495 failed += fail |
487 vlog('pid %d exited, status %d' % (pid, status)) | 496 vlog('pid %d exited, status %d' % (pid, status)) |
488 failures |= status | 497 failures |= status |
489 print | 498 print |
490 for s in skips: | 499 for s in skips: |
491 print "Skipped %s: %s" % (s[0], s[1]) | 500 print "Skipped %s: %s" % (s[0], s[1]) |
501 for s in fails: | |
502 print "Failed %s: %s" % (s[0], s[1]) | |
492 print "# Ran %d tests, %d skipped, %d failed." % ( | 503 print "# Ran %d tests, %d skipped, %d failed." % ( |
493 tested, skipped, failed) | 504 tested, skipped, failed) |
494 sys.exit(failures != 0) | 505 sys.exit(failures != 0) |
495 | 506 |
496 def run_tests(tests): | 507 def run_tests(tests): |
524 if not tests: | 535 if not tests: |
525 print "running all tests" | 536 print "running all tests" |
526 tests = orig | 537 tests = orig |
527 | 538 |
528 skips = [] | 539 skips = [] |
540 fails = [] | |
529 for test in tests: | 541 for test in tests: |
530 if options.retest and not os.path.exists(test + ".err"): | 542 if options.retest and not os.path.exists(test + ".err"): |
531 skipped += 1 | 543 skipped += 1 |
532 continue | 544 continue |
533 ret = run_one(test, skips) | 545 ret = run_one(test, skips, fails) |
534 if ret is None: | 546 if ret is None: |
535 skipped += 1 | 547 skipped += 1 |
536 elif not ret: | 548 elif not ret: |
537 if options.interactive: | 549 if options.interactive: |
538 print "Accept this change? [n] ", | 550 print "Accept this change? [n] ", |
549 if options.child: | 561 if options.child: |
550 fp = os.fdopen(options.child, 'w') | 562 fp = os.fdopen(options.child, 'w') |
551 fp.write('%d\n%d\n%d\n' % (tested, skipped, failed)) | 563 fp.write('%d\n%d\n%d\n' % (tested, skipped, failed)) |
552 for s in skips: | 564 for s in skips: |
553 fp.write("%s %s\n" % s) | 565 fp.write("%s %s\n" % s) |
566 for s in fails: | |
567 fp.write("%s %s\n" % s) | |
554 fp.close() | 568 fp.close() |
555 else: | 569 else: |
556 print | 570 print |
557 for s in skips: | 571 for s in skips: |
558 print "Skipped %s: %s" % s | 572 print "Skipped %s: %s" % s |
573 for s in fails: | |
574 print "Failed %s: %s" % s | |
559 print "# Ran %d tests, %d skipped, %d failed." % ( | 575 print "# Ran %d tests, %d skipped, %d failed." % ( |
560 tested, skipped, failed) | 576 tested, skipped, failed) |
561 | 577 |
562 if coverage: | 578 if coverage: |
563 output_coverage() | 579 output_coverage() |