annotate tests/run-tests.py @ 20258:3cd441353d6b

run-tests: report tests as failed when run-test raises an error Before no message was returned to the main thread. No result was registered and no new thread was started. This does not happen when running normal. But when fiddling around with the test infrastructure, this helps a lot.
author Simon Heimberg <simohe@besonet.ch>
date Thu, 16 Jan 2014 18:55:35 +0100
parents f694cd81b600
children bb4aac9b048c
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
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
38 #
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
39 # (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
40 # 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
41 # 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
42 # 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
43
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
44 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
45 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
46 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
47 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
48 import os
10905
13a1b2fb7ef2 pylint, pyflakes: remove unused or duplicate imports
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10903
diff changeset
49 import shutil
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
50 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
51 import signal
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 sys
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
53 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
54 import time
18616
35b4affe6fdd test: display used python hash seed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18565
diff changeset
55 import random
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
56 import re
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
57 import threading
17464
eddfb9a550d0 run-tests: do not duplicate killdaemons() code
Patrick Mezard <patrick@mezard.eu>
parents: 16906
diff changeset
58 import killdaemons as killmod
18057
6b88ded2a993 run-tests: support running tests in parallel on windows
Bryan O'Sullivan <bryano@fb.com>
parents: 18050
diff changeset
59 import Queue as queue
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
60
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
61 processlock = threading.Lock()
19413
a4de0d3dc35a run-tests: lock popen wait/poll
Brendan Cully <brendan@kublai.com>
parents: 19407
diff changeset
62
19415
a0699972e75a run-tests: replace popen locking with a noop _cleanup handler on py24
Brendan Cully <brendan@kublai.com>
parents: 19414
diff changeset
63 # subprocess._cleanup can race with any Popen.wait or Popen.poll on py24
a0699972e75a run-tests: replace popen locking with a noop _cleanup handler on py24
Brendan Cully <brendan@kublai.com>
parents: 19414
diff changeset
64 # http://bugs.python.org/issue1731717 for details. We shouldn't be producing
a0699972e75a run-tests: replace popen locking with a noop _cleanup handler on py24
Brendan Cully <brendan@kublai.com>
parents: 19414
diff changeset
65 # zombies but it's pretty harmless even if we do.
20219
f694cd81b600 run-tests: better check for python version
Simon Heimberg <simohe@besonet.ch>
parents: 20046
diff changeset
66 if sys.version_info < (2, 5):
19415
a0699972e75a run-tests: replace popen locking with a noop _cleanup handler on py24
Brendan Cully <brendan@kublai.com>
parents: 19414
diff changeset
67 subprocess._cleanup = lambda: None
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
68
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
69 closefds = os.name == 'posix'
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
70 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
71 processlock.acquire()
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
72 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
73 close_fds=closefds,
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
74 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
75 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
76 processlock.release()
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
77
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
78 p.fromchild = p.stdout
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
79 p.tochild = p.stdin
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
80 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
81
14337
439ed4721a6d run-tests: ignore timeout when Popen.terminate is unavailable
Patrick Mezard <pmezard@gmail.com>
parents: 14336
diff changeset
82 p.timeout = False
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
83 if timeout:
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
84 def t():
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
85 start = time.time()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
86 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
87 time.sleep(.1)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
88 p.timeout = True
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
89 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
90 terminate(p)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
91 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
92
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
93 return p
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
94
5685
57d29a45ffbc Use skipped: instead of hghave: for skipping tests, use this in test-merge-types
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5524
diff changeset
95 # reserved exit code to skip test (used by hghave)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
96 SKIPPED_STATUS = 80
5685
57d29a45ffbc Use skipped: instead of hghave: for skipping tests, use this in test-merge-types
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5524
diff changeset
97 SKIPPED_PREFIX = 'skipped: '
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
98 FAILED_PREFIX = 'hghave check failed: '
15448
873f94ecd706 run-tests: convert windows paths to unix
Mads Kiilerich <mads@kiilerich.com>
parents: 15447
diff changeset
99 PYTHON = sys.executable.replace('\\', '/')
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
100 IMPL_PATH = 'PYTHONPATH'
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
101 if 'java' in sys.platform:
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
102 IMPL_PATH = 'JYTHONPATH'
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
103
18049
07ad75b22910 run-tests: check for the correct python when starting
Bryan O'Sullivan <bryano@fb.com>
parents: 18048
diff changeset
104 requiredtools = [os.path.basename(sys.executable), "diff", "grep", "unzip",
07ad75b22910 run-tests: check for the correct python when starting
Bryan O'Sullivan <bryano@fb.com>
parents: 18048
diff changeset
105 "gunzip", "bunzip2", "sed"]
20019
edbf7f1fd2a2 run-tests: remove files that we potentially create outside of $TMPDIR
Sean Farley <sean.michael.farley@gmail.com>
parents: 20018
diff changeset
106 createdfiles = []
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
107
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
108 defaults = {
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
109 '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
110 '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
111 '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
112 '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
113 }
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
114
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
115 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
116 entries = dict()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
117 for filename in files:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
118 try:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
119 path = os.path.expanduser(os.path.expandvars(filename))
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
120 f = open(path, "r")
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
121 except IOError, err:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
122 if err.errno != errno.ENOENT:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
123 raise
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
124 if warn:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
125 print "warning: no such %s file: %s" % (listtype, filename)
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
126 continue
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
127
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
128 for line in f.readlines():
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
129 line = line.split('#', 1)[0].strip()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
130 if line:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
131 entries[line] = filename
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
132
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
133 f.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
134 return entries
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
135
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
136 def parseargs():
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
137 parser = optparse.OptionParser("%prog [options] [tests]")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
138
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
139 # keep these sorted
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
140 parser.add_option("--blacklist", action="append",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
141 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
142 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
143 help="always run tests listed in the specified whitelist file")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
144 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
145 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
146 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
147 help="print a test coverage report")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
148 parser.add_option("-d", "--debug", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
149 help="debug mode: write output of test scripts to console"
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
150 " rather than capturing and diff'ing 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
151 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
152 help="exit on the first test failure")
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
153 parser.add_option("-H", "--htmlcov", action="store_true",
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
154 help="create an HTML report of the coverage of the files")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
155 parser.add_option("--inotify", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
156 help="enable inotify extension when running tests")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
157 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
158 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
159 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
160 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
161 " (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
162 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
163 help="keep temporary directory after running tests")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
164 parser.add_option("-k", "--keywords",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
165 help="run tests matching keywords")
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
166 parser.add_option("-l", "--local", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
167 help="shortcut for --with-hg=<testdir>/../hg")
19283
8300adf9ca33 run-tests: add --loop support
Matt Mackall <mpm@selenic.com>
parents: 19282
diff changeset
168 parser.add_option("--loop", action="store_true",
8300adf9ca33 run-tests: add --loop support
Matt Mackall <mpm@selenic.com>
parents: 19282
diff changeset
169 help="loop tests repeatedly")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
170 parser.add_option("-n", "--nodiff", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
171 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
172 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
173 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
174 " (default: $%s or %d)" % defaults['port'])
17966
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
175 parser.add_option("--compiler", type="string",
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
176 help="compiler to build with")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
177 parser.add_option("--pure", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
178 help="use pure Python code instead of C extensions")
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
179 parser.add_option("-R", "--restart", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
180 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
181 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
182 help="retest failed tests")
9580
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
183 parser.add_option("-S", "--noskips", action="store_true",
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
184 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
185 parser.add_option("--shell", type="string",
b68a41420397 run-tests: add --shell command line flag
Martin Geisler <mg@lazybytes.net>
parents: 14201
diff changeset
186 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
187 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
188 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
189 " (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
190 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
191 help="time how long each test takes")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
192 parser.add_option("--tmpdir", type="string",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
193 help="run tests in the given temporary directory"
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
194 " (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
195 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
196 help="output verbose messages")
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
197 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
198 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
199 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
200 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
201 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
202 "temporary installation")
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
203 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
204 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
205 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
206 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
207 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
208 help='run tests in random order')
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
209
14201
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
210 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
211 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
212 parser.set_defaults(**defaults)
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
213 (options, args) = parser.parse_args()
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
214
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
215 # 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
216 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
217 options.pure = True
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
218
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
219 if options.with_hg:
15942
d7a34c07e69b run-tests: expand user in --with-hg
Mads Kiilerich <mads@kiilerich.com>
parents: 15941
diff changeset
220 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
221 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
222 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
223 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
224 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
225 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
226 if options.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
227 testdir = os.path.dirname(os.path.realpath(sys.argv[0]))
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
228 hgbin = os.path.join(os.path.dirname(testdir), 'hg')
16538
dd194e5df4c1 tests: don't require 'hg' without extension on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 16346
diff changeset
229 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
230 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
231 % 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
232 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
233
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
234 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
235 if options.anycoverage:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
236 try:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
237 import coverage
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
238 covver = version.StrictVersion(coverage.__version__).version
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
239 if covver < (3, 3):
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
240 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
241 except ImportError:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
242 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
243
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
244 if options.anycoverage and options.local:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
245 # 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
246 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
247 "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
248
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
249 global verbose
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
250 if options.verbose:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
251 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
252
9394
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
253 if options.tmpdir:
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
254 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
255
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
256 if options.jobs < 1:
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
257 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
258 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
259 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
260 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
261 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
262 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
263 '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
264 options.timeout = 0
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
265 if options.py3k_warnings:
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
266 if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
267 parser.error('--py3k-warnings can only be used on Python 2.6+')
9959
b37b060d84c7 run-tests: add a "--blacklist target" option to skip predefined test lists
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9958
diff changeset
268 if options.blacklist:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
269 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
270 if options.whitelist:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
271 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
272 else:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
273 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
274
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
275 return (options, args)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
276
5800
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
277 def rename(src, dst):
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
278 """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
279 for existing destination support.
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
280 """
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
281 shutil.copy(src, dst)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
282 os.remove(src)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
283
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
284 def parsehghaveoutput(lines):
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
285 '''Parse hghave log lines.
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
286 Return tuple of lists (missing, failed):
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
287 * the missing/unknown features
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
288 * the features for which existence check failed'''
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
289 missing = []
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
290 failed = []
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
291 for line in lines:
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
292 if line.startswith(SKIPPED_PREFIX):
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
293 line = line.splitlines()[0]
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
294 missing.append(line[len(SKIPPED_PREFIX):])
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
295 elif line.startswith(FAILED_PREFIX):
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
296 line = line.splitlines()[0]
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
297 failed.append(line[len(FAILED_PREFIX):])
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
298
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
299 return missing, failed
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
300
10088
ec8304e66ea5 run-tests.py: Show paths to failing tests, .err and .out
Mads Kiilerich <mads@kiilerich.com>
parents: 10030
diff changeset
301 def showdiff(expected, output, ref, err):
14062
643381286e0c run-tests: print a new line before writing the diff
Idan Kamara <idankk86@gmail.com>
parents: 14037
diff changeset
302 print
10088
ec8304e66ea5 run-tests.py: Show paths to failing tests, .err and .out
Mads Kiilerich <mads@kiilerich.com>
parents: 10030
diff changeset
303 for line in difflib.unified_diff(expected, output, ref, err):
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
304 sys.stdout.write(line)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
305
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
306 verbose = False
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
307 def vlog(*msg):
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
308 if verbose is not False:
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
309 iolock.acquire()
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
310 if verbose:
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
311 print verbose,
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
312 for m in msg:
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
313 print m,
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
314 print
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
315 sys.stdout.flush()
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
316 iolock.release()
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
317
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
318 def log(*msg):
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
319 iolock.acquire()
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
320 if verbose:
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
321 print verbose,
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
322 for m in msg:
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
323 print m,
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
324 print
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
325 sys.stdout.flush()
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
326 iolock.release()
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
327
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
328 def findprogram(program):
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
329 """Search PATH for a executable program"""
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
330 for p in os.environ.get('PATH', os.defpath).split(os.pathsep):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
331 name = os.path.join(p, program)
14335
220f31030e7f run-tests: fix python executable detection and copy on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 14282
diff changeset
332 if os.name == 'nt' or os.access(name, os.X_OK):
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
333 return name
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
334 return None
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
335
19242
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
336 def createhgrc(path, options):
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
337 # create a fresh hgrc
19299
cdc612db2ffb run-tests: open hgrc file only for writing
Simon Heimberg <simohe@besonet.ch>
parents: 19294
diff changeset
338 hgrc = open(path, 'w')
19242
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
339 hgrc.write('[ui]\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
340 hgrc.write('slash = True\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
341 hgrc.write('interactive = False\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
342 hgrc.write('[defaults]\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
343 hgrc.write('backout = -d "0 0"\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
344 hgrc.write('commit = -d "0 0"\n')
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19759
diff changeset
345 hgrc.write('shelve = --date "0 0"\n')
19242
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
346 hgrc.write('tag = -d "0 0"\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
347 if options.inotify:
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
348 hgrc.write('[extensions]\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
349 hgrc.write('inotify=\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
350 hgrc.write('[inotify]\n')
19267
6a7c76395b4c run-tests: move DAEMON_PIDS to env
Matt Mackall <mpm@selenic.com>
parents: 19266
diff changeset
351 hgrc.write('pidfile=daemon.pids')
19242
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
352 hgrc.write('appendpid=True\n')
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
353 if options.extra_config_opt:
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
354 for opt in options.extra_config_opt:
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
355 section, key = opt.split('.', 1)
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
356 assert '=' in key, ('extra config opt %s must '
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
357 'have an = for assignment' % opt)
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
358 hgrc.write('[%s]\n%s\n' % (section, key))
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
359 hgrc.close()
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
360
19275
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
361 def createenv(options, testtmp, threadtmp, port):
19269
f4247d7e2046 run-tests: move environment creation to a separate function
Matt Mackall <mpm@selenic.com>
parents: 19268
diff changeset
362 env = os.environ.copy()
f4247d7e2046 run-tests: move environment creation to a separate function
Matt Mackall <mpm@selenic.com>
parents: 19268
diff changeset
363 env['TESTTMP'] = testtmp
f4247d7e2046 run-tests: move environment creation to a separate function
Matt Mackall <mpm@selenic.com>
parents: 19268
diff changeset
364 env['HOME'] = testtmp
19275
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
365 env["HGPORT"] = str(port)
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
366 env["HGPORT1"] = str(port + 1)
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
367 env["HGPORT2"] = str(port + 2)
19274
6f666780f846 run-tests: introduce threadtmp directory
Matt Mackall <mpm@selenic.com>
parents: 19273
diff changeset
368 env["HGRCPATH"] = os.path.join(threadtmp, '.hgrc')
6f666780f846 run-tests: introduce threadtmp directory
Matt Mackall <mpm@selenic.com>
parents: 19273
diff changeset
369 env["DAEMON_PIDS"] = os.path.join(threadtmp, 'daemon.pids')
19272
16df87e25f41 run-tests: move more variables to env
Matt Mackall <mpm@selenic.com>
parents: 19271
diff changeset
370 env["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
16df87e25f41 run-tests: move more variables to env
Matt Mackall <mpm@selenic.com>
parents: 19271
diff changeset
371 env["HGMERGE"] = "internal:merge"
16df87e25f41 run-tests: move more variables to env
Matt Mackall <mpm@selenic.com>
parents: 19271
diff changeset
372 env["HGUSER"] = "test"
16df87e25f41 run-tests: move more variables to env
Matt Mackall <mpm@selenic.com>
parents: 19271
diff changeset
373 env["HGENCODING"] = "ascii"
16df87e25f41 run-tests: move more variables to env
Matt Mackall <mpm@selenic.com>
parents: 19271
diff changeset
374 env["HGENCODINGMODE"] = "strict"
19269
f4247d7e2046 run-tests: move environment creation to a separate function
Matt Mackall <mpm@selenic.com>
parents: 19268
diff changeset
375
19270
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
376 # Reset some environment variables to well-known values so that
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
377 # the tests produce repeatable output.
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
378 env['LANG'] = env['LC_ALL'] = env['LANGUAGE'] = 'C'
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
379 env['TZ'] = 'GMT'
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
380 env["EMAIL"] = "Foo Bar <foo.bar@example.com>"
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
381 env['COLUMNS'] = '80'
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
382 env['TERM'] = 'xterm'
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
383
19271
08be9601b464 run-tests: simplify env deletion
Matt Mackall <mpm@selenic.com>
parents: 19270
diff changeset
384 for k in ('HG HGPROF CDPATH GREP_OPTIONS http_proxy no_proxy ' +
08be9601b464 run-tests: simplify env deletion
Matt Mackall <mpm@selenic.com>
parents: 19270
diff changeset
385 'NO_PROXY').split():
08be9601b464 run-tests: simplify env deletion
Matt Mackall <mpm@selenic.com>
parents: 19270
diff changeset
386 if k in env:
08be9601b464 run-tests: simplify env deletion
Matt Mackall <mpm@selenic.com>
parents: 19270
diff changeset
387 del env[k]
19270
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
388
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
389 # unset env related to hooks
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
390 for k in env.keys():
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
391 if k.startswith('HG_'):
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
392 del env[k]
ac80a1cddf83 run-tests: move most of remaining environment tweaks
Matt Mackall <mpm@selenic.com>
parents: 19269
diff changeset
393
19269
f4247d7e2046 run-tests: move environment creation to a separate function
Matt Mackall <mpm@selenic.com>
parents: 19268
diff changeset
394 return env
19242
d25fc3264d44 run-tests: pull hgrc creation out as function
Matt Mackall <mpm@selenic.com>
parents: 19241
diff changeset
395
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
396 def checktools():
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
397 # Before we go any further, check for pre-requisite tools
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
398 # stuff from coreutils (cat, rm, etc) are not tested
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
399 for p in requiredtools:
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
400 if os.name == 'nt' and not p.endswith('.exe'):
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
401 p += '.exe'
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
402 found = findprogram(p)
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
403 if found:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
404 vlog("# Found prerequisite", p, "at", found)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
405 else:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
406 print "WARNING: Did not find prerequisite tool: "+p
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
407
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
408 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
409 """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
410 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
411 try:
14971
0b21ae0a2366 tests: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14867
diff changeset
412 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
413 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
414 pass
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
415
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
416 def killdaemons(pidfile):
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
417 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
418 logfn=vlog)
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
419
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
420 def cleanup(options):
6208
c88b9e597588 tests: add --keep-tmp to run-tests.py to debug test environment
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6004
diff changeset
421 if not options.keep_tmpdir:
8671
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
422 vlog("# Cleaning up HGTMP", HGTMP)
6208
c88b9e597588 tests: add --keep-tmp to run-tests.py to debug test environment
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6004
diff changeset
423 shutil.rmtree(HGTMP, True)
20019
edbf7f1fd2a2 run-tests: remove files that we potentially create outside of $TMPDIR
Sean Farley <sean.michael.farley@gmail.com>
parents: 20018
diff changeset
424 for f in createdfiles:
edbf7f1fd2a2 run-tests: remove files that we potentially create outside of $TMPDIR
Sean Farley <sean.michael.farley@gmail.com>
parents: 20018
diff changeset
425 try:
edbf7f1fd2a2 run-tests: remove files that we potentially create outside of $TMPDIR
Sean Farley <sean.michael.farley@gmail.com>
parents: 20018
diff changeset
426 os.remove(f)
edbf7f1fd2a2 run-tests: remove files that we potentially create outside of $TMPDIR
Sean Farley <sean.michael.farley@gmail.com>
parents: 20018
diff changeset
427 except OSError:
edbf7f1fd2a2 run-tests: remove files that we potentially create outside of $TMPDIR
Sean Farley <sean.michael.farley@gmail.com>
parents: 20018
diff changeset
428 pass
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
429
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
430 def usecorrectpython():
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
431 # some tests run python interpreter. they must use same
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
432 # interpreter we use or bad things will happen.
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
433 pyexename = sys.platform == 'win32' and 'python.exe' or 'python'
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
434 if getattr(os, 'symlink', None):
18061
0e4316c3a703 run-tests: fix whitespace nonsense
Bryan O'Sullivan <bos@serpentine.com>
parents: 18060
diff changeset
435 vlog("# Making python executable in test path a symlink to '%s'" %
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
436 sys.executable)
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
437 mypython = os.path.join(BINDIR, pyexename)
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
438 try:
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
439 if os.readlink(mypython) == sys.executable:
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
440 return
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
441 os.unlink(mypython)
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
442 except OSError, err:
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
443 if err.errno != errno.ENOENT:
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
444 raise
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
445 if findprogram(pyexename) != sys.executable:
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
446 try:
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
447 os.symlink(sys.executable, mypython)
20019
edbf7f1fd2a2 run-tests: remove files that we potentially create outside of $TMPDIR
Sean Farley <sean.michael.farley@gmail.com>
parents: 20018
diff changeset
448 createdfiles.append(mypython)
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
449 except OSError, err:
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
450 # child processes may race, which is harmless
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
451 if err.errno != errno.EEXIST:
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
452 raise
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
453 else:
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
454 exedir, exename = os.path.split(sys.executable)
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
455 vlog("# Modifying search path to find %s as %s in '%s'" %
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
456 (exename, pyexename, exedir))
18059
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
457 path = os.environ['PATH'].split(os.pathsep)
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
458 while exedir in path:
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
459 path.remove(exedir)
c135ab6413b4 run-tests: on windows, put correct python at front of PATH
Bryan O'Sullivan <bryano@fb.com>
parents: 18058
diff changeset
460 os.environ['PATH'] = os.pathsep.join([exedir] + path)
18244
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
461 if not findprogram(pyexename):
5a3c71b0e042 run-tests.py: fix handling of symlink to the right python
Mads Kiilerich <mads@kiilerich.com>
parents: 18230
diff changeset
462 print "WARNING: Cannot find %s in search path" % pyexename
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2989
diff changeset
463
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
464 def installhg(options):
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
465 vlog("# Performing temporary installation of HG")
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
466 installerrs = os.path.join("tests", "install.err")
17966
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
467 compiler = ''
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
468 if options.compiler:
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
469 compiler = '--compiler ' + options.compiler
7723
a343cd25e425 run-tests: add --pure flag for using pure Python modules
Martin Geisler <mg@daimi.au.dk>
parents: 7529
diff changeset
470 pure = options.pure and "--pure" or ""
19758
14c4f605f0fc run-tests: if run by python3, execute setup.py with --c2to3
Augie Fackler <raf@durin42.com>
parents: 19527
diff changeset
471 py3 = ''
14c4f605f0fc run-tests: if run by python3, execute setup.py with --c2to3
Augie Fackler <raf@durin42.com>
parents: 19527
diff changeset
472 if sys.version_info[0] == 3:
14c4f605f0fc run-tests: if run by python3, execute setup.py with --c2to3
Augie Fackler <raf@durin42.com>
parents: 19527
diff changeset
473 py3 = '--c2to3'
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
474
5267
b817d17c7ee5 Make run-tests.py work when invoked outside of tests.
Brendan Cully <brendan@kublai.com>
parents: 5251
diff changeset
475 # Run installer in hg root
8943
09ff905cdc86 run-tests: use os.path.realpath() to find hg's setup.py.
Greg Ward <greg-hg@gerg.ca>
parents: 8843
diff changeset
476 script = os.path.realpath(sys.argv[0])
09ff905cdc86 run-tests: use os.path.realpath() to find hg's setup.py.
Greg Ward <greg-hg@gerg.ca>
parents: 8843
diff changeset
477 hgroot = os.path.dirname(os.path.dirname(script))
09ff905cdc86 run-tests: use os.path.realpath() to find hg's setup.py.
Greg Ward <greg-hg@gerg.ca>
parents: 8843
diff changeset
478 os.chdir(hgroot)
9905
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
479 nohome = '--home=""'
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
480 if os.name == 'nt':
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
481 # The --home="" trick works only on OS where os.sep == '/'
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
482 # because of a distutils convert_path() fast-path. Avoid it at
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
483 # least on Windows for now, deal with .pydistutils.cfg bugs
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
484 # when they happen.
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
485 nohome = ''
19758
14c4f605f0fc run-tests: if run by python3, execute setup.py with --c2to3
Augie Fackler <raf@durin42.com>
parents: 19527
diff changeset
486 cmd = ('%(exe)s setup.py %(py3)s %(pure)s clean --all'
17966
ae20cde050c2 run-tests: add a --compiler option
Bryan O'Sullivan <bryano@fb.com>
parents: 17965
diff changeset
487 ' build %(compiler)s --build-base="%(base)s"'
17965
0167da3cbc44 run-tests: make build command line less intimidating
Bryan O'Sullivan <bryano@fb.com>
parents: 17936
diff changeset
488 ' install --force --prefix="%(prefix)s" --install-lib="%(libdir)s"'
0167da3cbc44 run-tests: make build command line less intimidating
Bryan O'Sullivan <bryano@fb.com>
parents: 17936
diff changeset
489 ' --install-scripts="%(bindir)s" %(nohome)s >%(logfile)s 2>&1'
19758
14c4f605f0fc run-tests: if run by python3, execute setup.py with --c2to3
Augie Fackler <raf@durin42.com>
parents: 19527
diff changeset
490 % dict(exe=sys.executable, py3=py3, pure=pure, compiler=compiler,
17965
0167da3cbc44 run-tests: make build command line less intimidating
Bryan O'Sullivan <bryano@fb.com>
parents: 17936
diff changeset
491 base=os.path.join(HGTMP, "build"),
17967
0e2850a6fcdd run-tests: fix an unnoticed check-code violation
Bryan O'Sullivan <bryano@fb.com>
parents: 17966
diff changeset
492 prefix=INST, libdir=PYTHONDIR, bindir=BINDIR,
17965
0167da3cbc44 run-tests: make build command line less intimidating
Bryan O'Sullivan <bryano@fb.com>
parents: 17936
diff changeset
493 nohome=nohome, logfile=installerrs))
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
494 vlog("# Running", cmd)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
495 if os.system(cmd) == 0:
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
496 if not options.verbose:
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
497 os.remove(installerrs)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
498 else:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
499 f = open(installerrs)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
500 for line in f:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
501 print line,
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
502 f.close()
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
503 sys.exit(1)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
504 os.chdir(TESTDIR)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
505
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
506 usecorrectpython()
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
507
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
508 if options.py3k_warnings and not options.anycoverage:
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
509 vlog("# Updating hg command to enable Py3k Warnings switch")
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
510 f = open(os.path.join(BINDIR, 'hg'), 'r')
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
511 lines = [line.rstrip() for line in f]
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
512 lines[0] += ' -3'
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
513 f.close()
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
514 f = open(os.path.join(BINDIR, 'hg'), 'w')
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
515 for line in lines:
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
516 f.write(line + '\n')
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
517 f.close()
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
518
14336
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
519 hgbat = os.path.join(BINDIR, 'hg.bat')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
520 if os.path.isfile(hgbat):
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
521 # hg.bat expects to be put in bin/scripts while run-tests.py
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
522 # installation layout put it in bin/ directly. Fix it
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
523 f = open(hgbat, 'rb')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
524 data = f.read()
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
525 f.close()
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
526 if '"%~dp0..\python" "%~dp0hg" %*' in data:
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
527 data = data.replace('"%~dp0..\python" "%~dp0hg" %*',
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
528 '"%~dp0python" "%~dp0hg" %*')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
529 f = open(hgbat, 'wb')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
530 f.write(data)
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
531 f.close()
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
532 else:
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
533 print 'WARNING: cannot fix hg.bat reference to python.exe'
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
534
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
535 if options.anycoverage:
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
536 custom = os.path.join(TESTDIR, 'sitecustomize.py')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
537 target = os.path.join(PYTHONDIR, 'sitecustomize.py')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
538 vlog('# Installing coverage trigger to %s' % target)
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
539 shutil.copyfile(custom, target)
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
540 rc = os.path.join(TESTDIR, '.coveragerc')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
541 vlog('# Installing coverage rc to %s' % rc)
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
542 os.environ['COVERAGE_PROCESS_START'] = rc
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
543 fn = os.path.join(INST, '..', '.coverage')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
544 os.environ['COVERAGE_FILE'] = fn
8092
c49578c5122f run-tests: move _hgpath() up so it's not in the middle of the main program.
Greg Ward <greg-hg@gerg.ca>
parents: 8091
diff changeset
545
17921
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
546 def outputtimes(options):
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
547 vlog('# Producing time report')
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
548 times.sort(key=lambda t: (t[1], t[0]), reverse=True)
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
549 cols = '%7.3f %s'
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
550 print '\n%-7s %s' % ('Time', 'Test')
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
551 for test, timetaken in times:
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
552 print cols % (timetaken, test)
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
553
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
554 def outputcoverage(options):
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
555
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
556 vlog('# Producing coverage report')
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
557 os.chdir(PYTHONDIR)
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
558
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
559 def covrun(*args):
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
560 cmd = 'coverage %s' % ' '.join(args)
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
561 vlog('# Running: %s' % cmd)
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
562 os.system(cmd)
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
563
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
564 covrun('-c')
15858
14132a55d66b run-tests: use a list comprehension instead of map
Matt Mackall <mpm@selenic.com>
parents: 15857
diff changeset
565 omit = ','.join(os.path.join(x, '*') for x in [BINDIR, TESTDIR])
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
566 covrun('-i', '-r', '"--omit=%s"' % omit) # report
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
567 if options.htmlcov:
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
568 htmldir = os.path.join(TESTDIR, 'htmlcov')
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
569 covrun('-i', '-b', '"--directory=%s"' % htmldir, '"--omit=%s"' % omit)
2145
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
570 if options.annotate:
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
571 adir = os.path.join(TESTDIR, 'annotated')
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
572 if not os.path.isdir(adir):
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
573 os.mkdir(adir)
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
574 covrun('-i', '-a', '"--directory=%s"' % adir, '"--omit=%s"' % omit)
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
575
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
576 def pytest(test, wd, options, replacements, env):
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
577 py3kswitch = options.py3k_warnings and ' -3' or ''
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
578 cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test)
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
579 vlog("# Running", cmd)
19460
d876c82f25a3 run-tests: backout 4f32747879d1 line endings change
Matt Mackall <mpm@selenic.com>
parents: 19438
diff changeset
580 if os.name == 'nt':
d876c82f25a3 run-tests: backout 4f32747879d1 line endings change
Matt Mackall <mpm@selenic.com>
parents: 19438
diff changeset
581 replacements.append((r'\r\n', '\n'))
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
582 return run(cmd, wd, options, replacements, env)
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
583
12941
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
584 needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
585 escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
586 escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256))
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
587 escapemap.update({'\\': '\\\\', '\r': r'\r'})
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
588 def escapef(m):
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
589 return escapemap[m.group(0)]
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
590 def stringescape(s):
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
591 return escapesub(escapef, s)
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
592
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
593 def rematch(el, l):
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
594 try:
17777
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
595 # use \Z to ensure that the regex matches to the end of the string
19460
d876c82f25a3 run-tests: backout 4f32747879d1 line endings change
Matt Mackall <mpm@selenic.com>
parents: 19438
diff changeset
596 if os.name == 'nt':
d876c82f25a3 run-tests: backout 4f32747879d1 line endings change
Matt Mackall <mpm@selenic.com>
parents: 19438
diff changeset
597 return re.match(el + r'\r?\n\Z', l)
17777
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
598 return re.match(el + r'\n\Z', l)
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
599 except re.error:
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
600 # el is an invalid regex
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
601 return False
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
602
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
603 def globmatch(el, l):
15447
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
604 # The only supported special characters are * and ? plus / which also
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
605 # matches \ on windows. Escaping of these caracters is supported.
18680
15711d9d8b2c tests: quickly check if the glob line already matches the output
Simon Heimberg <simohe@besonet.ch>
parents: 18616
diff changeset
606 if el + '\n' == l:
19419
e823abe577a2 run-tests: test for os.altsep instead of os.name when checking \ for /
Simon Heimberg <simohe@besonet.ch>
parents: 19415
diff changeset
607 if os.altsep:
18681
7591ed29e824 tests: inform on Windows about unnecessary glob lines
Simon Heimberg <simohe@besonet.ch>
parents: 18680
diff changeset
608 # matching on "/" is not needed for this line
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
609 log("\nInfo, unnecessary glob: %s (glob)" % el)
18680
15711d9d8b2c tests: quickly check if the glob line already matches the output
Simon Heimberg <simohe@besonet.ch>
parents: 18616
diff changeset
610 return True
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
611 i, n = 0, len(el)
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
612 res = ''
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
613 while i < n:
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
614 c = el[i]
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
615 i += 1
15447
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
616 if c == '\\' and el[i] in '*?\\/':
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
617 res += el[i - 1:i + 1]
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
618 i += 1
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
619 elif c == '*':
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
620 res += '.*'
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
621 elif c == '?':
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
622 res += '.'
19419
e823abe577a2 run-tests: test for os.altsep instead of os.name when checking \ for /
Simon Heimberg <simohe@besonet.ch>
parents: 19415
diff changeset
623 elif c == '/' and os.altsep:
15447
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
624 res += '[/\\\\]'
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
625 else:
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
626 res += re.escape(c)
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
627 return rematch(res, l)
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
628
15415
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
629 def linematch(el, l):
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
630 if el == l: # perfect match (fast)
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
631 return True
17778
80fe64581f3a run-tests: make it possible to combine (esc) with (glob) and (re)
Mads Kiilerich <mads@kiilerich.com>
parents: 17777
diff changeset
632 if el:
80fe64581f3a run-tests: make it possible to combine (esc) with (glob) and (re)
Mads Kiilerich <mads@kiilerich.com>
parents: 17777
diff changeset
633 if el.endswith(" (esc)\n"):
80fe64581f3a run-tests: make it possible to combine (esc) with (glob) and (re)
Mads Kiilerich <mads@kiilerich.com>
parents: 17777
diff changeset
634 el = el[:-7].decode('string-escape') + '\n'
19460
d876c82f25a3 run-tests: backout 4f32747879d1 line endings change
Matt Mackall <mpm@selenic.com>
parents: 19438
diff changeset
635 if el == l or os.name == 'nt' and el[:-1] + '\r\n' == l:
d876c82f25a3 run-tests: backout 4f32747879d1 line endings change
Matt Mackall <mpm@selenic.com>
parents: 19438
diff changeset
636 return True
17778
80fe64581f3a run-tests: make it possible to combine (esc) with (glob) and (re)
Mads Kiilerich <mads@kiilerich.com>
parents: 17777
diff changeset
637 if (el.endswith(" (re)\n") and rematch(el[:-6], l) or
80fe64581f3a run-tests: make it possible to combine (esc) with (glob) and (re)
Mads Kiilerich <mads@kiilerich.com>
parents: 17777
diff changeset
638 el.endswith(" (glob)\n") and globmatch(el[:-8], l)):
80fe64581f3a run-tests: make it possible to combine (esc) with (glob) and (re)
Mads Kiilerich <mads@kiilerich.com>
parents: 17777
diff changeset
639 return True
15415
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
640 return False
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
641
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
642 def tsttest(test, wd, options, replacements, env):
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
643 # We generate a shell script which outputs unique markers to line
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
644 # up script results with our source. These markers include input
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
645 # line number and the last return code
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
646 salt = "SALT" + str(time.time())
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
647 def addsalt(line, inpython):
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
648 if inpython:
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
649 script.append('%s %d 0\n' % (salt, line))
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
650 else:
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
651 script.append('echo %s %s $?\n' % (salt, line))
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
652
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
653 # After we run the shell script, we re-unify the script output
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
654 # with non-active parts of the source, with synchronization by our
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
655 # SALT line number markers. The after table contains the
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
656 # non-active components, ordered by line number
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
657 after = {}
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
658 pos = prepos = -1
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
659
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
660 # Expected shellscript output
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
661 expected = {}
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
662
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
663 # We keep track of whether or not we're in a Python block so we
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
664 # can generate the surrounding doctest magic
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
665 inpython = False
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
666
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
667 # True or False when in a true or false conditional section
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
668 skipping = None
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
669
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
670 def hghave(reqs):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
671 # TODO: do something smarter when all other uses of hghave is gone
16897
2774576dee4d tests/run-tests: avoid C:/ in arguments
Adrian Buehlmann <adrian@cadifra.com>
parents: 16890
diff changeset
672 tdir = TESTDIR.replace('\\', '/')
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
673 proc = Popen4('%s -c "%s/hghave %s"' %
16906
2a95830cff77 tests: use the right directory for running hghave from run-tests.py
Mads Kiilerich <mads@kiilerich.com>
parents: 16905
diff changeset
674 (options.shell, tdir, ' '.join(reqs)), wd, 0)
18229
77d06793a20d tests: make hghave and run-tests exit on unknown feature requirements
Mads Kiilerich <mads@kiilerich.com>
parents: 18061
diff changeset
675 stdout, stderr = proc.communicate()
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
676 ret = proc.wait()
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
677 if wifexited(ret):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
678 ret = os.WEXITSTATUS(ret)
18229
77d06793a20d tests: make hghave and run-tests exit on unknown feature requirements
Mads Kiilerich <mads@kiilerich.com>
parents: 18061
diff changeset
679 if ret == 2:
77d06793a20d tests: make hghave and run-tests exit on unknown feature requirements
Mads Kiilerich <mads@kiilerich.com>
parents: 18061
diff changeset
680 print stdout
77d06793a20d tests: make hghave and run-tests exit on unknown feature requirements
Mads Kiilerich <mads@kiilerich.com>
parents: 18061
diff changeset
681 sys.exit(1)
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
682 return ret == 0
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
683
15416
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
684 f = open(test)
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
685 t = f.readlines()
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
686 f.close()
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
687
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
688 script = []
15940
4bc35496136f tests: add 'set -x' to the .t sh scripts in run-tests.py debug mode
Mads Kiilerich <mads@kiilerich.com>
parents: 15859
diff changeset
689 if options.debug:
4bc35496136f tests: add 'set -x' to the .t sh scripts in run-tests.py debug mode
Mads Kiilerich <mads@kiilerich.com>
parents: 15859
diff changeset
690 script.append('set -x\n')
15569
3e13ade423f0 tests: use an alias to make msys 'pwd' return paths with forward slashes
Mads Kiilerich <mads@kiilerich.com>
parents: 15517
diff changeset
691 if os.getenv('MSYSTEM'):
3e13ade423f0 tests: use an alias to make msys 'pwd' return paths with forward slashes
Mads Kiilerich <mads@kiilerich.com>
parents: 15517
diff changeset
692 script.append('alias pwd="pwd -W"\n')
18565
ba5e71770db2 run-tests: do not fail on empty tsttest file
Simon Heimberg <simohe@besonet.ch>
parents: 18500
diff changeset
693 n = 0
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
694 for n, l in enumerate(t):
12934
ea7ad8c3988a tests: handle .t files without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12895
diff changeset
695 if not l.endswith('\n'):
ea7ad8c3988a tests: handle .t files without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12895
diff changeset
696 l += '\n'
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
697 if l.startswith('#if'):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
698 if skipping is not None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
699 after.setdefault(pos, []).append(' !!! nested #if\n')
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
700 skipping = not hghave(l.split()[1:])
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
701 after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
702 elif l.startswith('#else'):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
703 if skipping is None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
704 after.setdefault(pos, []).append(' !!! missing #if\n')
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
705 skipping = not skipping
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
706 after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
707 elif l.startswith('#endif'):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
708 if skipping is None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
709 after.setdefault(pos, []).append(' !!! missing #if\n')
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
710 skipping = None
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
711 after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
712 elif skipping:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
713 after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
714 elif l.startswith(' >>> '): # python inlines
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
715 after.setdefault(pos, []).append(l)
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
716 prepos = pos
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
717 pos = n
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
718 if not inpython:
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
719 # we've just entered a Python block, add the header
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
720 inpython = True
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
721 addsalt(prepos, False) # make sure we report the exit code
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
722 script.append('%s -m heredoctest <<EOF\n' % PYTHON)
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
723 addsalt(n, True)
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
724 script.append(l[2:])
16841
f2555e891982 run-tests: don't add python lines to expected dict
Adrian Buehlmann <adrian@cadifra.com>
parents: 16840
diff changeset
725 elif l.startswith(' ... '): # python inlines
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
726 after.setdefault(prepos, []).append(l)
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
727 script.append(l[2:])
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
728 elif l.startswith(' $ '): # commands
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
729 if inpython:
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
730 script.append("EOF\n")
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
731 inpython = False
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
732 after.setdefault(pos, []).append(l)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
733 prepos = pos
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
734 pos = n
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
735 addsalt(n, False)
16905
671c73d523cf tests: make .t tests stop immediately if a cd fails
Mads Kiilerich <mads@kiilerich.com>
parents: 16897
diff changeset
736 cmd = l[4:].split()
671c73d523cf tests: make .t tests stop immediately if a cd fails
Mads Kiilerich <mads@kiilerich.com>
parents: 16897
diff changeset
737 if len(cmd) == 2 and cmd[0] == 'cd':
671c73d523cf tests: make .t tests stop immediately if a cd fails
Mads Kiilerich <mads@kiilerich.com>
parents: 16897
diff changeset
738 l = ' $ cd %s || exit 1\n' % cmd[1]
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
739 script.append(l[4:])
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
740 elif l.startswith(' > '): # continuations
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
741 after.setdefault(prepos, []).append(l)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
742 script.append(l[4:])
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
743 elif l.startswith(' '): # results
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
744 # queue up a list of expected results
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
745 expected.setdefault(pos, []).append(l[2:])
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
746 else:
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
747 if inpython:
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
748 script.append("EOF\n")
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
749 inpython = False
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
750 # non-command/result - queue up for merged output
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
751 after.setdefault(pos, []).append(l)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
752
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
753 if inpython:
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
754 script.append("EOF\n")
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
755 if skipping is not None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
756 after.setdefault(pos, []).append(' !!! missing #endif\n')
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
757 addsalt(n + 1, False)
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
758
15416
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
759 # Write out the script and execute it
19871
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
760 name = wd + '.sh'
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
761 f = open(name, 'w')
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
762 for l in script:
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
763 f.write(l)
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
764 f.close()
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
765
19871
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
766 cmd = '%s "%s"' % (options.shell, name)
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
767 vlog("# Running", cmd)
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
768 exitcode, output = run(cmd, wd, options, replacements, env)
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
769 # do not merge output if skipped, return hghave message instead
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
770 # similarly, with --debug, output is None
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
771 if exitcode == SKIPPED_STATUS or output is None:
6e74632170d3 run-tests: place the .t shell script next to $TESTTMP and with a useful name
Mads Kiilerich <madski@unity3d.com>
parents: 19854
diff changeset
772 return exitcode, output
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
773
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
774 # Merge the script output back into a unified test
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
775
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
776 pos = -1
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
777 postout = []
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
778 ret = 0
17739
5b08e8b7ab00 run-tests: drop unused enumerate
Mads Kiilerich <mads@kiilerich.com>
parents: 17541
diff changeset
779 for l in output:
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
780 lout, lcmd = l, None
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
781 if salt in l:
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
782 lout, lcmd = l.split(salt, 1)
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
783
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
784 if lout:
17741
a51304b851c6 run-tests: use more explicit criteria for detecting no-eol
Mads Kiilerich <mads@kiilerich.com>
parents: 17739
diff changeset
785 if not lout.endswith('\n'):
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
786 lout += ' (no-eol)\n'
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
787
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
788 # find the expected output at the current position
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
789 el = None
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
790 if pos in expected and expected[pos]:
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
791 el = expected[pos].pop(0)
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
792
15415
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
793 if linematch(el, lout):
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
794 postout.append(" " + el)
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
795 else:
12941
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
796 if needescape(lout):
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
797 lout = stringescape(lout.rstrip('\n')) + " (esc)\n"
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
798 postout.append(" " + lout) # let diff deal with it
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
799
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
800 if lcmd:
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
801 # add on last return code
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
802 ret = int(lcmd.split()[1])
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
803 if ret != 0:
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
804 postout.append(" [%s]\n" % ret)
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
805 if pos in after:
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
806 # merge in non-active test bits
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
807 postout += after.pop(pos)
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
808 pos = int(lcmd.split()[0])
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
809
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
810 if pos in after:
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
811 postout += after.pop(pos)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
812
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
813 return exitcode, postout
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
814
13348
31fdb04cb5e8 run-tests: only call WIFEXITED on systems it exists
Simon Heimberg <simohe@besonet.ch>
parents: 13347
diff changeset
815 wifexited = getattr(os, "WIFEXITED", lambda x: False)
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
816 def run(cmd, wd, options, replacements, env):
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
817 """Run command in a sub-process, capturing the output (stdout and stderr).
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
818 Return a tuple (exitcode, output). output is None in debug mode."""
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
819 # TODO: Use subprocess.Popen if we're running on Python 2.4
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
820 if options.debug:
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
821 proc = subprocess.Popen(cmd, shell=True, cwd=wd, env=env)
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
822 ret = proc.wait()
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
823 return (ret, None)
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
824
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
825 proc = Popen4(cmd, wd, options.timeout, env)
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
826 def cleanup():
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
827 terminate(proc)
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
828 ret = proc.wait()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
829 if ret == 0:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
830 ret = signal.SIGTERM << 8
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
831 killdaemons(env['DAEMON_PIDS'])
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
832 return ret
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
833
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
834 output = ''
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
835 proc.tochild.close()
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
836
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
837 try:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
838 output = proc.fromchild.read()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
839 except KeyboardInterrupt:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
840 vlog('# Handling keyboard interrupt')
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
841 cleanup()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
842 raise
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
843
19413
a4de0d3dc35a run-tests: lock popen wait/poll
Brendan Cully <brendan@kublai.com>
parents: 19407
diff changeset
844 ret = proc.wait()
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
845 if wifexited(ret):
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
846 ret = os.WEXITSTATUS(ret)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
847
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
848 if proc.timeout:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
849 ret = 'timeout'
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
850
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
851 if ret:
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
852 killdaemons(env['DAEMON_PIDS'])
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
853
19273
f3effc499288 run-tests: add abort flag
Matt Mackall <mpm@selenic.com>
parents: 19272
diff changeset
854 if abort:
f3effc499288 run-tests: add abort flag
Matt Mackall <mpm@selenic.com>
parents: 19272
diff changeset
855 raise KeyboardInterrupt()
f3effc499288 run-tests: add abort flag
Matt Mackall <mpm@selenic.com>
parents: 19272
diff changeset
856
12639
236058a65cb4 tests: replace test tmp directory with $TESTTMP in test output
Mads Kiilerich <mads@kiilerich.com>
parents: 12621
diff changeset
857 for s, r in replacements:
12895
53cfde2b3cf9 run-tests: use regex when searching for $HGPORT in test output
Martin Geisler <mg@aragost.com>
parents: 12721
diff changeset
858 output = re.sub(s, r, output)
17742
405b6bd015df run-tests: allow test output lines to be terminated with \r in addition to \n
Mads Kiilerich <mads@kiilerich.com>
parents: 17741
diff changeset
859 return ret, output.splitlines(True)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
860
19274
6f666780f846 run-tests: introduce threadtmp directory
Matt Mackall <mpm@selenic.com>
parents: 19273
diff changeset
861 def runone(options, test, count):
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
862 '''returns a result element: (code, test, msg)'''
2710
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
863
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
864 def skip(msg):
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
865 if options.verbose:
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
866 log("\nSkipping %s: %s" % (testpath, msg))
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
867 return 's', test, msg
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
868
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
869 def fail(msg, ret):
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
870 if not options.nodiff:
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
871 log("\nERROR: %s %s" % (testpath, msg))
13999
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
872 if (not ret and options.interactive
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
873 and os.path.exists(testpath + ".err")):
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
874 iolock.acquire()
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
875 print "Accept this change? [n] ",
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
876 answer = sys.stdin.readline().strip()
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
877 iolock.release()
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
878 if answer.lower() in "y yes".split():
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
879 if test.endswith(".t"):
13999
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
880 rename(testpath + ".err", testpath)
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
881 else:
13999
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
882 rename(testpath + ".err", testpath + ".out")
19249
de45df2688a9 run-tests: unify marks and result codes
Matt Mackall <mpm@selenic.com>
parents: 19248
diff changeset
883 return '.', test, ''
de45df2688a9 run-tests: unify marks and result codes
Matt Mackall <mpm@selenic.com>
parents: 19248
diff changeset
884 return '!', test, msg
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
885
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
886 def success():
19249
de45df2688a9 run-tests: unify marks and result codes
Matt Mackall <mpm@selenic.com>
parents: 19248
diff changeset
887 return '.', test, ''
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
888
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
889 def ignore(msg):
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
890 return 'i', test, msg
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
891
19244
eee43d763f9f run-tests: regroup nested functions
Matt Mackall <mpm@selenic.com>
parents: 19243
diff changeset
892 def describe(ret):
eee43d763f9f run-tests: regroup nested functions
Matt Mackall <mpm@selenic.com>
parents: 19243
diff changeset
893 if ret < 0:
eee43d763f9f run-tests: regroup nested functions
Matt Mackall <mpm@selenic.com>
parents: 19243
diff changeset
894 return 'killed by signal %d' % -ret
eee43d763f9f run-tests: regroup nested functions
Matt Mackall <mpm@selenic.com>
parents: 19243
diff changeset
895 return 'returned error code %d' % ret
eee43d763f9f run-tests: regroup nested functions
Matt Mackall <mpm@selenic.com>
parents: 19243
diff changeset
896
19245
dcb05a1470bd run-tests: regroup some variable initialization
Matt Mackall <mpm@selenic.com>
parents: 19244
diff changeset
897 testpath = os.path.join(TESTDIR, test)
dcb05a1470bd run-tests: regroup some variable initialization
Matt Mackall <mpm@selenic.com>
parents: 19244
diff changeset
898 err = os.path.join(TESTDIR, test + ".err")
dcb05a1470bd run-tests: regroup some variable initialization
Matt Mackall <mpm@selenic.com>
parents: 19244
diff changeset
899 lctest = test.lower()
dcb05a1470bd run-tests: regroup some variable initialization
Matt Mackall <mpm@selenic.com>
parents: 19244
diff changeset
900
19246
29ddf9d93e35 run-tests: fix a path existence check
Matt Mackall <mpm@selenic.com>
parents: 19245
diff changeset
901 if not os.path.exists(testpath):
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
902 return skip("doesn't exist")
13989
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
903
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
904 if not (options.whitelisted and test in options.whitelisted):
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
905 if options.blacklist and test in options.blacklist:
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
906 return skip("blacklisted")
13993
174d0a113757 run-tests: move blacklist and retest filtering to runone
Matt Mackall <mpm@selenic.com>
parents: 13992
diff changeset
907
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
908 if options.retest and not os.path.exists(test + ".err"):
19311
ad16e5c7a429 run-tests: ignoring tests works again
simon@laptop-tosh
parents: 19304
diff changeset
909 return ignore("not retesting")
13993
174d0a113757 run-tests: move blacklist and retest filtering to runone
Matt Mackall <mpm@selenic.com>
parents: 13992
diff changeset
910
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
911 if options.keywords:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
912 fp = open(test)
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
913 t = fp.read().lower() + test.lower()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
914 fp.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
915 for k in options.keywords.lower().split():
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
916 if k in t:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
917 break
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
918 else:
19311
ad16e5c7a429 run-tests: ignoring tests works again
simon@laptop-tosh
parents: 19304
diff changeset
919 return ignore("doesn't match keyword")
13991
8cfe191e2ce4 run-tests: move keyword checking into runone
Matt Mackall <mpm@selenic.com>
parents: 13990
diff changeset
920
19527
534cdbe87cad run-tests: only check the common criteria once per test
Simon Heimberg <simohe@besonet.ch>
parents: 19460
diff changeset
921 if not lctest.startswith("test-"):
534cdbe87cad run-tests: only check the common criteria once per test
Simon Heimberg <simohe@besonet.ch>
parents: 19460
diff changeset
922 return skip("not a test file")
19239
db978c792b02 run-tests: make a table of test types
Matt Mackall <mpm@selenic.com>
parents: 19238
diff changeset
923 for ext, func, out in testtypes:
19527
534cdbe87cad run-tests: only check the common criteria once per test
Simon Heimberg <simohe@besonet.ch>
parents: 19460
diff changeset
924 if lctest.endswith(ext):
19239
db978c792b02 run-tests: make a table of test types
Matt Mackall <mpm@selenic.com>
parents: 19238
diff changeset
925 runner = func
db978c792b02 run-tests: make a table of test types
Matt Mackall <mpm@selenic.com>
parents: 19238
diff changeset
926 ref = os.path.join(TESTDIR, test + out)
db978c792b02 run-tests: make a table of test types
Matt Mackall <mpm@selenic.com>
parents: 19238
diff changeset
927 break
2710
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
928 else:
17801
03554dfc7ced run-tests: remove dead code for supporting old test scripts
Mads Kiilerich <mads@kiilerich.com>
parents: 17800
diff changeset
929 return skip("unknown test type")
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
930
19247
b43ed416bc2d run-tests: regroup some initialization checks
Matt Mackall <mpm@selenic.com>
parents: 19246
diff changeset
931 vlog("# Test", test)
b43ed416bc2d run-tests: regroup some initialization checks
Matt Mackall <mpm@selenic.com>
parents: 19246
diff changeset
932
b43ed416bc2d run-tests: regroup some initialization checks
Matt Mackall <mpm@selenic.com>
parents: 19246
diff changeset
933 if os.path.exists(err):
b43ed416bc2d run-tests: regroup some initialization checks
Matt Mackall <mpm@selenic.com>
parents: 19246
diff changeset
934 os.remove(err) # Remove any previous output files
b43ed416bc2d run-tests: regroup some initialization checks
Matt Mackall <mpm@selenic.com>
parents: 19246
diff changeset
935
10406
6586a6889f66 run-tests.py: skipped tests shouldn't change working directory
Mads Kiilerich <mads@kiilerich.com>
parents: 10336
diff changeset
936 # Make a tmp subdirectory to work in
19274
6f666780f846 run-tests: introduce threadtmp directory
Matt Mackall <mpm@selenic.com>
parents: 19273
diff changeset
937 threadtmp = os.path.join(HGTMP, "child%d" % count)
6f666780f846 run-tests: introduce threadtmp directory
Matt Mackall <mpm@selenic.com>
parents: 19273
diff changeset
938 testtmp = os.path.join(threadtmp, os.path.basename(test))
6f666780f846 run-tests: introduce threadtmp directory
Matt Mackall <mpm@selenic.com>
parents: 19273
diff changeset
939 os.mkdir(threadtmp)
19243
050c6fae40d2 run-tests: regroup temp dir creation
Matt Mackall <mpm@selenic.com>
parents: 19242
diff changeset
940 os.mkdir(testtmp)
13764
8ed67e44c71c tests: set HOME to the test temp dir (issue2707)
Idan Kamara <idankk86@gmail.com>
parents: 13539
diff changeset
941
19275
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
942 port = options.port + count * 3
15449
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
943 replacements = [
19275
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
944 (r':%s\b' % port, ':$HGPORT'),
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
945 (r':%s\b' % (port + 1), ':$HGPORT1'),
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
946 (r':%s\b' % (port + 2), ':$HGPORT2'),
15449
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
947 ]
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
948 if os.name == 'nt':
15451
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
949 replacements.append(
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
950 (''.join(c.isalpha() and '[%s%s]' % (c.lower(), c.upper()) or
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
951 c in '/\\' and r'[/\\]' or
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
952 c.isdigit() and c or
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
953 '\\' + c
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
954 for c in testtmp), '$TESTTMP'))
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
955 else:
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
956 replacements.append((re.escape(testtmp), '$TESTTMP'))
15449
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
957
19275
de44cf138761 run-tests: use count to calculate port to use
Matt Mackall <mpm@selenic.com>
parents: 19274
diff changeset
958 env = createenv(options, testtmp, threadtmp, port)
19268
36dc45b1f427 run-tests: move HGRCPATH to env
Matt Mackall <mpm@selenic.com>
parents: 19267
diff changeset
959 createhgrc(env['HGRCPATH'], options)
36dc45b1f427 run-tests: move HGRCPATH to env
Matt Mackall <mpm@selenic.com>
parents: 19267
diff changeset
960
19302
a1b8b1b9e2e2 run-tests: always gather runtimes
Matt Mackall <mpm@selenic.com>
parents: 19301
diff changeset
961 starttime = time.time()
19300
d7d40600a248 run-tests: report interrupted tests
Simon Heimberg <simohe@besonet.ch>
parents: 19299
diff changeset
962 try:
d7d40600a248 run-tests: report interrupted tests
Simon Heimberg <simohe@besonet.ch>
parents: 19299
diff changeset
963 ret, out = runner(testpath, testtmp, options, replacements, env)
d7d40600a248 run-tests: report interrupted tests
Simon Heimberg <simohe@besonet.ch>
parents: 19299
diff changeset
964 except KeyboardInterrupt:
19302
a1b8b1b9e2e2 run-tests: always gather runtimes
Matt Mackall <mpm@selenic.com>
parents: 19301
diff changeset
965 endtime = time.time()
19304
59d5281b5799 run-tests: simplify interrupted message
Matt Mackall <mpm@selenic.com>
parents: 19303
diff changeset
966 log('INTERRUPTED: %s (after %d seconds)' % (test, endtime - starttime))
19300
d7d40600a248 run-tests: report interrupted tests
Simon Heimberg <simohe@besonet.ch>
parents: 19299
diff changeset
967 raise
19302
a1b8b1b9e2e2 run-tests: always gather runtimes
Matt Mackall <mpm@selenic.com>
parents: 19301
diff changeset
968 endtime = time.time()
a1b8b1b9e2e2 run-tests: always gather runtimes
Matt Mackall <mpm@selenic.com>
parents: 19301
diff changeset
969 times.append((test, endtime - starttime))
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
970 vlog("# Ret was:", ret)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
971
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
972 killdaemons(env['DAEMON_PIDS'])
18051
48f797ac0879 tests: kill daemons early, making breaking at "Accept" prompt safe
Mads Kiilerich <madski@unity3d.com>
parents: 18050
diff changeset
973
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
974 skipped = (ret == SKIPPED_STATUS)
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
975
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
976 # If we're not in --debug mode and reference output file exists,
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
977 # check test output against it.
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
978 if options.debug:
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 13002
diff changeset
979 refout = None # to match "out is None"
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
980 elif os.path.exists(ref):
2213
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
981 f = open(ref, "r")
17742
405b6bd015df run-tests: allow test output lines to be terminated with \r in addition to \n
Mads Kiilerich <mads@kiilerich.com>
parents: 17741
diff changeset
982 refout = f.read().splitlines(True)
2213
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
983 f.close()
2246
3fd603eb6add run-tests.py: print diff if reference output not existing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2213
diff changeset
984 else:
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
985 refout = []
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
986
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
987 if (ret != 0 or out != refout) and not skipped and not options.debug:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
988 # Save errors to a file for diagnosis
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
989 f = open(err, "wb")
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
990 for line in out:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
991 f.write(line)
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
992 f.close()
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
993
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
994 if skipped:
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
995 if out is None: # debug mode: nothing to parse
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
996 missing = ['unknown']
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
997 failed = None
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
998 else:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
999 missing, failed = parsehghaveoutput(out)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
1000 if not missing:
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
1001 missing = ['irrelevant']
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
1002 if failed:
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1003 result = fail("hghave failed checking for %s" % failed[-1], ret)
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
1004 skipped = False
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
1005 else:
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1006 result = skip(missing[-1])
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
1007 elif ret == 'timeout':
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1008 result = fail("timed out", ret)
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
1009 elif out != refout:
14006
a395575691a6 run-tests: display diff before prompting with --interactive
Patrick Mezard <pmezard@gmail.com>
parents: 14003
diff changeset
1010 if not options.nodiff:
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
1011 iolock.acquire()
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
1012 if options.view:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
1013 os.system("%s %s %s" % (options.view, ref, err))
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
1014 else:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
1015 showdiff(refout, out, ref, err)
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
1016 iolock.release()
14006
a395575691a6 run-tests: display diff before prompting with --interactive
Patrick Mezard <pmezard@gmail.com>
parents: 14003
diff changeset
1017 if ret:
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1018 result = fail("output changed and " + describe(ret), ret)
14006
a395575691a6 run-tests: display diff before prompting with --interactive
Patrick Mezard <pmezard@gmail.com>
parents: 14003
diff changeset
1019 else:
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1020 result = fail("output changed", ret)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
1021 elif ret:
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1022 result = fail(describe(ret), ret)
14037
4ab1e987941b run-tests: don't count test as succeeded if it failed
Idan Kamara <idankk86@gmail.com>
parents: 14019
diff changeset
1023 else:
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1024 result = success()
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
1025
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
1026 if not options.verbose:
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
1027 iolock.acquire()
19249
de45df2688a9 run-tests: unify marks and result codes
Matt Mackall <mpm@selenic.com>
parents: 19248
diff changeset
1028 sys.stdout.write(result[0])
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
1029 sys.stdout.flush()
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
1030 iolock.release()
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
1031
6208
c88b9e597588 tests: add --keep-tmp to run-tests.py to debug test environment
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6004
diff changeset
1032 if not options.keep_tmpdir:
19274
6f666780f846 run-tests: introduce threadtmp directory
Matt Mackall <mpm@selenic.com>
parents: 19273
diff changeset
1033 shutil.rmtree(threadtmp, True)
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1034 return result
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
1035
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1036 _hgpath = None
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1037
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1038 def _gethgpath():
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1039 """Return the path to the mercurial package that is actually found by
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1040 the current Python interpreter."""
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1041 global _hgpath
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1042 if _hgpath is not None:
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1043 return _hgpath
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1044
19759
1b8054b98d68 run-tests: find mercurial path with syntax valid on both py2 and py3
Augie Fackler <raf@durin42.com>
parents: 19758
diff changeset
1045 cmd = '%s -c "import mercurial; print (mercurial.__path__[0])"'
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1046 pipe = os.popen(cmd % PYTHON)
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1047 try:
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1048 _hgpath = pipe.read().strip()
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1049 finally:
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1050 pipe.close()
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1051 return _hgpath
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1052
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1053 def _checkhglib(verb):
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1054 """Ensure that the 'mercurial' package imported by python is
8673
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
1055 the one we expect it to be. If not, print a warning to stderr."""
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
1056 expecthg = os.path.join(PYTHONDIR, 'mercurial')
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1057 actualhg = _gethgpath()
14263
7352ff757a48 run-tests: compare absolute paths in _checkhglib
Idan Kamara <idankk86@gmail.com>
parents: 14202
diff changeset
1058 if os.path.abspath(actualhg) != os.path.abspath(expecthg):
8673
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
1059 sys.stderr.write('warning: %s with unexpected mercurial lib: %s\n'
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
1060 ' (expected %s)\n'
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
1061 % (verb, actualhg, expecthg))
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1062
19249
de45df2688a9 run-tests: unify marks and result codes
Matt Mackall <mpm@selenic.com>
parents: 19248
diff changeset
1063 results = {'.':[], '!':[], 's':[], 'i':[]}
17921
4ac9cf3d810c run-tests: add --time option to log times for each test
Siddharth Agarwal <sid0@fb.com>
parents: 17920
diff changeset
1064 times = []
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
1065 iolock = threading.Lock()
19273
f3effc499288 run-tests: add abort flag
Matt Mackall <mpm@selenic.com>
parents: 19272
diff changeset
1066 abort = False
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
1067
19276
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1068 def scheduletests(options, tests):
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1069 jobs = options.jobs
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1070 done = queue.Queue()
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1071 running = 0
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1072 count = 0
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1073 global abort
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1074
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1075 def job(test, count):
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1076 try:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1077 done.put(runone(options, test, count))
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1078 except KeyboardInterrupt:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1079 pass
20258
3cd441353d6b run-tests: report tests as failed when run-test raises an error
Simon Heimberg <simohe@besonet.ch>
parents: 20219
diff changeset
1080 except: # re-raises
3cd441353d6b run-tests: report tests as failed when run-test raises an error
Simon Heimberg <simohe@besonet.ch>
parents: 20219
diff changeset
1081 done.put(('!', test, 'run-test raised an error, see traceback'))
3cd441353d6b run-tests: report tests as failed when run-test raises an error
Simon Heimberg <simohe@besonet.ch>
parents: 20219
diff changeset
1082 raise
19248
6a127fa5de23 run-tests: change return code of runone
Matt Mackall <mpm@selenic.com>
parents: 19247
diff changeset
1083
19276
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1084 try:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1085 while tests or running:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1086 if not done.empty() or running == jobs or not tests:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1087 try:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1088 code, test, msg = done.get(True, 1)
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1089 results[code].append((test, msg))
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1090 if options.first and code not in '.si':
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1091 break
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1092 except queue.Empty:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1093 continue
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1094 running -= 1
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1095 if tests and not running == jobs:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1096 test = tests.pop(0)
19283
8300adf9ca33 run-tests: add --loop support
Matt Mackall <mpm@selenic.com>
parents: 19282
diff changeset
1097 if options.loop:
8300adf9ca33 run-tests: add --loop support
Matt Mackall <mpm@selenic.com>
parents: 19282
diff changeset
1098 tests.append(test)
19312
aedb4d0012ff run-tests: call Threads constructor with keyword arguments
simon@laptop-tosh
parents: 19311
diff changeset
1099 t = threading.Thread(target=job, args=(test, count))
19276
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1100 t.start()
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1101 running += 1
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1102 count += 1
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1103 except KeyboardInterrupt:
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1104 abort = True
13995
b29b7cbc252f run-tests: move test loop into a helper function
Matt Mackall <mpm@selenic.com>
parents: 13994
diff changeset
1105
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1106 def runtests(options, tests):
2258
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
1107 try:
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
1108 if INST:
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
1109 installhg(options)
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
1110 _checkhglib("Testing")
18048
9b7288fc7bf2 run-tests: use correct python when run with --local
Bryan O'Sullivan <bryano@fb.com>
parents: 17967
diff changeset
1111 else:
9b7288fc7bf2 run-tests: use correct python when run with --local
Bryan O'Sullivan <bryano@fb.com>
parents: 17967
diff changeset
1112 usecorrectpython()
6982
9fc5bf4adbcf imported patch test-check
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6681
diff changeset
1113
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1114 if options.restart:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1115 orig = list(tests)
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1116 while tests:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1117 if os.path.exists(tests[0] + ".err"):
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1118 break
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1119 tests.pop(0)
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1120 if not tests:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1121 print "running all tests"
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1122 tests = orig
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
1123
19276
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1124 scheduletests(options, tests)
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
1125
19249
de45df2688a9 run-tests: unify marks and result codes
Matt Mackall <mpm@selenic.com>
parents: 19248
diff changeset
1126 failed = len(results['!'])
de45df2688a9 run-tests: unify marks and result codes
Matt Mackall <mpm@selenic.com>
parents: 19248
diff changeset
1127 tested = len(results['.']) + failed
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
1128 skipped = len(results['s'])
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
1129 ignored = len(results['i'])
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
1130
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1131 print
19294
3c3f6b83f8cb run-tests: make --noskips work
Matt Mackall <mpm@selenic.com>
parents: 19283
diff changeset
1132 if not options.noskips:
3c3f6b83f8cb run-tests: make --noskips work
Matt Mackall <mpm@selenic.com>
parents: 19283
diff changeset
1133 for s in results['s']:
3c3f6b83f8cb run-tests: make --noskips work
Matt Mackall <mpm@selenic.com>
parents: 19283
diff changeset
1134 print "Skipped %s: %s" % s
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1135 for s in results['!']:
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1136 print "Failed %s: %s" % s
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1137 _checkhglib("Tested")
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1138 print "# Ran %d tests, %d skipped, %d failed." % (
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1139 tested, skipped + ignored, failed)
20046
6a03695fa72a tests: python hash seed is only relevant after failures - otherwise keep quiet
Mads Kiilerich <madski@unity3d.com>
parents: 20019
diff changeset
1140 if results['!']:
6a03695fa72a tests: python hash seed is only relevant after failures - otherwise keep quiet
Mads Kiilerich <madski@unity3d.com>
parents: 20019
diff changeset
1141 print 'python hash seed:', os.environ['PYTHONHASHSEED']
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1142 if options.time:
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1143 outputtimes(options)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
1144
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
1145 if options.anycoverage:
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
1146 outputcoverage(options)
2258
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
1147 except KeyboardInterrupt:
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
1148 failed = True
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1149 print "\ninterrupted!"
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
1150
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
1151 if failed:
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
1152 sys.exit(1)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
1153
19239
db978c792b02 run-tests: make a table of test types
Matt Mackall <mpm@selenic.com>
parents: 19238
diff changeset
1154 testtypes = [('.py', pytest, '.out'),
db978c792b02 run-tests: make a table of test types
Matt Mackall <mpm@selenic.com>
parents: 19238
diff changeset
1155 ('.t', tsttest, '')]
db978c792b02 run-tests: make a table of test types
Matt Mackall <mpm@selenic.com>
parents: 19238
diff changeset
1156
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1157 def main():
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
1158 (options, args) = parseargs()
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1159 os.umask(022)
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
1160
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1161 checktools()
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
1162
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1163 if len(args) == 0:
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1164 args = [t for t in os.listdir(".")
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1165 if t.startswith("test-")
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1166 and (t.endswith(".py") or t.endswith(".t"))]
12677
9848a94e2ad6 run-tests.py: do not install hg when the tests do no exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12643
diff changeset
1167
13989
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
1168 tests = args
12677
9848a94e2ad6 run-tests.py: do not install hg when the tests do no exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12643
diff changeset
1169
19057
3d265e0822d3 run-tests: introduce --random for running tests in random error
Mads Kiilerich <madski@unity3d.com>
parents: 18788
diff changeset
1170 if options.random:
3d265e0822d3 run-tests: introduce --random for running tests in random error
Mads Kiilerich <madski@unity3d.com>
parents: 18788
diff changeset
1171 random.shuffle(tests)
19277
09e1c148e847 run-tests: schedule largest tests first
Matt Mackall <mpm@selenic.com>
parents: 19276
diff changeset
1172 else:
19281
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1173 # keywords for slow tests
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1174 slow = 'svn gendoc check-code-hg'.split()
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1175 def sortkey(f):
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1176 # run largest tests first, as they tend to take the longest
19315
401b3ad26e66 run-tests: sort missing files first instead of raising an error
simon@laptop-tosh
parents: 19312
diff changeset
1177 try:
401b3ad26e66 run-tests: sort missing files first instead of raising an error
simon@laptop-tosh
parents: 19312
diff changeset
1178 val = -os.stat(f).st_size
401b3ad26e66 run-tests: sort missing files first instead of raising an error
simon@laptop-tosh
parents: 19312
diff changeset
1179 except OSError, e:
401b3ad26e66 run-tests: sort missing files first instead of raising an error
simon@laptop-tosh
parents: 19312
diff changeset
1180 if e.errno != errno.ENOENT:
401b3ad26e66 run-tests: sort missing files first instead of raising an error
simon@laptop-tosh
parents: 19312
diff changeset
1181 raise
401b3ad26e66 run-tests: sort missing files first instead of raising an error
simon@laptop-tosh
parents: 19312
diff changeset
1182 return -1e9 # file does not exist, tell early
19281
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1183 for kw in slow:
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1184 if kw in f:
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1185 val *= 10
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1186 return val
0a5e19007cd1 run-tests: sort certain slow tests earlier by keyword
Matt Mackall <mpm@selenic.com>
parents: 19280
diff changeset
1187 tests.sort(key=sortkey)
19057
3d265e0822d3 run-tests: introduce --random for running tests in random error
Mads Kiilerich <madski@unity3d.com>
parents: 18788
diff changeset
1188
18616
35b4affe6fdd test: display used python hash seed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18565
diff changeset
1189 if 'PYTHONHASHSEED' not in os.environ:
35b4affe6fdd test: display used python hash seed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18565
diff changeset
1190 # use a random python hash seed all the time
35b4affe6fdd test: display used python hash seed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18565
diff changeset
1191 # we do the randomness ourself to know what seed is used
35b4affe6fdd test: display used python hash seed
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18565
diff changeset
1192 os.environ['PYTHONHASHSEED'] = str(random.getrandbits(32))
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
1193
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1194 global TESTDIR, HGTMP, INST, BINDIR, PYTHONDIR, COVERAGE_FILE
16897
2774576dee4d tests/run-tests: avoid C:/ in arguments
Adrian Buehlmann <adrian@cadifra.com>
parents: 16890
diff changeset
1195 TESTDIR = os.environ["TESTDIR"] = os.getcwd()
9706
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1196 if options.tmpdir:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1197 options.keep_tmpdir = True
9706
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1198 tmpdir = options.tmpdir
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1199 if os.path.exists(tmpdir):
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1200 # Meaning of tmpdir has changed since 1.3: we used to create
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1201 # HGTMP inside tmpdir; now HGTMP is tmpdir. So fail if
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1202 # tmpdir already exists.
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1203 sys.exit("error: temp dir %r already exists" % tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1204
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1205 # Automatically removing tmpdir sounds convenient, but could
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1206 # really annoy anyone in the habit of using "--tmpdir=/tmp"
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1207 # or "--tmpdir=$HOME".
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1208 #vlog("# Removing temp dir", tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1209 #shutil.rmtree(tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1210 os.makedirs(tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1211 else:
16890
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
1212 d = None
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
1213 if os.name == 'nt':
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
1214 # without this, we get the default temp dir location, but
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
1215 # in all lowercase, which causes troubles with paths (issue3490)
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
1216 d = os.getenv('TMP')
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
1217 tmpdir = tempfile.mkdtemp('', 'hgtests.', d)
9706
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
1218 HGTMP = os.environ['HGTMP'] = os.path.realpath(tmpdir)
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
1219
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1220 if 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
1221 INST = None
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1222 BINDIR = os.path.dirname(os.path.realpath(options.with_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
1223
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1224 # This looks redundant with how Python initializes sys.path from
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1225 # the location of the script being executed. Needed because the
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1226 # "hg" specified by --with-hg is not the only Python 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
1227 # executed in the test suite that needs to import 'mercurial'
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1228 # ... which means it's not really redundant at all.
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1229 PYTHONDIR = BINDIR
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1230 else:
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1231 INST = os.path.join(HGTMP, "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
1232 BINDIR = os.environ["BINDIR"] = os.path.join(INST, "bin")
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1233 PYTHONDIR = os.path.join(INST, "lib", "python")
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1234
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1235 os.environ["BINDIR"] = BINDIR
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1236 os.environ["PYTHON"] = PYTHON
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
1237
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1238 path = [BINDIR] + os.environ["PATH"].split(os.pathsep)
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1239 os.environ["PATH"] = os.pathsep.join(path)
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
1240
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1241 # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1242 # can run .../tests/run-tests.py test-foo where test-foo
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1243 # adds an extension to HGRC
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1244 pypath = [PYTHONDIR, TESTDIR]
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1245 # We have to augment PYTHONPATH, rather than simply replacing
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1246 # it, in case external libraries are only available via current
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1247 # PYTHONPATH. (In particular, the Subversion bindings on OS X
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1248 # are in /opt/subversion.)
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1249 oldpypath = os.environ.get(IMPL_PATH)
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1250 if oldpypath:
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1251 pypath.append(oldpypath)
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
1252 os.environ[IMPL_PATH] = os.pathsep.join(pypath)
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
1253
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1254 COVERAGE_FILE = os.path.join(TESTDIR, ".coverage")
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
1255
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1256 vlog("# Using TESTDIR", TESTDIR)
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1257 vlog("# Using HGTMP", HGTMP)
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
1258 vlog("# Using PATH", os.environ["PATH"])
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
1259 vlog("# Using", IMPL_PATH, os.environ[IMPL_PATH])
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
1260
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1261 try:
19276
e55751963889 run-tests: introduce thread scheduler
Matt Mackall <mpm@selenic.com>
parents: 19275
diff changeset
1262 runtests(options, tests)
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
1263 finally:
16346
48692b416fbc tests: shorten post-test sleeps
Matt Mackall <mpm@selenic.com>
parents: 15942
diff changeset
1264 time.sleep(.1)
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
1265 cleanup(options)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
1266
13347
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
1267 if __name__ == '__main__':
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
1268 main()