comparison tests/run-tests.py @ 5470:8374f3f081f2

tests: tidy up reporting of skipped tests if not verbose: - print 's' rather than '.' - pass skipped test reports back to parent for -j - report which tests were skipped at the end - print '.' after test completion
author Matt Mackall <mpm@selenic.com>
date Fri, 19 Oct 2007 12:53:43 -0500
parents 557e4a916e12
children d0a022d5871e
comparison
equal deleted inserted replaced
5469:b12432b1c2c7 5470:8374f3f081f2
255 ret = signal.SIGTERM << 8 255 ret = signal.SIGTERM << 8
256 output += ("\n### Abort: timeout after %d seconds.\n" 256 output += ("\n### Abort: timeout after %d seconds.\n"
257 % options.timeout) 257 % options.timeout)
258 return ret, splitnewlines(output) 258 return ret, splitnewlines(output)
259 259
260 def run_one(test): 260 def run_one(test, skips):
261 '''tristate output: 261 '''tristate output:
262 None -> skipped 262 None -> skipped
263 True -> passed 263 True -> passed
264 False -> failed''' 264 False -> failed'''
265 265
266 def skip(msg):
267 if not verbose:
268 skips.append((test, msg))
269 sys.stdout.write('s')
270 sys.stdout.flush()
271 else:
272 print "\nSkipping %s: %s" % (test, msg)
273 return None
274
266 vlog("# Test", test) 275 vlog("# Test", test)
267 if not verbose:
268 sys.stdout.write('.')
269 sys.stdout.flush()
270 276
271 # create a fresh hgrc 277 # create a fresh hgrc
272 hgrc = file(HGRCPATH, 'w+') 278 hgrc = file(HGRCPATH, 'w+')
273 hgrc.write('[ui]\n') 279 hgrc.write('[ui]\n')
274 hgrc.write('slash = True\n') 280 hgrc.write('slash = True\n')
297 if lctest.endswith('.py') or firstline == '#!/usr/bin/env python': 303 if lctest.endswith('.py') or firstline == '#!/usr/bin/env python':
298 cmd = '%s "%s"' % (python, testpath) 304 cmd = '%s "%s"' % (python, testpath)
299 elif lctest.endswith('.bat'): 305 elif lctest.endswith('.bat'):
300 # do not run batch scripts on non-windows 306 # do not run batch scripts on non-windows
301 if os.name != 'nt': 307 if os.name != 'nt':
302 print '\nSkipping %s: batch script' % test 308 return skip("batch script")
303 return None
304 # To reliably get the error code from batch files on WinXP, 309 # To reliably get the error code from batch files on WinXP,
305 # the "cmd /c call" prefix is needed. Grrr 310 # the "cmd /c call" prefix is needed. Grrr
306 cmd = 'cmd /c call "%s"' % testpath 311 cmd = 'cmd /c call "%s"' % testpath
307 else: 312 else:
308 # do not run shell scripts on windows 313 # do not run shell scripts on windows
309 if os.name == 'nt': 314 if os.name == 'nt':
310 print '\nSkipping %s: shell script' % test 315 return skip("shell script")
311 return None
312 # do not try to run non-executable programs 316 # do not try to run non-executable programs
313 if not os.access(testpath, os.X_OK): 317 if not os.access(testpath, os.X_OK):
314 print '\nSkipping %s: not executable' % test 318 return skip("not executable")
315 return None
316 cmd = '"%s"' % testpath 319 cmd = '"%s"' % testpath
317 320
318 if options.timeout > 0: 321 if options.timeout > 0:
319 signal.alarm(options.timeout) 322 signal.alarm(options.timeout)
320 323
340 show_diff(ref_out, out) 343 show_diff(ref_out, out)
341 if skipped: 344 if skipped:
342 missing = extract_missing_features(out) 345 missing = extract_missing_features(out)
343 if not missing: 346 if not missing:
344 missing = ['irrelevant'] 347 missing = ['irrelevant']
345 print '\nSkipping %s: %s' % (test, missing[-1]) 348 skip(missing[-1])
346 elif ret: 349 elif ret:
347 print "\nERROR: %s failed with error code %d" % (test, ret) 350 print "\nERROR: %s failed with error code %d" % (test, ret)
348 elif diffret: 351 elif diffret:
349 ret = diffret 352 ret = diffret
353
354 if not verbose:
355 sys.stdout.write('.')
356 sys.stdout.flush()
350 357
351 if ret != 0 and not skipped: 358 if ret != 0 and not skipped:
352 # Save errors to a file for diagnosis 359 # Save errors to a file for diagnosis
353 f = open(err, "wb") 360 f = open(err, "wb")
354 for line in out: 361 for line in out:
451 vlog(' '.join(cmdline)) 458 vlog(' '.join(cmdline))
452 fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r') 459 fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r')
453 os.close(wfd) 460 os.close(wfd)
454 failures = 0 461 failures = 0
455 tested, skipped, failed = 0, 0, 0 462 tested, skipped, failed = 0, 0, 0
463 skips = []
456 while fps: 464 while fps:
457 pid, status = os.wait() 465 pid, status = os.wait()
458 fp = fps.pop(pid) 466 fp = fps.pop(pid)
459 test, skip, fail = map(int, fp.read().splitlines()) 467 l = fp.read().splitlines()
468 test, skip, fail = map(int, l[:3])
469 for s in l[3:]:
470 skips.append(s.split(" ", 1))
460 tested += test 471 tested += test
461 skipped += skip 472 skipped += skip
462 failed += fail 473 failed += fail
463 vlog('pid %d exited, status %d' % (pid, status)) 474 vlog('pid %d exited, status %d' % (pid, status))
464 failures |= status 475 failures |= status
465 print "\n# Ran %d tests, %d skipped, %d failed." % ( 476 print
477 for s in skips:
478 print "Skipped %s: %s" % (s[0], s[1])
479 print "# Ran %d tests, %d skipped, %d failed." % (
466 tested, skipped, failed) 480 tested, skipped, failed)
467 sys.exit(failures != 0) 481 sys.exit(failures != 0)
468 482
469 def run_tests(tests): 483 def run_tests(tests):
470 global DAEMON_PIDS, HGRCPATH 484 global DAEMON_PIDS, HGRCPATH
496 tests.pop(0) 510 tests.pop(0)
497 if not tests: 511 if not tests:
498 print "running all tests" 512 print "running all tests"
499 tests = orig 513 tests = orig
500 514
515 skips = []
501 for test in tests: 516 for test in tests:
502 if options.retest and not os.path.exists(test + ".err"): 517 if options.retest and not os.path.exists(test + ".err"):
503 skipped += 1 518 skipped += 1
504 continue 519 continue
505 ret = run_one(test) 520 ret = run_one(test, skips)
506 if ret is None: 521 if ret is None:
507 skipped += 1 522 skipped += 1
508 elif not ret: 523 elif not ret:
509 if options.interactive: 524 if options.interactive:
510 print "Accept this change? [n] ", 525 print "Accept this change? [n] ",
519 tested += 1 534 tested += 1
520 535
521 if options.child: 536 if options.child:
522 fp = os.fdopen(options.child, 'w') 537 fp = os.fdopen(options.child, 'w')
523 fp.write('%d\n%d\n%d\n' % (tested, skipped, failed)) 538 fp.write('%d\n%d\n%d\n' % (tested, skipped, failed))
539 for s in skips:
540 fp.write("%s %s\n" % s)
524 fp.close() 541 fp.close()
525 else: 542 else:
526 print "\n# Ran %d tests, %d skipped, %d failed." % ( 543 print
544 for s in skips:
545 print "Skipped %s: %s" % s
546 print "# Ran %d tests, %d skipped, %d failed." % (
527 tested, skipped, failed) 547 tested, skipped, failed)
528 548
529 if coverage: 549 if coverage:
530 output_coverage() 550 output_coverage()
531 except KeyboardInterrupt: 551 except KeyboardInterrupt: