annotate tests/run-tests.py @ 26761:8270ee357dd9

exchange: support streaming clone bundles in clone bundles Now that we have support for detecting compatible stream clone bundles in bundle specifications, we can safely add support for applying stream clone bundles to the clone bundles feature.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 17 Oct 2015 11:37:08 -0700
parents a38924f7680c
children 61fbf5dc12b2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
1 #!/usr/bin/env python
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
2 #
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
3 # run-tests.py - Run a set of tests on Mercurial
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
4 #
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
5 # Copyright 2006 Matt Mackall <mpm@selenic.com>
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
6 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8161
diff changeset
7 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10154
diff changeset
8 # GNU General Public License version 2 or any later version.
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
9
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
10 # Modifying this script is tricky because it has many modes:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
11 # - serial (default) vs parallel (-jN, N > 1)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
12 # - no coverage (default) vs coverage (-c, -C, -s)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
13 # - temp install (default) vs specific hg script (--with-hg, --local)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
14 # - tests are a mix of shell scripts and Python scripts
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
15 #
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
16 # If you change this script, it is recommended that you ensure you
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
17 # haven't broken it by running it in various modes with a representative
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
18 # sample of test scripts. For example:
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8724
diff changeset
19 #
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
20 # 1) serial, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
21 # ./run-tests.py test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
22 # 2) serial, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
23 # ./run-tests.py --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
24 # 3) serial, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
25 # ./run-tests.py -c test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
26 # 4) serial, coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
27 # ./run-tests.py -c --local test-s* # unsupported
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
28 # 5) parallel, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
29 # ./run-tests.py -j2 test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
30 # 6) parallel, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
31 # ./run-tests.py -j2 --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
32 # 7) parallel, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
33 # ./run-tests.py -j2 -c test-s* # currently broken
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
34 # 8) parallel, coverage, local install:
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
35 # ./run-tests.py -j2 -c --local test-s* # unsupported (and broken)
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
36 # 9) parallel, custom tmp dir:
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
37 # ./run-tests.py -j2 --tmpdir /tmp/myhgtests
26158
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
38 # 10) parallel, pure, tests that call run-tests:
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
39 # ./run-tests.py --pure `grep -l run-tests.py *.t`
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
40 #
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
41 # (You could use any subset of the tests: test-s* happens to match
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
42 # enough that it's worth doing parallel runs, few enough that it
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
43 # completes fairly quickly, includes both shell and Python scripts, and
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
44 # includes some scripts that run daemon processes.)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
45
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
46 from __future__ import print_function
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
47
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
48 from distutils import version
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
49 import difflib
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
50 import errno
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
51 import optparse
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
52 import os
10905
13a1b2fb7ef2 pylint, pyflakes: remove unused or duplicate imports
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10903
diff changeset
53 import shutil
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
54 import subprocess
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
55 import signal
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
56 import socket
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
57 import sys
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
58 import tempfile
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
59 import time
18616
35b4affe6fdd test: display used python hash seed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18565
diff changeset
60 import random
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
61 import re
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
62 import threading
17464
eddfb9a550d0 run-tests: do not duplicate killdaemons() code
Patrick Mezard <patrick@mezard.eu>
parents: 16906
diff changeset
63 import killdaemons as killmod
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
64 try:
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
65 import Queue as queue
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
66 except ImportError:
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
67 import queue
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
68 from xml.dom import minidom
21426
791bdd65acd3 run-tests: initial support for running tests with unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21388
diff changeset
69 import unittest
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
70
25037
570141fa38f9 run-tests: introduce a name for os.environb
Augie Fackler <augie@google.com>
parents: 25036
diff changeset
71 osenvironb = getattr(os, 'environb', os.environ)
570141fa38f9 run-tests: introduce a name for os.environb
Augie Fackler <augie@google.com>
parents: 25036
diff changeset
72
22391
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
73 try:
23263
dd51abf0aa17 run-tests: use a try/except ladder instead of looking for a specific version
Augie Fackler <raf@durin42.com>
parents: 23139
diff changeset
74 import json
dd51abf0aa17 run-tests: use a try/except ladder instead of looking for a specific version
Augie Fackler <raf@durin42.com>
parents: 23139
diff changeset
75 except ImportError:
dd51abf0aa17 run-tests: use a try/except ladder instead of looking for a specific version
Augie Fackler <raf@durin42.com>
parents: 23139
diff changeset
76 try:
22391
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
77 import simplejson as json
23263
dd51abf0aa17 run-tests: use a try/except ladder instead of looking for a specific version
Augie Fackler <raf@durin42.com>
parents: 23139
diff changeset
78 except ImportError:
dd51abf0aa17 run-tests: use a try/except ladder instead of looking for a specific version
Augie Fackler <raf@durin42.com>
parents: 23139
diff changeset
79 json = None
22391
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
80
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
81 processlock = threading.Lock()
19413
a4de0d3dc35a run-tests: lock popen wait/poll
Brendan Cully <brendan@kublai.com>
parents: 19407
diff changeset
82
25160
fefc72523491 run-tests: insist that if people use Python 3, they use 3.5.x
Augie Fackler <augie@google.com>
parents: 25159
diff changeset
83 if sys.version_info > (3, 5, 0):
25157
a8d22895a575 run-tests: introduce PYTHON3 boolean constant (issue4668)
Augie Fackler <augie@google.com>
parents: 25156
diff changeset
84 PYTHON3 = True
25033
2bdd9e442bcc run-tests: work around the rename of xrange to range
Augie Fackler <augie@google.com>
parents: 25031
diff changeset
85 xrange = range # we use xrange in one place, and we'd rather not use range
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
86 def _bytespath(p):
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
87 return p.encode('utf-8')
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
88
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
89 def _strpath(p):
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
90 return p.decode('utf-8')
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
91
25160
fefc72523491 run-tests: insist that if people use Python 3, they use 3.5.x
Augie Fackler <augie@google.com>
parents: 25159
diff changeset
92 elif sys.version_info >= (3, 0, 0):
fefc72523491 run-tests: insist that if people use Python 3, they use 3.5.x
Augie Fackler <augie@google.com>
parents: 25159
diff changeset
93 print('%s is only supported on Python 3.5+ and 2.6-2.7, not %s' %
fefc72523491 run-tests: insist that if people use Python 3, they use 3.5.x
Augie Fackler <augie@google.com>
parents: 25159
diff changeset
94 (sys.argv[0], '.'.join(str(v) for v in sys.version_info[:3])))
fefc72523491 run-tests: insist that if people use Python 3, they use 3.5.x
Augie Fackler <augie@google.com>
parents: 25159
diff changeset
95 sys.exit(70) # EX_SOFTWARE from `man 3 sysexit`
25157
a8d22895a575 run-tests: introduce PYTHON3 boolean constant (issue4668)
Augie Fackler <augie@google.com>
parents: 25156
diff changeset
96 else:
a8d22895a575 run-tests: introduce PYTHON3 boolean constant (issue4668)
Augie Fackler <augie@google.com>
parents: 25156
diff changeset
97 PYTHON3 = False
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
98
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
99 # In python 2.x, path operations are generally done using
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
100 # bytestrings by default, so we don't have to do any extra
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
101 # fiddling there. We define the wrapper functions anyway just to
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
102 # help keep code consistent between platforms.
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
103 def _bytespath(p):
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
104 return p
25033
2bdd9e442bcc run-tests: work around the rename of xrange to range
Augie Fackler <augie@google.com>
parents: 25031
diff changeset
105
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
106 _strpath = _bytespath
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
107
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
108 # For Windows support
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
109 wifexited = getattr(os, "WIFEXITED", lambda x: False)
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
110
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
111 def checkportisavailable(port):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
112 """return true if a port seems free to bind on localhost"""
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
113 try:
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
114 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
115 s.bind(('localhost', port))
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
116 s.close()
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
117 return True
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
118 except socket.error as exc:
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
119 if not exc.errno == errno.EADDRINUSE:
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
120 raise
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
121 return False
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
122
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
123 closefds = os.name == 'posix'
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
124 def Popen4(cmd, wd, timeout, env=None):
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
125 processlock.acquire()
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
126 p = subprocess.Popen(cmd, shell=True, bufsize=-1, cwd=wd, env=env,
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
127 close_fds=closefds,
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
128 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
129 stderr=subprocess.STDOUT)
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
130 processlock.release()
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
131
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
132 p.fromchild = p.stdout
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
133 p.tochild = p.stdin
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
134 p.childerr = p.stderr
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
135
14337
439ed4721a6d run-tests: ignore timeout when Popen.terminate is unavailable
Patrick Mezard <pmezard@gmail.com>
parents: 14336
diff changeset
136 p.timeout = False
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
137 if timeout:
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
138 def t():
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
139 start = time.time()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
140 while time.time() - start < timeout and p.returncode is None:
16346
48692b416fbc tests: shorten post-test sleeps
Matt Mackall <mpm@selenic.com>
parents: 15942
diff changeset
141 time.sleep(.1)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
142 p.timeout = True
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
143 if p.returncode is None:
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
144 terminate(p)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
145 threading.Thread(target=t).start()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
146
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
147 return p
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
148
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
149 PYTHON = _bytespath(sys.executable.replace('\\', '/'))
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
150 IMPL_PATH = b'PYTHONPATH'
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
151 if 'java' in sys.platform:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
152 IMPL_PATH = b'JYTHONPATH'
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
153
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
154 defaults = {
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
155 'jobs': ('HGTEST_JOBS', 1),
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
156 'timeout': ('HGTEST_TIMEOUT', 180),
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
157 'port': ('HGTEST_PORT', 20059),
15941
af289d6cd422 tests: let run-tests.py default to use 'sh' in $PATH instead of '/bin/sh'
Mads Kiilerich <mads@kiilerich.com>
parents: 15940
diff changeset
158 'shell': ('HGTEST_SHELL', 'sh'),
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
159 }
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
160
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
161 def parselistfiles(files, listtype, warn=True):
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
162 entries = dict()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
163 for filename in files:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
164 try:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
165 path = os.path.expanduser(os.path.expandvars(filename))
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
166 f = open(path, "rb")
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
167 except IOError as err:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
168 if err.errno != errno.ENOENT:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
169 raise
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
170 if warn:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
171 print("warning: no such %s file: %s" % (listtype, filename))
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
172 continue
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
173
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
174 for line in f.readlines():
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
175 line = line.split(b'#', 1)[0].strip()
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
176 if line:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
177 entries[line] = filename
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
178
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
179 f.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
180 return entries
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
181
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
182 def getparser():
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
183 """Obtain the OptionParser used by the CLI."""
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
184 parser = optparse.OptionParser("%prog [options] [tests]")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
185
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
186 # keep these sorted
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
187 parser.add_option("--blacklist", action="append",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
188 help="skip tests listed in the specified blacklist file")
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
189 parser.add_option("--whitelist", action="append",
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
190 help="always run tests listed in the specified whitelist file")
20821
3d1d16b19e7d tests: add run-tests --changed option for running tests changed in revisions
Mads Kiilerich <madski@unity3d.com>
parents: 20793
diff changeset
191 parser.add_option("--changed", type="string",
3d1d16b19e7d tests: add run-tests --changed option for running tests changed in revisions
Mads Kiilerich <madski@unity3d.com>
parents: 20793
diff changeset
192 help="run tests that are changed in parent rev or working directory")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
193 parser.add_option("-C", "--annotate", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
194 help="output files annotated with coverage")
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
195 parser.add_option("-c", "--cover", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
196 help="print a test coverage report")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
197 parser.add_option("-d", "--debug", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
198 help="debug mode: write output of test scripts to console"
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 21023
diff changeset
199 " rather than capturing and diffing it (disables timeout)")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
200 parser.add_option("-f", "--first", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
201 help="exit on the first test failure")
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
202 parser.add_option("-H", "--htmlcov", action="store_true",
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
203 help="create an HTML report of the coverage of the files")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
204 parser.add_option("-i", "--interactive", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
205 help="prompt to accept changed output")
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
206 parser.add_option("-j", "--jobs", type="int",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
207 help="number of jobs to run in parallel"
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
208 " (default: $%s or %d)" % defaults['jobs'])
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
209 parser.add_option("--keep-tmpdir", action="store_true",
9706
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
210 help="keep temporary directory after running tests")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
211 parser.add_option("-k", "--keywords",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
212 help="run tests matching keywords")
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
213 parser.add_option("-l", "--local", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
214 help="shortcut for --with-hg=<testdir>/../hg")
19283
8300adf9ca33 run-tests: add --loop support
Matt Mackall <mpm@selenic.com>
parents: 19282
diff changeset
215 parser.add_option("--loop", action="store_true",
8300adf9ca33 run-tests: add --loop support
Matt Mackall <mpm@selenic.com>
parents: 19282
diff changeset
216 help="loop tests repeatedly")
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
217 parser.add_option("--runs-per-test", type="int", dest="runs_per_test",
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
218 help="run each test N times (default=1)", default=1)
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
219 parser.add_option("-n", "--nodiff", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
220 help="skip showing test changes")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
221 parser.add_option("-p", "--port", type="int",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
222 help="port on which servers should listen"
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
223 " (default: $%s or %d)" % defaults['port'])
17966
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
224 parser.add_option("--compiler", type="string",
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
225 help="compiler to build with")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
226 parser.add_option("--pure", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
227 help="use pure Python code instead of C extensions")
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
228 parser.add_option("-R", "--restart", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
229 help="restart at last error")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
230 parser.add_option("-r", "--retest", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
231 help="retest failed tests")
9580
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
232 parser.add_option("-S", "--noskips", action="store_true",
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
233 help="don't report skip tests verbosely")
14202
b68a41420397 run-tests: add --shell command line flag
Martin Geisler <mg@lazybytes.net>
parents: 14201
diff changeset
234 parser.add_option("--shell", type="string",
b68a41420397 run-tests: add --shell command line flag
Martin Geisler <mg@lazybytes.net>
parents: 14201
diff changeset
235 help="shell to use (default: $%s or %s)" % defaults['shell'])
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
236 parser.add_option("-t", "--timeout", type="int",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
237 help="kill errant tests after TIMEOUT seconds"
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
238 " (default: $%s or %d)" % defaults['timeout'])
17921
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
239 parser.add_option("--time", action="store_true",
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
240 help="time how long each test takes")
22391
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
241 parser.add_option("--json", action="store_true",
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
242 help="store test result data in 'report.json' file")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
243 parser.add_option("--tmpdir", type="string",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
244 help="run tests in the given temporary directory"
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
245 " (implies --keep-tmpdir)")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
246 parser.add_option("-v", "--verbose", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
247 help="output verbose messages")
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
248 parser.add_option("--xunit", type="string",
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
249 help="record xunit results at specified path")
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
250 parser.add_option("--view", type="string",
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
251 help="external diff viewer")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
252 parser.add_option("--with-hg", type="string",
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
253 metavar="HG",
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
254 help="test using specified hg script rather than a "
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
255 "temporary installation")
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
256 parser.add_option("-3", "--py3k-warnings", action="store_true",
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
257 help="enable Py3k warnings on Python 2.6+")
14134
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
258 parser.add_option('--extra-config-opt', action="append",
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
259 help='set the given config opt in the test hgrc')
19057
3d265e0822d3 run-tests: introduce --random for running tests in random error
Mads Kiilerich <madski@unity3d.com>
parents: 18788
diff changeset
260 parser.add_option('--random', action="store_true",
3d265e0822d3 run-tests: introduce --random for running tests in random error
Mads Kiilerich <madski@unity3d.com>
parents: 18788
diff changeset
261 help='run tests in random order')
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
262 parser.add_option('--profile-runner', action='store_true',
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
263 help='run statprof on run-tests')
26109
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
264 parser.add_option('--allow-slow-tests', action='store_true',
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
265 help='allow extremely slow tests')
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
266
14201
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
267 for option, (envvar, default) in defaults.items():
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
268 defaults[option] = type(default)(os.environ.get(envvar, default))
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
269 parser.set_defaults(**defaults)
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
270
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
271 return parser
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
272
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
273 def parseargs(args, parser):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
274 """Parse arguments with our OptionParser and validate results."""
21006
723e41ad59b4 run-tests: Pass arguments into argument parser
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20821
diff changeset
275 (options, args) = parser.parse_args(args)
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
276
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
277 # jython is always pure
10766
afbcea270bb8 run-tests: force to test pure on pypy as well
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10765
diff changeset
278 if 'java' in sys.platform or '__pypy__' in sys.modules:
10765
fd31a3237498 Fix run-tests.py -jX after 2ed667a9dfcb
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10758
diff changeset
279 options.pure = True
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
280
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
281 if options.with_hg:
15942
d7a34c07e69b run-tests: expand user in --with-hg
Mads Kiilerich <mads@kiilerich.com>
parents: 15941
diff changeset
282 options.with_hg = os.path.expanduser(options.with_hg)
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
283 if not (os.path.isfile(options.with_hg) and
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
284 os.access(options.with_hg, os.X_OK)):
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
285 parser.error('--with-hg must specify an executable hg script')
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
286 if not os.path.basename(options.with_hg) == 'hg':
14359
ad5c68a0db6a run-tests: print a newline after all warnings
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14340
diff changeset
287 sys.stderr.write('warning: --with-hg should specify an hg script\n')
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
288 if options.local:
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
289 testdir = os.path.dirname(_bytespath(os.path.realpath(sys.argv[0])))
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
290 hgbin = os.path.join(os.path.dirname(testdir), b'hg')
16538
dd194e5df4c1 tests: don't require 'hg' without extension on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 16346
diff changeset
291 if os.name != 'nt' and not os.access(hgbin, os.X_OK):
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
292 parser.error('--local specified, but %r not found or not executable'
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
293 % hgbin)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
294 options.with_hg = hgbin
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
295
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
296 options.anycoverage = options.cover or options.annotate or options.htmlcov
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
297 if options.anycoverage:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
298 try:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
299 import coverage
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
300 covver = version.StrictVersion(coverage.__version__).version
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
301 if covver < (3, 3):
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
302 parser.error('coverage options require coverage 3.3 or later')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
303 except ImportError:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
304 parser.error('coverage options now require the coverage package')
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
305
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
306 if options.anycoverage and options.local:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
307 # this needs some path mangling somewhere, I guess
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
308 parser.error("sorry, coverage options do not work when --local "
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
309 "is specified")
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
310
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
311 if options.anycoverage and options.with_hg:
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
312 parser.error("sorry, coverage options do not work when --with-hg "
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
313 "is specified")
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
314
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
315 global verbose
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
316 if options.verbose:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
317 verbose = ''
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
318
9394
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
319 if options.tmpdir:
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
320 options.tmpdir = os.path.expanduser(options.tmpdir)
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
321
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
322 if options.jobs < 1:
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
323 parser.error('--jobs must be positive')
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
324 if options.interactive and options.debug:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
325 parser.error("-i/--interactive and -d/--debug are incompatible")
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
326 if options.debug:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
327 if options.timeout != defaults['timeout']:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
328 sys.stderr.write(
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
329 'warning: --timeout option ignored with --debug\n')
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
330 options.timeout = 0
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
331 if options.py3k_warnings:
25158
3906b9783cd9 run-tests: prefer PYTHON3 constant to many version_info checks (issue4668)
Augie Fackler <augie@google.com>
parents: 25157
diff changeset
332 if PYTHON3:
3906b9783cd9 run-tests: prefer PYTHON3 constant to many version_info checks (issue4668)
Augie Fackler <augie@google.com>
parents: 25157
diff changeset
333 parser.error(
3906b9783cd9 run-tests: prefer PYTHON3 constant to many version_info checks (issue4668)
Augie Fackler <augie@google.com>
parents: 25157
diff changeset
334 '--py3k-warnings can only be used on Python 2.6 and 2.7')
9959
b37b060d84c7 run-tests: add a "--blacklist target" option to skip predefined test lists
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9958
diff changeset
335 if options.blacklist:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
336 options.blacklist = parselistfiles(options.blacklist, 'blacklist')
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
337 if options.whitelist:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
338 options.whitelisted = parselistfiles(options.whitelist, 'whitelist')
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
339 else:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
340 options.whitelisted = {}
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
341
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
342 return (options, args)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
343
5800
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
344 def rename(src, dst):
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
345 """Like os.rename(), trade atomicity and opened files friendliness
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
346 for existing destination support.
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
347 """
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
348 shutil.copy(src, dst)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
349 os.remove(src)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
350
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
351 _unified_diff = difflib.unified_diff
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
352 if PYTHON3:
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
353 import functools
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
354 _unified_diff = functools.partial(difflib.diff_bytes, difflib.unified_diff)
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
355
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
356 def getdiff(expected, output, ref, err):
21022
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
357 servefail = False
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
358 lines = []
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
359 for line in _unified_diff(expected, output, ref, err):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
360 if line.startswith(b'+++') or line.startswith(b'---'):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
361 line = line.replace(b'\\', b'/')
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
362 if line.endswith(b' \n'):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
363 line = line[:-2] + b'\n'
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
364 lines.append(line)
21022
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
365 if not servefail and line.startswith(
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
366 b'+ abort: child process failed to start'):
21022
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
367 servefail = True
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
368
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
369 return servefail, lines
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
370
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
371 verbose = False
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
372 def vlog(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
373 """Log only when in verbose mode."""
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
374 if verbose is False:
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
375 return
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
376
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
377 return log(*msg)
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
378
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
379 # Bytes that break XML even in a CDATA block: control characters 0-31
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
380 # sans \t, \n and \r
25051
9c28f3236677 run-tests: do cdata escaping using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25050
diff changeset
381 CDATA_EVIL = re.compile(br"[\000-\010\013\014\016-\037]")
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
382
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
383 def cdatasafe(data):
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
384 """Make a string safe to include in a CDATA block.
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
385
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
386 Certain control characters are illegal in a CDATA block, and
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
387 there's no way to include a ]]> in a CDATA either. This function
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
388 replaces illegal bytes with ? and adds a space between the ]] so
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
389 that it won't break the CDATA block.
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
390 """
25051
9c28f3236677 run-tests: do cdata escaping using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25050
diff changeset
391 return CDATA_EVIL.sub(b'?', data).replace(b']]>', b'] ]>')
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
392
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
393 def log(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
394 """Log something to stdout.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
395
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
396 Arguments are strings to print.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
397 """
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
398 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
399 if verbose:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
400 print(verbose, end=' ')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
401 for m in msg:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
402 print(m, end=' ')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
403 print()
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
404 sys.stdout.flush()
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
405
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
406 def terminate(proc):
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
407 """Terminate subprocess (with fallback for Python versions < 2.6)"""
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
408 vlog('# Terminating process %d' % proc.pid)
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
409 try:
14971
0b21ae0a2366 tests: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14867
diff changeset
410 getattr(proc, 'terminate', lambda : os.kill(proc.pid, signal.SIGTERM))()
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
411 except OSError:
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
412 pass
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
413
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
414 def killdaemons(pidfile):
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
415 return killmod.killdaemons(pidfile, tryhard=False, remove=True,
17464
eddfb9a550d0 run-tests: do not duplicate killdaemons() code
Patrick Mezard <patrick@mezard.eu>
parents: 16906
diff changeset
416 logfn=vlog)
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
417
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
418 class Test(unittest.TestCase):
21309
0b123e6a318c run-tests: allow Test.run() to run multiple times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21308
diff changeset
419 """Encapsulates a single, runnable test.
0b123e6a318c run-tests: allow Test.run() to run multiple times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21308
diff changeset
420
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
421 While this class conforms to the unittest.TestCase API, it differs in that
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
422 instances need to be instantiated manually. (Typically, unittest.TestCase
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
423 classes are instantiated automatically by scanning modules.)
21309
0b123e6a318c run-tests: allow Test.run() to run multiple times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21308
diff changeset
424 """
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
425
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
426 # Status code reserved for skipped tests (used by hghave).
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
427 SKIPPED_STATUS = 80
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
428
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
429 def __init__(self, path, tmpdir, keeptmpdir=False,
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
430 debug=False,
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
431 timeout=defaults['timeout'],
21516
1e275c09242e run-tests: move py3kwarnings to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21515
diff changeset
432 startport=defaults['port'], extraconfigopts=None,
21517
af7d3a5c330b run-tests: move shell to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21516
diff changeset
433 py3kwarnings=False, shell=None):
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
434 """Create a test from parameters.
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
435
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
436 path is the full path to the file defining the test.
21338
3cd2d2de4060 run-tests: move computation of test paths into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21337
diff changeset
437
21504
888a5dfe1569 run-tests: pass temp dir into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21502
diff changeset
438 tmpdir is the main temporary directory to use for this test.
21505
3a1881dbf860 run-tests: pass abort into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21504
diff changeset
439
21509
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
440 keeptmpdir determines whether to keep the test's temporary directory
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
441 after execution. It defaults to removal (False).
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
442
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
443 debug mode will make the test execute verbosely, with unfiltered
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
444 output.
21511
3ec3e81a4110 run-tests: move diff options into arguments of Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21510
diff changeset
445
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
446 timeout controls the maximum run time of the test. It is ignored when
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
447 debug is True.
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
448
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
449 startport controls the starting port number to use for this test. Each
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
450 test will reserve 3 port numbers for execution. It is the caller's
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
451 responsibility to allocate a non-overlapping port range to Test
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
452 instances.
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
453
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
454 extraconfigopts is an iterable of extra hgrc config options. Values
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
455 must have the form "key=value" (something understood by hgrc). Values
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
456 of the form "foo.key=value" will result in "[foo] key=value".
21516
1e275c09242e run-tests: move py3kwarnings to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21515
diff changeset
457
1e275c09242e run-tests: move py3kwarnings to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21515
diff changeset
458 py3kwarnings enables Py3k warnings.
21517
af7d3a5c330b run-tests: move shell to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21516
diff changeset
459
af7d3a5c330b run-tests: move shell to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21516
diff changeset
460 shell is the shell to execute tests in.
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
461 """
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
462 self.path = path
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
463 self.bname = os.path.basename(path)
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
464 self.name = _strpath(self.bname)
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
465 self._testdir = os.path.dirname(path)
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
466 self.errpath = os.path.join(self._testdir, b'%s.err' % self.bname)
21435
f376f56a354e run-tests: rename Test._test to Test.name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21434
diff changeset
467
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
468 self._threadtmp = tmpdir
21509
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
469 self._keeptmpdir = keeptmpdir
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
470 self._debug = debug
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
471 self._timeout = timeout
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
472 self._startport = startport
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
473 self._extraconfigopts = extraconfigopts or []
21516
1e275c09242e run-tests: move py3kwarnings to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21515
diff changeset
474 self._py3kwarnings = py3kwarnings
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
475 self._shell = _bytespath(shell)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
476
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
477 self._aborted = False
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
478 self._daemonpids = []
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
479 self._finished = None
21449
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
480 self._ret = None
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
481 self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
482 self._skipped = None
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
483 self._testtmp = None
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
484
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
485 # If we're not in --debug mode and reference output file exists,
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
486 # check test output against it.
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
487 if debug:
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
488 self._refout = None # to match "out is None"
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
489 elif os.path.exists(self.refpath):
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
490 f = open(self.refpath, 'rb')
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
491 self._refout = f.read().splitlines(True)
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
492 f.close()
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
493 else:
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
494 self._refout = []
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
495
24965
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
496 # needed to get base class __repr__ running
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
497 @property
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
498 def _testMethodName(self):
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
499 return self.name
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
500
21463
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
501 def __str__(self):
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
502 return self.name
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
503
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
504 def shortDescription(self):
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
505 return self.name
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
506
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
507 def setUp(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
508 """Tasks to perform before run()."""
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
509 self._finished = False
21449
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
510 self._ret = None
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
511 self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
512 self._skipped = None
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
513
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
514 try:
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
515 os.mkdir(self._threadtmp)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
516 except OSError as e:
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
517 if e.errno != errno.EEXIST:
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
518 raise
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
519
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
520 self._testtmp = os.path.join(self._threadtmp,
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
521 os.path.basename(self.path))
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
522 os.mkdir(self._testtmp)
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
523
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
524 # Remove any previous output files.
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
525 if os.path.exists(self.errpath):
24332
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
526 try:
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
527 os.remove(self.errpath)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
528 except OSError as e:
24332
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
529 # We might have raced another test to clean up a .err
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
530 # file, so ignore ENOENT when removing a previous .err
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
531 # file.
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
532 if e.errno != errno.ENOENT:
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
533 raise
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
534
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
535 def run(self, result):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
536 """Run this test and report results against a TestResult instance."""
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
537 # This function is extremely similar to unittest.TestCase.run(). Once
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
538 # we require Python 2.7 (or at least its version of unittest), this
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
539 # function can largely go away.
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
540 self._result = result
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
541 result.startTest(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
542 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
543 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
544 self.setUp()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
545 except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
546 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
547 raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
548 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
549 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
550 return
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
551
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
552 success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
553 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
554 self.runTest()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
555 except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
556 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
557 raise
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
558 except SkipTest as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
559 result.addSkip(self, str(e))
21997
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
560 # The base class will have already counted this as a
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
561 # test we "ran", but we want to exclude skipped tests
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
562 # from those we count towards those run.
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
563 result.testsRun -= 1
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
564 except IgnoreTest as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
565 result.addIgnore(self, str(e))
21997
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
566 # As with skips, ignores also should be excluded from
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
567 # the number of tests executed.
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
568 result.testsRun -= 1
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
569 except WarnTest as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
570 result.addWarn(self, str(e))
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
571 except self.failureException as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
572 # This differs from unittest in that we don't capture
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
573 # the stack trace. This is for historical reasons and
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
574 # this decision could be revisited in the future,
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
575 # especially for PythonTest instances.
21753
b7baef94a333 run-tests: checks behaviour of test on failure while testing
anuraggoel <anurag.dsps@gmail.com>
parents: 21740
diff changeset
576 if result.addFailure(self, str(e)):
b7baef94a333 run-tests: checks behaviour of test on failure while testing
anuraggoel <anurag.dsps@gmail.com>
parents: 21740
diff changeset
577 success = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
578 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
579 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
580 else:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
581 success = True
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
582
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
583 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
584 self.tearDown()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
585 except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
586 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
587 raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
588 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
589 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
590 success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
591
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
592 if success:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
593 result.addSuccess(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
594 finally:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
595 result.stopTest(self, interrupted=self._aborted)
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
596
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
597 def runTest(self):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
598 """Run this test instance.
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
599
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
600 This will return a tuple describing the result of the test.
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
601 """
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
602 env = self._getenv()
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
603 self._daemonpids.append(env['DAEMON_PIDS'])
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
604 self._createhgrc(env['HGRCPATH'])
21300
a2774731a51a run-tests: move createhgrc() call into Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21299
diff changeset
605
21435
f376f56a354e run-tests: rename Test._test to Test.name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21434
diff changeset
606 vlog('# Test', self.name)
21337
79930515604f run-tests: move logging of test start into Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21336
diff changeset
607
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
608 ret, out = self._run(env)
21500
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
609 self._finished = True
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
610 self._ret = ret
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
611 self._out = out
21305
d7a7825ff2cf run-tests: capture execution results in a TestResult class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21304
diff changeset
612
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
613 def describe(ret):
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
614 if ret < 0:
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
615 return 'killed by signal: %d' % -ret
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
616 return 'returned error code %d' % ret
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
617
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
618 self._skipped = False
21336
45ab0668d1b2 run-tests: remove remaining uses of TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21335
diff changeset
619
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
620 if ret == self.SKIPPED_STATUS:
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
621 if out is None: # Debug mode, nothing to parse.
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
622 missing = ['unknown']
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
623 failed = None
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
624 else:
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
625 missing, failed = TTest.parsehghaveoutput(out)
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
626
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
627 if not missing:
22292
102f0e926668 run-tests: report skipped tests as "skipped" - they might still be "relevant"
Mads Kiilerich <madski@unity3d.com>
parents: 22165
diff changeset
628 missing = ['skipped']
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
629
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
630 if failed:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
631 self.fail('hg have failed checking for %s' % failed[-1])
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
632 else:
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
633 self._skipped = True
21490
588ebd47cd87 run-tests: replace Test.skip() with raise SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21489
diff changeset
634 raise SkipTest(missing[-1])
21325
0e66eb57e42a run-tests: generate timeout result in Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21324
diff changeset
635 elif ret == 'timeout':
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
636 self.fail('timed out')
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
637 elif ret is False:
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
638 raise WarnTest('no result code from test')
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
639 elif out != self._refout:
21614
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
640 # Diff generation may rely on written .err file.
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
641 if (ret != 0 or out != self._refout) and not self._skipped \
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
642 and not self._debug:
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
643 f = open(self.errpath, 'wb')
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
644 for line in out:
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
645 f.write(line)
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
646 f.close()
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
647
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
648 # The result object handles diff calculation for us.
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
649 if self._result.addOutputMismatch(self, ret, out, self._refout):
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
650 # change was accepted, skip failing
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
651 return
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
652
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
653 if ret:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
654 msg = 'output changed and ' + describe(ret)
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
655 else:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
656 msg = 'output changed'
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
657
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
658 self.fail(msg)
21327
206814c9072a run-tests: move remaining result processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21326
diff changeset
659 elif ret:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
660 self.fail(describe(ret))
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
661
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
662 def tearDown(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
663 """Tasks to perform after run()."""
21456
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
664 for entry in self._daemonpids:
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
665 killdaemons(entry)
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
666 self._daemonpids = []
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
667
26422
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
668 if self._keeptmpdir:
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
669 log('\nKeeping testtmp dir: %s\nKeeping threadtmp dir: %s' %
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
670 (self._testtmp, self._threadtmp))
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
671 else:
21461
a46a91989d57 run-tests: ignore failures from rmtree
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21460
diff changeset
672 shutil.rmtree(self._testtmp, True)
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
673 shutil.rmtree(self._threadtmp, True)
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
674
21455
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
675 if (self._ret != 0 or self._out != self._refout) and not self._skipped \
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
676 and not self._debug and self._out:
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
677 f = open(self.errpath, 'wb')
21455
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
678 for line in self._out:
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
679 f.write(line)
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
680 f.close()
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
681
24926
3fe1e07f1a32 run-test: include test name in the return vlog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24811
diff changeset
682 vlog("# Ret was:", self._ret, '(%s)' % self.name)
21452
1517c0461b75 run-tests: move some functionality to Test.tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21451
diff changeset
683
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
684 def _run(self, env):
21339
de25e968b4d8 run-tests: refactor runone() into gettest() and scheduletests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21338
diff changeset
685 # This should be implemented in child classes to run tests.
21490
588ebd47cd87 run-tests: replace Test.skip() with raise SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21489
diff changeset
686 raise SkipTest('unknown test type')
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
687
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
688 def abort(self):
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
689 """Terminate execution of this test."""
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
690 self._aborted = True
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
691
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
692 def _getreplacements(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
693 """Obtain a mapping of text replacements to apply to test output.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
694
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
695 Test output needs to be normalized so it can be compared to expected
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
696 output. This function defines how some of that normalization will
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
697 occur.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
698 """
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
699 r = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
700 (br':%d\b' % self._startport, b':$HGPORT'),
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
701 (br':%d\b' % (self._startport + 1), b':$HGPORT1'),
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
702 (br':%d\b' % (self._startport + 2), b':$HGPORT2'),
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
703 (br'(?m)^(saved backup bundle to .*\.hg)( \(glob\))?$',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
704 br'\1 (glob)'),
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
705 ]
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
706
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
707 if os.name == 'nt':
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
708 r.append(
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
709 (b''.join(c.isalpha() and b'[%s%s]' % (c.lower(), c.upper()) or
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
710 c in b'/\\' and br'[/\\]' or c.isdigit() and c or b'\\' + c
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
711 for c in self._testtmp), b'$TESTTMP'))
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
712 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
713 r.append((re.escape(self._testtmp), b'$TESTTMP'))
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
714
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
715 return r
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
716
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
717 def _getenv(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
718 """Obtain environment variables to use during test execution."""
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
719 env = os.environ.copy()
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
720 env['TESTTMP'] = self._testtmp
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
721 env['HOME'] = self._testtmp
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
722 env["HGPORT"] = str(self._startport)
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
723 env["HGPORT1"] = str(self._startport + 1)
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
724 env["HGPORT2"] = str(self._startport + 2)
25034
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
725 env["HGRCPATH"] = os.path.join(self._threadtmp, b'.hgrc')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
726 env["DAEMON_PIDS"] = os.path.join(self._threadtmp, b'daemon.pids')
23347
49cdf51cbc6c run-tests: include quotes in the HGEDITOR value when storing sys.executable
Matt Harbison <matt_harbison@yahoo.com>
parents: 23263
diff changeset
727 env["HGEDITOR"] = ('"' + sys.executable + '"'
49cdf51cbc6c run-tests: include quotes in the HGEDITOR value when storing sys.executable
Matt Harbison <matt_harbison@yahoo.com>
parents: 23263
diff changeset
728 + ' -c "import sys; sys.exit(0)"')
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
729 env["HGMERGE"] = "internal:merge"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
730 env["HGUSER"] = "test"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
731 env["HGENCODING"] = "ascii"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
732 env["HGENCODINGMODE"] = "strict"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
733
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
734 # Reset some environment variables to well-known values so that
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
735 # the tests produce repeatable output.
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
736 env['LANG'] = env['LC_ALL'] = env['LANGUAGE'] = 'C'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
737 env['TZ'] = 'GMT'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
738 env["EMAIL"] = "Foo Bar <foo.bar@example.com>"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
739 env['COLUMNS'] = '80'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
740 env['TERM'] = 'xterm'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
741
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
742 for k in ('HG HGPROF CDPATH GREP_OPTIONS http_proxy no_proxy ' +
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
743 'NO_PROXY').split():
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
744 if k in env:
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
745 del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
746
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
747 # unset env related to hooks
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
748 for k in env.keys():
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
749 if k.startswith('HG_'):
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
750 del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
751
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
752 return env
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
753
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
754 def _createhgrc(self, path):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
755 """Create an hgrc file for this test."""
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
756 hgrc = open(path, 'wb')
25034
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
757 hgrc.write(b'[ui]\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
758 hgrc.write(b'slash = True\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
759 hgrc.write(b'interactive = False\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
760 hgrc.write(b'mergemarkers = detailed\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
761 hgrc.write(b'promptecho = True\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
762 hgrc.write(b'[defaults]\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
763 hgrc.write(b'backout = -d "0 0"\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
764 hgrc.write(b'commit = -d "0 0"\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
765 hgrc.write(b'shelve = --date "0 0"\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
766 hgrc.write(b'tag = -d "0 0"\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
767 hgrc.write(b'[devel]\n')
25290
8f88f768e24c devel: rename 'all' to 'all-warnings' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25262
diff changeset
768 hgrc.write(b'all-warnings = true\n')
25034
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
769 hgrc.write(b'[largefiles]\n')
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
770 hgrc.write(b'usercache = %s\n' %
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
771 (os.path.join(self._testtmp, b'.cache/largefiles')))
23388
42ed0780ec4b run-tests: set a default largefiles usercache in the default hgrc file
Matt Harbison <matt_harbison@yahoo.com>
parents: 23352
diff changeset
772
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
773 for opt in self._extraconfigopts:
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
774 section, key = opt.split('.', 1)
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
775 assert '=' in key, ('extra config opt %s must '
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
776 'have an = for assignment' % opt)
25034
af6e6a0781d7 run-tests: use bytes explicitly for tmpdir and hgrc construction
Augie Fackler <augie@google.com>
parents: 25033
diff changeset
777 hgrc.write(b'[%s]\n%s\n' % (section, key))
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
778 hgrc.close()
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
779
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
780 def fail(self, msg):
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
781 # unittest differentiates between errored and failed.
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
782 # Failed is denoted by AssertionError (by default at least).
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
783 raise AssertionError(msg)
21323
a7c677e2f6ae run-tests: move fail() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21322
diff changeset
784
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
785 def _runcommand(self, cmd, env, normalizenewlines=False):
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
786 """Run command in a sub-process, capturing the output (stdout and
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
787 stderr).
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
788
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
789 Return a tuple (exitcode, output). output is None in debug mode.
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
790 """
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
791 if self._debug:
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
792 proc = subprocess.Popen(cmd, shell=True, cwd=self._testtmp,
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
793 env=env)
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
794 ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
795 return (ret, None)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
796
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
797 proc = Popen4(cmd, self._testtmp, self._timeout, env)
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
798 def cleanup():
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
799 terminate(proc)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
800 ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
801 if ret == 0:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
802 ret = signal.SIGTERM << 8
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
803 killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
804 return ret
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
805
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
806 output = ''
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
807 proc.tochild.close()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
808
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
809 try:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
810 output = proc.fromchild.read()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
811 except KeyboardInterrupt:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
812 vlog('# Handling keyboard interrupt')
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
813 cleanup()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
814 raise
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
815
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
816 ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
817 if wifexited(ret):
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
818 ret = os.WEXITSTATUS(ret)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
819
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
820 if proc.timeout:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
821 ret = 'timeout'
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
822
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
823 if ret:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
824 killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
825
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
826 for s, r in self._getreplacements():
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
827 output = re.sub(s, r, output)
24510
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
828
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
829 if normalizenewlines:
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
830 output = output.replace('\r\n', '\n')
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
831
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
832 return ret, output.splitlines(True)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
833
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
834 class PythonTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
835 """A Python-based test."""
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
836
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
837 @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
838 def refpath(self):
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
839 return os.path.join(self._testdir, b'%s.out' % self.bname)
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
840
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
841 def _run(self, env):
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
842 py3kswitch = self._py3kwarnings and b' -3' or b''
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
843 cmd = b'%s%s "%s"' % (PYTHON, py3kswitch, self.path)
21311
f9a7018a35ff run-tests: roll pytest() into PythonTest._run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21310
diff changeset
844 vlog("# Running", cmd)
24510
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
845 normalizenewlines = os.name == 'nt'
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
846 result = self._runcommand(cmd, env,
24510
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
847 normalizenewlines=normalizenewlines)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
848 if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
849 raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
850
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
851 return result
21311
f9a7018a35ff run-tests: roll pytest() into PythonTest._run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21310
diff changeset
852
23352
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
853 # This script may want to drop globs from lines matching these patterns on
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
854 # Windows, but check-code.py wants a glob on these lines unconditionally. Don't
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
855 # warn if that is the case for anything matching these lines.
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
856 checkcodeglobpats = [
25059
0e0f1068b878 run-tests: fix checking a line to see if it needs globbing
Augie Fackler <augie@google.com>
parents: 25058
diff changeset
857 re.compile(br'^pushing to \$TESTTMP/.*[^)]$'),
0e0f1068b878 run-tests: fix checking a line to see if it needs globbing
Augie Fackler <augie@google.com>
parents: 25058
diff changeset
858 re.compile(br'^moving \S+/.*[^)]$'),
0e0f1068b878 run-tests: fix checking a line to see if it needs globbing
Augie Fackler <augie@google.com>
parents: 25058
diff changeset
859 re.compile(br'^pulling from \$TESTTMP/.*[^)]$')
23352
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
860 ]
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
861
25036
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
862 bchr = chr
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
863 if PYTHON3:
25036
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
864 bchr = lambda x: bytes([x])
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
865
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
866 class TTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
867 """A "t test" is a test backed by a .t file."""
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
868
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
869 SKIPPED_PREFIX = 'skipped: '
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
870 FAILED_PREFIX = 'hghave check failed: '
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
871 NEEDESCAPE = re.compile(br'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
21384
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
872
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
873 ESCAPESUB = re.compile(br'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
874 ESCAPEMAP = dict((bchr(i), br'\x%02x' % i) for i in range(256))
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
875 ESCAPEMAP.update({b'\\': b'\\\\', b'\r': br'\r'})
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
876
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
877 @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
878 def refpath(self):
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
879 return os.path.join(self._testdir, self.bname)
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
880
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
881 def _run(self, env):
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
882 f = open(self.path, 'rb')
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
883 lines = f.readlines()
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
884 f.close()
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
885
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
886 salt, script, after, expected = self._parsetest(lines)
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
887
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
888 # Write out the generated script.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
889 fname = b'%s.sh' % self._testtmp
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
890 f = open(fname, 'wb')
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
891 for l in script:
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
892 f.write(l)
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
893 f.close()
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
894
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
895 cmd = b'%s "%s"' % (self._shell, fname)
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
896 vlog("# Running", cmd)
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
897
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
898 exitcode, output = self._runcommand(cmd, env)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
899
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
900 if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
901 raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
902
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
903 # Do not merge output if skipped. Return hghave message instead.
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
904 # Similarly, with --debug, output is None.
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
905 if exitcode == self.SKIPPED_STATUS or output is None:
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
906 return exitcode, output
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
907
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
908 return self._processoutput(exitcode, output, salt, after, expected)
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
909
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
910 def _hghave(self, reqs):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
911 # TODO do something smarter when all other uses of hghave are gone.
25728
905c32321cfb run-tests.py: execute hghave by the path relative to run-tests.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25388
diff changeset
912 runtestdir = os.path.abspath(os.path.dirname(_bytespath(__file__)))
905c32321cfb run-tests.py: execute hghave by the path relative to run-tests.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25388
diff changeset
913 tdir = runtestdir.replace(b'\\', b'/')
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
914 proc = Popen4(b'%s -c "%s/hghave %s"' %
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
915 (self._shell, tdir, b' '.join(reqs)),
23933
769027075e21 run-tests.py: execute hghave with same env vars as ones for actual tests
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23859
diff changeset
916 self._testtmp, 0, self._getenv())
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
917 stdout, stderr = proc.communicate()
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
918 ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
919 if wifexited(ret):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
920 ret = os.WEXITSTATUS(ret)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
921 if ret == 2:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
922 print(stdout)
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
923 sys.exit(1)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
924
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
925 return ret == 0
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
926
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
927 def _parsetest(self, lines):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
928 # We generate a shell script which outputs unique markers to line
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
929 # up script results with our source. These markers include input
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
930 # line number and the last return code.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
931 salt = b"SALT%d" % time.time()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
932 def addsalt(line, inpython):
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
933 if inpython:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
934 script.append(b'%s %d 0\n' % (salt, line))
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
935 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
936 script.append(b'echo %s %d $?\n' % (salt, line))
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
937
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
938 script = []
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
939
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
940 # After we run the shell script, we re-unify the script output
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
941 # with non-active parts of the source, with synchronization by our
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
942 # SALT line number markers. The after table contains the non-active
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
943 # components, ordered by line number.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
944 after = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
945
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
946 # Expected shell script output.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
947 expected = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
948
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
949 pos = prepos = -1
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
950
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
951 # True or False when in a true or false conditional section
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
952 skipping = None
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
953
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
954 # We keep track of whether or not we're in a Python block so we
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
955 # can generate the surrounding doctest magic.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
956 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
957
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
958 if self._debug:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
959 script.append(b'set -x\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
960 if os.getenv('MSYSTEM'):
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
961 script.append(b'alias pwd="pwd -W"\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
962
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
963 for n, l in enumerate(lines):
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
964 if not l.endswith(b'\n'):
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
965 l += b'\n'
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
966 if l.startswith(b'#require'):
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
967 lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
968 if len(lsplit) < 2 or lsplit[0] != b'#require':
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
969 after.setdefault(pos, []).append(' !!! invalid #require\n')
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
970 if not self._hghave(lsplit[1:]):
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
971 script = [b"exit 80\n"]
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
972 break
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
973 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
974 elif l.startswith(b'#if'):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
975 lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
976 if len(lsplit) < 2 or lsplit[0] != b'#if':
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
977 after.setdefault(pos, []).append(' !!! invalid #if\n')
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
978 if skipping is not None:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
979 after.setdefault(pos, []).append(' !!! nested #if\n')
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
980 skipping = not self._hghave(lsplit[1:])
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
981 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
982 elif l.startswith(b'#else'):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
983 if skipping is None:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
984 after.setdefault(pos, []).append(' !!! missing #if\n')
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
985 skipping = not skipping
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
986 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
987 elif l.startswith(b'#endif'):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
988 if skipping is None:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
989 after.setdefault(pos, []).append(' !!! missing #if\n')
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
990 skipping = None
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
991 after.setdefault(pos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
992 elif skipping:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
993 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
994 elif l.startswith(b' >>> '): # python inlines
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
995 after.setdefault(pos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
996 prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
997 pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
998 if not inpython:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
999 # We've just entered a Python block. Add the header.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1000 inpython = True
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1001 addsalt(prepos, False) # Make sure we report the exit code.
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
1002 script.append(b'%s -m heredoctest <<EOF\n' % PYTHON)
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1003 addsalt(n, True)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1004 script.append(l[2:])
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1005 elif l.startswith(b' ... '): # python inlines
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1006 after.setdefault(prepos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1007 script.append(l[2:])
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1008 elif l.startswith(b' $ '): # commands
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1009 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1010 script.append(b'EOF\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1011 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1012 after.setdefault(pos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1013 prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1014 pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1015 addsalt(n, False)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1016 cmd = l[4:].split()
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1017 if len(cmd) == 2 and cmd[0] == b'cd':
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1018 l = b' $ cd %s || exit 1\n' % cmd[1]
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1019 script.append(l[4:])
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1020 elif l.startswith(b' > '): # continuations
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1021 after.setdefault(prepos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1022 script.append(l[4:])
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1023 elif l.startswith(b' '): # results
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1024 # Queue up a list of expected results.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1025 expected.setdefault(pos, []).append(l[2:])
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1026 else:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1027 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1028 script.append(b'EOF\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1029 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1030 # Non-command/result. Queue up for merged output.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1031 after.setdefault(pos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1032
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1033 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1034 script.append(b'EOF\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1035 if skipping is not None:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1036 after.setdefault(pos, []).append(' !!! missing #endif\n')
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1037 addsalt(n + 1, False)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1038
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1039 return salt, script, after, expected
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1040
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1041 def _processoutput(self, exitcode, output, salt, after, expected):
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1042 # Merge the script output back into a unified test.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1043 warnonly = 1 # 1: not yet; 2: yes; 3: for sure not
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1044 if exitcode != 0:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1045 warnonly = 3
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1046
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1047 pos = -1
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1048 postout = []
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1049 for l in output:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1050 lout, lcmd = l, None
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1051 if salt in l:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1052 lout, lcmd = l.split(salt, 1)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1053
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1054 while lout:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1055 if not lout.endswith(b'\n'):
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1056 lout += b' (no-eol)\n'
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1057
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1058 # Find the expected output at the current position.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1059 el = None
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1060 if expected.get(pos, None):
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1061 el = expected[pos].pop(0)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1062
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1063 r = TTest.linematch(el, lout)
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1064 if isinstance(r, str):
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1065 if r == '+glob':
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1066 lout = el[:-1] + ' (glob)\n'
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1067 r = '' # Warn only this line.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1068 elif r == '-glob':
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1069 lout = ''.join(el.rsplit(' (glob)', 1))
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1070 r = '' # Warn only this line.
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1071 elif r == "retry":
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1072 postout.append(b' ' + el)
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1073 continue
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1074 else:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1075 log('\ninfo, unknown linematch result: %r\n' % r)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1076 r = False
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1077 if r:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1078 postout.append(b' ' + el)
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1079 else:
21384
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1080 if self.NEEDESCAPE(lout):
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1081 lout = TTest._stringescape(b'%s (esc)\n' %
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1082 lout.rstrip(b'\n'))
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1083 postout.append(b' ' + lout) # Let diff deal with it.
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1084 if r != '': # If line failed.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1085 warnonly = 3 # for sure not
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1086 elif warnonly == 1: # Is "not yet" and line is warn only.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1087 warnonly = 2 # Yes do warn.
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1088 break
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1089
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1090 # clean up any optional leftovers
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1091 while expected.get(pos, None):
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1092 el = expected[pos].pop(0)
26612
a38924f7680c run-tests: add b-prefix on two strings to fix python3 support
Augie Fackler <augie@google.com>
parents: 26422
diff changeset
1093 if not el.endswith(b" (?)\n"):
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1094 expected[pos].insert(0, el)
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1095 break
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1096 postout.append(b' ' + el)
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1097
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1098 if lcmd:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1099 # Add on last return code.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1100 ret = int(lcmd.split()[1])
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1101 if ret != 0:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1102 postout.append(b' [%d]\n' % ret)
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1103 if pos in after:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1104 # Merge in non-active test bits.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1105 postout += after.pop(pos)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1106 pos = int(lcmd.split()[0])
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1107
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1108 if pos in after:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1109 postout += after.pop(pos)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1110
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1111 if warnonly == 2:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1112 exitcode = False # Set exitcode to warned.
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1113
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1114 return exitcode, postout
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1115
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1116 @staticmethod
21316
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1117 def rematch(el, l):
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1118 try:
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1119 # use \Z to ensure that the regex matches to the end of the string
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1120 if os.name == 'nt':
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1121 return re.match(el + br'\r?\n\Z', l)
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1122 return re.match(el + br'\n\Z', l)
21316
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1123 except re.error:
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1124 # el is an invalid regex
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1125 return False
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1126
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1127 @staticmethod
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1128 def globmatch(el, l):
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1129 # The only supported special characters are * and ? plus / which also
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1130 # matches \ on windows. Escaping of these characters is supported.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1131 if el + b'\n' == l:
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1132 if os.altsep:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1133 # matching on "/" is not needed for this line
23352
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
1134 for pat in checkcodeglobpats:
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
1135 if pat.match(el):
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
1136 return True
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1137 return b'-glob'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1138 return True
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1139 i, n = 0, len(el)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1140 res = b''
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1141 while i < n:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1142 c = el[i:i + 1]
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1143 i += 1
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1144 if c == b'\\' and i < n and el[i:i + 1] in b'*?\\/':
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1145 res += el[i - 1:i + 1]
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1146 i += 1
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1147 elif c == b'*':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1148 res += b'.*'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1149 elif c == b'?':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1150 res += b'.'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1151 elif c == b'/' and os.altsep:
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1152 res += b'[/\\\\]'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1153 else:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1154 res += re.escape(c)
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1155 return TTest.rematch(res, l)
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1156
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1157 @staticmethod
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1158 def linematch(el, l):
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1159 retry = False
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1160 if el == l: # perfect match (fast)
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1161 return True
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1162 if el:
26612
a38924f7680c run-tests: add b-prefix on two strings to fix python3 support
Augie Fackler <augie@google.com>
parents: 26422
diff changeset
1163 if el.endswith(b" (?)\n"):
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1164 retry = "retry"
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1165 el = el[:-5] + "\n"
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1166 if el.endswith(b" (esc)\n"):
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
1167 if PYTHON3:
25047
8c7e938c8146 run-tests: string-escape no longer exists in python 3, use unicode_escape
Augie Fackler <augie@google.com>
parents: 25046
diff changeset
1168 el = el[:-7].decode('unicode_escape') + '\n'
8c7e938c8146 run-tests: string-escape no longer exists in python 3, use unicode_escape
Augie Fackler <augie@google.com>
parents: 25046
diff changeset
1169 el = el.encode('utf-8')
8c7e938c8146 run-tests: string-escape no longer exists in python 3, use unicode_escape
Augie Fackler <augie@google.com>
parents: 25046
diff changeset
1170 else:
8c7e938c8146 run-tests: string-escape no longer exists in python 3, use unicode_escape
Augie Fackler <augie@google.com>
parents: 25046
diff changeset
1171 el = el[:-7].decode('string-escape') + '\n'
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1172 if el == l or os.name == 'nt' and el[:-1] + b'\r\n' == l:
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1173 return True
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1174 if el.endswith(b" (re)\n"):
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1175 return TTest.rematch(el[:-6], l) or retry
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1176 if el.endswith(b" (glob)\n"):
23728
31d3f973d079 run-tests: automatically add (glob) to "saved backup bundle to" lines
Mads Kiilerich <madski@unity3d.com>
parents: 23388
diff changeset
1177 # ignore '(glob)' added to l by 'replacements'
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1178 if l.endswith(b" (glob)\n"):
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1179 l = l[:-8] + b"\n"
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
1180 return TTest.globmatch(el[:-8], l)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1181 if os.altsep and l.replace(b'\\', b'/') == el:
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1182 return b'+glob'
25388
6025cac3d02f tests: add (?) flag for optional lines
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
1183 return retry
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1184
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1185 @staticmethod
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1186 def parsehghaveoutput(lines):
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1187 '''Parse hghave log lines.
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1188
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1189 Return tuple of lists (missing, failed):
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1190 * the missing/unknown features
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1191 * the features for which existence check failed'''
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1192 missing = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1193 failed = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1194 for line in lines:
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
1195 if line.startswith(TTest.SKIPPED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1196 line = line.splitlines()[0]
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
1197 missing.append(line[len(TTest.SKIPPED_PREFIX):])
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
1198 elif line.startswith(TTest.FAILED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1199 line = line.splitlines()[0]
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
1200 failed.append(line[len(TTest.FAILED_PREFIX):])
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1201
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1202 return missing, failed
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1203
21384
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1204 @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1205 def _escapef(m):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1206 return TTest.ESCAPEMAP[m.group(0)]
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1207
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1208 @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1209 def _stringescape(s):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1210 return TTest.ESCAPESUB(TTest._escapef, s)
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1211
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
1212 iolock = threading.RLock()
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
1213
21442
867a1116be3c run-tests: record skips by raising SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21441
diff changeset
1214 class SkipTest(Exception):
867a1116be3c run-tests: record skips by raising SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21441
diff changeset
1215 """Raised to indicate that a test is to be skipped."""
867a1116be3c run-tests: record skips by raising SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21441
diff changeset
1216
21443
a6845a042d46 run-tests: record ignored tests by raising IgnoreTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21442
diff changeset
1217 class IgnoreTest(Exception):
a6845a042d46 run-tests: record ignored tests by raising IgnoreTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21442
diff changeset
1218 """Raised to indicate that a test is to be ignored."""
a6845a042d46 run-tests: record ignored tests by raising IgnoreTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21442
diff changeset
1219
21444
2b7d364690d8 run-tests: record warnings by raising WarnTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21443
diff changeset
1220 class WarnTest(Exception):
2b7d364690d8 run-tests: record warnings by raising WarnTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21443
diff changeset
1221 """Raised to indicate that a test warned."""
2b7d364690d8 run-tests: record warnings by raising WarnTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21443
diff changeset
1222
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1223 class TestResult(unittest._TextTestResult):
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1224 """Holds results when executing via unittest."""
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1225 # Don't worry too much about accessing the non-public _TextTestResult.
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1226 # It is relatively common in Python testing tools.
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1227 def __init__(self, options, *args, **kwargs):
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1228 super(TestResult, self).__init__(*args, **kwargs)
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1229
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1230 self._options = options
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1231
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1232 # unittest.TestResult didn't have skipped until 2.7. We need to
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1233 # polyfill it.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1234 self.skipped = []
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1235
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1236 # We have a custom "ignored" result that isn't present in any Python
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1237 # unittest implementation. It is very similar to skipped. It may make
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1238 # sense to map it into skip some day.
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1239 self.ignored = []
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1240
21433
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1241 # We have a custom "warned" result that isn't present in any Python
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1242 # unittest implementation. It is very similar to failed. It may make
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1243 # sense to map it into fail some day.
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1244 self.warned = []
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1245
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1246 self.times = []
25097
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1247 self._firststarttime = None
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1248 # Data stored for the benefit of generating xunit reports.
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1249 self.successes = []
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1250 self.faildata = {}
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1251
21462
8a4ef661f08d run-tests: make failure reporting in unittest mode equivalent to default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21461
diff changeset
1252 def addFailure(self, test, reason):
8a4ef661f08d run-tests: make failure reporting in unittest mode equivalent to default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21461
diff changeset
1253 self.failures.append((test, reason))
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1254
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1255 if self._options.first:
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1256 self.stop()
21735
5ee547fdb0be run-tests: produce error on running a failing test
anuraggoel <anurag.dsps@gmail.com>
parents: 21733
diff changeset
1257 else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1258 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1259 if not self._options.nodiff:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1260 self.stream.write('\nERROR: %s output changed\n' % test)
21754
7e14d026c4c4 run-tests: fixes the '--interactive' option error
anuraggoel <anurag.dsps@gmail.com>
parents: 21753
diff changeset
1261
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1262 self.stream.write('!')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1263 self.stream.flush()
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1264
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1265 def addSuccess(self, test):
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1266 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1267 super(TestResult, self).addSuccess(test)
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1268 self.successes.append(test)
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1269
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1270 def addError(self, test, err):
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1271 super(TestResult, self).addError(test, err)
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1272 if self._options.first:
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1273 self.stop()
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1274
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1275 # Polyfill.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1276 def addSkip(self, test, reason):
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1277 self.skipped.append((test, reason))
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1278 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1279 if self.showAll:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1280 self.stream.writeln('skipped %s' % reason)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1281 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1282 self.stream.write('s')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1283 self.stream.flush()
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
1284
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1285 def addIgnore(self, test, reason):
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1286 self.ignored.append((test, reason))
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1287 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1288 if self.showAll:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1289 self.stream.writeln('ignored %s' % reason)
21997
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
1290 else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1291 if reason not in ('not retesting', "doesn't match keyword"):
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1292 self.stream.write('i')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1293 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1294 self.testsRun += 1
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1295 self.stream.flush()
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
1296
21433
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1297 def addWarn(self, test, reason):
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1298 self.warned.append((test, reason))
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1299
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1300 if self._options.first:
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1301 self.stop()
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1302
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1303 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1304 if self.showAll:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1305 self.stream.writeln('warned %s' % reason)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1306 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1307 self.stream.write('~')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1308 self.stream.flush()
21433
ff4a270bd334 run-tests: teach unittest about warned results
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21432
diff changeset
1309
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1310 def addOutputMismatch(self, test, ret, got, expected):
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1311 """Record a mismatch in test output for a particular test."""
22838
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
1312 if self.shouldStop:
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
1313 # don't print, some other test case already failed and
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
1314 # printed, we're just stale and probably failed due to our
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
1315 # temp dir getting cleaned up.
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
1316 return
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1317
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
1318 accepted = False
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1319 failed = False
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1320 lines = []
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
1321
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1322 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1323 if self._options.nodiff:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1324 pass
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1325 elif self._options.view:
25056
e5f6c6ec21b8 run-tests: be more paranoid about os.system using bytes
Augie Fackler <augie@google.com>
parents: 25055
diff changeset
1326 v = self._options.view
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
1327 if PYTHON3:
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1328 v = _bytespath(v)
25056
e5f6c6ec21b8 run-tests: be more paranoid about os.system using bytes
Augie Fackler <augie@google.com>
parents: 25055
diff changeset
1329 os.system(b"%s %s %s" %
e5f6c6ec21b8 run-tests: be more paranoid about os.system using bytes
Augie Fackler <augie@google.com>
parents: 25055
diff changeset
1330 (v, test.refpath, test.errpath))
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1331 else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1332 servefail, lines = getdiff(expected, got,
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1333 test.refpath, test.errpath)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1334 if servefail:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1335 self.addFailure(
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1336 test,
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1337 'server failed to start (HGPORT=%s)' % test._startport)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1338 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1339 self.stream.write('\n')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1340 for line in lines:
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
1341 if PYTHON3:
25053
4f2c74ef8128 run-tests: write bytes to the binary buffer on sys.{stdout,stderr}
Augie Fackler <augie@google.com>
parents: 25052
diff changeset
1342 self.stream.flush()
4f2c74ef8128 run-tests: write bytes to the binary buffer on sys.{stdout,stderr}
Augie Fackler <augie@google.com>
parents: 25052
diff changeset
1343 self.stream.buffer.write(line)
4f2c74ef8128 run-tests: write bytes to the binary buffer on sys.{stdout,stderr}
Augie Fackler <augie@google.com>
parents: 25052
diff changeset
1344 self.stream.buffer.flush()
4f2c74ef8128 run-tests: write bytes to the binary buffer on sys.{stdout,stderr}
Augie Fackler <augie@google.com>
parents: 25052
diff changeset
1345 else:
4f2c74ef8128 run-tests: write bytes to the binary buffer on sys.{stdout,stderr}
Augie Fackler <augie@google.com>
parents: 25052
diff changeset
1346 self.stream.write(line)
4f2c74ef8128 run-tests: write bytes to the binary buffer on sys.{stdout,stderr}
Augie Fackler <augie@google.com>
parents: 25052
diff changeset
1347 self.stream.flush()
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1348
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1349 # handle interactive prompt without releasing iolock
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1350 if self._options.interactive:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1351 self.stream.write('Accept this change? [n] ')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1352 answer = sys.stdin.readline().strip()
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1353 if answer.lower() in ('y', 'yes'):
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1354 if test.name.endswith('.t'):
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1355 rename(test.errpath, test.path)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1356 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1357 rename(test.errpath, '%s.out' % test.path)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1358 accepted = True
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1359 if not accepted and not failed:
25052
c4217a046b62 run-tests: record faildata using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25051
diff changeset
1360 self.faildata[test.name] = b''.join(lines)
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
1361
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
1362 return accepted
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1363
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1364 def startTest(self, test):
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1365 super(TestResult, self).startTest(test)
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1366
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
1367 # os.times module computes the user time and system time spent by
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
1368 # child's processes along with real elapsed time taken by a process.
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
1369 # This module has one limitation. It can only work for Linux user
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
1370 # and not for Windows.
24331
d3bdd8c7174f run-tests: stop storing start/stop times in a dict by test name
Augie Fackler <augie@google.com>
parents: 24330
diff changeset
1371 test.started = os.times()
25097
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1372 if self._firststarttime is None: # thread racy but irrelevant
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1373 self._firststarttime = test.started[4]
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1374
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1375 def stopTest(self, test, interrupted=False):
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1376 super(TestResult, self).stopTest(test)
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1377
24331
d3bdd8c7174f run-tests: stop storing start/stop times in a dict by test name
Augie Fackler <augie@google.com>
parents: 24330
diff changeset
1378 test.stopped = os.times()
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
1379
24331
d3bdd8c7174f run-tests: stop storing start/stop times in a dict by test name
Augie Fackler <augie@google.com>
parents: 24330
diff changeset
1380 starttime = test.started
d3bdd8c7174f run-tests: stop storing start/stop times in a dict by test name
Augie Fackler <augie@google.com>
parents: 24330
diff changeset
1381 endtime = test.stopped
25097
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1382 origin = self._firststarttime
24984
5195322b9f80 run-tests: spread and document the content of time tuple
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24983
diff changeset
1383 self.times.append((test.name,
5195322b9f80 run-tests: spread and document the content of time tuple
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24983
diff changeset
1384 endtime[2] - starttime[2], # user space CPU time
5195322b9f80 run-tests: spread and document the content of time tuple
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24983
diff changeset
1385 endtime[3] - starttime[3], # sys space CPU time
5195322b9f80 run-tests: spread and document the content of time tuple
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24983
diff changeset
1386 endtime[4] - starttime[4], # real time
25097
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1387 starttime[4] - origin, # start date in run context
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1388 endtime[4] - origin, # end date in run context
24984
5195322b9f80 run-tests: spread and document the content of time tuple
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24983
diff changeset
1389 ))
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
1390
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1391 if interrupted:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1392 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1393 self.stream.writeln('INTERRUPTED: %s (after %d seconds)' % (
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1394 test.name, self.times[-1][3]))
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1395
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1396 class TestSuite(unittest.TestSuite):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
1397 """Custom unittest TestSuite that knows how to execute Mercurial tests."""
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1398
21533
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
1399 def __init__(self, testdir, jobs=1, whitelist=None, blacklist=None,
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
1400 retest=False, keywords=None, loop=False, runs_per_test=1,
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1401 loadtest=None,
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1402 *args, **kwargs):
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1403 """Create a new instance that can run tests with a configuration.
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1404
21533
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
1405 testdir specifies the directory where tests are executed from. This
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
1406 is typically the ``tests`` directory from Mercurial's source
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
1407 repository.
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
1408
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1409 jobs specifies the number of jobs to run concurrently. Each test
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1410 executes on its own thread. Tests actually spawn new processes, so
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1411 state mutation should not be an issue.
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1412
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1413 whitelist and blacklist denote tests that have been whitelisted and
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1414 blacklisted, respectively. These arguments don't belong in TestSuite.
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1415 Instead, whitelist and blacklist should be handled by the thing that
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1416 populates the TestSuite with tests. They are present to preserve
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1417 backwards compatible behavior which reports skipped tests as part
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1418 of the results.
21530
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
1419
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
1420 retest denotes whether to retest failed tests. This arguably belongs
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
1421 outside of TestSuite.
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
1422
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
1423 keywords denotes key words that will be used to filter which tests
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
1424 to execute. This arguably belongs outside of TestSuite.
21532
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
1425
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
1426 loop denotes whether to loop over tests forever.
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1427 """
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1428 super(TestSuite, self).__init__(*args, **kwargs)
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1429
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1430 self._jobs = jobs
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1431 self._whitelist = whitelist
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1432 self._blacklist = blacklist
21530
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
1433 self._retest = retest
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
1434 self._keywords = keywords
21532
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
1435 self._loop = loop
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
1436 self._runs_per_test = runs_per_test
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1437 self._loadtest = loadtest
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1438
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1439 def run(self, result):
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1440 # We have a number of filters that need to be applied. We do this
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1441 # here instead of inside Test because it makes the running logic for
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1442 # Test simpler.
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1443 tests = []
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1444 num_tests = [0]
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1445 for test in self._tests:
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1446 def get():
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1447 num_tests[0] += 1
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1448 if getattr(test, 'should_reload', False):
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1449 return self._loadtest(test.bname, num_tests[0])
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1450 return test
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1451 if not os.path.exists(test.path):
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1452 result.addSkip(test, "Doesn't exist")
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1453 continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1454
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1455 if not (self._whitelist and test.name in self._whitelist):
25055
d79258e30499 run-tests: blacklist entries are bytes, use bname to check blacklisting
Augie Fackler <augie@google.com>
parents: 25053
diff changeset
1456 if self._blacklist and test.bname in self._blacklist:
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1457 result.addSkip(test, 'blacklisted')
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1458 continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1459
21530
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
1460 if self._retest and not os.path.exists(test.errpath):
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1461 result.addIgnore(test, 'not retesting')
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1462 continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1463
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
1464 if self._keywords:
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
1465 f = open(test.path, 'rb')
25048
6b8ddf896463 run-tests: refer to test.bname when sniffing for keywords
Augie Fackler <augie@google.com>
parents: 25047
diff changeset
1466 t = f.read().lower() + test.bname.lower()
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1467 f.close()
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1468 ignored = False
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
1469 for k in self._keywords.lower().split():
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1470 if k not in t:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1471 result.addIgnore(test, "doesn't match keyword")
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1472 ignored = True
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1473 break
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1474
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1475 if ignored:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1476 continue
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
1477 for _ in xrange(self._runs_per_test):
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1478 tests.append(get())
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1479
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1480 runtests = list(tests)
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1481 done = queue.Queue()
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1482 running = 0
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1483
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1484 def job(test, result):
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1485 try:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1486 test(result)
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1487 done.put(None)
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1488 except KeyboardInterrupt:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1489 pass
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1490 except: # re-raises
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1491 done.put(('!', test, 'run-test raised an error, see traceback'))
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1492 raise
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1493
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1494 stoppedearly = False
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1495
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1496 try:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1497 while tests or running:
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1498 if not done.empty() or running == self._jobs or not tests:
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1499 try:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1500 done.get(True, 1)
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1501 running -= 1
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1502 if result and result.shouldStop:
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1503 stoppedearly = True
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1504 break
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1505 except queue.Empty:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1506 continue
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
1507 if tests and not running == self._jobs:
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1508 test = tests.pop(0)
21532
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
1509 if self._loop:
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1510 if getattr(test, 'should_reload', False):
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1511 num_tests[0] += 1
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1512 tests.append(
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1513 self._loadtest(test.name, num_tests[0]))
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1514 else:
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1515 tests.append(test)
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1516 t = threading.Thread(target=job, name=test.name,
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1517 args=(test, result))
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1518 t.start()
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1519 running += 1
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1520
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1521 # If we stop early we still need to wait on started tests to
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1522 # finish. Otherwise, there is a race between the test completing
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1523 # and the test's cleanup code running. This could result in the
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1524 # test reporting incorrect.
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1525 if stoppedearly:
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1526 while running:
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1527 try:
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1528 done.get(True, 1)
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1529 running -= 1
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1530 except queue.Empty:
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
1531 continue
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
1532 except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1533 for test in runtests:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1534 test.abort()
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1535
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1536 return result
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
1537
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1538 class TextTestRunner(unittest.TextTestRunner):
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1539 """Custom unittest test runner that uses appropriate settings."""
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1540
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1541 def __init__(self, runner, *args, **kwargs):
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1542 super(TextTestRunner, self).__init__(*args, **kwargs)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1543
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1544 self._runner = runner
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1545
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1546 def run(self, test):
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1547 result = TestResult(self._runner.options, self.stream,
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
1548 self.descriptions, self.verbosity)
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1549
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1550 test(result)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1551
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1552 failed = len(result.failures)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1553 warned = len(result.warned)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1554 skipped = len(result.skipped)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1555 ignored = len(result.ignored)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1556
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1557 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1558 self.stream.writeln('')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1559
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1560 if not self._runner.options.noskips:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1561 for test, msg in result.skipped:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1562 self.stream.writeln('Skipped %s: %s' % (test.name, msg))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1563 for test, msg in result.warned:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1564 self.stream.writeln('Warned %s: %s' % (test.name, msg))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1565 for test, msg in result.failures:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1566 self.stream.writeln('Failed %s: %s' % (test.name, msg))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1567 for test, msg in result.errors:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1568 self.stream.writeln('Errored %s: %s' % (test.name, msg))
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1569
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1570 if self._runner.options.xunit:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1571 xuf = open(self._runner.options.xunit, 'wb')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1572 try:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1573 timesd = dict((t[0], t[3]) for t in result.times)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1574 doc = minidom.Document()
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1575 s = doc.createElement('testsuite')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1576 s.setAttribute('name', 'run-tests')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1577 s.setAttribute('tests', str(result.testsRun))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1578 s.setAttribute('errors', "0") # TODO
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1579 s.setAttribute('failures', str(failed))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1580 s.setAttribute('skipped', str(skipped + ignored))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1581 doc.appendChild(s)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1582 for tc in result.successes:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1583 t = doc.createElement('testcase')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1584 t.setAttribute('name', tc.name)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1585 t.setAttribute('time', '%.3f' % timesd[tc.name])
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1586 s.appendChild(t)
25049
55f1ac2797cc run-tests: use items instead of iteritems on dicts
Augie Fackler <augie@google.com>
parents: 25048
diff changeset
1587 for tc, err in sorted(result.faildata.items()):
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1588 t = doc.createElement('testcase')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1589 t.setAttribute('name', tc)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1590 t.setAttribute('time', '%.3f' % timesd[tc])
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1591 # createCDATASection expects a unicode or it will
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1592 # convert using default conversion rules, which will
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1593 # fail if string isn't ASCII.
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1594 err = cdatasafe(err).decode('utf-8', 'replace')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1595 cd = doc.createCDATASection(err)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1596 t.appendChild(cd)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1597 s.appendChild(t)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1598 xuf.write(doc.toprettyxml(indent=' ', encoding='utf-8'))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1599 finally:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1600 xuf.close()
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1601
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1602 if self._runner.options.json:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1603 if json is None:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1604 raise ImportError("json module not installed")
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1605 jsonpath = os.path.join(self._runner._testdir, 'report.json')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1606 fp = open(jsonpath, 'w')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1607 try:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1608 timesd = {}
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1609 for tdata in result.times:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1610 test = tdata[0]
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1611 timesd[test] = tdata[1:]
22391
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
1612
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1613 outcome = {}
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1614 groups = [('success', ((tc, None)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1615 for tc in result.successes)),
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1616 ('failure', result.failures),
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1617 ('skip', result.skipped)]
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1618 for res, testcases in groups:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1619 for tc, __ in testcases:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1620 tres = {'result': res,
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1621 'time': ('%0.3f' % timesd[tc.name][2]),
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1622 'cuser': ('%0.3f' % timesd[tc.name][0]),
25097
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1623 'csys': ('%0.3f' % timesd[tc.name][1]),
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1624 'start': ('%0.3f' % timesd[tc.name][3]),
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
1625 'end': ('%0.3f' % timesd[tc.name][4])}
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1626 outcome[tc.name] = tres
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1627 jsonout = json.dumps(outcome, sort_keys=True, indent=4)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1628 fp.writelines(("testreport =", jsonout))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1629 finally:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1630 fp.close()
22391
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
1631
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1632 self._runner._checkhglib('Tested')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
1633
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1634 self.stream.writeln(
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1635 '# Ran %d tests, %d skipped, %d warned, %d failed.'
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1636 % (result.testsRun,
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1637 skipped + ignored, warned, failed))
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1638 if failed:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1639 self.stream.writeln('python hash seed: %s' %
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1640 os.environ['PYTHONHASHSEED'])
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1641 if self._runner.options.time:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1642 self.printtimes(result.times)
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
1643
21613
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1644 return result
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1645
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
1646 def printtimes(self, times):
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
1647 # iolock held by run
21494
dcefc4091c86 run-tests: move outputtimes() into unittest runner class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21493
diff changeset
1648 self.stream.writeln('# Producing time report')
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
1649 times.sort(key=lambda t: (t[3]))
25098
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
1650 cols = '%7.3f %7.3f %7.3f %7.3f %7.3f %s'
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
1651 self.stream.writeln('%-7s %-7s %-7s %-7s %-7s %s' %
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
1652 ('start', 'end', 'cuser', 'csys', 'real', 'Test'))
24982
5c15f7e0f52b run-tests: stop explicit expansion of time data
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24981
diff changeset
1653 for tdata in times:
5c15f7e0f52b run-tests: stop explicit expansion of time data
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24981
diff changeset
1654 test = tdata[0]
25098
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
1655 cuser, csys, real, start, end = tdata[1:6]
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
1656 self.stream.writeln(cols % (start, end, cuser, csys, real, test))
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
1657
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
1658 class TestRunner(object):
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
1659 """Holds context for executing tests.
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
1660
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
1661 Tests rely on a lot of state. This object holds it for them.
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
1662 """
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1663
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1664 # Programs required to run tests.
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
1665 REQUIREDTOOLS = [
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1666 os.path.basename(_bytespath(sys.executable)),
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1667 b'diff',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1668 b'grep',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1669 b'unzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1670 b'gunzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1671 b'bunzip2',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1672 b'sed',
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
1673 ]
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
1674
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1675 # Maps file extensions to test class.
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1676 TESTTYPES = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1677 (b'.py', PythonTest),
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1678 (b'.t', TTest),
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1679 ]
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1680
21341
cb88d4a04f58 run-tests: move TESTDIR out of a global
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21340
diff changeset
1681 def __init__(self):
21348
b3399154505f run-tests: add options to runner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21347
diff changeset
1682 self.options = None
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
1683 self._hgroot = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1684 self._testdir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1685 self._hgtmp = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1686 self._installdir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1687 self._bindir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1688 self._tmpbinddir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1689 self._pythondir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1690 self._coveragefile = None
21352
39fd89fbbc3c run-tests: move createdfiles out of a global and into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21351
diff changeset
1691 self._createdfiles = []
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
1692 self._hgpath = None
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1693 self._portoffset = 0
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1694 self._ports = {}
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
1695
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
1696 def run(self, args, parser=None):
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1697 """Run the test suite."""
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1698 oldmask = os.umask(0o22)
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
1699 try:
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
1700 parser = parser or getparser()
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
1701 options, args = parseargs(args, parser)
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1702 # positional arguments are paths to test files to run, so
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1703 # we make sure they're all bytestrings
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1704 args = [_bytespath(a) for a in args]
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
1705 self.options = options
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
1706
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
1707 self._checktools()
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
1708 tests = self.findtests(args)
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1709 if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1710 import statprof
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1711 statprof.start()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1712 result = self._run(tests)
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1713 if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1714 statprof.stop()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1715 statprof.display()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1716 return result
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
1717
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
1718 finally:
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
1719 os.umask(oldmask)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1720
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1721 def _run(self, tests):
21372
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1722 if self.options.random:
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1723 random.shuffle(tests)
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1724 else:
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1725 # keywords for slow tests
25067
f52c5701925a run-tests: allow different extra weight for slow tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25060
diff changeset
1726 slow = {b'svn': 10,
f52c5701925a run-tests: allow different extra weight for slow tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25060
diff changeset
1727 b'gendoc': 10,
25068
f66fc374d2d7 run-test.py: greatly increase the priority of 'check-code' tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25067
diff changeset
1728 b'check-code-hg': 100,
25067
f52c5701925a run-tests: allow different extra weight for slow tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25060
diff changeset
1729 }
21372
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1730 def sortkey(f):
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1731 # run largest tests first, as they tend to take the longest
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1732 try:
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1733 val = -os.stat(f).st_size
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1734 except OSError as e:
21372
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1735 if e.errno != errno.ENOENT:
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1736 raise
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1737 return -1e9 # file does not exist, tell early
25261
27600986a0d9 run-tests: use items() instead of iteritems()
Augie Fackler <raf@durin42.com>
parents: 25177
diff changeset
1738 for kw, mul in slow.items():
21372
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1739 if kw in f:
25067
f52c5701925a run-tests: allow different extra weight for slow tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25060
diff changeset
1740 val *= mul
21372
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1741 return val
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1742 tests.sort(key=sortkey)
3a44787e50e2 run-tests: move test shuffling and sorting into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21371
diff changeset
1743
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1744 self._testdir = osenvironb[b'TESTDIR'] = getattr(
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1745 os, 'getcwdb', os.getcwd)()
21371
a10ba7870c2d run-tests: assign testdir in TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21370
diff changeset
1746
21370
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
1747 if 'PYTHONHASHSEED' not in os.environ:
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
1748 # use a random python hash seed all the time
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
1749 # we do the randomness ourself to know what seed is used
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
1750 os.environ['PYTHONHASHSEED'] = str(random.getrandbits(32))
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
1751
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1752 if self.options.tmpdir:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1753 self.options.keep_tmpdir = True
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1754 tmpdir = _bytespath(self.options.tmpdir)
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1755 if os.path.exists(tmpdir):
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1756 # Meaning of tmpdir has changed since 1.3: we used to create
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1757 # HGTMP inside tmpdir; now HGTMP is tmpdir. So fail if
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1758 # tmpdir already exists.
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1759 print("error: temp dir %r already exists" % tmpdir)
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1760 return 1
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1761
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1762 # Automatically removing tmpdir sounds convenient, but could
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1763 # really annoy anyone in the habit of using "--tmpdir=/tmp"
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1764 # or "--tmpdir=$HOME".
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1765 #vlog("# Removing temp dir", tmpdir)
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1766 #shutil.rmtree(tmpdir)
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1767 os.makedirs(tmpdir)
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1768 else:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1769 d = None
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1770 if os.name == 'nt':
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1771 # without this, we get the default temp dir location, but
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1772 # in all lowercase, which causes troubles with paths (issue3490)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1773 d = osenvironb.get(b'TMP', None)
25262
5a809deb88e6 run-tests: python3.5 now supports mkdtemp using bytes for paths
Augie Fackler <raf@durin42.com>
parents: 25261
diff changeset
1774 tmpdir = tempfile.mkdtemp(b'', b'hgtests.', d)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1775
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1776 self._hgtmp = osenvironb[b'HGTMP'] = (
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1777 os.path.realpath(tmpdir))
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
1778
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1779 if self.options.with_hg:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1780 self._installdir = None
25042
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
1781 whg = self.options.with_hg
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
1782 # If --with-hg is not specified, we have bytes already,
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
1783 # but if it was specified in python3 we get a str, so we
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
1784 # have to encode it back into a bytes.
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
1785 if PYTHON3:
25042
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
1786 if not isinstance(whg, bytes):
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1787 whg = _bytespath(whg)
25042
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
1788 self._bindir = os.path.dirname(os.path.realpath(whg))
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
1789 assert isinstance(self._bindir, bytes)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1790 self._tmpbindir = os.path.join(self._hgtmp, b'install', b'bin')
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1791 os.makedirs(self._tmpbindir)
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1792
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1793 # This looks redundant with how Python initializes sys.path from
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1794 # the location of the script being executed. Needed because the
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1795 # "hg" specified by --with-hg is not the only Python script
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1796 # executed in the test suite that needs to import 'mercurial'
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1797 # ... which means it's not really redundant at all.
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1798 self._pythondir = self._bindir
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1799 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1800 self._installdir = os.path.join(self._hgtmp, b"install")
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1801 self._bindir = osenvironb[b"BINDIR"] = \
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1802 os.path.join(self._installdir, b"bin")
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1803 self._tmpbindir = self._bindir
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1804 self._pythondir = os.path.join(self._installdir, b"lib", b"python")
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1805
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1806 osenvironb[b"BINDIR"] = self._bindir
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
1807 osenvironb[b"PYTHON"] = PYTHON
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1808
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1809 fileb = _bytespath(__file__)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1810 runtestdir = os.path.abspath(os.path.dirname(fileb))
25729
57dfadc4f46c run-tests.py: add RUNTESTDIR to refer `tests` of Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25728
diff changeset
1811 osenvironb[b'RUNTESTDIR'] = runtestdir
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
1812 if PYTHON3:
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
1813 sepb = _bytespath(os.pathsep)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1814 else:
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1815 sepb = os.pathsep
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1816 path = [self._bindir, runtestdir] + osenvironb[b"PATH"].split(sepb)
24742
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
1817 if os.path.islink(__file__):
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
1818 # test helper will likely be at the end of the symlink
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1819 realfile = os.path.realpath(fileb)
24742
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
1820 realdir = os.path.abspath(os.path.dirname(realfile))
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
1821 path.insert(2, realdir)
25730
c380d5273e91 run-tests.py: add TESTDIR to PATH if it differs from RUNTESTDIR
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25729
diff changeset
1822 if self._testdir != runtestdir:
c380d5273e91 run-tests.py: add TESTDIR to PATH if it differs from RUNTESTDIR
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25729
diff changeset
1823 path = [self._testdir] + path
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1824 if self._tmpbindir != self._bindir:
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1825 path = [self._tmpbindir] + path
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1826 osenvironb[b"PATH"] = sepb.join(path)
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
1827
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1828 # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1829 # can run .../tests/run-tests.py test-foo where test-foo
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1830 # adds an extension to HGRC. Also include run-test.py directory to
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1831 # import modules like heredoctest.
23859
661b246bf1c4 run-tests: include testdir in $PATH so tests easily can use helper tools
Mads Kiilerich <madski@unity3d.com>
parents: 23728
diff changeset
1832 pypath = [self._pythondir, self._testdir, runtestdir]
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1833 # We have to augment PYTHONPATH, rather than simply replacing
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1834 # it, in case external libraries are only available via current
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1835 # PYTHONPATH. (In particular, the Subversion bindings on OS X
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1836 # are in /opt/subversion.)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1837 oldpypath = osenvironb.get(IMPL_PATH)
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1838 if oldpypath:
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1839 pypath.append(oldpypath)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1840 osenvironb[IMPL_PATH] = sepb.join(pypath)
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1841
23935
d64dd1252386 run-tests.py: inherit --pure option from outer run-tests.py execution
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23933
diff changeset
1842 if self.options.pure:
d64dd1252386 run-tests.py: inherit --pure option from outer run-tests.py execution
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23933
diff changeset
1843 os.environ["HGTEST_RUN_TESTS_PURE"] = "--pure"
d64dd1252386 run-tests.py: inherit --pure option from outer run-tests.py execution
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23933
diff changeset
1844
26109
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
1845 if self.options.allow_slow_tests:
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
1846 os.environ["HGTEST_SLOW"] = "slow"
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
1847 elif 'HGTEST_SLOW' in os.environ:
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
1848 del os.environ['HGTEST_SLOW']
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
1849
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1850 self._coveragefile = os.path.join(self._testdir, b'.coverage')
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
1851
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1852 vlog("# Using TESTDIR", self._testdir)
25729
57dfadc4f46c run-tests.py: add RUNTESTDIR to refer `tests` of Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25728
diff changeset
1853 vlog("# Using RUNTESTDIR", osenvironb[b'RUNTESTDIR'])
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1854 vlog("# Using HGTMP", self._hgtmp)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1855 vlog("# Using PATH", os.environ["PATH"])
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1856 vlog("# Using", IMPL_PATH, osenvironb[IMPL_PATH])
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1857
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1858 try:
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1859 return self._runtests(tests) or 0
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1860 finally:
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1861 time.sleep(.1)
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1862 self._cleanup()
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1863
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1864 def findtests(self, args):
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1865 """Finds possible test files from arguments.
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1866
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1867 If you wish to inject custom tests into the test harness, this would
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1868 be a good function to monkeypatch or override in a derived class.
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1869 """
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1870 if not args:
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1871 if self.options.changed:
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1872 proc = Popen4('hg st --rev "%s" -man0 .' %
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1873 self.options.changed, None, 0)
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1874 stdout, stderr = proc.communicate()
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1875 args = stdout.strip(b'\0').split(b'\0')
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1876 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1877 args = os.listdir(b'.')
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1878
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1879 return [t for t in args
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1880 if os.path.basename(t).startswith(b'test-')
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1881 and (t.endswith(b'.py') or t.endswith(b'.t'))]
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
1882
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1883 def _runtests(self, tests):
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1884 try:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1885 if self._installdir:
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
1886 self._installhg()
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
1887 self._checkhglib("Testing")
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1888 else:
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
1889 self._usecorrectpython()
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1890
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1891 if self.options.restart:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1892 orig = list(tests)
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1893 while tests:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1894 if os.path.exists(tests[0] + ".err"):
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1895 break
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1896 tests.pop(0)
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1897 if not tests:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1898 print("running all tests")
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1899 tests = orig
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1900
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
1901 tests = [self._gettest(t, i) for i, t in enumerate(tests)]
21437
d9532be2fc4d run-tests: pass Test instances into TestRunner._executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21436
diff changeset
1902
21458
c42219733f30 run-tests: don't print results in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21457
diff changeset
1903 failed = False
c42219733f30 run-tests: don't print results in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21457
diff changeset
1904 warned = False
25050
28526bb5b3b5 run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com>
parents: 25049
diff changeset
1905 kws = self.options.keywords
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
1906 if kws is not None and PYTHON3:
25050
28526bb5b3b5 run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com>
parents: 25049
diff changeset
1907 kws = kws.encode('utf-8')
21458
c42219733f30 run-tests: don't print results in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21457
diff changeset
1908
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1909 suite = TestSuite(self._testdir,
21533
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
1910 jobs=self.options.jobs,
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1911 whitelist=self.options.whitelisted,
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
1912 blacklist=self.options.blacklist,
21530
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
1913 retest=self.options.retest,
25050
28526bb5b3b5 run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com>
parents: 25049
diff changeset
1914 keywords=kws,
21532
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
1915 loop=self.options.loop,
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
1916 runs_per_test=self.options.runs_per_test,
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1917 tests=tests, loadtest=self._gettest)
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
1918 verbosity = 1
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
1919 if self.options.verbose:
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
1920 verbosity = 2
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
1921 runner = TextTestRunner(self, verbosity=verbosity)
21613
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1922 result = runner.run(suite)
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1923
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1924 if result.failures:
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1925 failed = True
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1926 if result.warned:
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
1927 warned = True
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1928
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1929 if self.options.anycoverage:
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
1930 self._outputcoverage()
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1931 except KeyboardInterrupt:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1932 failed = True
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1933 print("\ninterrupted!")
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1934
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1935 if failed:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1936 return 1
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1937 if warned:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1938 return 80
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
1939
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1940 def _getport(self, count):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1941 port = self._ports.get(count) # do we have a cached entry?
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1942 if port is None:
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1943 port = self.options.port + self._portoffset
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1944 portneeded = 3
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1945 # above 100 tries we just give up and let test reports failure
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1946 for tries in xrange(100):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1947 allfree = True
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1948 for idx in xrange(portneeded):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1949 if not checkportisavailable(port + idx):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1950 allfree = False
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1951 break
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1952 self._portoffset += portneeded
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1953 if allfree:
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1954 break
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1955 self._ports[count] = port
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1956 return port
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1957
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
1958 def _gettest(self, test, count):
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1959 """Obtain a Test by looking at its filename.
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1960
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1961 Returns a Test instance. The Test may not be runnable if it doesn't
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1962 map to a known type.
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1963 """
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1964 lctest = test.lower()
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1965 testcls = Test
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1966
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1967 for ext, cls in self.TESTTYPES:
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1968 if lctest.endswith(ext):
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1969 testcls = cls
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1970 break
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1971
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1972 refpath = os.path.join(self._testdir, test)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1973 tmpdir = os.path.join(self._hgtmp, b'child%d' % count)
21504
888a5dfe1569 run-tests: pass temp dir into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21502
diff changeset
1974
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1975 t = testcls(refpath, tmpdir,
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1976 keeptmpdir=self.options.keep_tmpdir,
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1977 debug=self.options.debug,
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1978 timeout=self.options.timeout,
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
1979 startport=self._getport(count),
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1980 extraconfigopts=self.options.extra_config_opt,
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1981 py3kwarnings=self.options.py3k_warnings,
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1982 shell=self.options.shell)
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1983 t.should_reload = True
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
1984 return t
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
1985
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
1986 def _cleanup(self):
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1987 """Clean up state from this test invocation."""
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1988
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1989 if self.options.keep_tmpdir:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1990 return
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1991
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1992 vlog("# Cleaning up HGTMP", self._hgtmp)
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
1993 shutil.rmtree(self._hgtmp, True)
21352
39fd89fbbc3c run-tests: move createdfiles out of a global and into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21351
diff changeset
1994 for f in self._createdfiles:
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1995 try:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1996 os.remove(f)
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1997 except OSError:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1998 pass
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
1999
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
2000 def _usecorrectpython(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2001 """Configure the environment to use the appropriate Python in tests."""
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2002 # Tests must use the same interpreter as us or bad things will happen.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2003 pyexename = sys.platform == 'win32' and b'python.exe' or b'python'
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2004 if getattr(os, 'symlink', None):
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2005 vlog("# Making python executable in test path a symlink to '%s'" %
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2006 sys.executable)
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2007 mypython = os.path.join(self._tmpbindir, pyexename)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2008 try:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2009 if os.readlink(mypython) == sys.executable:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2010 return
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2011 os.unlink(mypython)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
2012 except OSError as err:
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2013 if err.errno != errno.ENOENT:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2014 raise
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2015 if self._findprogram(pyexename) != sys.executable:
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2016 try:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2017 os.symlink(sys.executable, mypython)
21352
39fd89fbbc3c run-tests: move createdfiles out of a global and into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21351
diff changeset
2018 self._createdfiles.append(mypython)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
2019 except OSError as err:
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2020 # child processes may race, which is harmless
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2021 if err.errno != errno.EEXIST:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2022 raise
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2023 else:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2024 exedir, exename = os.path.split(sys.executable)
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2025 vlog("# Modifying search path to find %s as %s in '%s'" %
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2026 (exename, pyexename, exedir))
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2027 path = os.environ['PATH'].split(os.pathsep)
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2028 while exedir in path:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2029 path.remove(exedir)
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2030 os.environ['PATH'] = os.pathsep.join([exedir] + path)
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2031 if not self._findprogram(pyexename):
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
2032 print("WARNING: Cannot find %s in search path" % pyexename)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
2033
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
2034 def _installhg(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2035 """Install hg into the test environment.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2036
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2037 This will also configure hg with the appropriate testing settings.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2038 """
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2039 vlog("# Performing temporary installation of HG")
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2040 installerrs = os.path.join(b"tests", b"install.err")
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2041 compiler = ''
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2042 if self.options.compiler:
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2043 compiler = '--compiler ' + self.options.compiler
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24075
diff changeset
2044 if self.options.pure:
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2045 pure = b"--pure"
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24075
diff changeset
2046 else:
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2047 pure = b""
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2048 py3 = ''
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2049
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2050 # Run installer in hg root
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2051 script = os.path.realpath(sys.argv[0])
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2052 exe = sys.executable
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
2053 if PYTHON3:
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2054 py3 = b'--c2to3'
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
2055 compiler = _bytespath(compiler)
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
2056 script = _bytespath(script)
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
2057 exe = _bytespath(exe)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2058 hgroot = os.path.dirname(os.path.dirname(script))
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
2059 self._hgroot = hgroot
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2060 os.chdir(hgroot)
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2061 nohome = b'--home=""'
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2062 if os.name == 'nt':
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2063 # The --home="" trick works only on OS where os.sep == '/'
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2064 # because of a distutils convert_path() fast-path. Avoid it at
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2065 # least on Windows for now, deal with .pydistutils.cfg bugs
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2066 # when they happen.
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2067 nohome = b''
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2068 cmd = (b'%(exe)s setup.py %(py3)s %(pure)s clean --all'
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2069 b' build %(compiler)s --build-base="%(base)s"'
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2070 b' install --force --prefix="%(prefix)s"'
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2071 b' --install-lib="%(libdir)s"'
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2072 b' --install-scripts="%(bindir)s" %(nohome)s >%(logfile)s 2>&1'
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2073 % {b'exe': exe, b'py3': py3, b'pure': pure,
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2074 b'compiler': compiler,
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2075 b'base': os.path.join(self._hgtmp, b"build"),
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2076 b'prefix': self._installdir, b'libdir': self._pythondir,
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2077 b'bindir': self._bindir,
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2078 b'nohome': nohome, b'logfile': installerrs})
24075
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2079
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2080 # setuptools requires install directories to exist.
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2081 def makedirs(p):
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2082 try:
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2083 os.makedirs(p)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
2084 except OSError as e:
24075
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2085 if e.errno != errno.EEXIST:
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2086 raise
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2087 makedirs(self._pythondir)
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2088 makedirs(self._bindir)
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
2089
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2090 vlog("# Running", cmd)
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2091 if os.system(cmd) == 0:
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2092 if not self.options.verbose:
26087
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
2093 try:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
2094 os.remove(installerrs)
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
2095 except OSError as e:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
2096 if e.errno != errno.ENOENT:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
2097 raise
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2098 else:
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
2099 f = open(installerrs, 'rb')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2100 for line in f:
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
2101 if PYTHON3:
25040
6b8c48cfb85e run-tests: write bytes to sys.stdout.buffer in python 3
Augie Fackler <augie@google.com>
parents: 25039
diff changeset
2102 sys.stdout.buffer.write(line)
6b8c48cfb85e run-tests: write bytes to sys.stdout.buffer in python 3
Augie Fackler <augie@google.com>
parents: 25039
diff changeset
2103 else:
6b8c48cfb85e run-tests: write bytes to sys.stdout.buffer in python 3
Augie Fackler <augie@google.com>
parents: 25039
diff changeset
2104 sys.stdout.write(line)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2105 f.close()
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2106 sys.exit(1)
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2107 os.chdir(self._testdir)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2108
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
2109 self._usecorrectpython()
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2110
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2111 if self.options.py3k_warnings and not self.options.anycoverage:
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2112 vlog("# Updating hg command to enable Py3k Warnings switch")
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
2113 f = open(os.path.join(self._bindir, 'hg'), 'rb')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2114 lines = [line.rstrip() for line in f]
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2115 lines[0] += ' -3'
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2116 f.close()
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
2117 f = open(os.path.join(self._bindir, 'hg'), 'wb')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2118 for line in lines:
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2119 f.write(line + '\n')
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2120 f.close()
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2121
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2122 hgbat = os.path.join(self._bindir, b'hg.bat')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2123 if os.path.isfile(hgbat):
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2124 # hg.bat expects to be put in bin/scripts while run-tests.py
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2125 # installation layout put it in bin/ directly. Fix it
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2126 f = open(hgbat, 'rb')
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2127 data = f.read()
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2128 f.close()
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2129 if b'"%~dp0..\python" "%~dp0hg" %*' in data:
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2130 data = data.replace(b'"%~dp0..\python" "%~dp0hg" %*',
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2131 b'"%~dp0python" "%~dp0hg" %*')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2132 f = open(hgbat, 'wb')
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2133 f.write(data)
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2134 f.close()
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2135 else:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
2136 print('WARNING: cannot fix hg.bat reference to python.exe')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2137
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2138 if self.options.anycoverage:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2139 custom = os.path.join(self._testdir, 'sitecustomize.py')
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2140 target = os.path.join(self._pythondir, 'sitecustomize.py')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2141 vlog('# Installing coverage trigger to %s' % target)
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2142 shutil.copyfile(custom, target)
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2143 rc = os.path.join(self._testdir, '.coveragerc')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2144 vlog('# Installing coverage rc to %s' % rc)
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2145 os.environ['COVERAGE_PROCESS_START'] = rc
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2146 covdir = os.path.join(self._installdir, '..', 'coverage')
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2147 try:
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2148 os.mkdir(covdir)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
2149 except OSError as e:
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2150 if e.errno != errno.EEXIST:
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2151 raise
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2152
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2153 os.environ['COVERAGE_DIR'] = covdir
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
2154
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
2155 def _checkhglib(self, verb):
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
2156 """Ensure that the 'mercurial' package imported by python is
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
2157 the one we expect it to be. If not, print a warning to stderr."""
21733
9ad11d5bcc2f run-tests: don't check for the mercurial library used when using --with-hg
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21614
diff changeset
2158 if ((self._bindir == self._pythondir) and
9ad11d5bcc2f run-tests: don't check for the mercurial library used when using --with-hg
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21614
diff changeset
2159 (self._bindir != self._tmpbindir)):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
2160 # The pythondir has been inferred from --with-hg flag.
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
2161 # We cannot expect anything sensible here.
21733
9ad11d5bcc2f run-tests: don't check for the mercurial library used when using --with-hg
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21614
diff changeset
2162 return
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
2163 expecthg = os.path.join(self._pythondir, b'mercurial')
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2164 actualhg = self._gethgpath()
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
2165 if os.path.abspath(actualhg) != os.path.abspath(expecthg):
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
2166 sys.stderr.write('warning: %s with unexpected mercurial lib: %s\n'
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
2167 ' (expected %s)\n'
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
2168 % (verb, actualhg, expecthg))
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2169 def _gethgpath(self):
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2170 """Return the path to the mercurial package that is actually found by
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2171 the current Python interpreter."""
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2172 if self._hgpath is not None:
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2173 return self._hgpath
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2174
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
2175 cmd = b'%s -c "import mercurial; print (mercurial.__path__[0])"'
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
2176 cmd = cmd % PYTHON
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
2177 if PYTHON3:
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
2178 cmd = _strpath(cmd)
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
2179 pipe = os.popen(cmd)
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2180 try:
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
2181 self._hgpath = _bytespath(pipe.read().strip())
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2182 finally:
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2183 pipe.close()
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2184
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2185 return self._hgpath
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
2186
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
2187 def _outputcoverage(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2188 """Produce code coverage output."""
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2189 from coverage import coverage
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
2190
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2191 vlog('# Producing coverage report')
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2192 # chdir is the easiest way to get short, relative paths in the
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2193 # output.
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
2194 os.chdir(self._hgroot)
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2195 covdir = os.path.join(self._installdir, '..', 'coverage')
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2196 cov = coverage(data_file=os.path.join(covdir, 'cov'))
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
2197
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
2198 # Map install directory paths back to source directory.
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
2199 cov.config.paths['srcdir'] = ['.', self._pythondir]
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
2200
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
2201 cov.combine()
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
2202
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2203 omit = [os.path.join(x, '*') for x in [self._bindir, self._testdir]]
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2204 cov.report(ignore_errors=True, omit=omit)
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2205
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
2206 if self.options.htmlcov:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2207 htmldir = os.path.join(self._testdir, 'htmlcov')
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2208 cov.html_report(directory=htmldir, omit=omit)
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
2209 if self.options.annotate:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2210 adir = os.path.join(self._testdir, 'annotated')
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
2211 if not os.path.isdir(adir):
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
2212 os.mkdir(adir)
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
2213 cov.annotate(directory=adir, omit=omit)
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
2214
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2215 def _findprogram(self, program):
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2216 """Search PATH for a executable program"""
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
2217 dpb = _bytespath(os.defpath)
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
2218 sepb = _bytespath(os.pathsep)
25038
66da89457c47 run-tests: fix _findprogram to reliably return bytes
Augie Fackler <augie@google.com>
parents: 25037
diff changeset
2219 for p in osenvironb.get(b'PATH', dpb).split(sepb):
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2220 name = os.path.join(p, program)
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2221 if os.name == 'nt' or os.access(name, os.X_OK):
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2222 return name
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2223 return None
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2224
21374
592b3d2616d7 run-tests: move checktools into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21373
diff changeset
2225 def _checktools(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2226 """Ensure tools required to run tests are present."""
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2227 for p in self.REQUIREDTOOLS:
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2228 if os.name == 'nt' and not p.endswith('.exe'):
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2229 p += '.exe'
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2230 found = self._findprogram(p)
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2231 if found:
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2232 vlog("# Found prerequisite", p, "at", found)
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2233 else:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
2234 print("WARNING: Did not find prerequisite tool: %s " % p)
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2235
13347
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
2236 if __name__ == '__main__':
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
2237 runner = TestRunner()
22120
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2238
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2239 try:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2240 import msvcrt
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2241 msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2242 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2243 msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2244 except ImportError:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2245 pass
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
2246
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
2247 sys.exit(runner.run(sys.argv[1:]))