Mercurial > hg
comparison tests/run-tests.py @ 35751:6d65cef5b038
merge with stable
author | Augie Fackler <augie@google.com> |
---|---|
date | Fri, 19 Jan 2018 16:28:11 -0500 |
parents | 31acf6619f08 87676e8ee056 |
children | 4be991331a46 |
comparison
equal
deleted
inserted
replaced
35750:a39a9df7ecca | 35751:6d65cef5b038 |
---|---|
668 # Status code reserved for skipped tests (used by hghave). | 668 # Status code reserved for skipped tests (used by hghave). |
669 SKIPPED_STATUS = 80 | 669 SKIPPED_STATUS = 80 |
670 | 670 |
671 def __init__(self, path, outputdir, tmpdir, keeptmpdir=False, | 671 def __init__(self, path, outputdir, tmpdir, keeptmpdir=False, |
672 debug=False, | 672 debug=False, |
673 first=False, | |
673 timeout=None, | 674 timeout=None, |
674 startport=None, extraconfigopts=None, | 675 startport=None, extraconfigopts=None, |
675 py3kwarnings=False, shell=None, hgcommand=None, | 676 py3kwarnings=False, shell=None, hgcommand=None, |
676 slowtimeout=None, usechg=False, | 677 slowtimeout=None, usechg=False, |
677 useipv6=False): | 678 useipv6=False): |
720 self.errpath = os.path.join(self._outputdir, b'%s.err' % self.bname) | 721 self.errpath = os.path.join(self._outputdir, b'%s.err' % self.bname) |
721 | 722 |
722 self._threadtmp = tmpdir | 723 self._threadtmp = tmpdir |
723 self._keeptmpdir = keeptmpdir | 724 self._keeptmpdir = keeptmpdir |
724 self._debug = debug | 725 self._debug = debug |
726 self._first = first | |
725 self._timeout = timeout | 727 self._timeout = timeout |
726 self._slowtimeout = slowtimeout | 728 self._slowtimeout = slowtimeout |
727 self._startport = startport | 729 self._startport = startport |
728 self._extraconfigopts = extraconfigopts or [] | 730 self._extraconfigopts = extraconfigopts or [] |
729 self._py3kwarnings = py3kwarnings | 731 self._py3kwarnings = py3kwarnings |
904 with open(self.errpath, 'wb') as f: | 906 with open(self.errpath, 'wb') as f: |
905 for line in out: | 907 for line in out: |
906 f.write(line) | 908 f.write(line) |
907 | 909 |
908 # The result object handles diff calculation for us. | 910 # The result object handles diff calculation for us. |
909 if self._result.addOutputMismatch(self, ret, out, self._refout): | 911 with firstlock: |
910 # change was accepted, skip failing | 912 if self._result.addOutputMismatch(self, ret, out, self._refout): |
911 return | 913 # change was accepted, skip failing |
914 return | |
915 if self._first: | |
916 global firsterror | |
917 firsterror = True | |
912 | 918 |
913 if ret: | 919 if ret: |
914 msg = 'output changed and ' + describe(ret) | 920 msg = 'output changed and ' + describe(ret) |
915 else: | 921 else: |
916 msg = 'output changed' | 922 msg = 'output changed' |
1035 """Obtain environment variables to use during test execution.""" | 1041 """Obtain environment variables to use during test execution.""" |
1036 def defineport(i): | 1042 def defineport(i): |
1037 offset = '' if i == 0 else '%s' % i | 1043 offset = '' if i == 0 else '%s' % i |
1038 env["HGPORT%s" % offset] = '%s' % (self._startport + i) | 1044 env["HGPORT%s" % offset] = '%s' % (self._startport + i) |
1039 env = os.environ.copy() | 1045 env = os.environ.copy() |
1040 env['PYTHONUSERBASE'] = sysconfig.get_config_var('userbase') | 1046 env['PYTHONUSERBASE'] = sysconfig.get_config_var('userbase') or '' |
1041 env['HGEMITWARNINGS'] = '1' | 1047 env['HGEMITWARNINGS'] = '1' |
1042 env['TESTTMP'] = self._testtmp | 1048 env['TESTTMP'] = self._testtmp |
1043 env['HOME'] = self._testtmp | 1049 env['HOME'] = self._testtmp |
1044 # This number should match portneeded in _getport | 1050 # This number should match portneeded in _getport |
1045 for port in xrange(3): | 1051 for port in xrange(3): |
1635 @staticmethod | 1641 @staticmethod |
1636 def _stringescape(s): | 1642 def _stringescape(s): |
1637 return TTest.ESCAPESUB(TTest._escapef, s) | 1643 return TTest.ESCAPESUB(TTest._escapef, s) |
1638 | 1644 |
1639 iolock = threading.RLock() | 1645 iolock = threading.RLock() |
1646 firstlock = threading.RLock() | |
1647 firsterror = False | |
1640 | 1648 |
1641 class TestResult(unittest._TextTestResult): | 1649 class TestResult(unittest._TextTestResult): |
1642 """Holds results when executing via unittest.""" | 1650 """Holds results when executing via unittest.""" |
1643 # Don't worry too much about accessing the non-public _TextTestResult. | 1651 # Don't worry too much about accessing the non-public _TextTestResult. |
1644 # It is relatively common in Python testing tools. | 1652 # It is relatively common in Python testing tools. |
1720 self.testsRun += 1 | 1728 self.testsRun += 1 |
1721 self.stream.flush() | 1729 self.stream.flush() |
1722 | 1730 |
1723 def addOutputMismatch(self, test, ret, got, expected): | 1731 def addOutputMismatch(self, test, ret, got, expected): |
1724 """Record a mismatch in test output for a particular test.""" | 1732 """Record a mismatch in test output for a particular test.""" |
1725 if self.shouldStop: | 1733 if self.shouldStop or firsterror: |
1726 # don't print, some other test case already failed and | 1734 # don't print, some other test case already failed and |
1727 # printed, we're just stale and probably failed due to our | 1735 # printed, we're just stale and probably failed due to our |
1728 # temp dir getting cleaned up. | 1736 # temp dir getting cleaned up. |
1729 return | 1737 return |
1730 | 1738 |
2713 kwds = dict((k, testdesc[k]) for k in ['case'] if k in testdesc) | 2721 kwds = dict((k, testdesc[k]) for k in ['case'] if k in testdesc) |
2714 | 2722 |
2715 t = testcls(refpath, self._outputdir, tmpdir, | 2723 t = testcls(refpath, self._outputdir, tmpdir, |
2716 keeptmpdir=self.options.keep_tmpdir, | 2724 keeptmpdir=self.options.keep_tmpdir, |
2717 debug=self.options.debug, | 2725 debug=self.options.debug, |
2726 first=self.options.first, | |
2718 timeout=self.options.timeout, | 2727 timeout=self.options.timeout, |
2719 startport=self._getport(count), | 2728 startport=self._getport(count), |
2720 extraconfigopts=self.options.extra_config_opt, | 2729 extraconfigopts=self.options.extra_config_opt, |
2721 py3kwarnings=self.options.py3k_warnings, | 2730 py3kwarnings=self.options.py3k_warnings, |
2722 shell=self.options.shell, | 2731 shell=self.options.shell, |