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