run-tests: remove global abort flag
authorGregory Szorc <gregory.szorc@gmail.com>
Tue, 22 Apr 2014 12:35:18 -0700
changeset 21520 fa6ba4372678
parent 21519 25d5a9ecbb85
child 21521 855f092c96e5
run-tests: remove global abort flag The global abort flag has been moved into each Test instance. A Test.abort() accomplishing the same thing has been added.
tests/run-tests.py
--- a/tests/run-tests.py	Thu May 08 16:50:22 2014 -0700
+++ b/tests/run-tests.py	Tue Apr 22 12:35:18 2014 -0700
@@ -338,7 +338,7 @@
     # Status code reserved for skipped tests (used by hghave).
     SKIPPED_STATUS = 80
 
-    def __init__(self, path, tmpdir, abort, keeptmpdir=False,
+    def __init__(self, path, tmpdir, keeptmpdir=False,
                  debug=False, nodiff=False, diffviewer=None,
                  interactive=False, timeout=defaults['timeout'],
                  startport=defaults['port'], extraconfigopts=None,
@@ -349,9 +349,6 @@
 
         tmpdir is the main temporary directory to use for this test.
 
-        abort is a flag that turns to True if test execution should be aborted.
-        It is consulted periodically during the execution of tests.
-
         keeptmpdir determines whether to keep the test's temporary directory
         after execution. It defaults to removal (False).
 
@@ -388,7 +385,6 @@
         self.errpath = os.path.join(self._testdir, '%s.err' % self.name)
 
         self._threadtmp = tmpdir
-        self._abort = abort
         self._keeptmpdir = keeptmpdir
         self._debug = debug
         self._nodiff = nodiff
@@ -399,8 +395,9 @@
         self._extraconfigopts = extraconfigopts or []
         self._py3kwarnings = py3kwarnings
         self._shell = shell
+
+        self._aborted = False
         self._daemonpids = []
-
         self._finished = None
         self._ret = None
         self._out = None
@@ -447,12 +444,11 @@
 
     def run(self, result):
         result.startTest(self)
-        interrupted = False
         try:
             try:
                 self.setUp()
             except (KeyboardInterrupt, SystemExit):
-                interrupted = True
+                self._aborted = True
                 raise
             except Exception:
                 result.addError(self, sys.exc_info())
@@ -462,7 +458,7 @@
             try:
                 self.runTest()
             except KeyboardInterrupt:
-                interrupted = True
+                self._aborted = True
                 raise
             except SkipTest, e:
                 result.addSkip(self, str(e))
@@ -484,7 +480,7 @@
             try:
                 self.tearDown()
             except (KeyboardInterrupt, SystemExit):
-                interrupted = True
+                self._aborted = True
                 raise
             except Exception:
                 result.addError(self, sys.exc_info())
@@ -493,7 +489,7 @@
             if success:
                 result.addSuccess(self)
         finally:
-            result.stopTest(self, interrupted=interrupted)
+            result.stopTest(self, interrupted=self._aborted)
 
     def runTest(self):
         """Run this test instance.
@@ -589,6 +585,10 @@
         # This should be implemented in child classes to run tests.
         raise SkipTest('unknown test type')
 
+    def abort(self):
+        """Terminate execution of this test."""
+        self._aborted = True
+
     def _getreplacements(self):
         r = [
             (r':%s\b' % self._startport, ':$HGPORT'),
@@ -698,8 +698,12 @@
         vlog("# Running", cmd)
         if os.name == 'nt':
             replacements.append((r'\r\n', '\n'))
-        return run(cmd, self._testtmp, replacements, env, self._abort,
+        result = run(cmd, self._testtmp, replacements, env,
                    debug=self._debug, timeout=self._timeout)
+        if self._aborted:
+            raise KeyboardInterrupt()
+
+        return result
 
 class TTest(Test):
     """A "t test" is a test backed by a .t file."""
@@ -734,8 +738,11 @@
         vlog("# Running", cmd)
 
         exitcode, output = run(cmd, self._testtmp, replacements, env,
-                               self._abort, debug=self._debug,
-                               timeout=self._timeout)
+                               debug=self._debug, timeout=self._timeout)
+
+        if self._aborted:
+            raise KeyboardInterrupt()
+
         # Do not merge output if skipped. Return hghave message instead.
         # Similarly, with --debug, output is None.
         if exitcode == self.SKIPPED_STATUS or output is None:
@@ -1012,7 +1019,7 @@
 
 
 wifexited = getattr(os, "WIFEXITED", lambda x: False)
-def run(cmd, wd, replacements, env, abort, debug=False, timeout=None):
+def run(cmd, wd, replacements, env, debug=False, timeout=None):
     """Run command in a sub-process, capturing the output (stdout and stderr).
     Return a tuple (exitcode, output).  output is None in debug mode."""
     if debug:
@@ -1049,9 +1056,6 @@
     if ret:
         killdaemons(env['DAEMON_PIDS'])
 
-    if abort[0]:
-        raise KeyboardInterrupt()
-
     for s, r in replacements:
         output = re.sub(s, r, output)
     return ret, output.splitlines(True)
@@ -1196,6 +1200,7 @@
 
             tests.append(test)
 
+        runtests = list(tests)
         jobs = self._runner.options.jobs
         done = queue.Queue()
         running = 0
@@ -1229,7 +1234,8 @@
                     t.start()
                     running += 1
         except KeyboardInterrupt:
-            self._runner.abort[0] = True
+            for test in runtests:
+                test.abort()
 
         return result
 
@@ -1315,7 +1321,6 @@
         self.tmpbinddir = None
         self.pythondir = None
         self.coveragefile = None
-        self.abort = [False]
         self._createdfiles = []
         self._hgpath = None
 
@@ -1518,7 +1523,7 @@
         refpath = os.path.join(self.testdir, test)
         tmpdir = os.path.join(self.hgtmp, 'child%d' % count)
 
-        return testcls(refpath, tmpdir, self.abort,
+        return testcls(refpath, tmpdir,
                        keeptmpdir=self.options.keep_tmpdir,
                        debug=self.options.debug,
                        nodiff = self.options.nodiff,