tests/run-tests.py
changeset 8095 f5428d4ffd97
parent 8094 60a9e3cf0cf4
child 8096 a110d7a20f3f
equal deleted inserted replaced
8094:60a9e3cf0cf4 8095:f5428d4ffd97
    44     'jobs': ('HGTEST_JOBS', 1),
    44     'jobs': ('HGTEST_JOBS', 1),
    45     'timeout': ('HGTEST_TIMEOUT', 180),
    45     'timeout': ('HGTEST_TIMEOUT', 180),
    46     'port': ('HGTEST_PORT', 20059),
    46     'port': ('HGTEST_PORT', 20059),
    47 }
    47 }
    48 
    48 
    49 # globals set by parse_args() (ugh)
    49 python = sys.executable
    50 verbose = False
       
    51 nodiff = False
       
    52 coverage = False
       
    53 python = None
       
    54 
    50 
    55 def parse_args():
    51 def parse_args():
    56     parser = optparse.OptionParser("%prog [options] [tests]")
    52     parser = optparse.OptionParser("%prog [options] [tests]")
    57     parser.add_option("-C", "--annotate", action="store_true",
    53     parser.add_option("-C", "--annotate", action="store_true",
    58         help="output files annotated with coverage")
    54         help="output files annotated with coverage")
    96     for option, default in defaults.items():
    92     for option, default in defaults.items():
    97         defaults[option] = int(os.environ.get(*default))
    93         defaults[option] = int(os.environ.get(*default))
    98     parser.set_defaults(**defaults)
    94     parser.set_defaults(**defaults)
    99     (options, args) = parser.parse_args()
    95     (options, args) = parser.parse_args()
   100 
    96 
   101     global verbose, nodiff, coverage, python
    97     global vlog
   102     verbose = options.verbose
    98     options.anycoverage = (options.cover or
   103     nodiff = options.nodiff
    99                            options.cover_stdlib or
   104     coverage = options.cover or options.cover_stdlib or options.annotate
   100                            options.annotate)
   105     python = sys.executable
   101 
       
   102     if options.verbose:
       
   103         def vlog(*msg):
       
   104             for m in msg:
       
   105                 print m,
       
   106             print
       
   107     else:
       
   108         vlog = lambda *msg: None
   106 
   109 
   107     if options.jobs < 1:
   110     if options.jobs < 1:
   108         print >> sys.stderr, 'ERROR: -j/--jobs must be positive'
   111         print >> sys.stderr, 'ERROR: -j/--jobs must be positive'
   109         sys.exit(1)
   112         sys.exit(1)
   110     if options.interactive and options.jobs > 1:
   113     if options.interactive and options.jobs > 1:
   117     """Like os.rename(), trade atomicity and opened files friendliness
   120     """Like os.rename(), trade atomicity and opened files friendliness
   118     for existing destination support.
   121     for existing destination support.
   119     """
   122     """
   120     shutil.copy(src, dst)
   123     shutil.copy(src, dst)
   121     os.remove(src)
   124     os.remove(src)
   122 
       
   123 def vlog(*msg):
       
   124     if verbose:
       
   125         for m in msg:
       
   126             print m,
       
   127         print
       
   128 
   125 
   129 def splitnewlines(text):
   126 def splitnewlines(text):
   130     '''like str.splitlines, but only split on newlines.
   127     '''like str.splitlines, but only split on newlines.
   131     keep line endings.'''
   128     keep line endings.'''
   132     i = 0
   129     i = 0
   183         else:
   180         else:
   184             print "WARNING: Did not find prerequisite tool: "+p
   181             print "WARNING: Did not find prerequisite tool: "+p
   185 
   182 
   186 def cleanup_exit(options):
   183 def cleanup_exit(options):
   187     if not options.keep_tmpdir:
   184     if not options.keep_tmpdir:
   188         if verbose:
   185         if options.verbose:
   189             print "# Cleaning up HGTMP", HGTMP
   186             print "# Cleaning up HGTMP", HGTMP
   190         shutil.rmtree(HGTMP, True)
   187         shutil.rmtree(HGTMP, True)
   191 
   188 
   192 def use_correct_python():
   189 def use_correct_python():
   193     # some tests run python interpreter. they must use same
   190     # some tests run python interpreter. they must use same
   218            ' install --force --prefix="%s" --install-lib="%s"'
   215            ' install --force --prefix="%s" --install-lib="%s"'
   219            ' --install-scripts="%s" >%s 2>&1'
   216            ' --install-scripts="%s" >%s 2>&1'
   220            % (sys.executable, pure, INST, PYTHONDIR, BINDIR, installerrs))
   217            % (sys.executable, pure, INST, PYTHONDIR, BINDIR, installerrs))
   221     vlog("# Running", cmd)
   218     vlog("# Running", cmd)
   222     if os.system(cmd) == 0:
   219     if os.system(cmd) == 0:
   223         if not verbose:
   220         if not options.verbose:
   224             os.remove(installerrs)
   221             os.remove(installerrs)
   225     else:
   222     else:
   226         f = open(installerrs)
   223         f = open(installerrs)
   227         for line in f:
   224         for line in f:
   228             print line,
   225             print line,
   254             '        files += 1\n'
   251             '        files += 1\n'
   255             'sys.stdout.write("files patched: %d\\n" % files)\n')
   252             'sys.stdout.write("files patched: %d\\n" % files)\n')
   256     f.close()
   253     f.close()
   257     os.chmod(os.path.join(BINDIR, 'diffstat'), 0700)
   254     os.chmod(os.path.join(BINDIR, 'diffstat'), 0700)
   258 
   255 
   259     if coverage:
   256     if options.anycoverage:
   260         vlog("# Installing coverage wrapper")
   257         vlog("# Installing coverage wrapper")
   261         os.environ['COVERAGE_FILE'] = COVERAGE_FILE
   258         os.environ['COVERAGE_FILE'] = COVERAGE_FILE
   262         if os.path.exists(COVERAGE_FILE):
   259         if os.path.exists(COVERAGE_FILE):
   263             os.unlink(COVERAGE_FILE)
   260             os.unlink(COVERAGE_FILE)
   264         # Create a wrapper script to invoke hg via coverage.py
   261         # Create a wrapper script to invoke hg via coverage.py
   344     None -> skipped
   341     None -> skipped
   345     True -> passed
   342     True -> passed
   346     False -> failed'''
   343     False -> failed'''
   347 
   344 
   348     def skip(msg):
   345     def skip(msg):
   349         if not verbose:
   346         if not options.verbose:
   350             skips.append((test, msg))
   347             skips.append((test, msg))
   351         else:
   348         else:
   352             print "\nSkipping %s: %s" % (test, msg)
   349             print "\nSkipping %s: %s" % (test, msg)
   353         return None
   350         return None
   354 
   351 
   355     def fail(msg):
   352     def fail(msg):
   356         fails.append((test, msg))
   353         fails.append((test, msg))
   357         if not nodiff:
   354         if not options.nodiff:
   358             print "\nERROR: %s %s" % (test, msg)
   355             print "\nERROR: %s %s" % (test, msg)
   359         return None
   356         return None
   360 
   357 
   361     vlog("# Test", test)
   358     vlog("# Test", test)
   362 
   359 
   445         mark = '!'
   442         mark = '!'
   446         if ret:
   443         if ret:
   447             fail("output changed and returned error code %d" % ret)
   444             fail("output changed and returned error code %d" % ret)
   448         else:
   445         else:
   449             fail("output changed")
   446             fail("output changed")
   450         if not nodiff:
   447         if not options.nodiff:
   451             show_diff(ref_out, out)
   448             show_diff(ref_out, out)
   452         ret = 1
   449         ret = 1
   453     elif ret:
   450     elif ret:
   454         mark = '!'
   451         mark = '!'
   455         fail("returned error code %d" % ret)
   452         fail("returned error code %d" % ret)
   456 
   453 
   457     if not verbose:
   454     if not options.verbose:
   458         sys.stdout.write(mark)
   455         sys.stdout.write(mark)
   459         sys.stdout.flush()
   456         sys.stdout.flush()
   460 
   457 
   461     if ret != 0 and not skipped:
   458     if ret != 0 and not skipped:
   462         # Save errors to a file for diagnosis
   459         # Save errors to a file for diagnosis
   636             if hgpkg != expecthg:
   633             if hgpkg != expecthg:
   637                 print '# Tested unexpected mercurial: %s' % hgpkg
   634                 print '# Tested unexpected mercurial: %s' % hgpkg
   638             print "# Ran %d tests, %d skipped, %d failed." % (
   635             print "# Ran %d tests, %d skipped, %d failed." % (
   639                 tested, skipped, failed)
   636                 tested, skipped, failed)
   640 
   637 
   641         if coverage:
   638         if options.anycoverage:
   642             output_coverage(options)
   639             output_coverage(options)
   643     except KeyboardInterrupt:
   640     except KeyboardInterrupt:
   644         failed = True
   641         failed = True
   645         print "\ninterrupted!"
   642         print "\ninterrupted!"
   646 
   643