tests/run-tests.py
changeset 972 0d4e44410b4d
parent 971 87b7569d7404
child 975 98fa0fa48b7d
equal deleted inserted replaced
969:1f47c6ec53d6 972:0d4e44410b4d
    76             start = time.time()
    76             start = time.time()
    77             while time.time() - start < timeout and p.returncode is None:
    77             while time.time() - start < timeout and p.returncode is None:
    78                 time.sleep(1)
    78                 time.sleep(1)
    79             p.timeout = True
    79             p.timeout = True
    80             if p.returncode is None:
    80             if p.returncode is None:
    81                 try:
    81                 terminate(p)
    82                     p.terminate()
       
    83                 except OSError:
       
    84                     pass
       
    85         threading.Thread(target=t).start()
    82         threading.Thread(target=t).start()
    86 
    83 
    87     return p
    84     return p
    88 
    85 
    89 # reserved exit code to skip test (used by hghave)
    86 # reserved exit code to skip test (used by hghave)
   260     if options.debug:
   257     if options.debug:
   261         if options.timeout != defaults['timeout']:
   258         if options.timeout != defaults['timeout']:
   262             sys.stderr.write(
   259             sys.stderr.write(
   263                 'warning: --timeout option ignored with --debug\n')
   260                 'warning: --timeout option ignored with --debug\n')
   264         options.timeout = 0
   261         options.timeout = 0
   265     if options.timeout and not hasattr(subprocess.Popen, 'terminate'):
       
   266         sys.stderr.write('warning: timeout is not supported on this '
       
   267                          'platform and will be ignored\n')
       
   268         options.timeout = 0
       
   269     if options.py3k_warnings:
   262     if options.py3k_warnings:
   270         if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
   263         if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
   271             parser.error('--py3k-warnings can only be used on Python 2.6+')
   264             parser.error('--py3k-warnings can only be used on Python 2.6+')
   272     if options.blacklist:
   265     if options.blacklist:
   273         options.blacklist = parselistfiles(options.blacklist, 'blacklist')
   266         options.blacklist = parselistfiles(options.blacklist, 'blacklist')
   340         found = findprogram(p)
   333         found = findprogram(p)
   341         if found:
   334         if found:
   342             vlog("# Found prerequisite", p, "at", found)
   335             vlog("# Found prerequisite", p, "at", found)
   343         else:
   336         else:
   344             print "WARNING: Did not find prerequisite tool: "+p
   337             print "WARNING: Did not find prerequisite tool: "+p
       
   338 
       
   339 def terminate(proc):
       
   340     """Terminate subprocess (with fallback for Python versions < 2.6)"""
       
   341     vlog('# Terminating process %d' % proc.pid)
       
   342     try:
       
   343         if hasattr(proc, 'terminate'):
       
   344             proc.terminate()
       
   345         else:
       
   346             os.kill(proc.pid, signal.SIGTERM)
       
   347     except OSError:
       
   348         pass
   345 
   349 
   346 def killdaemons():
   350 def killdaemons():
   347     # Kill off any leftover daemon processes
   351     # Kill off any leftover daemon processes
   348     try:
   352     try:
   349         fp = open(DAEMON_PIDS)
   353         fp = open(DAEMON_PIDS)
   649         ret = proc.wait()
   653         ret = proc.wait()
   650         return (ret, None)
   654         return (ret, None)
   651 
   655 
   652     proc = Popen4(cmd, wd, options.timeout)
   656     proc = Popen4(cmd, wd, options.timeout)
   653     def cleanup():
   657     def cleanup():
   654         try:
   658         terminate(proc)
   655             proc.terminate()
       
   656         except OSError:
       
   657             pass
       
   658         ret = proc.wait()
   659         ret = proc.wait()
   659         if ret == 0:
   660         if ret == 0:
   660             ret = signal.SIGTERM << 8
   661             ret = signal.SIGTERM << 8
   661         killdaemons()
   662         killdaemons()
   662         return ret
   663         return ret