Mercurial > hg
comparison tests/run-tests.py @ 21384:a36cc85a5b7b
run-tests: move string escaping to TTest
With this patch, TTest is almost fully self-contained and extractable.
Only logging functions remain outside of its class.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sun, 20 Apr 2014 10:34:52 -0700 |
parents | 772ed56e2519 |
children | 28414e5ac9ec |
comparison
equal
deleted
inserted
replaced
21383:772ed56e2519 | 21384:a36cc85a5b7b |
---|---|
616 if os.name == 'nt': | 616 if os.name == 'nt': |
617 replacements.append((r'\r\n', '\n')) | 617 replacements.append((r'\r\n', '\n')) |
618 return run(cmd, testtmp, self._options, replacements, env, | 618 return run(cmd, testtmp, self._options, replacements, env, |
619 self._runner.abort) | 619 self._runner.abort) |
620 | 620 |
621 | |
622 needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search | |
623 escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub | |
624 escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256)) | |
625 escapemap.update({'\\': '\\\\', '\r': r'\r'}) | |
626 def escapef(m): | |
627 return escapemap[m.group(0)] | |
628 def stringescape(s): | |
629 return escapesub(escapef, s) | |
630 | |
631 class TTest(Test): | 621 class TTest(Test): |
632 """A "t test" is a test backed by a .t file.""" | 622 """A "t test" is a test backed by a .t file.""" |
633 | 623 |
634 SKIPPED_PREFIX = 'skipped: ' | 624 SKIPPED_PREFIX = 'skipped: ' |
635 FAILED_PREFIX = 'hghave check failed: ' | 625 FAILED_PREFIX = 'hghave check failed: ' |
626 NEEDESCAPE = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search | |
627 | |
628 ESCAPESUB = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub | |
629 ESCAPEMAP = dict((chr(i), r'\x%02x' % i) for i in range(256)).update( | |
630 {'\\': '\\\\', '\r': r'\r'}) | |
636 | 631 |
637 def _run(self, testtmp, replacements, env): | 632 def _run(self, testtmp, replacements, env): |
638 f = open(self._path) | 633 f = open(self._path) |
639 lines = f.readlines() | 634 lines = f.readlines() |
640 f.close() | 635 f.close() |
816 log('\ninfo, unknown linematch result: %r\n' % r) | 811 log('\ninfo, unknown linematch result: %r\n' % r) |
817 r = False | 812 r = False |
818 if r: | 813 if r: |
819 postout.append(' ' + el) | 814 postout.append(' ' + el) |
820 else: | 815 else: |
821 if needescape(lout): | 816 if self.NEEDESCAPE(lout): |
822 lout = stringescape(lout.rstrip('\n')) + ' (esc)\n' | 817 lout = TTest.stringescape('%s (esc)\n' % |
818 lout.rstrip('\n')) | |
823 postout.append(' ' + lout) # Let diff deal with it. | 819 postout.append(' ' + lout) # Let diff deal with it. |
824 if r != '': # If line failed. | 820 if r != '': # If line failed. |
825 warnonly = 3 # for sure not | 821 warnonly = 3 # for sure not |
826 elif warnonly == 1: # Is "not yet" and line is warn only. | 822 elif warnonly == 1: # Is "not yet" and line is warn only. |
827 warnonly = 2 # Yes do warn. | 823 warnonly = 2 # Yes do warn. |
915 elif line.startswith(TTest.FAILED_PREFIX): | 911 elif line.startswith(TTest.FAILED_PREFIX): |
916 line = line.splitlines()[0] | 912 line = line.splitlines()[0] |
917 failed.append(line[len(TTest.FAILED_PREFIX):]) | 913 failed.append(line[len(TTest.FAILED_PREFIX):]) |
918 | 914 |
919 return missing, failed | 915 return missing, failed |
916 | |
917 @staticmethod | |
918 def _escapef(m): | |
919 return TTest.ESCAPEMAP[m.group(0)] | |
920 | |
921 @staticmethod | |
922 def _stringescape(s): | |
923 return TTest.ESCAPESUB(TTest._escapef, s) | |
924 | |
920 | 925 |
921 wifexited = getattr(os, "WIFEXITED", lambda x: False) | 926 wifexited = getattr(os, "WIFEXITED", lambda x: False) |
922 def run(cmd, wd, options, replacements, env, abort): | 927 def run(cmd, wd, options, replacements, env, abort): |
923 """Run command in a sub-process, capturing the output (stdout and stderr). | 928 """Run command in a sub-process, capturing the output (stdout and stderr). |
924 Return a tuple (exitcode, output). output is None in debug mode.""" | 929 Return a tuple (exitcode, output). output is None in debug mode.""" |