561 |
561 |
562 def run(self): |
562 def run(self): |
563 env = self._getenv() |
563 env = self._getenv() |
564 createhgrc(env['HGRCPATH'], self._options) |
564 createhgrc(env['HGRCPATH'], self._options) |
565 |
565 |
|
566 result = TestResult() |
|
567 starttime = time.time() |
|
568 |
|
569 def updateduration(): |
|
570 result.duration = time.time() - starttime |
|
571 |
566 try: |
572 try: |
567 return self._run(self._replacements, env) |
573 ret, out = self._run(self._replacements, env) |
568 finally: |
574 updateduration() |
569 killdaemons(env['DAEMON_PIDS']) |
575 result.ret = ret |
|
576 result.out = out |
|
577 except KeyboardInterrupt: |
|
578 updateduration() |
|
579 result.interrupted = True |
|
580 except Exception, e: |
|
581 updateduration() |
|
582 result.exception = e |
|
583 |
|
584 killdaemons(env['DAEMON_PIDS']) |
|
585 |
|
586 return result |
570 |
587 |
571 def _run(self, replacements, env): |
588 def _run(self, replacements, env): |
572 raise NotImplemented('Subclasses must implement Test.run()') |
589 raise NotImplemented('Subclasses must implement Test.run()') |
573 |
590 |
574 def _setreplacements(self, count): |
591 def _setreplacements(self, count): |
622 for k in env.keys(): |
639 for k in env.keys(): |
623 if k.startswith('HG_'): |
640 if k.startswith('HG_'): |
624 del env[k] |
641 del env[k] |
625 |
642 |
626 return env |
643 return env |
|
644 |
|
645 class TestResult(object): |
|
646 """Holds the result of a test execution.""" |
|
647 |
|
648 def __init__(self): |
|
649 self.ret = None |
|
650 self.out = None |
|
651 self.duration = None |
|
652 self.interrupted = False |
|
653 self.exception = None |
627 |
654 |
628 def pytest(test, wd, options, replacements, env): |
655 def pytest(test, wd, options, replacements, env): |
629 py3kswitch = options.py3k_warnings and ' -3' or '' |
656 py3kswitch = options.py3k_warnings and ' -3' or '' |
630 cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test) |
657 cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test) |
631 vlog("# Running", cmd) |
658 vlog("# Running", cmd) |
1023 |
1050 |
1024 if os.path.exists(err): |
1051 if os.path.exists(err): |
1025 os.remove(err) # Remove any previous output files |
1052 os.remove(err) # Remove any previous output files |
1026 |
1053 |
1027 t = runner(testpath, options, count) |
1054 t = runner(testpath, options, count) |
1028 |
1055 res = t.run() |
1029 starttime = time.time() |
1056 |
1030 try: |
1057 if res.interrupted: |
1031 ret, out = t.run() |
1058 log('INTERRUPTED: %s (after %d seconds)' % (test, res.duration)) |
1032 except KeyboardInterrupt: |
1059 raise KeyboardInterrupt() |
1033 endtime = time.time() |
1060 |
1034 log('INTERRUPTED: %s (after %d seconds)' % (test, endtime - starttime)) |
1061 if res.exception: |
1035 raise |
1062 return fail('Exception during execution: %s' % res.exception, 255) |
1036 endtime = time.time() |
1063 |
1037 times.append((test, endtime - starttime)) |
1064 ret = res.ret |
|
1065 out = res.out |
|
1066 |
|
1067 times.append((test, res.duration)) |
1038 vlog("# Ret was:", ret) |
1068 vlog("# Ret was:", ret) |
1039 |
1069 |
1040 skipped = (ret == SKIPPED_STATUS) |
1070 skipped = (ret == SKIPPED_STATUS) |
1041 |
1071 |
1042 # If we're not in --debug mode and reference output file exists, |
1072 # If we're not in --debug mode and reference output file exists, |