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()