Mercurial > evolve
annotate tests/test-doctest.py @ 6736:ce3723b78f91 stable
topic: drop _cleanup_tns_file(), move code directly into wlock()
This way we don't even have to make any assertions about wlock status. This
should be safe, since we have the wlock and it's held, and other processes
cannot acquire it and start messing with wdir, but we're also not inside any
context managers that could be using the wlock, so it cannot be suddenly
released either.
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Mon, 11 Mar 2024 16:35:29 -0300 |
parents | 7ad8107d953a |
children | 16fd24f6cf22 |
rev | line source |
---|---|
6235
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
1 # this is hack to make sure no escape characters are inserted into the output |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
2 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
3 from __future__ import absolute_import |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
4 from __future__ import print_function |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
5 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
6 import doctest |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
7 import os |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
8 import re |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
9 import subprocess |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
10 import sys |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
11 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
12 ispy3 = sys.version_info[0] >= 3 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
13 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
14 if 'TERM' in os.environ: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
15 del os.environ['TERM'] |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
16 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
17 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
18 class py3docchecker(doctest.OutputChecker): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
19 def check_output(self, want, got, optionflags): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
20 want2 = re.sub(r'''\bu(['"])(.*?)\1''', r'\1\2\1', want) # py2: u'' |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
21 got2 = re.sub(r'''\bb(['"])(.*?)\1''', r'\1\2\1', got) # py3: b'' |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
22 # py3: <exc.name>: b'<msg>' -> <name>: <msg> |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
23 # <exc.name>: <others> -> <name>: <others> |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
24 # TODO: more output massaging |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
25 return any( |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
26 doctest.OutputChecker.check_output(self, w, g, optionflags) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
27 for w, g in [(want, got), (want2, got2)] |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
28 ) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
29 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
30 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
31 def testmod(name, optionflags=0, testtarget=None): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
32 __import__(name) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
33 mod = sys.modules[name] |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
34 if testtarget is not None: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
35 mod = getattr(mod, testtarget) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
36 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
37 # minimal copy of doctest.testmod() |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
38 finder = doctest.DocTestFinder() |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
39 checker = None |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
40 if ispy3: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
41 checker = py3docchecker() |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
42 runner = doctest.DocTestRunner(checker=checker, optionflags=optionflags) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
43 for test in finder.find(mod, name): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
44 runner.run(test) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
45 runner.summarize() |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
46 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
47 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
48 DONT_RUN = [] |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
49 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
50 # Exceptions to the defaults for a given detected module. The value for each |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
51 # module name is a list of dicts that specify the kwargs to pass to testmod. |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
52 # testmod is called once per item in the list, so an empty list will cause the |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
53 # module to not be tested. |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
54 testmod_arg_overrides = { |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
55 # 'mercurial.statprof': DONT_RUN, # >>> is an example, not a doctest |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
56 } |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
57 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
58 fileset = 'set:(**.py)' |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
59 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
60 cwd = os.path.dirname(os.environ["TESTDIR"]) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
61 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
62 # run-tests.py makes an installation of core Mercurial in /tmp/, but evolve is |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
63 # not installed together with it, and evolve modules need to be imported to run |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
64 # doctests. We insert it at the start to make sure wider install of evolve does not take priority. |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
65 sys.path.insert(0, cwd) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
66 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
67 if not os.path.isdir(os.path.join(cwd, ".hg")): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
68 sys.exit(0) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
69 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
70 files = subprocess.check_output( |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
71 "hg files --print0 \"%s\"" % fileset, |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
72 shell=True, |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
73 cwd=cwd, |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
74 ).split(b'\0') |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
75 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
76 if sys.version_info[0] >= 3: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
77 cwd = os.fsencode(cwd) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
78 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
79 mods_tested = set() |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
80 for f in files: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
81 if not f: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
82 continue |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
83 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
84 with open(os.path.join(cwd, f), "rb") as fh: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
85 if not re.search(br'\n\s*>>>', fh.read()): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
86 continue |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
87 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
88 if ispy3: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
89 f = f.decode() |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
90 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
91 modname = f.replace('.py', '').replace('\\', '.').replace('/', '.') |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
92 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
93 # Third-party modules aren't our responsibility to test. |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
94 if modname.startswith('hgext3rd.evolve.thirdparty.'): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
95 continue |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
96 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
97 for kwargs in testmod_arg_overrides.get(modname, [{}]): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
98 mods_tested.add((modname, '%r' % (kwargs,))) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
99 if modname.startswith('tests.'): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
100 # On py2, we can't import from tests.foo, but it works on both py2 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
101 # and py3 with the way that PYTHONPATH is setup to import without |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
102 # the 'tests.' prefix, so we do that. |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
103 modname = modname[len('tests.'):] |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
104 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
105 testmod(modname, **kwargs) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
106 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
107 # Meta-test: let's make sure that we actually ran what we expected to, above. |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
108 # Each item in the set is a 2-tuple of module name and stringified kwargs passed |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
109 # to testmod. |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
110 expected_mods_tested = set( |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
111 [ |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
112 ('hgext3rd.evolve.obshistory', '{}'), |
6236
7ad8107d953a
topic: introduce topic namespaces concept starting with simple parsing
Anton Shestakov <av6@dwimlabs.net>
parents:
6235
diff
changeset
|
113 ('hgext3rd.topic.common', '{}'), |
6235
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
114 ] |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
115 ) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
116 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
117 unexpectedly_run = mods_tested.difference(expected_mods_tested) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
118 not_run = expected_mods_tested.difference(mods_tested) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
119 |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
120 if unexpectedly_run: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
121 print('Unexpectedly ran (probably need to add to list):') |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
122 for r in sorted(unexpectedly_run): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
123 print(' %r' % (r,)) |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
124 if not_run: |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
125 print('Expected to run, but was not run (doctest removed?):') |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
126 for r in sorted(not_run): |
318b81560f8c
tests: port test-doctest.py from core hg
Anton Shestakov <av6@dwimlabs.net>
parents:
diff
changeset
|
127 print(' %r' % (r,)) |