annotate tests/run-tests.py @ 53040:cdd7bf612c7b stable tip

bundle-spec: properly format boolean parameter (issue6960) This was breaking automatic clone bundle generation. This changeset fixes it and add a test to catch it in the future.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 11 Mar 2025 02:29:42 +0100
parents e465689fa74d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45849
c102b704edb5 global: use python3 in shebangs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45845
diff changeset
1 #!/usr/bin/env python3
2110
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 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46767
diff changeset
5 # Copyright 2006 Olivia Mackall <olivia@selenic.com>
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
6 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8161
diff changeset
7 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10154
diff changeset
8 # GNU General Public License version 2 or any later version.
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
9
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
10 # Modifying this script is tricky because it has many modes:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
11 # - serial (default) vs parallel (-jN, N > 1)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
12 # - no coverage (default) vs coverage (-c, -C, -s)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
13 # - temp install (default) vs specific hg script (--with-hg, --local)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
14 # - tests are a mix of shell scripts and Python scripts
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
15 #
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
16 # If you change this script, it is recommended that you ensure you
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
17 # haven't broken it by running it in various modes with a representative
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
18 # sample of test scripts. For example:
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8724
diff changeset
19 #
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
20 # 1) serial, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
21 # ./run-tests.py test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
22 # 2) serial, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
23 # ./run-tests.py --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
24 # 3) serial, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
25 # ./run-tests.py -c test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
26 # 4) serial, coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
27 # ./run-tests.py -c --local test-s* # unsupported
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
28 # 5) parallel, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
29 # ./run-tests.py -j2 test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
30 # 6) parallel, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
31 # ./run-tests.py -j2 --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
32 # 7) parallel, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
33 # ./run-tests.py -j2 -c test-s* # currently broken
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
34 # 8) parallel, coverage, local install:
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
35 # ./run-tests.py -j2 -c --local test-s* # unsupported (and broken)
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
36 # 9) parallel, custom tmp dir:
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
37 # ./run-tests.py -j2 --tmpdir /tmp/myhgtests
26158
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
38 # 10) parallel, pure, tests that call run-tests:
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
39 # ./run-tests.py --pure `grep -l run-tests.py *.t`
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
40 #
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
41 # (You could use any subset of the tests: test-s* happens to match
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
42 # enough that it's worth doing parallel runs, few enough that it
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
43 # completes fairly quickly, includes both shell and Python scripts, and
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
44 # includes some scripts that run daemon processes.)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
45
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
46
35198
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35176
diff changeset
47 import argparse
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
48 import collections
45970
064449f9fdc2 run-tests: use a context manager when looking for available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 45957
diff changeset
49 import contextlib
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
50 import difflib
49507
35bf7f23b84c run-tests: deal with distutil deprecation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49314
diff changeset
51
2571
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 errno
48950
f928dec9add7 tests: unconditionalize _unified_diff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48949
diff changeset
53 import functools
28126
562a073a2a1b tests: load json with no fallback
Yuya Nishihara <yuya@tcha.org>
parents: 28099
diff changeset
54 import json
40245
e7e70c033783 run-tests: run tests with as many processes as cores by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40244
diff changeset
55 import multiprocessing
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
56 import os
52734
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
57 import pathlib
44501
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
58 import platform
48958
f547a5dee234 tests: unconditionalize some imports
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48957
diff changeset
59 import queue
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
60 import random
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
61 import re
48958
f547a5dee234 tests: unconditionalize some imports
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48957
diff changeset
62 import shlex
10905
13a1b2fb7ef2 pylint, pyflakes: remove unused or duplicate imports
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10903
diff changeset
63 import shutil
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
64 import signal
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
65 import socket
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
66 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
67 import sys
32342
8627cf4de929 run-tests: drop fallback for sysconfig for pre-py2.7
Martin von Zweigbergk <martinvonz@google.com>
parents: 31950
diff changeset
68 import sysconfig
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
69 import tempfile
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
70 import threading
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
71 import time
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
72 import unittest
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
73 import uuid
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
74 import xml.dom.minidom as minidom
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
75
52684
70a75d379daf tests: obfuscate Python version checks to subvert `pyupgrade`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52668
diff changeset
76 # Don't compare sys.version_info directly, to prevent pyupgrade from dropping
70a75d379daf tests: obfuscate Python version checks to subvert `pyupgrade`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52668
diff changeset
77 # the conditional.
70a75d379daf tests: obfuscate Python version checks to subvert `pyupgrade`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52668
diff changeset
78 sys_version_info = sys.version_info
70a75d379daf tests: obfuscate Python version checks to subvert `pyupgrade`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52668
diff changeset
79
70a75d379daf tests: obfuscate Python version checks to subvert `pyupgrade`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52668
diff changeset
80 if sys_version_info < (3, 8, 0):
48971
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
81 print(
51987
737423ae03c2 run-tests: bump the minimum python to 3.8
Matt Harbison <matt_harbison@yahoo.com>
parents: 51878
diff changeset
82 '%s is only supported on Python 3.8+, not %s'
48971
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
83 % (sys.argv[0], '.'.join(str(v) for v in sys.version_info[:3]))
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
84 )
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
85 sys.exit(70) # EX_SOFTWARE from `man 3 sysexit`
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
86
49617
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
87 MACOS = sys.platform == 'darwin'
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
88 WINDOWS = os.name == r'nt'
48958
f547a5dee234 tests: unconditionalize some imports
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48957
diff changeset
89 shellquote = shlex.quote
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
90 BINDIRNAME = b"Scripts" if WINDOWS else b"bin"
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
91
52347
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
92 # The number of HGPORTx ports allocated to each test.
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
93 HGPORT_COUNT = 4
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
94
52618
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
95 RUNTEST_DIR = os.path.abspath(os.path.dirname(__file__.encode('utf-8')))
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
96 RUNTEST_DIR_FORWARD_SLASH = RUNTEST_DIR.replace(os.sep.encode('utf-8'), b'/')
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
97
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
98
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
99 processlock = threading.Lock()
19413
a4de0d3dc35a run-tests: lock popen wait/poll
Brendan Cully <brendan@kublai.com>
parents: 19407
diff changeset
100
33552
754569f5e999 run-tests: make sure to check if pygments is installed before using it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33500
diff changeset
101 pygmentspresent = False
47319
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
102 try: # is pygments installed
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
103 import pygments
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
104 import pygments.lexers as lexers
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
105 import pygments.lexer as lexer
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
106 import pygments.formatters as formatters
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
107 import pygments.token as token
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
108 import pygments.style as style
52539
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
109 from pygments.console import ansiformat
47319
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
110
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
111 if WINDOWS:
47319
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
112 hgpath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
113 sys.path.append(hgpath)
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
114 try:
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
115 from mercurial import win32 # pytype: disable=import-error
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
116
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
117 # Don't check the result code because it fails on heptapod, but
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
118 # something is able to convert to color anyway.
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
119 win32.enablevtmode()
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
120 finally:
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
121 sys.path = sys.path[:-1]
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
122
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
123 pygmentspresent = True
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
124 difflexer = lexers.DiffLexer()
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
125 terminal256formatter = formatters.Terminal256Formatter()
52539
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
126
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
127 def colorize(text: str, style: str, color: bool = True) -> str:
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
128 if not color:
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
129 return text
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
130 return ansiformat(style, text)
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
131
47319
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47244
diff changeset
132 except ImportError:
52539
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
133
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
134 def colorize(text: str, style: str, color: bool = True) -> str:
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
135 return text
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52487
diff changeset
136
33420
e80041832eec run-tests: add color to output if pygments is available
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33203
diff changeset
137
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
138 progress_type = {}
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
139
33835
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
140 if pygmentspresent:
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
141 _T_ERROR = token.string_to_tokentype("Token.Generic.Error")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
142 _T_FAILED = token.string_to_tokentype("Token.Generic.Failed")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
143 _T_FNAME = token.string_to_tokentype("Token.Generic.FName")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
144 _T_IGNORED = token.string_to_tokentype("Token.Generic.Ignored")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
145 _T_SKIPPED = token.string_to_tokentype("Token.Generic.Skipped")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
146 _T_SNAME = token.string_to_tokentype("Token.Generic.SName")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
147 _T_SKIPPED_DOT = token.string_to_tokentype("Token.Generic.SkippedDot")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
148 _T_SUCCESS = token.string_to_tokentype("Token.Generic.Success")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
149 _T_TIMEDOUT = token.string_to_tokentype("Token.Generic.TimedOut")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
150
33835
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
151 class TestRunnerStyle(style.Style):
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
152 default_style = ""
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
153 styles = {
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
154 _T_ERROR: '#cd00cd',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
155 _T_FAILED: '#7f0000',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
156 _T_FNAME: '#ff0000',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
157 _T_IGNORED: '#cdcd00',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
158 _T_SKIPPED: '#e5e5e5',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
159 _T_SNAME: '#00ffff',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
160 _T_SKIPPED_DOT: '#00ffff',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
161 _T_SUCCESS: '#00cd00',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
162 _T_TIMEDOUT: '#ff00ff',
33835
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
163 }
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
164
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
165 class TestRunnerLexer(lexer.RegexLexer):
38302
b5651ae53127 run-tests: restrict the test cases allowed characters
Boris Feld <boris.feld@octobus.net>
parents: 38263
diff changeset
166 testpattern = r'[\w-]+\.(t|py)(#[a-zA-Z0-9_\-\.]+)?'
33835
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
167 tokens = {
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
168 'root': [
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
169 (r'^Skipped', _T_SKIPPED, 'skipped'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
170 (r'^Failed ', _T_FAILED, 'failed'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
171 (r'^ERROR: ', _T_FAILED, 'failed'),
33835
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
172 ],
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
173 'skipped': [
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
174 (testpattern, _T_SNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
175 (r':.*', _T_SKIPPED),
33835
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
176 ],
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
177 'failed': [
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
178 (testpattern, _T_FNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
179 (r'(:| ).*', _T_FAILED),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
180 ],
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
181 }
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
182
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
183 progress_type['.'] = _T_SUCCESS
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
184 progress_type['s'] = _T_SKIPPED_DOT
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
185 progress_type['i'] = _T_IGNORED
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
186 progress_type['!'] = _T_FAILED
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
187 progress_type['E'] = _T_ERROR
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
188 progress_type['t'] = _T_TIMEDOUT
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
189
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
190 class progressLexer(lexer.RegexLexer):
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
191 testpattern = r'[\w-]+\.(t|py)(#[a-zA-Z0-9_\-\.]+)?'
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
192 tokens = {
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
193 'root': [
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
194 (r'^Skipped', _T_SKIPPED, 'skipped'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
195 (r'^Failed ', _T_FAILED, 'failed'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
196 (r'^ERROR: ', _T_FAILED, 'failed'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
197 ],
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
198 'skipped': [
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
199 (testpattern, _T_SNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
200 (r':.*', _T_SKIPPED),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
201 ],
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
202 'failed': [
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
203 (testpattern, _T_FNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
204 (r'(:| ).*', _T_FAILED),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
205 ],
33835
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
206 }
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33736
diff changeset
207
33885
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33835
diff changeset
208 runnerformatter = formatters.Terminal256Formatter(style=TestRunnerStyle)
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33835
diff changeset
209 runnerlexer = TestRunnerLexer()
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33835
diff changeset
210
39661
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39605
diff changeset
211 origenviron = os.environ.copy()
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39605
diff changeset
212
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
213
48947
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
214 def _sys2bytes(p):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
215 if p is None:
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
216 return p
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
217 return p.encode('utf-8')
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
218
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
219
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
220 def _bytes2sys(p):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
221 if p is None:
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
222 return p
48947
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
223 return p.decode('utf-8')
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
224
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
225
50772
a4ec7a92d2c5 tests: avoid test environment affecting setup.py
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50335
diff changeset
226 original_env = os.environ.copy()
48947
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
227 osenvironb = getattr(os, 'environb', None)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
228 if osenvironb is None:
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
229 # Windows lacks os.environb, for instance. A proxy over the real thing
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
230 # instead of a copy allows the environment to be updated via bytes on
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
231 # all platforms.
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48971
diff changeset
232 class environbytes:
48947
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
233 def __init__(self, strenv):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
234 self.__len__ = strenv.__len__
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
235 self.clear = strenv.clear
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
236 self._strenv = strenv
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
237
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
238 def __getitem__(self, k):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
239 v = self._strenv.__getitem__(_bytes2sys(k))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
240 return _sys2bytes(v)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
241
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
242 def __setitem__(self, k, v):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
243 self._strenv.__setitem__(_bytes2sys(k), _bytes2sys(v))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
244
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
245 def __delitem__(self, k):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
246 self._strenv.__delitem__(_bytes2sys(k))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
247
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
248 def __contains__(self, k):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
249 return self._strenv.__contains__(_bytes2sys(k))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
250
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
251 def __iter__(self):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
252 return iter([_sys2bytes(k) for k in iter(self._strenv)])
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
253
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
254 def get(self, k, default=None):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
255 v = self._strenv.get(_bytes2sys(k), _bytes2sys(default))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
256 return _sys2bytes(v)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
257
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
258 def pop(self, k, default=None):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
259 v = self._strenv.pop(_bytes2sys(k), _bytes2sys(default))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
260 return _sys2bytes(v)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
261
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
262 osenvironb = environbytes(os.environ)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
263
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
264 getcwdb = getattr(os, 'getcwdb')
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
265 if not getcwdb or WINDOWS:
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
266 getcwdb = lambda: _sys2bytes(os.getcwd())
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48745
diff changeset
267
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
268
47619
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
269 if WINDOWS:
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
270 _getcwdb = getcwdb
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
271
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
272 def getcwdb():
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
273 cwd = _getcwdb()
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
274 if re.match(b'^[a-z]:', cwd):
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
275 # os.getcwd() is inconsistent on the capitalization of the drive
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
276 # letter, so adjust it. see https://bugs.python.org/issue40368
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
277 cwd = cwd[0:1].upper() + cwd[1:]
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
278 return cwd
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
279
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
280
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
281 # For Windows support
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
282 wifexited = getattr(os, "WIFEXITED", lambda x: False)
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
283
51689
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51687
diff changeset
284
31004
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
285 # Whether to use IPv6
31022
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 31007
diff changeset
286 def checksocketfamily(name, port=20058):
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 31007
diff changeset
287 """return true if we can listen on localhost using family=name
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 31007
diff changeset
288
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 31007
diff changeset
289 name should be either 'AF_INET', or 'AF_INET6'.
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 31007
diff changeset
290 port being used is okay - EADDRINUSE is considered as successful.
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 31007
diff changeset
291 """
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 31007
diff changeset
292 family = getattr(socket, name, None)
31004
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
293 if family is None:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
294 return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
295 try:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
296 s = socket.socket(family, socket.SOCK_STREAM)
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
297 s.bind(('localhost', port))
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
298 s.close()
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
299 return True
52665
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52624
diff changeset
300 except OSError as exc:
31004
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
301 if exc.errno == errno.EADDRINUSE:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
302 return True
49053
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 49047
diff changeset
303 elif exc.errno in (
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 49047
diff changeset
304 errno.EADDRNOTAVAIL,
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 49047
diff changeset
305 errno.EPROTONOSUPPORT,
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 49047
diff changeset
306 errno.EAFNOSUPPORT,
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 49047
diff changeset
307 ):
31004
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
308 return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
309 else:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
310 raise
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
311 else:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
312 return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
313
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
314
31031
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
315 # useipv6 will be set by parseargs
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
316 useipv6 = None
31004
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30925
diff changeset
317
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
318
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
319 def checkportisavailable(port):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
320 """return true if a port seems free to bind on localhost"""
31005
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 31004
diff changeset
321 if useipv6:
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 31004
diff changeset
322 family = socket.AF_INET6
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 31004
diff changeset
323 else:
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 31004
diff changeset
324 family = socket.AF_INET
31007
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 31006
diff changeset
325 try:
45970
064449f9fdc2 run-tests: use a context manager when looking for available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 45957
diff changeset
326 with contextlib.closing(socket.socket(family, socket.SOCK_STREAM)) as s:
064449f9fdc2 run-tests: use a context manager when looking for available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 45957
diff changeset
327 s.bind(('localhost', port))
31007
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 31006
diff changeset
328 return True
49955
a77c1375c316 run-tests: drop a workaround for python2
Matt Harbison <matt_harbison@yahoo.com>
parents: 49618
diff changeset
329 except PermissionError:
a77c1375c316 run-tests: drop a workaround for python2
Matt Harbison <matt_harbison@yahoo.com>
parents: 49618
diff changeset
330 return False
52665
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52624
diff changeset
331 except OSError as exc:
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
332 if WINDOWS and exc.errno == errno.WSAEACCES:
46327
85c0c7145f8e run-tests: catch a Windows specific error when testing for a free socket
Matt Harbison <matt_harbison@yahoo.com>
parents: 46326
diff changeset
333 return False
47041
6e0af81c43b2 run-tests: ignore PermissionError when checking available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 47014
diff changeset
334 if exc.errno not in (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
335 errno.EADDRINUSE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
336 errno.EADDRNOTAVAIL,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
337 errno.EPROTONOSUPPORT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
338 ):
31007
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 31006
diff changeset
339 raise
30918
2aaa8bfc7bd9 runtests: check ports on IPv6 address
Jun Wu <quark@fb.com>
parents: 30716
diff changeset
340 return False
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
341
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
342
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
343 closefds = os.name == 'posix'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
344
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
345
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
346 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
347 processlock.acquire()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
348 p = subprocess.Popen(
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
349 _bytes2sys(cmd),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
350 shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
351 bufsize=-1,
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
352 cwd=_bytes2sys(wd),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
353 env=env,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
354 close_fds=closefds,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
355 stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
356 stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
357 stderr=subprocess.STDOUT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
358 )
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
359 processlock.release()
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
360
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
361 p.fromchild = p.stdout
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
362 p.tochild = p.stdin
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
363 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
364
14337
439ed4721a6d run-tests: ignore timeout when Popen.terminate is unavailable
Patrick Mezard <pmezard@gmail.com>
parents: 14336
diff changeset
365 p.timeout = False
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
366 if timeout:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
367
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
368 def t():
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
369 start = time.time()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
370 while time.time() - start < timeout and p.returncode is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
371 time.sleep(0.1)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
372 p.timeout = True
46918
248cbe173203 run-test: make it clearer why we terminating process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46870
diff changeset
373 vlog('# Timout reached for process %d' % p.pid)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
374 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
375 terminate(p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
376
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
377 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
378
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
379 return p
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
380
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
381
44636
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44619
diff changeset
382 default_defaults = {
40245
e7e70c033783 run-tests: run tests with as many processes as cores by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40244
diff changeset
383 'jobs': ('HGTEST_JOBS', multiprocessing.cpu_count()),
51988
f4c038081561 run-tests: bump the default timeout on Windows to 4x the normal value
Matt Harbison <matt_harbison@yahoo.com>
parents: 51987
diff changeset
384 'timeout': ('HGTEST_TIMEOUT', 360 if not WINDOWS else 360 * 4),
41806
9f53a4e2e193 tests: increase timeout for slow test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41768
diff changeset
385 'slowtimeout': ('HGTEST_SLOWTIMEOUT', 1500),
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
386 '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
387 '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
388 }
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
389
44636
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44619
diff changeset
390 defaults = default_defaults.copy()
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44619
diff changeset
391
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
392
28644
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
393 def canonpath(path):
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
394 return os.path.realpath(os.path.expanduser(path))
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
395
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
396
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
397 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
398 entries = dict()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
399 for filename in files:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
400 try:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
401 path = os.path.expanduser(os.path.expandvars(filename))
21916
792ebd7dc5f6 run-tests: write out scripts in binary mode
Augie Fackler <raf@durin42.com>
parents: 21763
diff changeset
402 f = open(path, "rb")
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
403 except FileNotFoundError:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
404 if warn:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
405 print("warning: no such %s file: %s" % (listtype, filename))
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
406 continue
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
407
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
408 for line in f.readlines():
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
409 line = line.split(b'#', 1)[0].strip()
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
410 if line:
47042
dff19fe2973c run-tests: fix whitelist/blacklist with directories on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47041
diff changeset
411 # Ensure path entries are compatible with os.path.relpath()
dff19fe2973c run-tests: fix whitelist/blacklist with directories on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47041
diff changeset
412 entries[os.path.normpath(line)] = filename
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
413
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
414 f.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
415 return entries
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
416
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
417
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
418 def parsettestcases(path):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
419 """read a .t test file, return a set of test case names
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
420
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
421 If path does not exist, return an empty set.
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
422 """
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
423 cases = []
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
424 try:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
425 with open(path, 'rb') as f:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
426 for l in f:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
427 if l.startswith(b'#testcases '):
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
428 cases.append(sorted(l[11:].split()))
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
429 except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
430 pass
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
431 return cases
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
432
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
433
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
434 def getparser():
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
435 """Obtain the OptionParser used by the CLI."""
35198
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35176
diff changeset
436 parser = argparse.ArgumentParser(usage='%(prog)s [options] [tests]')
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
437
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
438 selection = parser.add_argument_group('Test Selection')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
439 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
440 '--allow-slow-tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
441 action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
442 help='allow extremely slow tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
443 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
444 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
445 "--blacklist",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
446 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
447 help="skip tests listed in the specified blacklist file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
448 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
449 selection.add_argument(
52181
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
450 "--shard-total",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
451 type=int,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
452 default=None,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
453 help="total number of shard to use (enable sharding)",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
454 )
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
455 selection.add_argument(
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
456 "--shard-index",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
457 type=int,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
458 default=None,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
459 help="index of this shard [1-N]",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
460 )
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
461 selection.add_argument(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
462 "--changed",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
463 help="run tests that are changed in parent rev or working directory",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
464 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
465 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
466 "-k", "--keywords", help="run tests matching keywords"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
467 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
468 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
469 "-r", "--retest", action="store_true", help="retest failed tests"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
470 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
471 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
472 "--test-list",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
473 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
474 help="read tests to run from the specified file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
475 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
476 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
477 "--whitelist",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
478 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
479 help="always run tests listed in the specified whitelist file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
480 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
481 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
482 'tests', metavar='TESTS', nargs='*', help='Tests to run'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
483 )
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
484
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
485 harness = parser.add_argument_group('Test Harness Behavior')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
486 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
487 "-d",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
488 "--debug",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
489 action="store_true",
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
490 help="debug mode: write output of test scripts to console"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
491 " rather than capturing and diffing it (disables timeout)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
492 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
493 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
494 "-f",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
495 "--first",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
496 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
497 help="exit on the first test failure",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
498 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
499 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
500 "-i",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
501 "--interactive",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
502 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
503 help="prompt to accept changed output",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
504 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
505 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
506 "-j",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
507 "--jobs",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
508 type=int,
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
509 help="number of jobs to run in parallel"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
510 " (default: $%s or %d)" % defaults['jobs'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
511 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
512 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
513 "--keep-tmpdir",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
514 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
515 help="keep temporary directory after running tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
516 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
517 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
518 "--list-tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
519 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
520 help="list tests instead of running them",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
521 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
522 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
523 "--loop", action="store_true", help="loop tests repeatedly"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
524 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
525 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
526 '--random', action="store_true", help='run tests in random order'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
527 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
528 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
529 '--order-by-runtime',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
530 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
531 help='run slowest tests first, according to .testtimes',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
532 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
533 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
534 "-p",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
535 "--port",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
536 type=int,
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
537 help="port on which servers should listen"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
538 " (default: $%s or %d)" % defaults['port'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
539 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
540 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
541 '--profile-runner',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
542 action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
543 help='run statprof on run-tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
544 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
545 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
546 "-R", "--restart", action="store_true", help="restart at last error"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
547 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
548 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
549 "--runs-per-test",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
550 type=int,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
551 dest="runs_per_test",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
552 help="run each test N times (default=1)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
553 default=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
554 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
555 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
556 "--shell", help="shell to use (default: $%s or %s)" % defaults['shell']
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
557 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
558 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
559 '--showchannels', action='store_true', help='show scheduling channels'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
560 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
561 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
562 "--slowtimeout",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
563 type=int,
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
564 help="kill errant slow tests after SLOWTIMEOUT seconds"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
565 " (default: $%s or %d)" % defaults['slowtimeout'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
566 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
567 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
568 "-t",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
569 "--timeout",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
570 type=int,
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
571 help="kill errant tests after TIMEOUT seconds"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
572 " (default: $%s or %d)" % defaults['timeout'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
573 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
574 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
575 "--tmpdir",
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
576 help="run tests in the given temporary directory"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
577 " (implies --keep-tmpdir)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
578 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
579 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
580 "-v", "--verbose", action="store_true", help="output verbose messages"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
581 )
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
582
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
583 hgconf = parser.add_argument_group('Mercurial Configuration')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
584 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
585 "--chg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
586 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
587 help="install and use chg wrapper in place of hg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
588 )
44619
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44586
diff changeset
589 hgconf.add_argument(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
590 "--chg-debug",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
591 action="store_true",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
592 help="show chg debug logs",
44619
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44586
diff changeset
593 )
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
594 hgconf.add_argument(
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
595 "--rhg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
596 action="store_true",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
597 help="install and use rhg Rust implementation in place of hg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
598 )
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
599 hgconf.add_argument(
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
600 "--pyoxidized",
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
601 action="store_true",
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
602 help="build the hg binary using pyoxidizer",
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
603 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
604 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
605 '--extra-config-opt',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
606 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
607 default=[],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
608 help='set the given config opt in the test hgrc',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
609 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
610 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
611 "-l",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
612 "--local",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
613 action="store_true",
29583
6ce870dba6fa run-tests: make --local set --with-chg if --chg is used
Jun Wu <quark@fb.com>
parents: 29582
diff changeset
614 help="shortcut for --with-hg=<testdir>/../hg, "
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
615 "--with-rhg=<testdir>/../rust/target/release/rhg if --rhg is set, "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
616 "and --with-chg=<testdir>/../contrib/chg/chg if --chg is set",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
617 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
618 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
619 "--ipv6",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
620 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
621 help="prefer IPv6 to IPv4 for network related tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
622 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
623 hgconf.add_argument(
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
624 "--hg-wheel",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
625 default=None,
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
626 metavar="WHEEL_PATH",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
627 dest="wheel",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
628 help="install mercurial from the given wheel",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
629 )
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
630 hgconf.add_argument(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
631 "--pure",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
632 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
633 help="use pure Python code instead of C extensions",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
634 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
635 hgconf.add_argument(
44501
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
636 "--rust",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
637 action="store_true",
44501
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
638 help="use Rust code alongside C extensions",
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
639 )
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
640 hgconf.add_argument(
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
641 "--no-rust",
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
642 action="store_true",
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
643 help="do not use Rust code even if compiled",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
644 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
645 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
646 "--with-chg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
647 metavar="CHG",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
648 help="use specified chg wrapper in place of hg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
649 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
650 hgconf.add_argument(
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
651 "--with-rhg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
652 metavar="RHG",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
653 help="use specified rhg Rust implementation in place of hg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
654 )
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
655 hgconf.add_argument(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
656 "--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
657 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
658 help="test using specified hg script rather than a "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
659 "temporary installation",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
660 )
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
661
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
662 reporting = parser.add_argument_group('Results Reporting')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
663 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
664 "-C",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
665 "--annotate",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
666 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
667 help="output files annotated with coverage",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
668 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
669 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
670 "--color",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
671 choices=["always", "auto", "never"],
35199
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35198
diff changeset
672 default=os.environ.get('HGRUNTESTSCOLOR', 'auto'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
673 help="colorisation: always|auto|never (default: auto)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
674 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
675 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
676 "-c",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
677 "--cover",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
678 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
679 help="print a test coverage report",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
680 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
681 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
682 '--exceptions',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
683 action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
684 help='log all exceptions and generate an exception report',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
685 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
686 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
687 "-H",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
688 "--htmlcov",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
689 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
690 help="create an HTML report of the coverage of the files",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
691 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
692 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
693 "--json",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
694 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
695 help="store test result data in 'report.json' file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
696 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
697 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
698 "--outputdir",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
699 help="directory to write error logs to (default=test directory)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
700 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
701 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
702 "-n", "--nodiff", action="store_true", help="skip showing test changes"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
703 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
704 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
705 "-S",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
706 "--noskips",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
707 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
708 help="don't report skip tests verbosely",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
709 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
710 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
711 "--time", action="store_true", help="time how long each test takes"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
712 )
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
713 reporting.add_argument(
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
714 "--tail-report",
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
715 action="store_true",
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
716 help="display information about the final test of each thread",
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
717 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
718 reporting.add_argument("--view", help="external diff viewer")
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
719 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
720 "--xunit", help="record xunit results at specified path"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
721 )
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
722
14201
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
723 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
724 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
725 parser.set_defaults(**defaults)
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
726
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
727 return parser
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
728
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
729
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
730 def parseargs(args, parser):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
731 """Parse arguments with our OptionParser and validate results."""
35198
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35176
diff changeset
732 options = parser.parse_args(args)
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
733
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
734 # 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
735 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
736 options.pure = True
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
737
44501
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
738 if platform.python_implementation() != 'CPython' and options.rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
739 parser.error('Rust extensions are only available with CPython')
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
740
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
741 if options.pure and options.rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
742 parser.error('--rust cannot be used with --pure')
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
743
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
744 if options.rust and options.no_rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
745 parser.error('--rust cannot be used with --no-rust')
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
746
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
747 if options.local:
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
748 if options.with_hg or options.with_rhg or options.with_chg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
749 parser.error(
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
750 '--local cannot be used with --with-hg or --with-rhg or --with-chg'
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
751 )
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
752 if options.pyoxidized:
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
753 parser.error('--pyoxidized does not work with --local (yet)')
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
754 testdir = os.path.dirname(_sys2bytes(canonpath(sys.argv[0])))
29582
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
755 reporootdir = os.path.dirname(testdir)
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
756 venv_local = b'.venv_%s%d.%d' % (
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
757 sys.implementation.name.encode(),
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
758 sys.version_info.major,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
759 sys.version_info.minor,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
760 )
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
761 path_local_hg = os.path.join(reporootdir, venv_local, BINDIRNAME, b"hg")
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
762 if not os.path.exists(path_local_hg):
52734
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
763 if "HGTEST_REAL_HG" in os.environ:
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
764 # this file is run from a test (typically test-run-tests.t)
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
765 # no local environment but we can still use ./hg to please test-run-tests.t
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
766 path_local_hg = os.path.join(reporootdir, b"hg")
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
767 else:
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
768 message = (
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
769 f"run-tests.py called with --local but {_bytes2sys(venv_local)} does not exist.\n"
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
770 f'To create it, run \nmake local PYTHON="{sys.executable}"'
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
771 )
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
772 paths_venv = sorted(
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
773 pathlib.Path(_bytes2sys(reporootdir)).glob(".venv_*")
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
774 )
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
775 if paths_venv:
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
776 message += (
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
777 "\nAlternatively, call run-tests.py with a Python "
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
778 f"corresponding to {[p.name for p in paths_venv]}."
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
779 )
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
780 print(message, file=sys.stderr)
e465689fa74d test-local: error in case of --local without the corresponding venv
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52732
diff changeset
781 sys.exit(1)
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
782
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
783 pathandattrs = [(path_local_hg, 'with_hg')]
29583
6ce870dba6fa run-tests: make --local set --with-chg if --chg is used
Jun Wu <quark@fb.com>
parents: 29582
diff changeset
784 if options.chg:
6ce870dba6fa run-tests: make --local set --with-chg if --chg is used
Jun Wu <quark@fb.com>
parents: 29582
diff changeset
785 pathandattrs.append((b'contrib/chg/chg', 'with_chg'))
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
786 if options.rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
787 pathandattrs.append((b'rust/target/release/rhg', 'with_rhg'))
29582
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
788 for relpath, attr in pathandattrs:
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
789 binpath = os.path.join(reporootdir, relpath)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
790 if not (WINDOWS or os.access(binpath, os.X_OK)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
791 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
792 '--local specified, but %r not found or '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
793 'not executable' % binpath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
794 )
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
795 setattr(options, attr, _bytes2sys(binpath))
42827
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42826
diff changeset
796
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42826
diff changeset
797 if options.with_hg:
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
798 options.with_hg = canonpath(_sys2bytes(options.with_hg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
799 if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
800 os.path.isfile(options.with_hg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
801 and os.access(options.with_hg, os.X_OK)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
802 ):
42827
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42826
diff changeset
803 parser.error('--with-hg must specify an executable hg script')
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42826
diff changeset
804 if os.path.basename(options.with_hg) not in [b'hg', b'hg.exe']:
47583
05abe1ff1edd run-test: clarify the error with a bad --with-hg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47577
diff changeset
805 msg = 'warning: --with-hg should specify an hg script, not: %s\n'
05abe1ff1edd run-test: clarify the error with a bad --with-hg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47577
diff changeset
806 msg %= _bytes2sys(os.path.basename(options.with_hg))
05abe1ff1edd run-test: clarify the error with a bad --with-hg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47577
diff changeset
807 sys.stderr.write(msg)
42827
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42826
diff changeset
808 sys.stderr.flush()
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
809
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
810 if (options.chg or options.with_chg) and WINDOWS:
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
811 parser.error('chg does not work on %s' % os.name)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
812 if (options.rhg or options.with_rhg) and WINDOWS:
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
813 parser.error('rhg does not work on %s' % os.name)
49617
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
814 if options.pyoxidized and not (MACOS or WINDOWS):
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
815 parser.error('--pyoxidized is currently macOS and Windows only')
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
816 if options.with_chg:
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
817 options.chg = False # no installation to temporary location
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
818 options.with_chg = canonpath(_sys2bytes(options.with_chg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
819 if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
820 os.path.isfile(options.with_chg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
821 and os.access(options.with_chg, os.X_OK)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
822 ):
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
823 parser.error('--with-chg must specify a chg executable')
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
824 if options.with_rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
825 options.rhg = False # no installation to temporary location
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
826 options.with_rhg = canonpath(_sys2bytes(options.with_rhg))
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
827 if not (
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
828 os.path.isfile(options.with_rhg)
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
829 and os.access(options.with_rhg, os.X_OK)
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
830 ):
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
831 parser.error('--with-rhg must specify a rhg executable')
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
832 if options.chg and options.with_hg:
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
833 # chg shares installation location with hg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
834 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
835 '--chg does not work when --with-hg is specified '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
836 '(use --with-chg instead)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
837 )
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
838 if options.rhg and options.with_hg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
839 # rhg shares installation location with hg
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
840 parser.error(
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
841 '--rhg does not work when --with-hg is specified '
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
842 '(use --with-rhg instead)'
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
843 )
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
844 if options.rhg and options.chg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
845 parser.error('--rhg and --chg do not work together')
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
846
33567
d9677e2ed16a run-tests: warn if --color=always and no pygments installed
Martin von Zweigbergk <martinvonz@google.com>
parents: 33566
diff changeset
847 if options.color == 'always' and not pygmentspresent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
848 sys.stderr.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
849 'warning: --color=always ignored because '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
850 'pygments is not installed\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
851 )
33567
d9677e2ed16a run-tests: warn if --color=always and no pygments installed
Martin von Zweigbergk <martinvonz@google.com>
parents: 33566
diff changeset
852
31031
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
853 global useipv6
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
854 if options.ipv6:
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
855 useipv6 = checksocketfamily('AF_INET6')
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
856 else:
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
857 # only use IPv6 if IPv4 is unavailable and IPv6 is available
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
858 useipv6 = (not checksocketfamily('AF_INET')) and checksocketfamily(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
859 'AF_INET6'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
860 )
31031
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31030
diff changeset
861
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gr?ndemann <info@keimlink.de>
parents: 15858
diff changeset
862 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
863 if options.anycoverage:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
864 try:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
865 import coverage
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
866
50335
787e7caf887a run-tests: remove obsolete coverage check and packaging import (issue6805)
pacien <pacien.trangirard@pacien.net>
parents: 50275
diff changeset
867 coverage.__version__ # silence unused import warning
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
868 except ImportError:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
869 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
870
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
871 if options.anycoverage and options.local:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
872 # this needs some path mangling somewhere, I guess
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
873 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
874 "sorry, coverage options do not work when --local " "is specified"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
875 )
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
876
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
877 if options.anycoverage and options.with_hg:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
878 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
879 "sorry, coverage options do not work when --with-hg " "is specified"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
880 )
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
881
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
882 global verbose
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
883 if options.verbose:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
884 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
885
9394
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
886 if options.tmpdir:
28644
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
887 options.tmpdir = canonpath(options.tmpdir)
9394
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
888
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
889 if options.jobs < 1:
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
890 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
891 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
892 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
893 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
894 if options.timeout != defaults['timeout']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
895 sys.stderr.write('warning: --timeout option ignored with --debug\n')
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
896 if options.slowtimeout != defaults['slowtimeout']:
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
897 sys.stderr.write(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
898 'warning: --slowtimeout option ignored with --debug\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
899 )
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
900 options.timeout = 0
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
901 options.slowtimeout = 0
28582
cdbc25306696 run-tests: add --with-python3 to define a Python 3 interpreter
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28569
diff changeset
902
9959
b37b060d84c7 run-tests: add a "--blacklist target" option to skip predefined test lists
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9958
diff changeset
903 if options.blacklist:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
904 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
905 if options.whitelist:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
906 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
907 else:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
908 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
909
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
910 if options.showchannels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
911 options.nodiff = True
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
912
52181
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
913 if options.shard_total is not None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
914 if options.shard_index is None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
915 parser.error("--shard-total requires --shard-index to be set")
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
916
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
917 if options.shard_index is not None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
918 if options.shard_total is None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
919 parser.error("--shard-index requires --shard-total to be set")
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
920 elif options.shard_index <= 0:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
921 msg = "--shard-index must be > 0 (%d)"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
922 msg %= options.shard_index
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
923 parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
924 elif options.shard_index > options.shard_total:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
925 msg = (
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
926 "--shard-index must be <= than --shard-total (%d not in [1,%d])"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
927 )
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
928 msg %= (options.shard_index, options.shard_total)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
929 parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
930
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
931 if options.shard_total is not None and options.order_by_runtime:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
932 msg = "cannot use --order-by-runtime when sharding"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
933 parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
934
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
935 if options.shard_total is not None and options.random:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
936 msg = "cannot use --random when sharding"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
937 parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
938
35198
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35176
diff changeset
939 return options
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
940
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
941
5800
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
942 def rename(src, dst):
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
943 """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
944 for existing destination support.
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
945 """
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
946 shutil.copy(src, dst)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
947 os.remove(src)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
948
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
949
40471
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
950 def makecleanable(path):
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
951 """Try to fix directory permission recursively so that the entire tree
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
952 can be deleted"""
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
953 for dirpath, dirnames, _filenames in os.walk(path, topdown=True):
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
954 for d in dirnames:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
955 p = os.path.join(dirpath, d)
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
956 try:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
957 os.chmod(p, os.stat(p).st_mode & 0o777 | 0o700) # chmod u+rwx
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
958 except OSError:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
959 pass
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
960
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
961
48950
f928dec9add7 tests: unconditionalize _unified_diff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48949
diff changeset
962 _unified_diff = functools.partial(difflib.diff_bytes, difflib.unified_diff)
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
963
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
964
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
965 def getdiff(expected, output, ref, err):
21022
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
966 servefail = False
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
967 lines = []
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
968 for line in _unified_diff(expected, output, ref, err):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
969 if line.startswith(b'+++') or line.startswith(b'---'):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
970 line = line.replace(b'\\', b'/')
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
971 if line.endswith(b' \n'):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
972 line = line[:-2] + b'\n'
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
973 lines.append(line)
21022
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
974 if not servefail and line.startswith(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
975 b'+ abort: child process failed to start'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
976 ):
21022
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
977 servefail = True
52e9e63f1495 run-tests: test result shows when a failed test could not start a server
Simon Heimberg <simohe@besonet.ch>
parents: 21009
diff changeset
978
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
979 return servefail, lines
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
980
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
981
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
982 verbose = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
983
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
984
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
985 def vlog(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
986 """Log only when in verbose mode."""
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
987 if verbose is False:
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
988 return
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
989
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
990 return log(*msg)
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
991
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
992
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
993 # Bytes that break XML even in a CDATA block: control characters 0-31
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
994 # sans \t, \n and \r
25051
9c28f3236677 run-tests: do cdata escaping using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25050
diff changeset
995 CDATA_EVIL = re.compile(br"[\000-\010\013\014\016-\037]")
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
996
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
997 # Match feature conditionalized output lines in the form, capturing the feature
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
998 # list in group 2, and the preceeding line output in group 1:
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
999 #
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
1000 # output..output (feature !)\n
41554
17a6e063c886 run-tests: use raw strings for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41509
diff changeset
1001 optline = re.compile(br'(.*) \((.+?) !\)\n$')
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
1002
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1003
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1004 def cdatasafe(data):
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1005 """Make a string safe to include in a CDATA block.
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1006
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1007 Certain control characters are illegal in a CDATA block, and
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1008 there's no way to include a ]]> in a CDATA either. This function
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1009 replaces illegal bytes with ? and adds a space between the ]] so
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1010 that it won't break the CDATA block.
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1011 """
25051
9c28f3236677 run-tests: do cdata escaping using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25050
diff changeset
1012 return CDATA_EVIL.sub(b'?', data).replace(b']]>', b'] ]>')
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
1013
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1014
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
1015 def log(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
1016 """Log something to stdout.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
1017
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
1018 Arguments are strings to print.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
1019 """
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1020 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1021 if verbose:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1022 print(verbose, end=' ')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1023 for m in msg:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1024 print(m, end=' ')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1025 print()
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
1026 sys.stdout.flush()
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
1027
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1028
33948
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1029 def highlightdiff(line, color):
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1030 if not color:
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1031 return line
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1032 assert pygmentspresent
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1033 return pygments.highlight(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1034 line.decode('latin1'), difflexer, terminal256formatter
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1035 ).encode('latin1')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1036
33948
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1037
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1038 def highlightmsg(msg, color):
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1039 if not color:
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1040 return msg
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1041 assert pygmentspresent
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1042 return pygments.highlight(msg, runnerlexer, runnerformatter)
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
1043
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1044
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1045 def highlight_progress(progress, color):
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1046 if not color:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1047 return progress
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1048 assert pygmentspresent
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1049 token = progress_type.get(progress)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1050 if token is None:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1051 return progress
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1052 style = runnerformatter.style_string.get(str(token))
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1053 if style is None:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1054 return progress
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1055 else:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1056 return style[0] + progress + style[1]
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1057
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
1058
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
1059 def terminate(proc):
32343
dc131b9772f2 run-tests: drop fallback for proc.terminate() for pre-py2.6
Martin von Zweigbergk <martinvonz@google.com>
parents: 32342
diff changeset
1060 """Terminate subprocess"""
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
1061 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
1062 try:
32343
dc131b9772f2 run-tests: drop fallback for proc.terminate() for pre-py2.6
Martin von Zweigbergk <martinvonz@google.com>
parents: 32342
diff changeset
1063 proc.terminate()
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
1064 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
1065 pass
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
1066
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1067
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
1068 def killdaemons(pidfile):
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
1069 import killdaemons as killmod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1070
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1071 return killmod.killdaemons(pidfile, tryhard=False, remove=True, logfn=vlog)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1072
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
1073
48877
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 48875
diff changeset
1074 # sysconfig is not thread-safe (https://github.com/python/cpython/issues/92452)
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 48875
diff changeset
1075 sysconfiglock = threading.Lock()
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 48875
diff changeset
1076
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 48875
diff changeset
1077
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1078 class Test(unittest.TestCase):
21309
0b123e6a318c run-tests: allow Test.run() to run multiple times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21308
diff changeset
1079 """Encapsulates a single, runnable test.
0b123e6a318c run-tests: allow Test.run() to run multiple times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21308
diff changeset
1080
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1081 While this class conforms to the unittest.TestCase API, it differs in that
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1082 instances need to be instantiated manually. (Typically, unittest.TestCase
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1083 classes are instantiated automatically by scanning modules.)
21309
0b123e6a318c run-tests: allow Test.run() to run multiple times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21308
diff changeset
1084 """
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1085
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
1086 # Status code reserved for skipped tests (used by hghave).
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
1087 SKIPPED_STATUS = 80
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
1088
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1089 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1090 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1091 path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1092 outputdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1093 tmpdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1094 keeptmpdir=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1095 debug=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1096 first=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1097 timeout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1098 startport=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1099 extraconfigopts=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1100 shell=None,
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1101 python=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1102 hgcommand=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1103 slowtimeout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1104 usechg=False,
44619
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44586
diff changeset
1105 chgdebug=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1106 useipv6=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1107 ):
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
1108 """Create a test from parameters.
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
1109
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
1110 path is the full path to the file defining the test.
21338
3cd2d2de4060 run-tests: move computation of test paths into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21337
diff changeset
1111
21504
888a5dfe1569 run-tests: pass temp dir into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21502
diff changeset
1112 tmpdir is the main temporary directory to use for this test.
21505
3a1881dbf860 run-tests: pass abort into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21504
diff changeset
1113
21509
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
1114 keeptmpdir determines whether to keep the test's temporary directory
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
1115 after execution. It defaults to removal (False).
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
1116
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
1117 debug mode will make the test execute verbosely, with unfiltered
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
1118 output.
21511
3ec3e81a4110 run-tests: move diff options into arguments of Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21510
diff changeset
1119
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
1120 timeout controls the maximum run time of the test. It is ignored when
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1121 debug is True. See slowtimeout for tests with #require slow.
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1122
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1123 slowtimeout overrides timeout if the test has #require slow.
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1124
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1125 startport controls the starting port number to use for this test. Each
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1126 test will reserve 3 port numbers for execution. It is the caller's
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1127 responsibility to allocate a non-overlapping port range to Test
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1128 instances.
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
1129
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
1130 extraconfigopts is an iterable of extra hgrc config options. Values
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
1131 must have the form "key=value" (something understood by hgrc). Values
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
1132 of the form "foo.key=value" will result in "[foo] key=value".
21516
1e275c09242e run-tests: move py3kwarnings to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21515
diff changeset
1133
21517
af7d3a5c330b run-tests: move shell to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21516
diff changeset
1134 shell is the shell to execute tests in.
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
1135 """
34271
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34270
diff changeset
1136 if timeout is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34270
diff changeset
1137 timeout = defaults['timeout']
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34270
diff changeset
1138 if startport is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34270
diff changeset
1139 startport = defaults['port']
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34270
diff changeset
1140 if slowtimeout is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34270
diff changeset
1141 slowtimeout = defaults['slowtimeout']
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
1142 self.path = path
45521
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
1143 self.relpath = os.path.relpath(path)
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
1144 self.bname = os.path.basename(path)
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1145 self.name = _bytes2sys(self.bname)
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
1146 self._testdir = os.path.dirname(path)
32736
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32735
diff changeset
1147 self._outputdir = outputdir
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1148 self._tmpname = os.path.basename(path)
32736
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32735
diff changeset
1149 self.errpath = os.path.join(self._outputdir, b'%s.err' % self.bname)
21435
f376f56a354e run-tests: rename Test._test to Test.name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21434
diff changeset
1150
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
1151 self._threadtmp = tmpdir
21509
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
1152 self._keeptmpdir = keeptmpdir
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
1153 self._debug = debug
35011
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1154 self._first = first
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
1155 self._timeout = timeout
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1156 self._slowtimeout = slowtimeout
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1157 self._startport = startport
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
1158 self._extraconfigopts = extraconfigopts or []
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1159 self._shell = _sys2bytes(shell)
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1160 assert python is not None
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1161 self._python = python
28099
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
1162 self._hgcommand = hgcommand or b'hg'
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1163 self._usechg = usechg
44619
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44586
diff changeset
1164 self._chgdebug = chgdebug
31023
225f574e0645 runtests: export HGIPV6 to hint test scripts whether to use IPv6
Jun Wu <quark@fb.com>
parents: 31022
diff changeset
1165 self._useipv6 = useipv6
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1166
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1167 self._aborted = False
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
1168 self._daemonpids = []
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
1169 self._finished = None
21449
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
1170 self._ret = None
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
1171 self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
1172 self._skipped = None
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1173 self._testtmp = None
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1174 self._chgsockdir = None
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
1175
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1176 self._refout = self.readrefout()
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1177
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1178 @property
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1179 def _pythonb(self):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1180 return _sys2bytes(self._python.replace('\\', '/'))
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1181
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1182 def readrefout(self):
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1183 """read reference output"""
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
1184 # If we're not in --debug mode and reference output file exists,
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
1185 # check test output against it.
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1186 if self._debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1187 return None # to match "out is None"
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1188 elif os.path.exists(self.refpath):
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1189 with open(self.refpath, 'rb') as f:
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1190 return f.read().splitlines(True)
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
1191 else:
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
1192 return []
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
1193
24965
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1194 # needed to get base class __repr__ running
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1195 @property
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1196 def _testMethodName(self):
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1197 return self.name
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1198
21463
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
1199 def __str__(self):
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
1200 return self.name
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
1201
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1202 def shortDescription(self):
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1203 return self.name
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1204
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1205 def setUp(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1206 """Tasks to perform before run()."""
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
1207 self._finished = False
21449
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
1208 self._ret = None
aedf18bcde11 run-tests: store test return code and output in Test instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21448
diff changeset
1209 self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
1210 self._skipped = None
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1211
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1212 try:
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1213 os.mkdir(self._threadtmp)
49313
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
1214 except FileExistsError:
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
1215 pass
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1216
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1217 name = self._tmpname
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1218 self._testtmp = os.path.join(self._threadtmp, name)
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1219 os.mkdir(self._testtmp)
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1220
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
1221 # Remove any previous output files.
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
1222 if os.path.exists(self.errpath):
24332
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1223 try:
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1224 os.remove(self.errpath)
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
1225 except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
1226 # We might have raced another test to clean up a .err file,
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
1227 # so ignore FileNotFoundError when removing a previous .err
24332
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1228 # file.
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
1229 pass
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
1230
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1231 if self._usechg:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1232 self._chgsockdir = os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1233 self._threadtmp, b'%s.chgsock' % name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1234 )
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1235 os.mkdir(self._chgsockdir)
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1236
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1237 def run(self, result):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1238 """Run this test and report results against a TestResult instance."""
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1239 # This function is extremely similar to unittest.TestCase.run(). Once
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1240 # we require Python 2.7 (or at least its version of unittest), this
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1241 # function can largely go away.
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1242 self._result = result
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1243 result.startTest(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1244 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1245 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1246 self.setUp()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1247 except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1248 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1249 raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1250 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1251 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1252 return
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1253
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1254 success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1255 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1256 self.runTest()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1257 except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1258 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1259 raise
32950
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32925
diff changeset
1260 except unittest.SkipTest as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1261 result.addSkip(self, str(e))
21997
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
1262 # The base class will have already counted this as a
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
1263 # test we "ran", but we want to exclude skipped tests
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
1264 # from those we count towards those run.
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
1265 result.testsRun -= 1
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1266 except self.failureException as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1267 # This differs from unittest in that we don't capture
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1268 # the stack trace. This is for historical reasons and
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
1269 # this decision could be revisited in the future,
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1270 # especially for PythonTest instances.
21753
b7baef94a333 run-tests: checks behaviour of test on failure while testing
anuraggoel <anurag.dsps@gmail.com>
parents: 21740
diff changeset
1271 if result.addFailure(self, str(e)):
b7baef94a333 run-tests: checks behaviour of test on failure while testing
anuraggoel <anurag.dsps@gmail.com>
parents: 21740
diff changeset
1272 success = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1273 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1274 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1275 else:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1276 success = True
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1277
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1278 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1279 self.tearDown()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1280 except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1281 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1282 raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1283 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1284 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1285 success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1286
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1287 if success:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1288 result.addSuccess(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1289 finally:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1290 result.stopTest(self, interrupted=self._aborted)
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1291
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1292 def runTest(self):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
1293 """Run this test instance.
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
1294
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
1295 This will return a tuple describing the result of the test.
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
1296 """
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1297 env = self._getenv()
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1298 self._genrestoreenv(env)
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
1299 self._daemonpids.append(env['DAEMON_PIDS'])
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
1300 self._createhgrc(env['HGRCPATH'])
21300
a2774731a51a run-tests: move createhgrc() call into Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21299
diff changeset
1301
21435
f376f56a354e run-tests: rename Test._test to Test.name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21434
diff changeset
1302 vlog('# Test', self.name)
21337
79930515604f run-tests: move logging of test start into Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21336
diff changeset
1303
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1304 ret, out = self._run(env)
21500
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
1305 self._finished = True
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
1306 self._ret = ret
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
1307 self._out = out
21305
d7a7825ff2cf run-tests: capture execution results in a TestResult class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21304
diff changeset
1308
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1309 def describe(ret):
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1310 if ret < 0:
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1311 return 'killed by signal: %d' % -ret
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1312 return 'returned error code %d' % ret
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1313
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
1314 self._skipped = False
21336
45ab0668d1b2 run-tests: remove remaining uses of TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21335
diff changeset
1315
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
1316 if ret == self.SKIPPED_STATUS:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1317 if out is None: # Debug mode, nothing to parse.
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1318 missing = ['unknown']
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1319 failed = None
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1320 else:
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1321 missing, failed = TTest.parsehghaveoutput(out)
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1322
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1323 if not missing:
22292
102f0e926668 run-tests: report skipped tests as "skipped" - they might still be "relevant"
Mads Kiilerich <madski@unity3d.com>
parents: 22165
diff changeset
1324 missing = ['skipped']
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1325
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1326 if failed:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1327 self.fail('hg have failed checking for %s' % failed[-1])
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1328 else:
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
1329 self._skipped = True
32950
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32925
diff changeset
1330 raise unittest.SkipTest(missing[-1])
21325
0e66eb57e42a run-tests: generate timeout result in Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21324
diff changeset
1331 elif ret == 'timeout':
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1332 self.fail('timed out')
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
1333 elif ret is False:
32952
6123a5267119 tests: remove WarnTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32951
diff changeset
1334 self.fail('no result code from test')
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1335 elif out != self._refout:
21614
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
1336 # Diff generation may rely on written .err file.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1337 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1338 (ret != 0 or out != self._refout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1339 and not self._skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1340 and not self._debug
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1341 ):
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1342 with open(self.errpath, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1343 for line in out:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1344 f.write(line)
21614
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
1345
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1346 # The result object handles diff calculation for us.
35011
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1347 with firstlock:
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1348 if self._result.addOutputMismatch(self, ret, out, self._refout):
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1349 # change was accepted, skip failing
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1350 return
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1351 if self._first:
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1352 global firsterror
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
1353 firsterror = True
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1354
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1355 if ret:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1356 msg = 'output changed and ' + describe(ret)
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1357 else:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1358 msg = 'output changed'
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1359
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1360 self.fail(msg)
21327
206814c9072a run-tests: move remaining result processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21326
diff changeset
1361 elif ret:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1362 self.fail(describe(ret))
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1363
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1364 def tearDown(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1365 """Tasks to perform after run()."""
21456
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1366 for entry in self._daemonpids:
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1367 killdaemons(entry)
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1368 self._daemonpids = []
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1369
26422
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
1370 if self._keeptmpdir:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1371 log(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1372 '\nKeeping testtmp dir: %s\nKeeping threadtmp dir: %s'
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
1373 % (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
1374 _bytes2sys(self._testtmp),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
1375 _bytes2sys(self._threadtmp),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
1376 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1377 )
26422
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
1378 else:
40471
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1379 try:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1380 shutil.rmtree(self._testtmp)
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1381 except OSError:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1382 # unreadable directory may be left in $TESTTMP; fix permission
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1383 # and try again
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1384 makecleanable(self._testtmp)
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1385 shutil.rmtree(self._testtmp, True)
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1386 shutil.rmtree(self._threadtmp, True)
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1387
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1388 if self._usechg:
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1389 # chgservers will stop automatically after they find the socket
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1390 # files are deleted
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1391 shutil.rmtree(self._chgsockdir, True)
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1392
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1393 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1394 (self._ret != 0 or self._out != self._refout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1395 and not self._skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1396 and not self._debug
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1397 and self._out
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1398 ):
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1399 with open(self.errpath, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1400 for line in self._out:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1401 f.write(line)
21455
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
1402
24926
3fe1e07f1a32 run-test: include test name in the return vlog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24811
diff changeset
1403 vlog("# Ret was:", self._ret, '(%s)' % self.name)
21452
1517c0461b75 run-tests: move some functionality to Test.tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21451
diff changeset
1404
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1405 def _run(self, env):
21339
de25e968b4d8 run-tests: refactor runone() into gettest() and scheduletests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21338
diff changeset
1406 # This should be implemented in child classes to run tests.
32950
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32925
diff changeset
1407 raise unittest.SkipTest('unknown test type')
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1408
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1409 def abort(self):
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1410 """Terminate execution of this test."""
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1411 self._aborted = True
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1412
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1413 def _portmap(self, i):
28284
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
1414 offset = b'' if i == 0 else b'%d' % i
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1415 return (br':%d\b' % (self._startport + i), b':$HGPORT%s' % offset)
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1416
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1417 def _getreplacements(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1418 """Obtain a mapping of text replacements to apply to test output.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1419
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1420 Test output needs to be normalized so it can be compared to expected
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1421 output. This function defines how some of that normalization will
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1422 occur.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1423 """
52347
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1424 r = [self._portmap(port) for port in range(HGPORT_COUNT)]
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1425
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1426 r.extend(
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1427 [
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1428 (br'([^0-9])%s' % re.escape(self._localip()), br'\1$LOCALIP'),
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1429 (br'\bHG_TXNID=TXN:[a-f0-9]{40}\b', br'HG_TXNID=TXN:$ID$'),
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1430 (self._escapepath(self._testtmp), b'$TESTTMP'),
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1431 ]
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1432 )
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1433
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
1434 if WINDOWS:
47571
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47505
diff changeset
1435 # JSON output escapes backslashes in Windows paths, so also catch a
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47505
diff changeset
1436 # double-escape.
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47505
diff changeset
1437 replaced = self._testtmp.replace(b'\\', br'\\')
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47505
diff changeset
1438 r.append((self._escapepath(replaced), b'$STR_REPR_TESTTMP'))
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1439
35205
779c6cf2967b run-tests: avoid calculating _testdir again
Martin von Zweigbergk <martinvonz@google.com>
parents: 35204
diff changeset
1440 replacementfile = os.path.join(self._testdir, b'common-pattern.py')
35092
4fb489a998c9 run-tests: allow to register any arbitrary pattern for replacement
Boris Feld <boris.feld@octobus.net>
parents: 35089
diff changeset
1441
4fb489a998c9 run-tests: allow to register any arbitrary pattern for replacement
Boris Feld <boris.feld@octobus.net>
parents: 35089
diff changeset
1442 if os.path.exists(replacementfile):
4fb489a998c9 run-tests: allow to register any arbitrary pattern for replacement
Boris Feld <boris.feld@octobus.net>
parents: 35089
diff changeset
1443 data = {}
35115
1ac4c0887de4 run-test: drop 'execfile' usage for 'common-pattern.py' file
Boris Feld <boris.feld@octobus.net>
parents: 35114
diff changeset
1444 with open(replacementfile, mode='rb') as source:
1ac4c0887de4 run-test: drop 'execfile' usage for 'common-pattern.py' file
Boris Feld <boris.feld@octobus.net>
parents: 35114
diff changeset
1445 # the intermediate 'compile' step help with debugging
1ac4c0887de4 run-test: drop 'execfile' usage for 'common-pattern.py' file
Boris Feld <boris.feld@octobus.net>
parents: 35114
diff changeset
1446 code = compile(source.read(), replacementfile, 'exec')
1ac4c0887de4 run-test: drop 'execfile' usage for 'common-pattern.py' file
Boris Feld <boris.feld@octobus.net>
parents: 35114
diff changeset
1447 exec(code, data)
36030
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35895
diff changeset
1448 for value in data.get('substitutions', ()):
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35895
diff changeset
1449 if len(value) != 2:
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35895
diff changeset
1450 msg = 'malformatted substitution in %s: %r'
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35895
diff changeset
1451 msg %= (replacementfile, value)
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35895
diff changeset
1452 raise ValueError(msg)
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35895
diff changeset
1453 r.append(value)
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1454 return r
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1455
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1456 def _escapepath(self, p):
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
1457 if WINDOWS:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1458 return b''.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1459 c.isalpha()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1460 and b'[%s%s]' % (c.lower(), c.upper())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1461 or c in b'/\\'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1462 and br'[/\\]'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1463 or c.isdigit()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1464 and c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1465 or b'\\' + c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1466 for c in [p[i : i + 1] for i in range(len(p))]
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1467 )
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1468 else:
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1469 return re.escape(p)
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1470
31026
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1471 def _localip(self):
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1472 if self._useipv6:
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1473 return b'::1'
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1474 else:
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1475 return b'127.0.0.1'
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1476
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1477 def _genrestoreenv(self, testenv):
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1478 """Generate a script that can be used by tests to restore the original
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1479 environment."""
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1480 # Put the restoreenv script inside self._threadtmp
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1481 scriptpath = os.path.join(self._threadtmp, b'restoreenv.sh')
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1482 testenv['HGTEST_RESTOREENV'] = _bytes2sys(scriptpath)
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1483
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1484 # Only restore environment variable names that the shell allows
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1485 # us to export.
33147
f458a6701983 tests: fix variable name regular expression in _genrestoreenv()
Adam Simpkins <simpkins@fb.com>
parents: 33133
diff changeset
1486 name_regex = re.compile('^[a-zA-Z][a-zA-Z0-9_]*$')
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1487
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33147
diff changeset
1488 # Do not restore these variables; otherwise tests would fail.
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33147
diff changeset
1489 reqnames = {'PYTHON', 'TESTDIR', 'TESTTMP'}
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33147
diff changeset
1490
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1491 with open(scriptpath, 'w') as envf:
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33147
diff changeset
1492 for name, value in origenviron.items():
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1493 if not name_regex.match(name):
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1494 # Skip environment variables with unusual names not
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1495 # allowed by most shells.
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1496 continue
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33147
diff changeset
1497 if name in reqnames:
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33147
diff changeset
1498 continue
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1499 envf.write('%s=%s\n' % (name, shellquote(value)))
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1500
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1501 for name in testenv:
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33147
diff changeset
1502 if name in origenviron or name in reqnames:
33133
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1503 continue
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1504 envf.write('unset %s\n' % (name,))
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33127
diff changeset
1505
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1506 def _getenv(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1507 """Obtain environment variables to use during test execution."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1508
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1509 def defineport(i):
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1510 offset = '' if i == 0 else '%s' % i
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1511 env["HGPORT%s" % offset] = '%s' % (self._startport + i)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1512
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1513 env = os.environ.copy()
48877
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 48875
diff changeset
1514 with sysconfiglock:
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 48875
diff changeset
1515 env['PYTHONUSERBASE'] = sysconfig.get_config_var('userbase') or ''
31950
cc70c6dbac30 util: add a way to issue deprecation warning without a UI object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31829
diff changeset
1516 env['HGEMITWARNINGS'] = '1'
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1517 env['TESTTMP'] = _bytes2sys(self._testtmp)
48834
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48745
diff changeset
1518 # the FORWARD_SLASH version is useful when running `sh` on non unix
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48745
diff changeset
1519 # system (e.g. Windows)
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48745
diff changeset
1520 env['TESTTMP_FORWARD_SLASH'] = env['TESTTMP'].replace(os.sep, '/')
47323
7ea39d633cf3 docket: move the uid logic in the `revlogutils.docket` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47321
diff changeset
1521 uid_file = os.path.join(_bytes2sys(self._testtmp), 'UID')
7ea39d633cf3 docket: move the uid logic in the `revlogutils.docket` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47321
diff changeset
1522 env['HGTEST_UUIDFILE'] = uid_file
36075
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
1523 env['TESTNAME'] = self.name
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1524 env['HOME'] = _bytes2sys(self._testtmp)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
1525 if WINDOWS:
46870
41d43d12c2c4 tests: restore the ability to run `black` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
1526 env['REALUSERPROFILE'] = env['USERPROFILE']
46093
08fd76a553c9 run-tests: configure the environment to expand `~` properly with Windows py38+
Matt Harbison <matt_harbison@yahoo.com>
parents: 46092
diff changeset
1527 # py3.8+ ignores HOME: https://bugs.python.org/issue36264
08fd76a553c9 run-tests: configure the environment to expand `~` properly with Windows py38+
Matt Harbison <matt_harbison@yahoo.com>
parents: 46092
diff changeset
1528 env['USERPROFILE'] = env['HOME']
44636
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44619
diff changeset
1529 formated_timeout = _bytes2sys(b"%d" % default_defaults['timeout'][1])
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44619
diff changeset
1530 env['HGTEST_TIMEOUT_DEFAULT'] = formated_timeout
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44619
diff changeset
1531 env['HGTEST_TIMEOUT'] = _bytes2sys(b"%d" % self._timeout)
52347
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1532
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
1533 for port in range(HGPORT_COUNT):
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1534 defineport(port)
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1535 env["HGRCPATH"] = _bytes2sys(os.path.join(self._threadtmp, b'.hgrc'))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1536 env["DAEMON_PIDS"] = _bytes2sys(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1537 os.path.join(self._threadtmp, b'daemon.pids')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1538 )
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1539 env["HGEDITOR"] = f'"{self._python}" -c "import sys; sys.exit(0)"'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1540 env["HGUSER"] = "test"
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1541 env["HGENCODING"] = "ascii"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1542 env["HGENCODINGMODE"] = "strict"
39156
1f987f7c832b tests: force a stable hostname in patchbomb tests
Augie Fackler <raf@durin42.com>
parents: 38972
diff changeset
1543 env["HGHOSTNAME"] = "test-hostname"
31023
225f574e0645 runtests: export HGIPV6 to hint test scripts whether to use IPv6
Jun Wu <quark@fb.com>
parents: 31022
diff changeset
1544 env['HGIPV6'] = str(int(self._useipv6))
40541
c311424ea579 catapult: add a bit more documentation on how to use catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40540
diff changeset
1545 # See contrib/catapipe.py for how to use this functionality.
40540
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40539
diff changeset
1546 if 'HGTESTCATAPULTSERVERPIPE' not in env:
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40539
diff changeset
1547 # If we don't have HGTESTCATAPULTSERVERPIPE explicitly set, pull the
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40539
diff changeset
1548 # non-test one in as a default, otherwise set to devnull
41768
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41767
diff changeset
1549 env['HGTESTCATAPULTSERVERPIPE'] = env.get(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1550 'HGCATAPULTSERVERPIPE', os.devnull
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1551 )
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1552
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1553 extraextensions = []
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1554 for opt in self._extraconfigopts:
46092
af3a6900f893 run-tests: fix `HGTESTEXTRAEXTENSIONS` with py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 46072
diff changeset
1555 section, key = opt.split('.', 1)
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1556 if section != 'extensions':
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1557 continue
46092
af3a6900f893 run-tests: fix `HGTESTEXTRAEXTENSIONS` with py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 46072
diff changeset
1558 name = key.split('=', 1)[0]
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1559 extraextensions.append(name)
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1560
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1561 if extraextensions:
46092
af3a6900f893 run-tests: fix `HGTESTEXTRAEXTENSIONS` with py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 46072
diff changeset
1562 env['HGTESTEXTRAEXTENSIONS'] = ' '.join(extraextensions)
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37012
diff changeset
1563
31026
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1564 # LOCALIP could be ::1 or 127.0.0.1. Useful for tests that require raw
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1565 # IP addresses.
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1566 env['LOCALIP'] = _bytes2sys(self._localip())
31026
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31023
diff changeset
1567
40994
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40989
diff changeset
1568 # This has the same effect as Py_LegacyWindowsStdioFlag in exewrapper.c,
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40989
diff changeset
1569 # but this is needed for testing python instances like dummyssh,
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40989
diff changeset
1570 # dummysmtpd.py, and dumbhttp.py.
48957
2ccd5e71bcd3 tests: remove last references to PYTHON3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48956
diff changeset
1571 if WINDOWS:
40994
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40989
diff changeset
1572 env['PYTHONLEGACYWINDOWSSTDIO'] = '1'
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40989
diff changeset
1573
43837
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1574 # Modified HOME in test environment can confuse Rust tools. So set
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1575 # CARGO_HOME and RUSTUP_HOME automatically if a Rust toolchain is
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1576 # present and these variables aren't already defined.
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1577 cargo_home_path = os.path.expanduser('~/.cargo')
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1578 rustup_home_path = os.path.expanduser('~/.rustup')
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1579
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1580 if os.path.exists(cargo_home_path) and b'CARGO_HOME' not in osenvironb:
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1581 env['CARGO_HOME'] = cargo_home_path
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1582 if (
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1583 os.path.exists(rustup_home_path)
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1584 and b'RUSTUP_HOME' not in osenvironb
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1585 ):
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1586 env['RUSTUP_HOME'] = rustup_home_path
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
1587
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1588 # Reset some environment variables to well-known values so that
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1589 # the tests produce repeatable output.
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1590 env['LANG'] = env['LC_ALL'] = env['LANGUAGE'] = 'C'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1591 env['TZ'] = 'GMT'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1592 env["EMAIL"] = "Foo Bar <foo.bar@example.com>"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1593 env['COLUMNS'] = '80'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1594 env['TERM'] = 'xterm'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1595
40521
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1596 dropped = [
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1597 'CDPATH',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1598 'CHGDEBUG',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1599 'EDITOR',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1600 'GREP_OPTIONS',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1601 'HG',
40522
d6b6f1b441cf run-tests: define the default merge tool through configuration
Boris Feld <boris.feld@octobus.net>
parents: 40521
diff changeset
1602 'HGMERGE',
40521
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1603 'HGPLAIN',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1604 'HGPLAINEXCEPT',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1605 'HGPROF',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1606 'http_proxy',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1607 'no_proxy',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1608 'NO_PROXY',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1609 'PAGER',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1610 'VISUAL',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1611 ]
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1612
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1613 for k in dropped:
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1614 if k in env:
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1615 del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1616
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1617 # unset env related to hooks
36551
c3df20906689 tests: fix run-tests environment cleanup on Python 3
Augie Fackler <augie@google.com>
parents: 36492
diff changeset
1618 for k in list(env):
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1619 if k.startswith('HG_'):
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1620 del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1621
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1622 if self._usechg:
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1623 env['CHGSOCKNAME'] = os.path.join(self._chgsockdir, b'server')
44619
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44586
diff changeset
1624 if self._chgdebug:
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44586
diff changeset
1625 env['CHGDEBUG'] = 'true'
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1626
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1627 return env
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1628
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
1629 def _createhgrc(self, path):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1630 """Create an hgrc file for this test."""
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1631 with open(path, 'wb') as hgrc:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1632 hgrc.write(b'[ui]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1633 hgrc.write(b'slash = True\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1634 hgrc.write(b'interactive = False\n')
45845
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45521
diff changeset
1635 hgrc.write(b'detailed-exit-code = True\n')
40522
d6b6f1b441cf run-tests: define the default merge tool through configuration
Boris Feld <boris.feld@octobus.net>
parents: 40521
diff changeset
1636 hgrc.write(b'merge = internal:merge\n')
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1637 hgrc.write(b'mergemarkers = detailed\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1638 hgrc.write(b'promptecho = True\n')
47950
a28a7dcb9158 tests: setup dummyssh as the default ssh
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47829
diff changeset
1639 dummyssh = os.path.join(self._testdir, b'dummyssh')
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1640 hgrc.write(b'ssh = "%s" "%s"\n' % (self._pythonb, dummyssh))
46030
f44b9c72f061 run-tests: allow some slack about 'waiting on lock' message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45970
diff changeset
1641 hgrc.write(b'timeout.warn=15\n')
47775
036b9b3cc79a run-tests: use a small timeout for chg instance
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47774
diff changeset
1642 hgrc.write(b'[chgserver]\n')
036b9b3cc79a run-tests: use a small timeout for chg instance
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47774
diff changeset
1643 hgrc.write(b'idletimeout=60\n')
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1644 hgrc.write(b'[defaults]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1645 hgrc.write(b'[devel]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1646 hgrc.write(b'all-warnings = true\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1647 hgrc.write(b'default-date = 0 0\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1648 hgrc.write(b'[largefiles]\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1649 hgrc.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1650 b'usercache = %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1651 % (os.path.join(self._testtmp, b'.cache/largefiles'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1652 )
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1653 hgrc.write(b'[lfs]\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1654 hgrc.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1655 b'usercache = %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1656 % (os.path.join(self._testtmp, b'.cache/lfs'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1657 )
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1658 hgrc.write(b'[web]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1659 hgrc.write(b'address = localhost\n')
44466
109322cd322a tests: avoid implicit conversion of str to unicode
Manuel Jacob <me@manueljacob.de>
parents: 44229
diff changeset
1660 hgrc.write(b'ipv6 = %r\n' % self._useipv6)
37012
5890e5872f36 hgweb: allow defining Server response header for HTTP server
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36706
diff changeset
1661 hgrc.write(b'server-header = testing stub value\n')
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1662
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1663 for opt in self._extraconfigopts:
44469
ff72bd52d56a tests: avoid implicit conversion of str to unicode
Manuel Jacob <me@manueljacob.de>
parents: 44468
diff changeset
1664 section, key = _sys2bytes(opt).split(b'.', 1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1665 assert b'=' in key, (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1666 'extra config opt %s must ' 'have an = for assignment' % opt
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1667 )
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1668 hgrc.write(b'[%s]\n%s\n' % (section, key))
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
1669
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1670 def fail(self, msg):
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
1671 # unittest differentiates between errored and failed.
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
1672 # Failed is denoted by AssertionError (by default at least).
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
1673 raise AssertionError(msg)
21323
a7c677e2f6ae run-tests: move fail() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21322
diff changeset
1674
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1675 def _runcommand(self, cmd, env, normalizenewlines=False):
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1676 """Run command in a sub-process, capturing the output (stdout and
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1677 stderr).
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1678
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1679 Return a tuple (exitcode, output). output is None in debug mode.
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1680 """
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
1681 if self._debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1682 proc = subprocess.Popen(
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1683 _bytes2sys(cmd),
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1684 shell=True,
47774
c405c089611a run-tests: do not inherit file descriptor when running a command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47639
diff changeset
1685 close_fds=closefds,
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1686 cwd=_bytes2sys(self._testtmp),
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1687 env=env,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1688 )
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1689 ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1690 return (ret, None)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1691
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
1692 proc = Popen4(cmd, self._testtmp, self._timeout, env)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1693
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1694 def cleanup():
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1695 terminate(proc)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1696 ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1697 if ret == 0:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1698 ret = signal.SIGTERM << 8
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1699 killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1700 return ret
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1701
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1702 proc.tochild.close()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1703
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1704 try:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1705 output = proc.fromchild.read()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1706 except KeyboardInterrupt:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1707 vlog('# Handling keyboard interrupt')
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1708 cleanup()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1709 raise
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1710
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1711 ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
1712 if wifexited(ret):
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1713 ret = os.WEXITSTATUS(ret)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1714
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1715 if proc.timeout:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1716 ret = 'timeout'
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1717
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1718 if ret:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1719 killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1720
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1721 for s, r in self._getreplacements():
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1722 output = re.sub(s, r, output)
24510
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
1723
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
1724 if normalizenewlines:
39722
030d558c6456 py3: add a missing b'' for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39679
diff changeset
1725 output = output.replace(b'\r\n', b'\n')
24510
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
1726
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1727 return ret, output.splitlines(True)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1728
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1729
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1730 class PythonTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1731 """A Python-based test."""
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1732
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1733 @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1734 def refpath(self):
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
1735 return os.path.join(self._testdir, b'%s.out' % self.bname)
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1736
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1737 def _run(self, env):
40270
8783710b1d58 run-tests: restore quoting the python executable for running *.py tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 40263
diff changeset
1738 # Quote the python(3) executable for Windows
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
1739 cmd = b'"%s" "%s"' % (self._pythonb, self.path)
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
1740 vlog("# Running", cmd.decode("utf-8"))
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
1741 result = self._runcommand(cmd, env, normalizenewlines=WINDOWS)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1742 if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1743 raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1744
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1745 return result
21311
f9a7018a35ff run-tests: roll pytest() into PythonTest._run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21310
diff changeset
1746
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1747
29518
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1748 # Some glob patterns apply only in some circumstances, so the script
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1749 # might want to remove (glob) annotations that otherwise should be
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1750 # retained.
23352
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
1751 checkcodeglobpats = [
29518
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1752 # On Windows it looks like \ doesn't require a (glob), but we know
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1753 # better.
25059
0e0f1068b878 run-tests: fix checking a line to see if it needs globbing
Augie Fackler <augie@google.com>
parents: 25058
diff changeset
1754 re.compile(br'^pushing to \$TESTTMP/.*[^)]$'),
0e0f1068b878 run-tests: fix checking a line to see if it needs globbing
Augie Fackler <augie@google.com>
parents: 25058
diff changeset
1755 re.compile(br'^moving \S+/.*[^)]$'),
29518
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1756 re.compile(br'^pulling from \$TESTTMP/.*[^)]$'),
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1757 # Not all platforms have 127.0.0.1 as loopback (though most do),
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1758 # so we always glob that too.
31678
6a2959acae1a runtests: change local IP glob pattern from "127.0.0.1" to "$LOCALIP"
Jun Wu <quark@fb.com>
parents: 31640
diff changeset
1759 re.compile(br'.*\$LOCALIP.*$'),
23352
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
1760 ]
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
1761
48951
4cea98b32d95 tests: unconditionalize bchr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48950
diff changeset
1762 bchr = lambda x: bytes([x])
25036
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
1763
42872
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42827
diff changeset
1764 WARN_UNDEFINED = 1
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42827
diff changeset
1765 WARN_YES = 2
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42827
diff changeset
1766 WARN_NO = 3
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42827
diff changeset
1767
42907
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
1768 MARK_OPTIONAL = b" (?)\n"
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
1769
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1770
42907
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
1771 def isoptional(line):
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
1772 return line.endswith(MARK_OPTIONAL)
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
1773
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1774
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1775 class TTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1776 """A "t test" is a test backed by a .t file."""
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1777
28284
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
1778 SKIPPED_PREFIX = b'skipped: '
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
1779 FAILED_PREFIX = b'hghave check failed: '
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1780 NEEDESCAPE = re.compile(br'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
21384
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
1781
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1782 ESCAPESUB = re.compile(br'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44469
diff changeset
1783 ESCAPEMAP = {bchr(i): br'\x%02x' % i for i in range(256)}
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1784 ESCAPEMAP.update({b'\\': b'\\\\', b'\r': br'\r'})
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
1785
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1786 def __init__(self, path, *args, **kwds):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1787 # accept an extra "case" parameter
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
1788 case = kwds.pop('case', [])
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1789 self._case = case
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
1790 self._allcases = {x for y in parsettestcases(path) for x in y}
52668
5cc8deb96b48 pyupgrade: modernize calls to superclass methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 52665
diff changeset
1791 super().__init__(path, *args, **kwds)
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1792 if case:
38972
35180ade80c1 tests: fix bytes/str issues in run-tests.py caught by python3
Augie Fackler <augie@google.com>
parents: 38864
diff changeset
1793 casepath = b'#'.join(case)
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
1794 self.name = '%s#%s' % (self.name, _bytes2sys(casepath))
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
1795 self.errpath = b'%s#%s.err' % (self.errpath[:-4], casepath)
45108
a659d5a4d2d5 run-tests: replace '#' with '-' in temp path of repos created for tests
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45049
diff changeset
1796 self._tmpname += b'-%s' % casepath.replace(b'#', b'-')
36492
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36491
diff changeset
1797 self._have = {}
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1798
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1799 @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1800 def refpath(self):
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1801 return os.path.join(self._testdir, self.bname)
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1802
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1803 def _run(self, env):
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1804 with open(self.path, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1805 lines = f.readlines()
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1806
32999
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32998
diff changeset
1807 # .t file is both reference output and the test input, keep reference
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32998
diff changeset
1808 # output updated with the the test input. This avoids some race
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32998
diff changeset
1809 # conditions where the reference output does not match the actual test.
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32998
diff changeset
1810 if self._refout is not None:
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32998
diff changeset
1811 self._refout = lines
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32998
diff changeset
1812
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1813 salt, script, after, expected = self._parsetest(lines)
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1814
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1815 # Write out the generated script.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1816 fname = b'%s.sh' % self._testtmp
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1817 with open(fname, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1818 for l in script:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
1819 f.write(l)
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1820
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1821 cmd = b'%s "%s"' % (self._shell, fname)
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
1822 vlog("# Running", cmd.decode("utf-8"))
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1823
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1824 exitcode, output = self._runcommand(cmd, env)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1825
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1826 if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1827 raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1828
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1829 # Do not merge output if skipped. Return hghave message instead.
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1830 # Similarly, with --debug, output is None.
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
1831 if exitcode == self.SKIPPED_STATUS or output is None:
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1832 return exitcode, output
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1833
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1834 return self._processoutput(exitcode, output, salt, after, expected)
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1835
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1836 def _hghave(self, reqs):
36492
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36491
diff changeset
1837 allreqs = b' '.join(reqs)
41808
bc1c1435a874 runtest: move slow timeout process earlier in the `_hghave` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41807
diff changeset
1838
bc1c1435a874 runtest: move slow timeout process earlier in the `_hghave` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41807
diff changeset
1839 self._detectslow(reqs)
bc1c1435a874 runtest: move slow timeout process earlier in the `_hghave` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41807
diff changeset
1840
36492
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36491
diff changeset
1841 if allreqs in self._have:
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36491
diff changeset
1842 return self._have.get(allreqs)
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36491
diff changeset
1843
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1844 # TODO do something smarter when all other uses of hghave are gone.
52618
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
1845 cmd = b'%s -c "%s/hghave %s"'
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
1846 cmd %= (self._shell, RUNTEST_DIR_FORWARD_SLASH, allreqs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1847 proc = Popen4(
52618
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
1848 cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1849 self._testtmp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1850 0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1851 self._getenv(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1852 )
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1853 stdout, stderr = proc.communicate()
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1854 ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
1855 if wifexited(ret):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1856 ret = os.WEXITSTATUS(ret)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1857 if ret == 2:
28699
5cc59dbd199f py3: convert hghave output to text
timeless <timeless@mozdev.org>
parents: 28698
diff changeset
1858 print(stdout.decode('utf-8'))
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1859 sys.exit(1)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1860
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1861 if ret != 0:
36492
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36491
diff changeset
1862 self._have[allreqs] = (False, stdout)
27564
80b53082a353 run-tests: report missing feature for skipped tests
timeless <timeless@mozdev.org>
parents: 27396
diff changeset
1863 return False, stdout
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1864
36492
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36491
diff changeset
1865 self._have[allreqs] = (True, None)
27564
80b53082a353 run-tests: report missing feature for skipped tests
timeless <timeless@mozdev.org>
parents: 27396
diff changeset
1866 return True, None
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1867
41807
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41806
diff changeset
1868 def _detectslow(self, reqs):
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41806
diff changeset
1869 """update the timeout of slow test when appropriate"""
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41806
diff changeset
1870 if b'slow' in reqs:
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41806
diff changeset
1871 self._timeout = self._slowtimeout
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41806
diff changeset
1872
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1873 def _iftest(self, args):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1874 # implements "#if"
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1875 reqs = []
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1876 for arg in args:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1877 if arg.startswith(b'no-') and arg[3:] in self._allcases:
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
1878 if arg[3:] in self._case:
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1879 return False
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1880 elif arg in self._allcases:
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
1881 if arg not in self._case:
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1882 return False
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1883 else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1884 reqs.append(arg)
41809
4cbccb50df46 runtest: also update slow test timeout during `#if` clauses
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41808
diff changeset
1885 self._detectslow(reqs)
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1886 return self._hghave(reqs)[0]
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
1887
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1888 def _parsetest(self, lines):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1889 # We generate a shell script which outputs unique markers to line
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1890 # up script results with our source. These markers include input
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1891 # line number and the last return code.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1892 salt = b"SALT%d" % time.time()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1893
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1894 def addsalt(line, inpython):
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1895 if inpython:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1896 script.append(b'%s %d 0\n' % (salt, line))
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1897 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1898 script.append(b'echo %s %d $?\n' % (salt, line))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1899
40539
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40538
diff changeset
1900 activetrace = []
48952
7265e5b1d18e tests: always encode session
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48951
diff changeset
1901 session = str(uuid.uuid4()).encode('ascii')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1902 hgcatapult = os.getenv('HGTESTCATAPULTSERVERPIPE') or os.getenv(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1903 'HGCATAPULTSERVERPIPE'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1904 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1905
40538
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1906 def toggletrace(cmd=None):
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1907 if not hgcatapult or hgcatapult == os.devnull:
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1908 return
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1909
40539
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40538
diff changeset
1910 if activetrace:
40538
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1911 script.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1912 b'echo END %s %s >> "$HGTESTCATAPULTSERVERPIPE"\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1913 % (session, activetrace[0])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1914 )
40538
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1915 if cmd is None:
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1916 return
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1917
39423
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39406
diff changeset
1918 if isinstance(cmd, str):
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39406
diff changeset
1919 quoted = shellquote(cmd.strip())
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39406
diff changeset
1920 else:
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39406
diff changeset
1921 quoted = shellquote(cmd.strip().decode('utf8')).encode('utf8')
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39406
diff changeset
1922 quoted = quoted.replace(b'\\', b'\\\\')
40538
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
1923 script.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1924 b'echo START %s %s >> "$HGTESTCATAPULTSERVERPIPE"\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1925 % (session, quoted)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1926 )
40539
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40538
diff changeset
1927 activetrace[0:] = [quoted]
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1928
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1929 script = []
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1930
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1931 # After we run the shell script, we re-unify the script output
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1932 # with non-active parts of the source, with synchronization by our
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1933 # SALT line number markers. The after table contains the non-active
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1934 # components, ordered by line number.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1935 after = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1936
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1937 # Expected shell script output.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1938 expected = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1939
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1940 pos = prepos = -1
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1941
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1942 # The current stack of conditionnal section.
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1943 # Each relevant conditionnal section can have the following value:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1944 # - True: we should run this block
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1945 # - False: we should skip this block
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1946 # - None: The parent block is skipped,
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1947 # (no branch of this one will ever run)
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1948 condition_stack = []
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1949
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1950 def run_line():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1951 """return True if the current line should be run"""
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1952 if not condition_stack:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1953 return True
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1954 return bool(condition_stack[-1])
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1955
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1956 def push_conditional_block(should_run):
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1957 """Push a new conditional context, with its initial state
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1958
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1959 i.e. entry a #if block"""
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1960 if not run_line():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1961 condition_stack.append(None)
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1962 else:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1963 condition_stack.append(should_run)
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1964
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1965 def flip_conditional():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1966 """reverse the current condition state
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1967
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1968 i.e. enter a #else
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1969 """
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1970 assert condition_stack
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1971 if condition_stack[-1] is not None:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1972 condition_stack[-1] = not condition_stack[-1]
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1973
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1974 def pop_conditional():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1975 """exit the current skipping context
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1976
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1977 i.e. reach the #endif"""
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1978 assert condition_stack
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
1979 condition_stack.pop()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1980
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1981 # We keep track of whether or not we're in a Python block so we
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1982 # can generate the surrounding doctest magic.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1983 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1984
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
1985 if self._debug:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1986 script.append(b'set -x\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1987 if os.getenv('MSYSTEM'):
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1988 script.append(b'alias pwd="pwd -W"\n')
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
1989
39406
b64d36e5ca31 run-tests: replace '/dev/null' with os.devnull for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39316
diff changeset
1990 if hgcatapult and hgcatapult != os.devnull:
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
1991 hgcatapult = hgcatapult.encode('utf8')
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
1992 cataname = self.name.encode('utf8')
42532
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42530
diff changeset
1993
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
1994 # Kludge: use a while loop to keep the pipe from getting
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
1995 # closed by our echo commands. The still-running file gets
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
1996 # reaped at the end of the script, which causes the while
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
1997 # loop to exit and closes the pipe. Sigh.
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
1998 script.append(
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
1999 b'rtendtracing() {\n'
40540
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40539
diff changeset
2000 b' echo END %(session)s %(name)s >> %(catapult)s\n'
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2001 b' rm -f "$TESTTMP/.still-running"\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2002 b'}\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2003 b'trap "rtendtracing" 0\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2004 b'touch "$TESTTMP/.still-running"\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2005 b'while [ -f "$TESTTMP/.still-running" ]; do sleep 1; done '
40540
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40539
diff changeset
2006 b'> %(catapult)s &\n'
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2007 b'HGCATAPULTSESSION=%(session)s ; export HGCATAPULTSESSION\n'
40540
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40539
diff changeset
2008 b'echo START %(session)s %(name)s >> %(catapult)s\n'
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2009 % {
42532
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42530
diff changeset
2010 b'name': cataname,
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42530
diff changeset
2011 b'session': session,
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42530
diff changeset
2012 b'catapult': hgcatapult,
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2013 }
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2014 )
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2015
35540
f04d16bef2c7 tests: make #testcase available as env var in test
Martin von Zweigbergk <martinvonz@google.com>
parents: 35493
diff changeset
2016 if self._case:
38972
35180ade80c1 tests: fix bytes/str issues in run-tests.py caught by python3
Augie Fackler <augie@google.com>
parents: 38864
diff changeset
2017 casestr = b'#'.join(self._case)
44202
9803b374389a tests: fix isinstance test of wrong variable
Manuel Jacob <me@manueljacob.de>
parents: 44023
diff changeset
2018 if isinstance(casestr, str):
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
2019 quoted = shellquote(casestr)
35863
4be991331a46 tests: get run-tests to reliably hand shellquote a string and not a bytes
Augie Fackler <augie@google.com>
parents: 35751
diff changeset
2020 else:
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
2021 quoted = shellquote(casestr.decode('utf8')).encode('utf8')
35863
4be991331a46 tests: get run-tests to reliably hand shellquote a string and not a bytes
Augie Fackler <augie@google.com>
parents: 35751
diff changeset
2022 script.append(b'TESTCASE=%s\n' % quoted)
35540
f04d16bef2c7 tests: make #testcase available as env var in test
Martin von Zweigbergk <martinvonz@google.com>
parents: 35493
diff changeset
2023 script.append(b'export TESTCASE\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2024
28812
f1de5a612a74 run-tests: handle empty tests
timeless <timeless@mozdev.org>
parents: 28701
diff changeset
2025 n = 0
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2026 for n, l in enumerate(lines):
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2027 if not l.endswith(b'\n'):
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2028 l += b'\n'
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2029 if l.startswith(b'#require'):
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
2030 lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2031 if len(lsplit) < 2 or lsplit[0] != b'#require':
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
2032 after.setdefault(pos, []).append(
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
2033 b' !!! invalid #require\n'
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
2034 )
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2035 if run_line():
36706
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36694
diff changeset
2036 haveresult, message = self._hghave(lsplit[1:])
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36694
diff changeset
2037 if not haveresult:
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36694
diff changeset
2038 script = [b'echo "%s"\nexit 80\n' % message]
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36694
diff changeset
2039 break
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
2040 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2041 elif l.startswith(b'#if'):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2042 lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2043 if len(lsplit) < 2 or lsplit[0] != b'#if':
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
2044 after.setdefault(pos, []).append(b' !!! invalid #if\n')
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2045 push_conditional_block(self._iftest(lsplit[1:]))
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2046 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2047 elif l.startswith(b'#else'):
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2048 if not condition_stack:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
2049 after.setdefault(pos, []).append(b' !!! missing #if\n')
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2050 flip_conditional()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2051 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
2052 elif l.startswith(b'#endif'):
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2053 if not condition_stack:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
2054 after.setdefault(pos, []).append(b' !!! missing #if\n')
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2055 pop_conditional()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2056 after.setdefault(pos, []).append(l)
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2057 elif not run_line():
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2058 after.setdefault(pos, []).append(l)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2059 elif l.startswith(b' >>> '): # python inlines
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2060 after.setdefault(pos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2061 prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2062 pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2063 if not inpython:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2064 # We've just entered a Python block. Add the header.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2065 inpython = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2066 addsalt(prepos, False) # Make sure we report the exit code.
52619
b0ecab6773cf run-tests: call heredoctest.py directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52618
diff changeset
2067 pyh = b'"%s" %s/testlib/heredoctest.py <<EOF\n'
b0ecab6773cf run-tests: call heredoctest.py directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52618
diff changeset
2068 pyh %= (self._pythonb, RUNTEST_DIR_FORWARD_SLASH)
b0ecab6773cf run-tests: call heredoctest.py directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52618
diff changeset
2069 script.append(pyh)
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2070 addsalt(n, True)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2071 script.append(l[2:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2072 elif l.startswith(b' ... '): # python inlines
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2073 after.setdefault(prepos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2074 script.append(l[2:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2075 elif l.startswith(b' $ '): # commands
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2076 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
2077 script.append(b'EOF\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2078 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2079 after.setdefault(pos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2080 prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2081 pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2082 addsalt(n, False)
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2083 rawcmd = l[4:]
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2084 cmd = rawcmd.split()
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2085 toggletrace(rawcmd)
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
2086 if len(cmd) == 2 and cmd[0] == b'cd':
43987
bd3fa45c0662 run-tests: ensure the script exits when it fails to change directories
Matt Harbison <matt_harbison@yahoo.com>
parents: 43837
diff changeset
2087 rawcmd = b'cd %s || exit 1\n' % cmd[1]
39281
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39156
diff changeset
2088 script.append(rawcmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2089 elif l.startswith(b' > '): # continuations
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2090 after.setdefault(prepos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2091 script.append(l[4:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2092 elif l.startswith(b' '): # results
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2093 # Queue up a list of expected results.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2094 expected.setdefault(pos, []).append(l[2:])
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2095 else:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2096 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
2097 script.append(b'EOF\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2098 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2099 # Non-command/result. Queue up for merged output.
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2100 after.setdefault(pos, []).append(l)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2101
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2102 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
2103 script.append(b'EOF\n')
49670
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49618
diff changeset
2104 if condition_stack:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
2105 after.setdefault(pos, []).append(b' !!! missing #endif\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2106 addsalt(n + 1, False)
40538
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
2107 # Need to end any current per-command trace
40539
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40538
diff changeset
2108 if activetrace:
40538
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40537
diff changeset
2109 toggletrace()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2110 return salt, script, after, expected
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2111
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2112 def _processoutput(self, exitcode, output, salt, after, expected):
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2113 # Merge the script output back into a unified test.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2114 warnonly = WARN_UNDEFINED # 1: not yet; 2: yes; 3: for sure not
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2115 if exitcode != 0:
42872
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42827
diff changeset
2116 warnonly = WARN_NO
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2117
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2118 pos = -1
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2119 postout = []
42873
eab66266180e run-tests: clarify "l" variable as "out_rawline"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42872
diff changeset
2120 for out_rawline in output:
42875
5ca351ba2478 run-tests: rename `lcmd` variable to `line_cmd`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42874
diff changeset
2121 out_line, cmd_line = out_rawline, None
42873
eab66266180e run-tests: clarify "l" variable as "out_rawline"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42872
diff changeset
2122 if salt in out_rawline:
42875
5ca351ba2478 run-tests: rename `lcmd` variable to `line_cmd`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42874
diff changeset
2123 out_line, cmd_line = out_rawline.split(salt, 1)
42874
35ef1e957a62 run-tests: rename `lout` variable to `out_line`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
2124
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2125 pos, postout, warnonly = self._process_out_line(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2126 out_line, pos, postout, expected, warnonly
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2127 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2128 pos, postout = self._process_cmd_line(cmd_line, pos, postout, after)
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2129
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2130 if pos in after:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2131 postout += after.pop(pos)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2132
42905
f461b65866e9 run-tests: extract a `process_out_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42904
diff changeset
2133 if warnonly == WARN_YES:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2134 exitcode = False # Set exitcode to warned.
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2135
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
2136 return exitcode, postout
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2137
42905
f461b65866e9 run-tests: extract a `process_out_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42904
diff changeset
2138 def _process_out_line(self, out_line, pos, postout, expected, warnonly):
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2139 while out_line:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2140 if not out_line.endswith(b'\n'):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2141 out_line += b' (no-eol)\n'
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2142
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2143 # Find the expected output at the current position.
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2144 els = [None]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2145 if expected.get(pos, None):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2146 els = expected[pos]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2147
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2148 optional = []
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2149 for i, el in enumerate(els):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2150 r = False
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2151 if el:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2152 r, exact = self.linematch(el, out_line)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2153 if isinstance(r, str):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2154 if r == '-glob':
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2155 out_line = ''.join(el.rsplit(' (glob)', 1))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2156 r = '' # Warn only this line.
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2157 elif r == "retry":
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2158 postout.append(b' ' + el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2159 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2160 log('\ninfo, unknown linematch result: %r\n' % r)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2161 r = False
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2162 if r:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2163 els.pop(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2164 break
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2165 if el:
42907
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
2166 if isoptional(el):
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2167 optional.append(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2168 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2169 m = optline.match(el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2170 if m:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2171 conditions = [c for c in m.group(2).split(b' ')]
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2172
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2173 if not self._iftest(conditions):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2174 optional.append(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2175 if exact:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2176 # Don't allow line to be matches against a later
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2177 # line in the output
28569
1ad0ddf8cccc run-tests: teach _processoutput to handle multiple lines of churn
timeless <timeless@mozdev.org>
parents: 28568
diff changeset
2178 els.pop(i)
1ad0ddf8cccc run-tests: teach _processoutput to handle multiple lines of churn
timeless <timeless@mozdev.org>
parents: 28568
diff changeset
2179 break
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2180
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2181 if r:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2182 if r == "retry":
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2183 continue
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2184 # clean up any optional leftovers
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2185 for i in optional:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2186 postout.append(b' ' + els[i])
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2187 for i in reversed(optional):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2188 del els[i]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2189 postout.append(b' ' + el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2190 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2191 if self.NEEDESCAPE(out_line):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2192 out_line = TTest._stringescape(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2193 b'%s (esc)\n' % out_line.rstrip(b'\n')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2194 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2195 postout.append(b' ' + out_line) # Let diff deal with it.
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2196 if r != '': # If line failed.
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2197 warnonly = WARN_NO
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2198 elif warnonly == WARN_UNDEFINED:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2199 warnonly = WARN_YES
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2200 break
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2201 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2202 # clean up any optional leftovers
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2203 while expected.get(pos, None):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2204 el = expected[pos].pop(0)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2205 if el:
42907
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
2206 if not isoptional(el):
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2207 m = optline.match(el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2208 if m:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2209 conditions = [c for c in m.group(2).split(b' ')]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2210
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2211 if self._iftest(conditions):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2212 # Don't append as optional line
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2213 continue
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
2214 else:
42906
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2215 continue
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2216 postout.append(b' ' + el)
42905
f461b65866e9 run-tests: extract a `process_out_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42904
diff changeset
2217 return pos, postout, warnonly
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
2218
42904
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2219 def _process_cmd_line(self, cmd_line, pos, postout, after):
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2220 """process a "command" part of a line from unified test output"""
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2221 if cmd_line:
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2222 # Add on last return code.
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2223 ret = int(cmd_line.split()[1])
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2224 if ret != 0:
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2225 postout.append(b' [%d]\n' % ret)
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2226 if pos in after:
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2227 # Merge in non-active test bits.
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2228 postout += after.pop(pos)
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2229 pos = int(cmd_line.split()[0])
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2230 return pos, postout
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
2231
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
2232 @staticmethod
21316
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2233 def rematch(el, l):
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2234 try:
43819
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43639
diff changeset
2235 # parse any flags at the beginning of the regex. Only 'i' is
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43639
diff changeset
2236 # supported right now, but this should be easy to extend.
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43639
diff changeset
2237 flags, el = re.match(br'^(\(\?i\))?(.*)', el).groups()[0:2]
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43639
diff changeset
2238 flags = flags or b''
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43639
diff changeset
2239 el = flags + b'(?:' + el + b')'
21316
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2240 # use \Z to ensure that the regex matches to the end of the string
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
2241 if WINDOWS:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2242 return re.match(el + br'\r?\n\Z', l)
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2243 return re.match(el + br'\n\Z', l)
21316
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2244 except re.error:
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2245 # el is an invalid regex
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2246 return False
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2247
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2248 @staticmethod
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2249 def globmatch(el, l):
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2250 # The only supported special characters are * and ? plus / which also
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2251 # matches \ on windows. Escaping of these characters is supported.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2252 if el + b'\n' == l:
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2253 if os.altsep:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2254 # matching on "/" is not needed for this line
23352
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
2255 for pat in checkcodeglobpats:
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
2256 if pat.match(el):
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
2257 return True
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2258 return b'-glob'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2259 return True
31678
6a2959acae1a runtests: change local IP glob pattern from "127.0.0.1" to "$LOCALIP"
Jun Wu <quark@fb.com>
parents: 31640
diff changeset
2260 el = el.replace(b'$LOCALIP', b'*')
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2261 i, n = 0, len(el)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2262 res = b''
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2263 while i < n:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2264 c = el[i : i + 1]
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2265 i += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2266 if c == b'\\' and i < n and el[i : i + 1] in b'*?\\/':
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2267 res += el[i - 1 : i + 1]
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2268 i += 1
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2269 elif c == b'*':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2270 res += b'.*'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2271 elif c == b'?':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2272 res += b'.'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2273 elif c == b'/' and os.altsep:
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2274 res += b'[/\\\\]'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2275 else:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2276 res += re.escape(c)
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2277 return TTest.rematch(res, l)
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2278
33721
eeed23508383 run-tests: drop required (feature !) style lines when the output is missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 33592
diff changeset
2279 def linematch(self, el, l):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2280 if el == l: # perfect match (fast)
38555
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38553
diff changeset
2281 return True, True
38553
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2282 retry = False
42907
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42906
diff changeset
2283 if isoptional(el):
38553
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2284 retry = "retry"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2285 el = el[: -len(MARK_OPTIONAL)] + b"\n"
38553
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2286 else:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2287 m = optline.match(el)
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2288 if m:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2289 conditions = [c for c in m.group(2).split(b' ')]
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2290
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2291 el = m.group(1) + b"\n"
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2292 if not self._iftest(conditions):
42177
c1850798f995 run-tests: stop matching line for missing feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41809
diff changeset
2293 # listed feature missing, should not match
c1850798f995 run-tests: stop matching line for missing feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41809
diff changeset
2294 return "retry", False
38553
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2295
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2296 if el.endswith(b" (esc)\n"):
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
2297 el = el[:-7].decode('unicode_escape') + '\n'
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
2298 el = el.encode('latin-1')
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
2299 if el == l or WINDOWS and el[:-1] + b'\r\n' == l:
38555
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38553
diff changeset
2300 return True, True
38553
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2301 if el.endswith(b" (re)\n"):
38555
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38553
diff changeset
2302 return (TTest.rematch(el[:-6], l) or retry), False
38553
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2303 if el.endswith(b" (glob)\n"):
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2304 # ignore '(glob)' added to l by 'replacements'
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2305 if l.endswith(b" (glob)\n"):
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2306 l = l[:-8] + b"\n"
38555
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38553
diff changeset
2307 return (TTest.globmatch(el[:-8], l) or retry), False
38553
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2308 if os.altsep:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2309 _l = l.replace(b'\\', b'/')
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
2310 if el == _l or WINDOWS and el[:-1] + b'\r\n' == _l:
38555
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38553
diff changeset
2311 return True, True
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38553
diff changeset
2312 return retry, True
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
2313
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2314 @staticmethod
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2315 def parsehghaveoutput(lines):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
2316 """Parse hghave log lines.
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2317
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2318 Return tuple of lists (missing, failed):
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2319 * the missing/unknown features
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
2320 * the features for which existence check failed"""
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2321 missing = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2322 failed = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2323 for line in lines:
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
2324 if line.startswith(TTest.SKIPPED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2325 line = line.splitlines()[0]
44487
69ae64637be5 tests: use native string type for parsed hghave log lines
Manuel Jacob <me@manueljacob.de>
parents: 44486
diff changeset
2326 missing.append(_bytes2sys(line[len(TTest.SKIPPED_PREFIX) :]))
21381
9aa5784992d4 run-tests: move SKIPPED_PREFIX and FAILED_PREFIX into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21380
diff changeset
2327 elif line.startswith(TTest.FAILED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2328 line = line.splitlines()[0]
44487
69ae64637be5 tests: use native string type for parsed hghave log lines
Manuel Jacob <me@manueljacob.de>
parents: 44486
diff changeset
2329 failed.append(_bytes2sys(line[len(TTest.FAILED_PREFIX) :]))
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2330
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2331 return missing, failed
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2332
21384
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2333 @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2334 def _escapef(m):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2335 return TTest.ESCAPEMAP[m.group(0)]
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2336
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2337 @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2338 def _stringescape(s):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2339 return TTest.ESCAPESUB(TTest._escapef, s)
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2340
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2341
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
2342 iolock = threading.RLock()
35011
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
2343 firstlock = threading.RLock()
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
2344 firsterror = False
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
2345
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
2346 base_class = unittest.TextTestResult
47898
3a95a4e660b9 python: compatibility for python 3.11 (issue6604)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47829
diff changeset
2347
3a95a4e660b9 python: compatibility for python 3.11 (issue6604)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47829
diff changeset
2348
3a95a4e660b9 python: compatibility for python 3.11 (issue6604)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47829
diff changeset
2349 class TestResult(base_class):
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2350 """Holds results when executing via unittest."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2351
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2352 def __init__(self, options, *args, **kwargs):
52668
5cc8deb96b48 pyupgrade: modernize calls to superclass methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 52665
diff changeset
2353 super().__init__(*args, **kwargs)
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2354
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2355 self._options = options
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2356
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2357 # unittest.TestResult didn't have skipped until 2.7. We need to
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2358 # polyfill it.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2359 self.skipped = []
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2360
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2361 # We have a custom "ignored" result that isn't present in any Python
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2362 # unittest implementation. It is very similar to skipped. It may make
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2363 # sense to map it into skip some day.
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2364 self.ignored = []
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2365
52023
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51993
diff changeset
2366 self._dot_printed = 0
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2367 self.times = []
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27636
diff changeset
2368 self._firststarttime = None
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2369 # Data stored for the benefit of generating xunit reports.
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2370 self.successes = []
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2371 self.faildata = {}
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2372
33565
0982d900dccb run-tests: pass color option via test case object , not global var
Martin von Zweigbergk <martinvonz@google.com>
parents: 33561
diff changeset
2373 if options.color == 'auto':
47320
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47319
diff changeset
2374 isatty = self.stream.isatty()
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47319
diff changeset
2375 # For some reason, redirecting stdout on Windows disables the ANSI
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47319
diff changeset
2376 # color processing of stderr, which is what is used to print the
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47319
diff changeset
2377 # output. Therefore, both must be tty on Windows to enable color.
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
2378 if WINDOWS:
47320
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47319
diff changeset
2379 isatty = isatty and sys.stdout.isatty()
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47319
diff changeset
2380 self.color = pygmentspresent and isatty
33565
0982d900dccb run-tests: pass color option via test case object , not global var
Martin von Zweigbergk <martinvonz@google.com>
parents: 33561
diff changeset
2381 elif options.color == 'never':
0982d900dccb run-tests: pass color option via test case object , not global var
Martin von Zweigbergk <martinvonz@google.com>
parents: 33561
diff changeset
2382 self.color = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2383 else: # 'always', for testing purposes
33565
0982d900dccb run-tests: pass color option via test case object , not global var
Martin von Zweigbergk <martinvonz@google.com>
parents: 33561
diff changeset
2384 self.color = pygmentspresent
33561
2893face0af5 run-tests: check if stream is a tty before using color
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33552
diff changeset
2385
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2386 def _write_dot(self, progress):
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2387 """write an item of the "dot" progress"""
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2388 formated = highlight_progress(progress, self.color)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2389 self.stream.write(formated)
52023
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51993
diff changeset
2390 self._dot_printed += 1
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51993
diff changeset
2391 if not self._dot_printed % 75:
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51993
diff changeset
2392 self.stream.write(f' [{self._dot_printed}]\n'.rjust(8))
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2393 self.stream.flush()
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2394
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2395 def onStart(self, test):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
2396 """Can be overriden by custom TestResult"""
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2397
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2398 def onEnd(self):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45849
diff changeset
2399 """Can be overriden by custom TestResult"""
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2400
21462
8a4ef661f08d run-tests: make failure reporting in unittest mode equivalent to default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21461
diff changeset
2401 def addFailure(self, test, reason):
8a4ef661f08d run-tests: make failure reporting in unittest mode equivalent to default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21461
diff changeset
2402 self.failures.append((test, reason))
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2403
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2404 if self._options.first:
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2405 self.stop()
21735
5ee547fdb0be run-tests: produce error on running a failing test
anuraggoel <anurag.dsps@gmail.com>
parents: 21733
diff changeset
2406 else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2407 with iolock:
27393
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2408 if reason == "timed out":
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2409 self._write_dot('t')
27393
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2410 else:
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2411 if not self._options.nodiff:
34842
8bce3e51b101 run-tests: move newline out of colorized message
Martin von Zweigbergk <martinvonz@google.com>
parents: 34804
diff changeset
2412 self.stream.write('\n')
8bce3e51b101 run-tests: move newline out of colorized message
Martin von Zweigbergk <martinvonz@google.com>
parents: 34804
diff changeset
2413 # Exclude the '\n' from highlighting to lex correctly
8bce3e51b101 run-tests: move newline out of colorized message
Martin von Zweigbergk <martinvonz@google.com>
parents: 34804
diff changeset
2414 formatted = 'ERROR: %s output changed\n' % test
33948
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33947
diff changeset
2415 self.stream.write(highlightmsg(formatted, self.color))
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2416 self._write_dot('!')
21754
7e14d026c4c4 run-tests: fixes the '--interactive' option error
anuraggoel <anurag.dsps@gmail.com>
parents: 21753
diff changeset
2417
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2418 self.stream.flush()
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2419
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2420 def addSuccess(self, test):
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2421 with iolock:
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2422 # bypass the TextTestResult method as do deal with the output ourself
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2423 super(base_class, self).addSuccess(test)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2424 if self.showAll:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2425 self._write_status(test, "ok")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2426 elif self.dots:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2427 self._write_dot('.')
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2428 self.successes.append(test)
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2429
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2430 def addError(self, test, err):
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2431 super(base_class, self).addError(test, err)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2432 if self.showAll:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2433 self._write_status(test, "ERROR")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2434 elif self.dots:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2435 self._write_dot('E')
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2436 if self._options.first:
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2437 self.stop()
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2438
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2439 # Polyfill.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2440 def addSkip(self, test, reason):
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2441 self.skipped.append((test, reason))
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2442 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2443 if self.showAll:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2444 self.stream.writeln('skipped %s' % reason)
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2445 else:
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2446 self._write_dot('s')
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2447
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2448 def addIgnore(self, test, reason):
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2449 self.ignored.append((test, reason))
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2450 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2451 if self.showAll:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2452 self.stream.writeln('ignored %s' % reason)
21997
93c3b3f55d59 run-tests: fix test result counts with --keyword specified or skips occurring
Augie Fackler <raf@durin42.com>
parents: 21993
diff changeset
2453 else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2454 if reason not in ('not retesting', "doesn't match keyword"):
51878
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51762
diff changeset
2455 self._write_dot('i')
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2456 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2457 self.testsRun += 1
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2458
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
2459 def addOutputMismatch(self, test, ret, got, expected):
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
2460 """Record a mismatch in test output for a particular test."""
35011
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35010
diff changeset
2461 if self.shouldStop or firsterror:
22838
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
2462 # don't print, some other test case already failed and
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
2463 # printed, we're just stale and probably failed due to our
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
2464 # temp dir getting cleaned up.
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
2465 return
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
2466
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
2467 accepted = False
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2468 lines = []
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
2469
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2470 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2471 if self._options.nodiff:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2472 pass
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2473 elif self._options.view:
25056
e5f6c6ec21b8 run-tests: be more paranoid about os.system using bytes
Augie Fackler <augie@google.com>
parents: 25055
diff changeset
2474 v = self._options.view
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2475 subprocess.call(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2476 r'"%s" "%s" "%s"'
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
2477 % (v, _bytes2sys(test.refpath), _bytes2sys(test.errpath)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2478 shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2479 )
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
2480 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2481 servefail, lines = getdiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2482 expected, got, test.refpath, test.errpath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2483 )
36468
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36075
diff changeset
2484 self.stream.write('\n')
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36075
diff changeset
2485 for line in lines:
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36075
diff changeset
2486 line = highlightdiff(line, self.color)
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
2487 self.stream.flush()
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
2488 self.stream.buffer.write(line)
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
2489 self.stream.buffer.flush()
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
2490
36491
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36468
diff changeset
2491 if servefail:
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36468
diff changeset
2492 raise test.failureException(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2493 'server failed to start (HGPORT=%s)' % test._startport
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2494 )
36491
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36468
diff changeset
2495
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2496 # handle interactive prompt without releasing iolock
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2497 if self._options.interactive:
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2498 if test.readrefout() != expected:
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2499 self.stream.write(
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2500 'Reference output has changed (run again to prompt '
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2501 'changes)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2502 )
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2503 else:
44985
617cd3b1e9cd tests: make it clear what happen when no response entered
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 44636
diff changeset
2504 self.stream.write('Accept this change? [y/N] ')
39914
0f8ff3ff5d5c run-tests: flush output stream before prompting to accept changes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39758
diff changeset
2505 self.stream.flush()
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2506 answer = sys.stdin.readline().strip()
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2507 if answer.lower() in ('y', 'yes'):
33000
573baab2a797 run-tests: fix -i when "#testcases" is used in .t test
Jun Wu <quark@fb.com>
parents: 32999
diff changeset
2508 if test.path.endswith(b'.t'):
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2509 rename(test.errpath, test.path)
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2510 else:
46456
7bb31c367847 run-test: avoid byte issue when replacing output file of python test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46327
diff changeset
2511 rename(test.errpath, b'%s.out' % test.path)
32998
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32961
diff changeset
2512 accepted = True
28127
807bc140e915 run-tests: remove useless "failed" flag from addOutputMismatch()
Yuya Nishihara <yuya@tcha.org>
parents: 28126
diff changeset
2513 if not accepted:
25052
c4217a046b62 run-tests: record faildata using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25051
diff changeset
2514 self.faildata[test.name] = b''.join(lines)
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
2515
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
2516 return accepted
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
2517
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2518 def startTest(self, test):
52668
5cc8deb96b48 pyupgrade: modernize calls to superclass methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 52665
diff changeset
2519 super().startTest(test)
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2520
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
2521 # os.times module computes the user time and system time spent by
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
2522 # child's processes along with real elapsed time taken by a process.
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
2523 # This module has one limitation. It can only work for Linux user
43639
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2524 # and not for Windows. Hence why we fall back to another function
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2525 # for wall time calculations.
43638
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2526 test.started_times = os.times()
43639
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2527 # TODO use a monotonic clock once support for Python 2.7 is dropped.
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2528 test.started_time = time.time()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2529 if self._firststarttime is None: # thread racy but irrelevant
43639
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2530 self._firststarttime = test.started_time
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2531
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2532 def stopTest(self, test, interrupted=False):
52668
5cc8deb96b48 pyupgrade: modernize calls to superclass methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 52665
diff changeset
2533 super().stopTest(test)
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2534
43638
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2535 test.stopped_times = os.times()
43639
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2536 stopped_time = time.time()
43638
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2537
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2538 starttime = test.started_times
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2539 endtime = test.stopped_times
25097
a4fce7905721 run-tests: track start and end time of tests
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25068
diff changeset
2540 origin = self._firststarttime
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2541 self.times.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2542 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2543 test.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2544 endtime[2] - starttime[2], # user space CPU time
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2545 endtime[3] - starttime[3], # sys space CPU time
43639
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2546 stopped_time - test.started_time, # real time
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2547 test.started_time - origin, # start date in run context
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43638
diff changeset
2548 stopped_time - origin, # end date in run context
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2549 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2550 )
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
2551
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2552 if interrupted:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2553 with iolock:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2554 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2555 'INTERRUPTED: %s (after %d seconds)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2556 % (test.name, self.times[-1][3])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2557 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2558
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2559
38616
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2560 def getTestResult():
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2561 """
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2562 Returns the relevant test result
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2563 """
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2564 if "CUSTOM_TEST_RESULT" in os.environ:
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2565 testresultmodule = __import__(os.environ["CUSTOM_TEST_RESULT"])
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2566 return testresultmodule.TestResult
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2567 else:
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2568 return TestResult
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38555
diff changeset
2569
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2570
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2571 class TestSuite(unittest.TestSuite):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
2572 """Custom unittest TestSuite that knows how to execute Mercurial tests."""
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2573
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2574 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2575 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2576 testdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2577 jobs=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2578 whitelist=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2579 blacklist=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2580 keywords=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2581 loop=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2582 runs_per_test=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2583 loadtest=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2584 showchannels=False,
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2585 tail_report=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2586 *args,
52023
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51993
diff changeset
2587 **kwargs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2588 ):
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2589 """Create a new instance that can run tests with a configuration.
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2590
21533
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
2591 testdir specifies the directory where tests are executed from. This
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
2592 is typically the ``tests`` directory from Mercurial's source
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
2593 repository.
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
2594
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2595 jobs specifies the number of jobs to run concurrently. Each test
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2596 executes on its own thread. Tests actually spawn new processes, so
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2597 state mutation should not be an issue.
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2598
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2599 If there is only one job, it will use the main thread.
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2600
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2601 whitelist and blacklist denote tests that have been whitelisted and
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2602 blacklisted, respectively. These arguments don't belong in TestSuite.
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2603 Instead, whitelist and blacklist should be handled by the thing that
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2604 populates the TestSuite with tests. They are present to preserve
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2605 backwards compatible behavior which reports skipped tests as part
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2606 of the results.
21530
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
2607
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2608 keywords denotes key words that will be used to filter which tests
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2609 to execute. This arguably belongs outside of TestSuite.
21532
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
2610
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
2611 loop denotes whether to loop over tests forever.
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2612 """
52668
5cc8deb96b48 pyupgrade: modernize calls to superclass methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 52665
diff changeset
2613 super().__init__(*args, **kwargs)
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2614
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2615 self._jobs = jobs
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2616 self._whitelist = whitelist
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2617 self._blacklist = blacklist
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2618 self._keywords = keywords
21532
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
2619 self._loop = loop
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
2620 self._runs_per_test = runs_per_test
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2621 self._loadtest = loadtest
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2622 self._showchannels = showchannels
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2623 self._tail_report = tail_report
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2624
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2625 def run(self, result):
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2626 # We have a number of filters that need to be applied. We do this
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2627 # here instead of inside Test because it makes the running logic for
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2628 # Test simpler.
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2629 tests = []
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2630 num_tests = [0]
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2631 for test in self._tests:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2632
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2633 def get():
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2634 num_tests[0] += 1
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2635 if getattr(test, 'should_reload', False):
32350
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32343
diff changeset
2636 return self._loadtest(test, num_tests[0])
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2637 return test
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2638
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2639 if not os.path.exists(test.path):
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2640 result.addSkip(test, "Doesn't exist")
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2641 continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2642
45521
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2643 is_whitelisted = self._whitelist and (
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2644 test.relpath in self._whitelist or test.bname in self._whitelist
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2645 )
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2646 if not is_whitelisted:
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2647 is_blacklisted = self._blacklist and (
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2648 test.relpath in self._blacklist
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2649 or test.bname in self._blacklist
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2650 )
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45453
diff changeset
2651 if is_blacklisted:
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2652 result.addSkip(test, 'blacklisted')
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2653 continue
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2654 if self._keywords:
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
2655 with open(test.path, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
2656 t = f.read().lower() + test.bname.lower()
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2657 ignored = False
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2658 for k in self._keywords.lower().split():
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2659 if k not in t:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2660 result.addIgnore(test, "doesn't match keyword")
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2661 ignored = True
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2662 break
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2663
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2664 if ignored:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2665 continue
49293
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49260
diff changeset
2666 for _ in range(self._runs_per_test):
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2667 tests.append(get())
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2668
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
2669 runtests = list(tests)
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2670 done = queue.Queue()
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2671 running = 0
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2672
48875
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2673 channels_lock = threading.Lock()
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2674 channels = [""] * self._jobs
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2675
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2676 def job(test, result):
48875
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2677 with channels_lock:
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2678 for n, v in enumerate(channels):
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2679 if not v:
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2680 channel = n
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2681 break
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2682 else:
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2683 raise ValueError('Could not find output channel')
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48874
diff changeset
2684 channels[channel] = "=" + test.name[5:].split(".")[0]
48874
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48873
diff changeset
2685
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2686 r = (None, test, None)
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2687 try:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2688 test(result)
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2689 except KeyboardInterrupt:
48874
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48873
diff changeset
2690 pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2691 except: # re-raises
48874
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48873
diff changeset
2692 r = ('!', test, 'run-test raised an error, see traceback')
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2693 raise
32645
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32644
diff changeset
2694 finally:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32644
diff changeset
2695 try:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32644
diff changeset
2696 channels[channel] = ''
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32644
diff changeset
2697 except IndexError:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32644
diff changeset
2698 pass
48874
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48873
diff changeset
2699 done.put(r)
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2700
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2701 def stat():
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2702 count = 0
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2703 while channels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2704 d = '\n%03s ' % count
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2705 for n, v in enumerate(channels):
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2706 if v:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2707 d += v[0]
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2708 channels[n] = v[1:] or '.'
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2709 else:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2710 d += ' '
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2711 d += ' '
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2712 with iolock:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2713 sys.stdout.write(d + ' ')
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2714 sys.stdout.flush()
49293
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49260
diff changeset
2715 for x in range(10):
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2716 if channels:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2717 time.sleep(0.1)
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2718 count += 1
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2719
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
2720 stoppedearly = False
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
2721
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2722 if self._showchannels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2723 statthread = threading.Thread(target=stat, name="stat")
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2724 statthread.start()
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2725
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2726 start_time = time.monotonic()
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2727 tail_data = []
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2728 try:
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2729 while tests or running:
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2730 finished = None
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2731 if not done.empty() or running == self._jobs or not tests:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2732 try:
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2733 _, finished, _ = done.get(True, 1)
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2734 running -= 1
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2735 if result and result.shouldStop:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2736 stoppedearly = True
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2737 break
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2738 except queue.Empty:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2739 continue
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2740 if tests and not running == self._jobs:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2741 test = tests.pop(0)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2742 if self._loop:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2743 if getattr(test, 'should_reload', False):
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2744 num_tests[0] += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2745 tests.append(self._loadtest(test, num_tests[0]))
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2746 else:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2747 tests.append(test)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2748 if self._jobs == 1:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2749 job(test, result)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2750 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2751 t = threading.Thread(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2752 target=job, name=test.name, args=(test, result)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2753 )
27689
50e621fe0362 run-tests: skip threading for a single test
timeless <timeless@mozdev.org>
parents: 27686
diff changeset
2754 t.start()
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2755 running += 1
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2756 if finished is not None and running < self._jobs:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2757 tail_data.append((finished, running, time.monotonic()))
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
2758
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2759 # If we stop early we still need to wait on started tests to
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2760 # finish. Otherwise, there is a race between the test completing
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2761 # and the test's cleanup code running. This could result in the
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2762 # test reporting incorrect.
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2763 if stoppedearly:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2764 while running:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2765 try:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2766 done.get(True, 1)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2767 running -= 1
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2768 except queue.Empty:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2769 continue
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2770 except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
2771 for test in runtests:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
2772 test.abort()
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2773
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2774 if self._tail_report:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2775 with iolock:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2776 sys.stdout.write('\n### test tail-report ###\n')
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2777 sys.stdout.flush()
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2778 channels = []
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2779 for test, remaining, end_time in tail_data:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2780 m = "[% 13.6f s] %d tests still running; finished %s\n"
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2781 m %= (end_time - start_time, remaining, test)
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2782 sys.stdout.write(m)
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2783 sys.stdout.flush()
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2784
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2785 return result
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2786
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2787
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2788 # Save the most recent 5 wall-clock runtimes of each test to a
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2789 # human-readable text file named .testtimes. Tests are sorted
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2790 # alphabetically, while times for each test are listed from oldest to
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2791 # newest.
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2792
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2793
32737
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32736
diff changeset
2794 def loadtimes(outputdir):
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2795 times = []
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2796 try:
35895
69d7fcd91696 testrunner: fix updating of .testtimes file
Martin von Zweigbergk <martinvonz@google.com>
parents: 35894
diff changeset
2797 with open(os.path.join(outputdir, b'.testtimes')) as fp:
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2798 for line in fp:
35894
568917059243 testrunner: make reading of test times work with #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 35888
diff changeset
2799 m = re.match('(.*?) ([0-9. ]+)', line)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2800 times.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2801 (m.group(1), [float(t) for t in m.group(2).split()])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2802 )
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
2803 except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
2804 pass
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2805 return times
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2806
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2807
32737
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32736
diff changeset
2808 def savetimes(outputdir, result):
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32736
diff changeset
2809 saved = dict(loadtimes(outputdir))
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2810 maxruns = 5
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44469
diff changeset
2811 skipped = {str(t[0]) for t in result.skipped}
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2812 for tdata in result.times:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2813 test, real = tdata[0], tdata[3]
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2814 if test not in skipped:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2815 ts = saved.setdefault(test, [])
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2816 ts.append(real)
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2817 ts[:] = ts[-maxruns:]
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2818
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2819 fd, tmpname = tempfile.mkstemp(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2820 prefix=b'.testtimes', dir=outputdir, text=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2821 )
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2822 with os.fdopen(fd, 'w') as fp:
28284
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
2823 for name, ts in sorted(saved.items()):
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2824 fp.write('%s %s\n' % (name, ' '.join(['%.3f' % (t,) for t in ts])))
32737
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32736
diff changeset
2825 timepath = os.path.join(outputdir, b'.testtimes')
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2826 try:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2827 os.unlink(timepath)
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2828 except OSError:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2829 pass
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2830 try:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2831 os.rename(tmpname, timepath)
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2832 except OSError:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2833 pass
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2834
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2835
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2836 def get_site_packages_dir(python_exe):
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2837 return subprocess.run(
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2838 [
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2839 python_exe,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2840 "-c",
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2841 "import sys; print([p for p in sys.path if p.startswith(sys.prefix) and p.endswith('site-packages')][0])",
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2842 ],
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2843 check=True,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2844 capture_output=True,
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2845 ).stdout.strip()
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2846
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
2847
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2848 class TextTestRunner(unittest.TextTestRunner):
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2849 """Custom unittest test runner that uses appropriate settings."""
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2850
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2851 def __init__(self, runner, *args, **kwargs):
52668
5cc8deb96b48 pyupgrade: modernize calls to superclass methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 52665
diff changeset
2852 super().__init__(*args, **kwargs)
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2853
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2854 self._runner = runner
38620
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
2855
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2856 self._result = getTestResult()(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2857 self._runner.options, self.stream, self.descriptions, self.verbosity
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2858 )
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2859
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2860 def listtests(self, test):
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2861 test = sorted(test, key=lambda t: t.name)
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2862
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2863 self._result.onStart(test)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2864
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2865 for t in test:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2866 print(t.name)
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2867 self._result.addSuccess(t)
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2868
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2869 if self._runner.options.xunit:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2870 with open(self._runner.options.xunit, "wb") as xuf:
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2871 self._writexunit(self._result, xuf)
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2872
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2873 if self._runner.options.json:
32738
232875623c27 run-tests: write JSON reports to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32737
diff changeset
2874 jsonpath = os.path.join(self._runner._outputdir, b'report.json')
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2875 with open(jsonpath, 'w') as fp:
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2876 self._writejson(self._result, fp)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2877
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2878 return self._result
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
2879
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2880 def run(self, test):
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2881 self._result.onStart(test)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2882 test(self._result)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2883
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2884 failed = len(self._result.failures)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2885 skipped = len(self._result.skipped)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2886 ignored = len(self._result.ignored)
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2887
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2888 with iolock:
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2889 if not self._runner.options.tail_report:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
2890 self.stream.writeln('')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2891
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2892 if not self._runner.options.noskips:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2893 for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2894 self._result.skipped, key=lambda s: s[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2895 ):
33947
5d2ce90c71f1 run-tests: include "\n" in formatted message instead of calling writeln()
Yuya Nishihara <yuya@tcha.org>
parents: 33890
diff changeset
2896 formatted = 'Skipped %s: %s\n' % (test.name, msg)
38622
fa6edc6a02a9 run-tests: fix a too long line
Boris Feld <boris.feld@octobus.net>
parents: 38620
diff changeset
2897 msg = highlightmsg(formatted, self._result.color)
fa6edc6a02a9 run-tests: fix a too long line
Boris Feld <boris.feld@octobus.net>
parents: 38620
diff changeset
2898 self.stream.write(msg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2899 for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2900 self._result.failures, key=lambda f: f[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2901 ):
33947
5d2ce90c71f1 run-tests: include "\n" in formatted message instead of calling writeln()
Yuya Nishihara <yuya@tcha.org>
parents: 33890
diff changeset
2902 formatted = 'Failed %s: %s\n' % (test.name, msg)
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2903 self.stream.write(highlightmsg(formatted, self._result.color))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2904 for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2905 self._result.errors, key=lambda e: e[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2906 ):
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2907 self.stream.writeln('Errored %s: %s' % (test.name, msg))
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2908
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2909 if self._runner.options.xunit:
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2910 with open(self._runner.options.xunit, "wb") as xuf:
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2911 self._writexunit(self._result, xuf)
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2912
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2913 if self._runner.options.json:
32738
232875623c27 run-tests: write JSON reports to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32737
diff changeset
2914 jsonpath = os.path.join(self._runner._outputdir, b'report.json')
27773
bf45edfa9d90 run-tests: use a context manager for file I/O
Bryan O'Sullivan <bryano@fb.com>
parents: 27689
diff changeset
2915 with open(jsonpath, 'w') as fp:
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2916 self._writejson(self._result, fp)
22391
c42e69268f5b run-tests: added '--json' functionality to store test result in json file
anuraggoel <anurag.dsps@gmail.com>
parents: 22361
diff changeset
2917
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
2918 self._runner._check_hg('Tested')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2919
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2920 savetimes(self._runner._outputdir, self._result)
28596
9949950664cd run-tests: add support for automatically bisecting test failures
Augie Fackler <augie@google.com>
parents: 28582
diff changeset
2921
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2922 self.stream.writeln(
32960
5af78c524f34 tests: remove support for warned tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32952
diff changeset
2923 '# Ran %d tests, %d skipped, %d failed.'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2924 % (self._result.testsRun, skipped + ignored, failed)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2925 )
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2926 if failed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2927 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2928 'python hash seed: %s' % os.environ['PYTHONHASHSEED']
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2929 )
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2930 if self._runner.options.time:
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2931 self.printtimes(self._result.times)
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
2932
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
2933 if self._runner.options.exceptions:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
2934 exceptions = aggregateexceptions(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2935 os.path.join(self._runner._outputdir, b'exceptions')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2936 )
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
2937
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
2938 self.stream.writeln('Exceptions Report:')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2939 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2940 '%d total from %d frames'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2941 % (exceptions['total'], len(exceptions['exceptioncounts']))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2942 )
36075
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
2943 combined = exceptions['combined']
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
2944 for key in sorted(combined, key=combined.get, reverse=True):
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
2945 frame, line, exc = key
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
2946 totalcount, testcount, leastcount, leasttest = combined[key]
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
2947
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2948 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2949 '%d (%d tests)\t%s: %s (%s - %d total)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2950 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2951 totalcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2952 testcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2953 frame,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2954 exc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2955 leasttest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2956 leastcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2957 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2958 )
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
2959
32925
bd77ac2bd23a run-tests: explicitly flush test runner output for Windows stability
Matt Harbison <matt_harbison@yahoo.com>
parents: 32871
diff changeset
2960 self.stream.flush()
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
2961
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2962 return self._result
21613
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
2963
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2964 def printtimes(self, times):
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
2965 # iolock held by run
21494
dcefc4091c86 run-tests: move outputtimes() into unittest runner class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21493
diff changeset
2966 self.stream.writeln('# Producing time report')
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
2967 times.sort(key=lambda t: (t[3]))
25098
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
2968 cols = '%7.3f %7.3f %7.3f %7.3f %7.3f %s'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2969 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2970 '%-7s %-7s %-7s %-7s %-7s %s'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2971 % ('start', 'end', 'cuser', 'csys', 'real', 'Test')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2972 )
24982
5c15f7e0f52b run-tests: stop explicit expansion of time data
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24981
diff changeset
2973 for tdata in times:
5c15f7e0f52b run-tests: stop explicit expansion of time data
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24981
diff changeset
2974 test = tdata[0]
25098
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
2975 cuser, csys, real, start, end = tdata[1:6]
bf84ab53c2fd run-tests: include 'start' and 'end' in --time output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25097
diff changeset
2976 self.stream.writeln(cols % (start, end, cuser, csys, real, test))
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2977
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2978 @staticmethod
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2979 def _writexunit(result, outf):
32734
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
2980 # See http://llg.cubic.org/docs/junit/ for a reference.
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44469
diff changeset
2981 timesd = {t[0]: t[3] for t in result.times}
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2982 doc = minidom.Document()
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2983 s = doc.createElement('testsuite')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2984 s.setAttribute('errors', "0") # TODO
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2985 s.setAttribute('failures', str(len(result.failures)))
41560
20e62312e016 run-tests: set attributes in sorted order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41554
diff changeset
2986 s.setAttribute('name', 'run-tests')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2987 s.setAttribute(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2988 'skipped', str(len(result.skipped) + len(result.ignored))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2989 )
41560
20e62312e016 run-tests: set attributes in sorted order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41554
diff changeset
2990 s.setAttribute('tests', str(result.testsRun))
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2991 doc.appendChild(s)
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2992 for tc in result.successes:
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2993 t = doc.createElement('testcase')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2994 t.setAttribute('name', tc.name)
32722
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32721
diff changeset
2995 tctime = timesd.get(tc.name)
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32721
diff changeset
2996 if tctime is not None:
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32721
diff changeset
2997 t.setAttribute('time', '%.3f' % tctime)
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2998 s.appendChild(t)
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
2999 for tc, err in sorted(result.faildata.items()):
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3000 t = doc.createElement('testcase')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3001 t.setAttribute('name', tc)
32722
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32721
diff changeset
3002 tctime = timesd.get(tc)
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32721
diff changeset
3003 if tctime is not None:
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32721
diff changeset
3004 t.setAttribute('time', '%.3f' % tctime)
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3005 # createCDATASection expects a unicode or it will
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3006 # convert using default conversion rules, which will
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3007 # fail if string isn't ASCII.
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3008 err = cdatasafe(err).decode('utf-8', 'replace')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3009 cd = doc.createCDATASection(err)
32734
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
3010 # Use 'failure' here instead of 'error' to match errors = 0,
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
3011 # failures = len(result.failures) in the testsuite element.
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
3012 failelem = doc.createElement('failure')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
3013 failelem.setAttribute('message', 'output changed')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
3014 failelem.setAttribute('type', 'output-mismatch')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
3015 failelem.appendChild(cd)
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32731
diff changeset
3016 t.appendChild(failelem)
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3017 s.appendChild(t)
32735
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3018 for tc, message in result.skipped:
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3019 # According to the schema, 'skipped' has no attributes. So store
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3020 # the skip message as a text node instead.
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3021 t = doc.createElement('testcase')
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3022 t.setAttribute('name', tc.name)
34276
20f547806a4d tests: fix run-tests XML reporting on Python 3
Augie Fackler <augie@google.com>
parents: 34275
diff changeset
3023 binmessage = message.encode('utf-8')
20f547806a4d tests: fix run-tests XML reporting on Python 3
Augie Fackler <augie@google.com>
parents: 34275
diff changeset
3024 message = cdatasafe(binmessage).decode('utf-8', 'replace')
32735
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3025 cd = doc.createCDATASection(message)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3026 skipelem = doc.createElement('skipped')
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3027 skipelem.appendChild(cd)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3028 t.appendChild(skipelem)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32734
diff changeset
3029 s.appendChild(t)
32720
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3030 outf.write(doc.toprettyxml(indent=' ', encoding='utf-8'))
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32645
diff changeset
3031
32721
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3032 @staticmethod
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3033 def _writejson(result, outf):
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3034 timesd = {}
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3035 for tdata in result.times:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3036 test = tdata[0]
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3037 timesd[test] = tdata[1:]
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3038
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3039 outcome = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3040 groups = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3041 ('success', ((tc, None) for tc in result.successes)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3042 ('failure', result.failures),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3043 ('skip', result.skipped),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3044 ]
32721
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3045 for res, testcases in groups:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3046 for tc, __ in testcases:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3047 if tc.name in timesd:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3048 diff = result.faildata.get(tc.name, b'')
32871
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32740
diff changeset
3049 try:
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32740
diff changeset
3050 diff = diff.decode('unicode_escape')
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32740
diff changeset
3051 except UnicodeDecodeError as e:
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32740
diff changeset
3052 diff = '%r decoding diff, sorry' % e
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3053 tres = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3054 'result': res,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3055 'time': ('%0.3f' % timesd[tc.name][2]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3056 'cuser': ('%0.3f' % timesd[tc.name][0]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3057 'csys': ('%0.3f' % timesd[tc.name][1]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3058 'start': ('%0.3f' % timesd[tc.name][3]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3059 'end': ('%0.3f' % timesd[tc.name][4]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3060 'diff': diff,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3061 }
32721
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3062 else:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3063 # blacklisted test
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3064 tres = {'result': res}
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3065
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3066 outcome[tc.name] = tres
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3067 jsonout = json.dumps(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3068 outcome, sort_keys=True, indent=4, separators=(',', ': ')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3069 )
32721
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3070 outf.writelines(("testreport =", jsonout))
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32720
diff changeset
3071
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3072
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3073 def sorttests(testdescs, previoustimes, shuffle=False):
35493
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3074 """Do an in-place sort of tests."""
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3075 if shuffle:
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3076 random.shuffle(testdescs)
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3077 return
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3078
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3079 if previoustimes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3080
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3081 def sortkey(f):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3082 f = f['path']
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3083 if f in previoustimes:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3084 # Use most recent time as estimate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3085 return -(previoustimes[f][-1])
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3086 else:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3087 # Default to a rather arbitrary value of 1 second for new tests
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3088 return -1.0
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3089
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3090 else:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3091 # keywords for slow tests
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3092 slow = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3093 b'svn': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3094 b'cvs': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3095 b'hghave': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3096 b'largefiles-update': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3097 b'run-tests': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3098 b'corruption': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3099 b'race': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3100 b'i18n': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3101 b'check': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3102 b'gendoc': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3103 b'contrib-perf': 200,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3104 b'merge-combination': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3105 }
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3106 perf = {}
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3107
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3108 def sortkey(f):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3109 # run largest tests first, as they tend to take the longest
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3110 f = f['path']
35493
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3111 try:
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3112 return perf[f]
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3113 except KeyError:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3114 try:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3115 val = -os.stat(f).st_size
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
3116 except FileNotFoundError:
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3117 perf[f] = -1e9 # file does not exist, tell early
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3118 return -1e9
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3119 for kw, mul in slow.items():
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3120 if kw in f:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3121 val *= mul
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3122 if f.endswith(b'.py'):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3123 val /= 10.0
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3124 perf[f] = val / 1000.0
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3125 return perf[f]
35493
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3126
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3127 testdescs.sort(key=sortkey)
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35492
diff changeset
3128
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3129
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48971
diff changeset
3130 class TestRunner:
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
3131 """Holds context for executing tests.
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
3132
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
3133 Tests rely on a lot of state. This object holds it for them.
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
3134 """
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3135
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3136 # Programs required to run tests.
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3137 REQUIREDTOOLS = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3138 b'diff',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3139 b'grep',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3140 b'unzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3141 b'gunzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3142 b'bunzip2',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3143 b'sed',
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3144 ]
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3145
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3146 # Maps file extensions to test class.
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3147 TESTTYPES = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3148 (b'.py', PythonTest),
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3149 (b'.t', TTest),
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3150 ]
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3151
21341
cb88d4a04f58 run-tests: move TESTDIR out of a global
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21340
diff changeset
3152 def __init__(self):
21348
b3399154505f run-tests: add options to runner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21347
diff changeset
3153 self.options = None
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
3154 self._hgroot = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3155 self._testdir = None
32736
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32735
diff changeset
3156 self._outputdir = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3157 self._hgtmp = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3158 self._installdir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3159 self._bindir = None
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
3160 # a place for run-tests.py to generate executable it needs
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
3161 self._custom_bin_dir = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3162 self._pythondir = None
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3163
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3164 if sys.executable:
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3165 self._python = sys.executable
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3166 elif os.environ.get('PYTHONEXECUTABLE'):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3167 self._python = os.environ['PYTHONEXECUTABLE']
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3168 elif os.environ.get('PYTHON'):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3169 self._python = os.environ['PYTHON']
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3170 else:
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3171 raise AssertionError('Could not find Python interpreter')
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3172
47574
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
3173 # True if we had to infer the pythondir from --with-hg
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
3174 self._pythondir_inferred = False
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3175 self._coveragefile = None
21352
39fd89fbbc3c run-tests: move createdfiles out of a global and into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21351
diff changeset
3176 self._createdfiles = []
28099
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
3177 self._hgcommand = None
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3178 self._hgpath = None
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3179 self._portoffset = 0
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3180 self._ports = {}
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
3181
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3182 @property
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3183 def _pythonb(self):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3184 return _sys2bytes(self._python.replace('\\', '/'))
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3185
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
3186 def run(self, args, parser=None):
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3187 """Run the test suite."""
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3188 oldmask = os.umask(0o22)
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
3189 try:
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
3190 parser = parser or getparser()
35198
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35176
diff changeset
3191 options = parseargs(args, parser)
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3192 tests = [_sys2bytes(a) for a in options.tests]
34270
1533371769b5 tests: add support for listing tests to run in a file
Augie Fackler <augie@google.com>
parents: 34058
diff changeset
3193 if options.test_list is not None:
1533371769b5 tests: add support for listing tests to run in a file
Augie Fackler <augie@google.com>
parents: 34058
diff changeset
3194 for listfile in options.test_list:
1533371769b5 tests: add support for listing tests to run in a file
Augie Fackler <augie@google.com>
parents: 34058
diff changeset
3195 with open(listfile, 'rb') as f:
35198
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35176
diff changeset
3196 tests.extend(t for t in f.read().splitlines() if t)
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
3197 self.options = options
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
3198
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
3199 self._checktools()
35198
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35176
diff changeset
3200 testdescs = self.findtests(tests)
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3201 if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3202 import statprof
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3203
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3204 statprof.start()
52181
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3205 result = self._run(
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3206 testdescs,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3207 shard_index=options.shard_index,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3208 shard_total=options.shard_total,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3209 )
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3210 if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3211 statprof.stop()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3212 statprof.display()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3213 return result
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
3214
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
3215 finally:
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
3216 os.umask(oldmask)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3217
52181
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3218 def _run(self, testdescs, shard_index=None, shard_total=None):
40537
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40529
diff changeset
3219 testdir = getcwdb()
35018
a18eef03d879 run-tests: $TESTDIR can be something else than $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34842
diff changeset
3220 # assume all tests in same folder for now
a18eef03d879 run-tests: $TESTDIR can be something else than $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34842
diff changeset
3221 if testdescs:
a18eef03d879 run-tests: $TESTDIR can be something else than $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34842
diff changeset
3222 pathname = os.path.dirname(testdescs[0]['path'])
35089
57d56f603f70 run-tests: fix TESTDIR if testdescs are absolute paths
Kyle Lippincott <spectral@google.com>
parents: 35024
diff changeset
3223 if pathname:
40537
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40529
diff changeset
3224 testdir = os.path.join(testdir, pathname)
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40529
diff changeset
3225 self._testdir = osenvironb[b'TESTDIR'] = testdir
48834
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48745
diff changeset
3226 osenvironb[b'TESTDIR_FORWARD_SLASH'] = osenvironb[b'TESTDIR'].replace(
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48745
diff changeset
3227 os.sep.encode('ascii'), b'/'
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48745
diff changeset
3228 )
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48745
diff changeset
3229
32736
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32735
diff changeset
3230 if self.options.outputdir:
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3231 self._outputdir = canonpath(_sys2bytes(self.options.outputdir))
32736
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32735
diff changeset
3232 else:
40537
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40529
diff changeset
3233 self._outputdir = getcwdb()
35120
fc0f3ed071fc run-tests: outputdir also has to be changed if $TESTDIR is not $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35115
diff changeset
3234 if testdescs and pathname:
fc0f3ed071fc run-tests: outputdir also has to be changed if $TESTDIR is not $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35115
diff changeset
3235 self._outputdir = os.path.join(self._outputdir, pathname)
36694
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3236 previoustimes = {}
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3237 if self.options.order_by_runtime:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3238 previoustimes = dict(loadtimes(self._outputdir))
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36551
diff changeset
3239 sorttests(testdescs, previoustimes, shuffle=self.options.random)
21371
a10ba7870c2d run-tests: assign testdir in TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21370
diff changeset
3240
21370
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
3241 if 'PYTHONHASHSEED' not in os.environ:
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
3242 # use a random python hash seed all the time
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
3243 # we do the randomness ourself to know what seed is used
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
3244 os.environ['PYTHONHASHSEED'] = str(random.getrandbits(32))
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
3245
44528
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44501
diff changeset
3246 # Rayon (Rust crate for multi-threading) will use all logical CPU cores
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44501
diff changeset
3247 # by default, causing thrashing on high-cpu-count systems.
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44501
diff changeset
3248 # Setting its limit to 3 during tests should still let us uncover
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44501
diff changeset
3249 # multi-threading bugs while keeping the thrashing reasonable.
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44501
diff changeset
3250 os.environ.setdefault("RAYON_NUM_THREADS", "3")
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44501
diff changeset
3251
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3252 if self.options.tmpdir:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3253 self.options.keep_tmpdir = True
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3254 tmpdir = _sys2bytes(self.options.tmpdir)
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3255 if os.path.exists(tmpdir):
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3256 # Meaning of tmpdir has changed since 1.3: we used to create
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3257 # HGTMP inside tmpdir; now HGTMP is tmpdir. So fail if
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3258 # tmpdir already exists.
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3259 print("error: temp dir %r already exists" % tmpdir)
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3260 return 1
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3261
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3262 os.makedirs(tmpdir)
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3263 else:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3264 d = None
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
3265 if WINDOWS:
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3266 # without this, we get the default temp dir location, but
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3267 # in all lowercase, which causes troubles with paths (issue3490)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3268 d = osenvironb.get(b'TMP', None)
25262
5a809deb88e6 run-tests: python3.5 now supports mkdtemp using bytes for paths
Augie Fackler <raf@durin42.com>
parents: 25261
diff changeset
3269 tmpdir = tempfile.mkdtemp(b'', b'hgtests.', d)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3270
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3271 self._hgtmp = osenvironb[b'HGTMP'] = os.path.realpath(tmpdir)
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3272
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
3273 self._custom_bin_dir = os.path.join(self._hgtmp, b'custom-bin')
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
3274 os.makedirs(self._custom_bin_dir)
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
3275
50773
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50772
diff changeset
3276 # detect and enforce an alternative way to specify rust extension usage
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50772
diff changeset
3277 if (
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3278 not (
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3279 self.options.wheel
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3280 or self.options.pure
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3281 or self.options.rust
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3282 or self.options.no_rust
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3283 )
50773
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50772
diff changeset
3284 and os.environ.get("HGWITHRUSTEXT") == "cpython"
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50772
diff changeset
3285 ):
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50772
diff changeset
3286 self.options.rust = True
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50772
diff changeset
3287
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3288 if self.options.with_hg:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3289 self._installdir = None
25042
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
3290 whg = self.options.with_hg
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
3291 self._bindir = os.path.dirname(os.path.realpath(whg))
201823c50610 run-tests: work around with_hg being bytes or string depending on provenance
Augie Fackler <augie@google.com>
parents: 25041
diff changeset
3292 assert isinstance(self._bindir, bytes)
28099
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
3293 self._hgcommand = os.path.basename(whg)
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3294
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3295 normbin = os.path.normpath(os.path.abspath(whg))
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3296 normbin = normbin.replace(_sys2bytes(os.sep), b'/')
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3297
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3298 # Other Python scripts in the test harness need to
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3299 # `import mercurial`. If `hg` is a Python script, we assume
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3300 # the Mercurial modules are relative to its path and tell the tests
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3301 # to load Python modules from its directory.
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3302 with open(whg, 'rb') as fh:
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3303 first_line = fh.readline()
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3304
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3305 if re.match(b'#!.*python', first_line):
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3306 python_exe = first_line.split(b"#!")[1].strip()
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3307 try:
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3308 self._pythondir = get_site_packages_dir(python_exe)
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3309 except (FileNotFoundError, subprocess.CalledProcessError):
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3310 self._pythondir = self._bindir
52732
fa5a0c2b9f04 run-tests: fix _python for --local
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52731
diff changeset
3311 if self.options.local:
fa5a0c2b9f04 run-tests: fix _python for --local
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52731
diff changeset
3312 self._python = _bytes2sys(python_exe)
fa5a0c2b9f04 run-tests: fix _python for --local
Pierre Augier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52731
diff changeset
3313
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3314 # If it looks like our in-repo Rust binary, use the source root.
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3315 # This is a bit hacky. But rhg is still not supported outside the
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3316 # source directory. So until it is, do the simple thing.
35600
31acf6619f08 run-tests: fix regular expression for path test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35569
diff changeset
3317 elif re.search(b'/rust/target/[^/]+/hg', normbin):
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3318 self._pythondir = os.path.dirname(self._testdir)
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3319 # Fall back to the legacy behavior.
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3320 else:
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3321 self._pythondir = self._bindir
47574
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
3322 self._pythondir_inferred = True
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35540
diff changeset
3323
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3324 else:
52579
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3325 self._hgcommand = b'hg'
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3326 self._installdir = os.path.join(self._hgtmp, b"install")
52579
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3327
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3328 # create a virtual env where hg is going to be installed
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3329 command_create_venv = [
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3330 self._python,
52579
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3331 "-m",
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3332 "venv",
52615
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52614
diff changeset
3333 "--system-site-packages",
52579
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3334 self._installdir,
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3335 ]
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3336 subprocess.run(command_create_venv, check=True)
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3337
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3338 bindir = b"Scripts" if WINDOWS else b"bin"
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52578
diff changeset
3339 self._bindir = os.path.join(self._installdir, bindir)
52615
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52614
diff changeset
3340 self._python = _bytes2sys(os.path.join(self._bindir, b"python"))
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3341 self._pythondir = get_site_packages_dir(self._python)
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3342
40989
ef7119cd4965 py3: enable legacy stdio mode in exewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40988
diff changeset
3343 # Force the use of hg.exe instead of relying on MSYS to recognize hg is
ef7119cd4965 py3: enable legacy stdio mode in exewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40988
diff changeset
3344 # a python script and feed it to python.exe. Legacy stdio is force
ef7119cd4965 py3: enable legacy stdio mode in exewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40988
diff changeset
3345 # enabled by hg.exe, and this is a more realistic way to launch hg
ef7119cd4965 py3: enable legacy stdio mode in exewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40988
diff changeset
3346 # anyway.
52198
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52196
diff changeset
3347 #
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52196
diff changeset
3348 # We do not do it when using wheels and they do not install a .exe.
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52196
diff changeset
3349 if (
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52196
diff changeset
3350 WINDOWS
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52196
diff changeset
3351 and not self.options.wheel
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52196
diff changeset
3352 and not self._hgcommand.endswith(b'.exe')
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52196
diff changeset
3353 ):
40988
2465e0b27a0d run-tests: alias hg to hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40947
diff changeset
3354 self._hgcommand += b'.exe'
2465e0b27a0d run-tests: alias hg to hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40947
diff changeset
3355
52540
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52539
diff changeset
3356 self._real_hg = os.path.join(self._bindir, self._hgcommand)
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52539
diff changeset
3357 osenvironb[b'HGTEST_REAL_HG'] = self._real_hg
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
3358 # set CHGHG, then replace "hg" command by "chg"
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
3359 chgbindir = self._bindir
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3360 if self.options.chg or self.options.with_chg:
47586
a8e33ab50c4f run-tests: use more explicit signaling for `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47585
diff changeset
3361 osenvironb[b'CHG_INSTALLED_AS_HG'] = b'1'
52540
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52539
diff changeset
3362 osenvironb[b'CHGHG'] = self._real_hg
28880
f74eed3115fd hghave: add "chg" flag to skip tests that can't be compatible with chg
Yuya Nishihara <yuya@tcha.org>
parents: 28829
diff changeset
3363 else:
47586
a8e33ab50c4f run-tests: use more explicit signaling for `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47585
diff changeset
3364 # drop flag for hghave
a8e33ab50c4f run-tests: use more explicit signaling for `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47585
diff changeset
3365 osenvironb.pop(b'CHG_INSTALLED_AS_HG', None)
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3366 if self.options.chg:
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3367 self._hgcommand = b'chg'
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3368 elif self.options.with_chg:
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
3369 chgbindir = os.path.dirname(os.path.realpath(self.options.with_chg))
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
3370 self._hgcommand = os.path.basename(self.options.with_chg)
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
3371
46736
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46707
diff changeset
3372 # configure fallback and replace "hg" command by "rhg"
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3373 rhgbindir = self._bindir
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3374 if self.options.rhg or self.options.with_rhg:
46737
78e6700ab009 tests: Add `rhg` and `no-rhg` for #require and #if in .t files
Simon Sapin <simon.sapin@octobus.net>
parents: 46736
diff changeset
3375 # Affects hghave.py
78e6700ab009 tests: Add `rhg` and `no-rhg` for #require and #if in .t files
Simon Sapin <simon.sapin@octobus.net>
parents: 46736
diff changeset
3376 osenvironb[b'RHG_INSTALLED_AS_HG'] = b'1'
46736
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46707
diff changeset
3377 # Affects configuration. Alternatives would be setting configuration through
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46707
diff changeset
3378 # `$HGRCPATH` but some tests override that, or changing `_hgcommand` to include
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46707
diff changeset
3379 # `--config` but that disrupts tests that print command lines and check expected
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46707
diff changeset
3380 # output.
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46707
diff changeset
3381 osenvironb[b'RHG_ON_UNSUPPORTED'] = b'fallback'
52540
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52539
diff changeset
3382 osenvironb[b'RHG_FALLBACK_EXECUTABLE'] = self._real_hg
47585
5654323832f0 run-tests: drop the `rhg` flag for `hghave.py` if unset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47584
diff changeset
3383 else:
5654323832f0 run-tests: drop the `rhg` flag for `hghave.py` if unset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47584
diff changeset
3384 # drop flag for hghave
5654323832f0 run-tests: drop the `rhg` flag for `hghave.py` if unset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47584
diff changeset
3385 osenvironb.pop(b'RHG_INSTALLED_AS_HG', None)
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3386 if self.options.rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3387 self._hgcommand = b'rhg'
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3388 elif self.options.with_rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3389 rhgbindir = os.path.dirname(os.path.realpath(self.options.with_rhg))
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3390 self._hgcommand = os.path.basename(self.options.with_rhg)
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3391
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3392 if self.options.pyoxidized:
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3393 testdir = os.path.dirname(_sys2bytes(canonpath(sys.argv[0])))
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3394 reporootdir = os.path.dirname(testdir)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3395 # XXX we should ideally install stuff instead of using the local build
49617
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3396
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3397 exe = b'hg'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3398 triple = b''
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3399
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3400 if WINDOWS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3401 triple = b'x86_64-pc-windows-msvc'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3402 exe = b'hg.exe'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3403 elif MACOS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3404 # TODO: support Apple silicon too
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3405 triple = b'x86_64-apple-darwin'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3406
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
3407 bin_path = b'build/pyoxidizer/%s/release/app/%s' % (triple, exe)
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3408 full_path = os.path.join(reporootdir, bin_path)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3409 self._hgcommand = full_path
47826
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47821
diff changeset
3410 # Affects hghave.py
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47821
diff changeset
3411 osenvironb[b'PYOXIDIZED_INSTALLED_AS_HG'] = b'1'
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47821
diff changeset
3412 else:
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47821
diff changeset
3413 osenvironb.pop(b'PYOXIDIZED_INSTALLED_AS_HG', None)
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3414
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3415 osenvironb[b"BINDIR"] = self._bindir
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3416 osenvironb[b"PYTHON"] = self._pythonb
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3417
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3418 fileb = _sys2bytes(__file__)
52618
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
3419 osenvironb[b'RUNTESTDIR'] = RUNTEST_DIR
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
3420 osenvironb[b'RUNTESTDIR_FORWARD_SLASH'] = RUNTEST_DIR_FORWARD_SLASH
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
3421 sepb = _sys2bytes(os.pathsep)
52618
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
3422 path = [self._bindir, RUNTEST_DIR] + osenvironb[b"PATH"].split(sepb)
24742
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
3423 if os.path.islink(__file__):
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
3424 # test helper will likely be at the end of the symlink
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3425 realfile = os.path.realpath(fileb)
24742
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
3426 realdir = os.path.abspath(os.path.dirname(realfile))
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
3427 path.insert(2, realdir)
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
3428 if chgbindir != self._bindir:
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
3429 path.insert(1, chgbindir)
46707
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3430 if rhgbindir != self._bindir:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46456
diff changeset
3431 path.insert(1, rhgbindir)
52618
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
3432 if self._testdir != RUNTEST_DIR:
25730
c380d5273e91 run-tests.py: add TESTDIR to PATH if it differs from RUNTESTDIR
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25729
diff changeset
3433 path = [self._testdir] + path
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
3434 path = [self._custom_bin_dir] + path
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3435 osenvironb[b"PATH"] = sepb.join(path)
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3436
51689
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51687
diff changeset
3437 os.environ["HGTEST_BASE_HGMODULEPOLICY"] = os.environ.get(
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51687
diff changeset
3438 "HGMODULEPOLICY", ""
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51687
diff changeset
3439 )
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51687
diff changeset
3440
23935
d64dd1252386 run-tests.py: inherit --pure option from outer run-tests.py execution
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23933
diff changeset
3441 if self.options.pure:
d64dd1252386 run-tests.py: inherit --pure option from outer run-tests.py execution
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23933
diff changeset
3442 os.environ["HGTEST_RUN_TESTS_PURE"] = "--pure"
28905
c969c72d6cbc run-tests: set HGMODULEPOLICY for --pure
timeless <timeless@mozdev.org>
parents: 28880
diff changeset
3443 os.environ["HGMODULEPOLICY"] = "py"
52731
ba8aa20ff31f test-hghave: make sure we dont have HGWITHRUSTEXT set with --pure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52689
diff changeset
3444 os.environ.pop("HGWITHRUSTEXT", None)
44501
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3445 if self.options.rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3446 os.environ["HGMODULEPOLICY"] = "rust+c"
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3447 if self.options.no_rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3448 current_policy = os.environ.get("HGMODULEPOLICY", "")
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3449 if current_policy.startswith("rust+"):
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3450 os.environ["HGMODULEPOLICY"] = current_policy[len("rust+") :]
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3451 os.environ.pop("HGWITHRUSTEXT", None)
23935
d64dd1252386 run-tests.py: inherit --pure option from outer run-tests.py execution
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23933
diff changeset
3452
26109
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
3453 if self.options.allow_slow_tests:
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
3454 os.environ["HGTEST_SLOW"] = "slow"
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
3455 elif 'HGTEST_SLOW' in os.environ:
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
3456 del os.environ['HGTEST_SLOW']
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
3457
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3458 self._coveragefile = os.path.join(self._testdir, b'.coverage')
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3459
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3460 if self.options.exceptions:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3461 exceptionsdir = os.path.join(self._outputdir, b'exceptions')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3462 try:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3463 os.makedirs(exceptionsdir)
49313
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
3464 except FileExistsError:
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
3465 pass
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3466
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3467 # Remove all existing exception reports.
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3468 for f in os.listdir(exceptionsdir):
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3469 os.unlink(os.path.join(exceptionsdir, f))
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3470
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3471 osenvironb[b'HGEXCEPTIONSDIR'] = exceptionsdir
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3472 logexceptions = os.path.join(self._testdir, b'logexceptions.py')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3473 self.options.extra_config_opt.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3474 'extensions.logexceptions=%s' % logexceptions.decode('utf-8')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3475 )
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
3476
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3477 vlog("# Using TESTDIR", _bytes2sys(self._testdir))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3478 vlog("# Using RUNTESTDIR", _bytes2sys(osenvironb[b'RUNTESTDIR']))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3479 vlog("# Using HGTMP", _bytes2sys(self._hgtmp))
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3480 vlog("# Using PATH", os.environ["PATH"])
52624
deb8afb8448e run-tests: clean the last usage of IMPL_PATH up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52623
diff changeset
3481 vlog("# Using PYTHONPATH", os.environ.get("PYTHONPATH", ""))
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3482 vlog("# Writing to directory", _bytes2sys(self._outputdir))
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3483
52181
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3484 if shard_total is not None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3485 slot = shard_index - 1
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3486 testdescs = [
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3487 t
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3488 for (idx, t) in enumerate(testdescs)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3489 if (idx % shard_total == slot)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3490 ]
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52171
diff changeset
3491
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3492 try:
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3493 return self._runtests(testdescs) or 0
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3494 finally:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3495 time.sleep(0.1)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3496 self._cleanup()
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3497
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3498 def findtests(self, args):
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3499 """Finds possible test files from arguments.
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3500
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3501 If you wish to inject custom tests into the test harness, this would
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3502 be a good function to monkeypatch or override in a derived class.
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3503 """
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3504 if not args:
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3505 if self.options.changed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3506 proc = Popen4(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3507 b'hg st --rev "%s" -man0 .'
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3508 % _sys2bytes(self.options.changed),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3509 None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3510 0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3511 )
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3512 stdout, stderr = proc.communicate()
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3513 args = stdout.strip(b'\0').split(b'\0')
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3514 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3515 args = os.listdir(b'.')
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3516
35024
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3517 expanded_args = []
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3518 for arg in args:
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3519 if os.path.isdir(arg):
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3520 if not arg.endswith(b'/'):
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3521 arg += b'/'
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3522 expanded_args.extend([arg + a for a in os.listdir(arg)])
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3523 else:
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3524 expanded_args.append(arg)
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3525 args = expanded_args
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35021
diff changeset
3526
44023
6d3b67a837a6 cleanup: drop redundant character escapes from `[]` character sets
Matt Harbison <matt_harbison@yahoo.com>
parents: 43987
diff changeset
3527 testcasepattern = re.compile(br'([\w-]+\.t|py)(?:#([a-zA-Z0-9_\-.#]+))')
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3528 tests = []
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3529 for t in args:
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3530 case = []
38234
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3531
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3532 if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3533 os.path.basename(t).startswith(b'test-')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3534 and (t.endswith(b'.py') or t.endswith(b'.t'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3535 ):
41139
8ddc5d8bea25 tests: support passing testcase after .t paths that have path separators
Kyle Lippincott <spectral@google.com>
parents: 40999
diff changeset
3536 m = testcasepattern.match(os.path.basename(t))
38234
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3537 if m is not None:
41142
89d103fc9c19 testrunner: avoid capturing a regex group we don't care about
Martin von Zweigbergk <martinvonz@google.com>
parents: 41139
diff changeset
3538 t_basename, casestr = m.groups()
41139
8ddc5d8bea25 tests: support passing testcase after .t paths that have path separators
Kyle Lippincott <spectral@google.com>
parents: 40999
diff changeset
3539 t = os.path.join(os.path.dirname(t), t_basename)
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3540 if casestr:
38972
35180ade80c1 tests: fix bytes/str issues in run-tests.py caught by python3
Augie Fackler <augie@google.com>
parents: 38864
diff changeset
3541 case = casestr.split(b'#')
38234
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3542 else:
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3543 continue
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3544
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3545 if t.endswith(b'.t'):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3546 # .t file may contain multiple test cases
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3547 casedimensions = parsettestcases(t)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3548 if casedimensions:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3549 cases = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3550
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3551 def addcases(case, casedimensions):
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3552 if not casedimensions:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3553 cases.append(case)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3554 else:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3555 for c in casedimensions[0]:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3556 addcases(case + [c], casedimensions[1:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3557
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3558 addcases([], casedimensions)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3559 if case and case in cases:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3560 cases = [case]
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3561 elif case:
38234
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3562 # Ignore invalid cases
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3563 cases = []
38234
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3564 else:
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3565 pass
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3566 tests += [{'path': t, 'case': c} for c in sorted(cases)]
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3567 else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3568 tests.append({'path': t})
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3569 else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3570 tests.append({'path': t})
45421
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
3571
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
3572 if self.options.retest:
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
3573 retest_args = []
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
3574 for test in tests:
45422
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3575 errpath = self._geterrpath(test)
45421
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
3576 if os.path.exists(errpath):
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
3577 retest_args.append(test)
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
3578 tests = retest_args
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3579 return tests
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3580
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3581 def _runtests(self, testdescs):
32350
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32343
diff changeset
3582 def _reloadtest(test, i):
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32343
diff changeset
3583 # convert a test back to its description dict
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32343
diff changeset
3584 desc = {'path': test.path}
38864
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38863
diff changeset
3585 case = getattr(test, '_case', [])
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3586 if case:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3587 desc['case'] = case
32350
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32343
diff changeset
3588 return self._gettest(desc, i)
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32343
diff changeset
3589
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3590 try:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3591 if self.options.restart:
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3592 orig = list(testdescs)
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3593 while testdescs:
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3594 desc = testdescs[0]
45422
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3595 errpath = self._geterrpath(desc)
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3596 if os.path.exists(errpath):
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3597 break
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3598 testdescs.pop(0)
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3599 if not testdescs:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3600 print("running all tests")
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3601 testdescs = orig
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3602
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3603 tests = [self._gettest(d, i) for i, d in enumerate(testdescs)]
41178
53327bfbf35d testrunner: make `-j100 --runs-per-test=100 test-foo.t` use 100 jobs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41142
diff changeset
3604 num_tests = len(tests) * self.options.runs_per_test
53327bfbf35d testrunner: make `-j100 --runs-per-test=100 test-foo.t` use 100 jobs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41142
diff changeset
3605
53327bfbf35d testrunner: make `-j100 --runs-per-test=100 test-foo.t` use 100 jobs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41142
diff changeset
3606 jobs = min(num_tests, self.options.jobs)
40244
1039404c5e1d run-tests: print number of tests and parallel process count
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39914
diff changeset
3607
21458
c42219733f30 run-tests: don't print results in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21457
diff changeset
3608 failed = False
25050
28526bb5b3b5 run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com>
parents: 25049
diff changeset
3609 kws = self.options.keywords
48957
2ccd5e71bcd3 tests: remove last references to PYTHON3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48956
diff changeset
3610 if kws is not None:
25050
28526bb5b3b5 run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com>
parents: 25049
diff changeset
3611 kws = kws.encode('utf-8')
21458
c42219733f30 run-tests: don't print results in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21457
diff changeset
3612
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3613 suite = TestSuite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3614 self._testdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3615 jobs=jobs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3616 whitelist=self.options.whitelisted,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3617 blacklist=self.options.blacklist,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3618 keywords=kws,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3619 loop=self.options.loop,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3620 runs_per_test=self.options.runs_per_test,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3621 showchannels=self.options.showchannels,
52487
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52359
diff changeset
3622 tail_report=self.options.tail_report,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3623 tests=tests,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3624 loadtest=_reloadtest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3625 )
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
3626 verbosity = 1
38620
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
3627 if self.options.list_tests:
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
3628 verbosity = 0
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
3629 elif self.options.verbose:
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
3630 verbosity = 2
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
3631 runner = TextTestRunner(self, verbosity=verbosity)
32723
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
3632
49618
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
3633 osenvironb.pop(b'PYOXIDIZED_IN_MEMORY_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
3634 osenvironb.pop(b'PYOXIDIZED_FILESYSTEM_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
3635
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3636 if self.options.list_tests:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3637 result = runner.listtests(suite)
32723
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
3638 else:
49508
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49507
diff changeset
3639 install_start_time = time.monotonic()
47577
2ee81806831f run-tests: setup "correct" python earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47576
diff changeset
3640 self._usecorrectpython()
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3641 if self._installdir:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3642 self._installhg()
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
3643 self._check_hg("Testing")
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3644 if self.options.chg:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3645 assert self._installdir
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3646 self._installchg()
46767
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
3647 if self.options.rhg:
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
3648 assert self._installdir
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
3649 self._installrhg()
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3650 elif self.options.pyoxidized:
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
3651 self._build_pyoxidized()
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3652 self._use_correct_mercurial()
49508
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49507
diff changeset
3653 install_end_time = time.monotonic()
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49507
diff changeset
3654 if self._installdir:
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49507
diff changeset
3655 msg = 'installed Mercurial in %.2f seconds'
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49507
diff changeset
3656 msg %= install_end_time - install_start_time
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49507
diff changeset
3657 log(msg)
32723
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
3658
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3659 log(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3660 'running %d tests using %d parallel processes'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3661 % (num_tests, jobs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3662 )
40244
1039404c5e1d run-tests: print number of tests and parallel process count
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39914
diff changeset
3663
32724
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32723
diff changeset
3664 result = runner.run(suite)
21613
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
3665
42405
15d5a2de44aa tests: make run-tests exit non-zero if there are "errors"
Kyle Lippincott <spectral@google.com>
parents: 41809
diff changeset
3666 if result.failures or result.errors:
21613
b3213b9fafed run-tests: exit with non-0 exit code when tests fail or warn
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21539
diff changeset
3667 failed = True
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3668
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
3669 result.onEnd()
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
3670
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3671 if self.options.anycoverage:
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3672 self._outputcoverage()
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3673 except KeyboardInterrupt:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3674 failed = True
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3675 print("\ninterrupted!")
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3676
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3677 if failed:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3678 return 1
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3679
45422
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3680 def _geterrpath(self, test):
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3681 # test['path'] is a relative path
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3682 if 'case' in test:
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3683 # for multiple dimensions test cases
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3684 casestr = b'#'.join(test['case'])
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3685 errpath = b'%s#%s.err' % (test['path'], casestr)
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3686 else:
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3687 errpath = b'%s.err' % test['path']
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3688 if self.options.outputdir:
45453
c6e332a451d0 py3: fix bytes and str mixup in run-tests
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45422
diff changeset
3689 self._outputdir = canonpath(_sys2bytes(self.options.outputdir))
c6e332a451d0 py3: fix bytes and str mixup in run-tests
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45422
diff changeset
3690 errpath = os.path.join(self._outputdir, errpath)
45422
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3691 return errpath
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45421
diff changeset
3692
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3693 def _getport(self, count):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3694 port = self._ports.get(count) # do we have a cached entry?
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3695 if port is None:
52347
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52320
diff changeset
3696 portneeded = HGPORT_COUNT
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3697 # above 100 tries we just give up and let test reports failure
49293
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49260
diff changeset
3698 for tries in range(100):
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3699 allfree = True
27602
67aa88e00fc7 run-tests: fix get port to try differing ports
timeless <timeless@mozdev.org>
parents: 27567
diff changeset
3700 port = self.options.port + self._portoffset
49293
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49260
diff changeset
3701 for idx in range(portneeded):
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3702 if not checkportisavailable(port + idx):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3703 allfree = False
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3704 break
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3705 self._portoffset += portneeded
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3706 if allfree:
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3707 break
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3708 self._ports[count] = port
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3709 return port
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3710
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3711 def _gettest(self, testdesc, count):
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3712 """Obtain a Test by looking at its filename.
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3713
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3714 Returns a Test instance. The Test may not be runnable if it doesn't
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3715 map to a known type.
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3716 """
32351
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32350
diff changeset
3717 path = testdesc['path']
32350
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32343
diff changeset
3718 lctest = path.lower()
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3719 testcls = Test
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3720
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
3721 for ext, cls in self.TESTTYPES:
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3722 if lctest.endswith(ext):
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3723 testcls = cls
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3724 break
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3725
40537
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40529
diff changeset
3726 refpath = os.path.join(getcwdb(), path)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3727 tmpdir = os.path.join(self._hgtmp, b'child%d' % count)
21504
888a5dfe1569 run-tests: pass temp dir into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21502
diff changeset
3728
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3729 # extra keyword parameters. 'case' is used by .t tests
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44469
diff changeset
3730 kwds = {k: testdesc[k] for k in ['case'] if k in testdesc}
32356
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32351
diff changeset
3731
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3732 t = testcls(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3733 refpath,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3734 self._outputdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3735 tmpdir,
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3736 python=self._python,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3737 keeptmpdir=self.options.keep_tmpdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3738 debug=self.options.debug,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3739 first=self.options.first,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3740 timeout=self.options.timeout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3741 startport=self._getport(count),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3742 extraconfigopts=self.options.extra_config_opt,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3743 shell=self.options.shell,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3744 hgcommand=self._hgcommand,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3745 usechg=bool(self.options.with_chg or self.options.chg),
44619
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44586
diff changeset
3746 chgdebug=self.options.chg_debug,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3747 useipv6=useipv6,
52023
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51993
diff changeset
3748 **kwds,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3749 )
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
3750 t.should_reload = True
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
3751 return t
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3752
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3753 def _cleanup(self):
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3754 """Clean up state from this test invocation."""
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3755 if self.options.keep_tmpdir:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3756 return
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3757
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
3758 vlog("# Cleaning up HGTMP", _bytes2sys(self._hgtmp))
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3759 shutil.rmtree(self._hgtmp, True)
21352
39fd89fbbc3c run-tests: move createdfiles out of a global and into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21351
diff changeset
3760 for f in self._createdfiles:
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3761 try:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3762 os.remove(f)
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3763 except OSError:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3764 pass
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3765
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3766 def _usecorrectpython(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3767 """Configure the environment to use the appropriate Python in tests."""
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3768 # Tests must use the same interpreter as us or bad things will happen.
52616
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3769
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3770 # install dir != None means we did install mercurial within a temporary
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3771 # virtual env and do need to make sure the right python will be in
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3772 # front of the PATH. Except for Windows who lack a `python3` executable
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3773 # in this case.
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3774 if self._installdir is None:
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3775 pyexe_names = [b'python', b'python3']
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3776 elif WINDOWS:
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3777 pyexe_names = [b'python3']
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3778 else:
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3779 return
39663
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39662
diff changeset
3780
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39662
diff changeset
3781 # os.symlink() is a thing with py3 on Windows, but it requires
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39662
diff changeset
3782 # Administrator rights.
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3783 if not WINDOWS and getattr(os, 'symlink', None):
47499
81d70de39c7e run-tests: unroll a non-so-one-liner
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47323
diff changeset
3784 msg = "# Making python executable in test path a symlink to '%s'"
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3785 msg %= self._python
47499
81d70de39c7e run-tests: unroll a non-so-one-liner
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47323
diff changeset
3786 vlog(msg)
47505
23f5ed6dbcb1 run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47503
diff changeset
3787 for pyexename in pyexe_names:
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
3788 mypython = os.path.join(self._custom_bin_dir, pyexename)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3789 try:
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3790 if os.readlink(mypython) == self._python:
47503
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47502
diff changeset
3791 continue
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47502
diff changeset
3792 os.unlink(mypython)
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
3793 except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
3794 pass
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3795 if self._findprogram(pyexename) != self._python:
47503
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47502
diff changeset
3796 try:
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3797 os.symlink(self._python, mypython)
47503
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47502
diff changeset
3798 self._createdfiles.append(mypython)
49313
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
3799 except FileExistsError:
47503
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47502
diff changeset
3800 # child processes may race, which is harmless
49313
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
3801 pass
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3802 elif WINDOWS and not os.getenv('MSYSTEM'):
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3803 raise AssertionError('cannot run test on Windows without MSYSTEM')
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3804 else:
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3805 # Generate explicit file instead of symlink
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3806 #
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3807 # This is especially important as Windows doesn't have
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3808 # `python3.exe`, and MSYS cannot understand the reparse point with
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3809 # that name provided by Microsoft. Create a simple script on PATH
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3810 # with that name that delegates to the py3 launcher so the shebang
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3811 # lines work.
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3812 esc_executable = _sys2bytes(shellquote(self._python))
47505
23f5ed6dbcb1 run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47503
diff changeset
3813 for pyexename in pyexe_names:
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3814 stub_exec_path = os.path.join(self._custom_bin_dir, pyexename)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3815 with open(stub_exec_path, 'wb') as f:
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3816 f.write(b'#!/bin/sh\n')
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3817 f.write(b'%s "$@"\n' % esc_executable)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3818
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3819 if WINDOWS:
52196
7a568296296e windows: simply rely on the PATH adjustment to find python.exe in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52181
diff changeset
3820 # adjust the path to make sur the main python finds itself and
7a568296296e windows: simply rely on the PATH adjustment to find python.exe in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52181
diff changeset
3821 # its own dll
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3822 path = os.environ['PATH'].split(os.pathsep)
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
3823 main_exec_dir = os.path.dirname(self._python)
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3824 extra_paths = [_bytes2sys(self._custom_bin_dir), main_exec_dir]
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3825
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3826 # Binaries installed by pip into the user area like pylint.exe may
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3827 # not be in PATH by default.
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3828 appdata = os.environ.get('APPDATA')
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3829 vi = sys.version_info
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3830 if appdata is not None:
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3831 python_dir = 'Python%d%d' % (vi[0], vi[1])
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3832 scripts_path = [appdata, 'Python', python_dir, 'Scripts']
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3833 scripts_dir = os.path.join(*scripts_path)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3834 extra_paths.append(scripts_dir)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3835
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
3836 os.environ['PATH'] = os.pathsep.join(extra_paths + path)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3837
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3838 def _use_correct_mercurial(self):
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3839 target_exec = os.path.join(self._custom_bin_dir, b'hg')
52616
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3840 # hgcommand is ≠ hg in case like `rhg` and `chg` or with windows .exe's
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3841 if self._hgcommand != b'hg':
52613
9b5e058a7fb9 run-tests: use shutil.which now that we can
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52612
diff changeset
3842 real_exec = shutil.which(self._hgcommand)
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3843 if real_exec is None:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3844 raise ValueError('could not find exec path for "%s"', real_exec)
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3845 if real_exec == target_exec:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3846 # do not overwrite something with itself
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3847 return
52616
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3848 if os.path.exists(target_exec):
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3849 # there is already something at the destination. Let's not
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3850 # overwrite it.
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52615
diff changeset
3851 return
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3852 if WINDOWS:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3853 with open(target_exec, 'wb') as f:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3854 f.write(b'#!/bin/sh\n')
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3855 escaped_exec = shellquote(_bytes2sys(real_exec))
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3856 f.write(b'%s "$@"\n' % _sys2bytes(escaped_exec))
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3857 else:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3858 os.symlink(real_exec, target_exec)
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3859 self._createdfiles.append(target_exec)
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
3860
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3861 def _install_hg_cmd_wheel(self):
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3862 wheel_path = self.options.wheel
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3863 assert wheel_path
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3864
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3865 script = _sys2bytes(os.path.realpath(sys.argv[0]))
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3866 hgroot = os.path.dirname(os.path.dirname(script))
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3867 self._hgroot = hgroot
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3868 os.chdir(hgroot)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3869 cmd = [
52615
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52614
diff changeset
3870 self._pythonb,
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3871 b"-m",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3872 b"pip",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3873 b"install",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3874 wheel_path,
52249
a782fb584b29 run-tests: disable caching of the wheels when installing test Mercurial
Matt Harbison <matt_harbison@yahoo.com>
parents: 52198
diff changeset
3875 b"--no-cache-dir",
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3876 b"--force",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3877 b"--ignore-installed",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3878 ]
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3879
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3880 return cmd
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3881
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3882 def _install_hg_cmd_setup(self):
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3883 # Run installer in hg root
44500
0d9ad84a28d9 run-tests: rename "pure" variable to setup_opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44488
diff changeset
3884 setup_opts = b""
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 24075
diff changeset
3885 if self.options.pure:
44500
0d9ad84a28d9 run-tests: rename "pure" variable to setup_opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44488
diff changeset
3886 setup_opts = b"--pure"
44501
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3887 elif self.options.rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3888 setup_opts = b"--rust"
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3889 elif self.options.no_rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44500
diff changeset
3890 setup_opts = b"--no-rust"
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3891
48953
2336e79a119c tests: remove Python 3 conditionalizing from variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48952
diff changeset
3892 script = _sys2bytes(os.path.realpath(sys.argv[0]))
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3893 hgroot = os.path.dirname(os.path.dirname(script))
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
3894 self._hgroot = hgroot
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3895 os.chdir(hgroot)
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3896 cmd = [self._pythonb, b"-m", b"pip", b"install", b"."]
52143
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3897 if setup_opts:
52689
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3898 cmd.extend(
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3899 [b"--config-settings", b"--global-option=%s" % setup_opts]
f5091286b10c packaging: modernize (compat PEP 517) with less distutils and setup.py calls
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52684
diff changeset
3900 )
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3901 return cmd
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3902
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3903 def _installhg(self):
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3904 """Install hg into the test environment.
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3905
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3906 This will also configure hg with the appropriate testing settings.
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3907 """
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3908 vlog("# Performing temporary installation of HG")
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3909 install_env = original_env.copy()
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3910 if self.options.wheel is None:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3911 cmd = self._install_hg_cmd_setup()
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3912 else:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3913 cmd = self._install_hg_cmd_wheel()
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3914 install_env["PYTHONUSERBASE"] = _bytes2sys(self._installdir)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3915
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3916 installerrs = os.path.join(self._hgtmp, b"install.err")
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3917 if self.options.pure:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3918 install_env.pop('HGWITHRUSTEXT', None)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3919 elif self.options.no_rust:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3920 install_env.pop('HGWITHRUSTEXT', None)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
3921
52143
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3922 vlog("# Running", cmd)
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3923 with open(installerrs, "wb") as logfile:
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3924 r = subprocess.call(
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3925 cmd,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3926 env=install_env,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3927 stdout=logfile,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3928 stderr=subprocess.STDOUT,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3929 )
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52038
diff changeset
3930 if r == 0:
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3931 if not self.options.verbose:
26087
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
3932 try:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
3933 os.remove(installerrs)
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
3934 except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49313
diff changeset
3935 pass
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3936 else:
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
3937 with open(installerrs, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
3938 for line in f:
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
3939 sys.stdout.buffer.write(line)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3940 sys.exit(1)
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3941 os.chdir(self._testdir)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3942
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
3943 hgbat = os.path.join(self._bindir, b'hg.bat')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3944 if os.path.isfile(hgbat):
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3945 # hg.bat expects to be put in bin/scripts while run-tests.py
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3946 # installation layout put it in bin/ directly. Fix it
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
3947 with open(hgbat, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
3948 data = f.read()
41554
17a6e063c886 run-tests: use raw strings for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41509
diff changeset
3949 if br'"%~dp0..\python" "%~dp0hg" %*' in data:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3950 data = data.replace(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3951 br'"%~dp0..\python" "%~dp0hg" %*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3952 b'"%~dp0python" "%~dp0hg" %*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3953 )
35454
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
3954 with open(hgbat, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35453
diff changeset
3955 f.write(data)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3956 else:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3957 print('WARNING: cannot fix hg.bat reference to python.exe')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3958
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3959 if self.options.anycoverage:
52618
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52617
diff changeset
3960 custom = os.path.join(RUNTEST_DIR, b'sitecustomize.py')
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3961 target = os.path.join(self._pythondir, b'sitecustomize.py')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3962 vlog('# Installing coverage trigger to %s' % target)
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3963 shutil.copyfile(custom, target)
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3964 rc = os.path.join(self._testdir, b'.coveragerc')
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3965 vlog('# Installing coverage rc to %s' % rc)
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3966 osenvironb[b'COVERAGE_PROCESS_START'] = rc
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3967 covdir = os.path.join(self._installdir, b'..', b'coverage')
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3968 try:
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3969 os.mkdir(covdir)
49313
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
3970 except FileExistsError:
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49293
diff changeset
3971 pass
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3972
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3973 osenvironb[b'COVERAGE_DIR'] = covdir
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3974
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
3975 def _check_hg(self, verb):
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
3976 """Ensure that the 'mercurial' package imported by python is
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
3977 the one we expect it to be. If not, print a warning to stderr."""
47574
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
3978 if self._pythondir_inferred:
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
3979 # The pythondir has been inferred from --with-hg flag.
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
3980 # We cannot expect anything sensible here.
21733
9ad11d5bcc2f run-tests: don't check for the mercurial library used when using --with-hg
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21614
diff changeset
3981 return
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
3982 expecthg = os.path.join(self._pythondir, b'mercurial')
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3983 actual_bin_hg = self._get_hg_bin_path()
52542
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
3984 actual_py_hg = self._get_hg_py_path()
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3985 if actual_bin_hg != actual_py_hg:
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3986 msg = (
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3987 b'fatal: "python" and "hg" disagree about mercurial lib path:\n'
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3988 b' hg: %s:\n'
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3989 b' py: %s:\n'
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3990 )
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3991 msg %= (actual_bin_hg, actual_py_hg)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3992 msg = colorize(msg.decode(), "red", self.options.color)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3993 sys.stderr.write(msg)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
3994 sys.exit(2)
52542
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
3995 if os.path.abspath(actual_py_hg) != os.path.abspath(expecthg):
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
3996 msg = (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3997 'warning: %s with unexpected mercurial lib: %s\n'
52542
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
3998 ' (expected %s)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3999 )
52542
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
4000 msg %= (verb, actual_py_hg.decode(), expecthg.decode())
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
4001 msg = colorize(msg, "yellow", self.options.color)
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
4002 sys.stderr.write(msg)
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4003 policy = self._get_hg_module_policy()
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4004 msg = b"fatal: mercurial binary has unexpected flavor for %s: %s\n"
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4005 err = None
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4006 if self.options.pure and policy != b"py":
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4007 err = msg % (b"--pure", policy)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4008 elif self.options.rust and b"rust" not in policy:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4009 err = msg % (b"--rust", policy)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4010 elif self.options.no_rust and b"rust" in policy:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4011 err = msg % (b"--no-rust", policy)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4012 if err is not None:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4013 err = colorize(err.decode(), "red", self.options.color)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4014 sys.stderr.write(err)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4015 sys.exit(3)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4016
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4017 def _get_hg_module_policy(self):
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4018 """return the module policy as seen by the "hg" binary"""
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4019 cmd = [
52565
8adfaa5ad484 run-tests: align call argument on string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52564
diff changeset
4020 _bytes2sys(self._real_hg),
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4021 "debuginstall",
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4022 "--template",
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4023 "{hgmodulepolicy}",
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4024 ]
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4025 p = subprocess.Popen(
52566
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52565
diff changeset
4026 " ".join(cmd),
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4027 stdout=subprocess.PIPE,
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4028 stderr=subprocess.PIPE,
52566
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52565
diff changeset
4029 shell=True,
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4030 )
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4031 out, err = p.communicate()
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4032 if p.returncode != 0:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4033 msg = "fatal: fetching module policy from `hg` failed:\n"
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4034 msg = colorize(msg, "red", self.options.color)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4035 sys.stderr.write(msg)
52564
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52543
diff changeset
4036 cmd_err = colorize(err.decode(), "magenta", self.options.color)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52543
diff changeset
4037 sys.stderr.write(cmd_err)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52543
diff changeset
4038 cmd_err = colorize(out.decode(), "yellow", self.options.color)
52541
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4039 sys.stderr.write(cmd_err)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4040 sys.exit(4)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52540
diff changeset
4041 return out
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4042
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4043 def _get_hg_bin_path(self):
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4044 """return the path to the mercurial lib according to the "hg" binary"""
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4045 cmd = [
52565
8adfaa5ad484 run-tests: align call argument on string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52564
diff changeset
4046 _bytes2sys(self._real_hg),
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4047 "debuginstall",
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4048 "--template",
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4049 "{hgmodules}",
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4050 ]
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4051 p = subprocess.Popen(
52566
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52565
diff changeset
4052 " ".join(cmd),
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4053 stdout=subprocess.PIPE,
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4054 stderr=subprocess.PIPE,
52566
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52565
diff changeset
4055 shell=True,
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4056 )
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4057 out, err = p.communicate()
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4058 if p.returncode != 0:
52564
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52543
diff changeset
4059 msg = f"fatal: fetching library from `hg` failed with {p.returncode}:\n"
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4060 msg = colorize(msg, "red", self.options.color)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4061 sys.stderr.write(msg)
52564
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52543
diff changeset
4062 cmd_err = colorize(err.decode(), "magenta", self.options.color)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52543
diff changeset
4063 sys.stderr.write(cmd_err)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52543
diff changeset
4064 cmd_err = colorize(out.decode(), "yellow", self.options.color)
52543
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4065 sys.stderr.write(cmd_err)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4066 sys.exit(4)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4067 return out
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52542
diff changeset
4068
52542
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52541
diff changeset
4069 def _get_hg_py_path(self):
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
4070 """Return the path to the mercurial package that is actually found by
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
4071 the current Python interpreter."""
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
4072 if self._hgpath is not None:
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
4073 return self._hgpath
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
4074
52349
0b708a375490 tests: use PYTHONSAFEPATH (-P) to check mercurial lib path
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52347
diff changeset
4075 # PYTHONSAFEPATH (-P) new in 3.11
0b708a375490 tests: use PYTHONSAFEPATH (-P) to check mercurial lib path
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52347
diff changeset
4076 if sys.version_info >= (3, 11, 0):
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
4077 python_safe_path = "-P "
52349
0b708a375490 tests: use PYTHONSAFEPATH (-P) to check mercurial lib path
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52347
diff changeset
4078 else:
52614
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
4079 python_safe_path = ""
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
4080
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
4081 cmd = '"%s" %s-c "import mercurial; print (mercurial.__path__[0])"'
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52613
diff changeset
4082 cmd %= (self._python, python_safe_path)
40947
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40541
diff changeset
4083
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40541
diff changeset
4084 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40541
diff changeset
4085 out, err = p.communicate()
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40541
diff changeset
4086
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40541
diff changeset
4087 self._hgpath = out.strip()
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
4088
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
4089 return self._hgpath
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
4090
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4091 def _installchg(self):
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4092 """Install chg into the test environment"""
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4093 vlog('# Performing temporary installation of CHG')
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4094 assert os.path.dirname(self._bindir) == self._installdir
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4095 assert self._hgroot, 'must be called after _installhg()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4096 cmd = b'"%(make)s" clean install PREFIX="%(prefix)s"' % {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4097 b'make': b'make', # TODO: switch by option or environment?
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4098 b'prefix': self._installdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4099 }
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4100 cwd = os.path.join(self._hgroot, b'contrib', b'chg')
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4101 vlog("# Running", cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4102 proc = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4103 cmd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4104 shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4105 cwd=cwd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4106 stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4107 stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4108 stderr=subprocess.STDOUT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4109 )
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4110 out, _err = proc.communicate()
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4111 if proc.returncode != 0:
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
4112 sys.stdout.buffer.write(out)
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4113 sys.exit(1)
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
4114
46767
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4115 def _installrhg(self):
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4116 """Install rhg into the test environment"""
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4117 vlog('# Performing temporary installation of rhg')
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4118 assert os.path.dirname(self._bindir) == self._installdir
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4119 assert self._hgroot, 'must be called after _installhg()'
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4120 cmd = b'"%(make)s" install-rhg PREFIX="%(prefix)s"' % {
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4121 b'make': b'make', # TODO: switch by option or environment?
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4122 b'prefix': self._installdir,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4123 }
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4124 cwd = self._hgroot
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4125 vlog("# Running", cmd)
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4126 proc = subprocess.Popen(
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4127 cmd,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4128 shell=True,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4129 cwd=cwd,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4130 stdin=subprocess.PIPE,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4131 stdout=subprocess.PIPE,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4132 stderr=subprocess.STDOUT,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4133 )
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4134 out, _err = proc.communicate()
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4135 if proc.returncode != 0:
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
4136 sys.stdout.buffer.write(out)
46767
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4137 sys.exit(1)
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46737
diff changeset
4138
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4139 def _build_pyoxidized(self):
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4140 """build a pyoxidized version of mercurial into the test environment
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4141
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4142 Ideally this function would be `install_pyoxidier` and would both build
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4143 and install pyoxidier. However we are starting small to get pyoxidizer
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4144 build binary to testing quickly.
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4145 """
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4146 vlog('# build a pyoxidized version of Mercurial')
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4147 assert os.path.dirname(self._bindir) == self._installdir
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4148 assert self._hgroot, 'must be called after _installhg()'
49617
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4149 target = b''
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4150 if WINDOWS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4151 target = b'windows'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4152 elif MACOS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4153 target = b'macos'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4154
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4155 cmd = b'"%(make)s" pyoxidizer-%(platform)s-tests' % {
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4156 b'make': b'make',
49617
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49508
diff changeset
4157 b'platform': target,
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4158 }
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4159 cwd = self._hgroot
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4160 vlog("# Running", cmd)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4161 proc = subprocess.Popen(
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4162 _bytes2sys(cmd),
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4163 shell=True,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4164 cwd=_bytes2sys(cwd),
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4165 stdin=subprocess.PIPE,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4166 stdout=subprocess.PIPE,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4167 stderr=subprocess.STDOUT,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4168 )
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4169 out, _err = proc.communicate()
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4170 if proc.returncode != 0:
48948
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48947
diff changeset
4171 sys.stdout.buffer.write(out)
47821
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4172 sys.exit(1)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
4173
49618
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4174 cmd = _bytes2sys(b"%s debuginstall -Tjson" % self._hgcommand)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4175 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4176 out, err = p.communicate()
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4177
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4178 props = json.loads(out)[0]
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4179
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4180 # Affects hghave.py
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4181 osenvironb.pop(b'PYOXIDIZED_IN_MEMORY_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4182 osenvironb.pop(b'PYOXIDIZED_FILESYSTEM_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4183 if props["hgmodules"] == props["pythonexe"]:
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4184 osenvironb[b'PYOXIDIZED_IN_MEMORY_RSRC'] = b'1'
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4185 else:
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4186 osenvironb[b'PYOXIDIZED_FILESYSTEM_RSRC'] = b'1'
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49617
diff changeset
4187
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
4188 def _outputcoverage(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
4189 """Produce code coverage output."""
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
4190 import coverage
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4191
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
4192 coverage = coverage.coverage
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
4193
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
4194 vlog('# Producing coverage report')
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
4195 # chdir is the easiest way to get short, relative paths in the
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
4196 # output.
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
4197 os.chdir(self._hgroot)
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
4198 covdir = os.path.join(_bytes2sys(self._installdir), '..', 'coverage')
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
4199 cov = coverage(data_file=os.path.join(covdir, 'cov'))
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
4200
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
4201 # Map install directory paths back to source directory.
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
4202 cov.config.paths['srcdir'] = ['.', _bytes2sys(self._pythondir)]
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
4203
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
4204 cov.combine()
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
4205
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
4206 omit = [
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
4207 _bytes2sys(os.path.join(x, b'*'))
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
4208 for x in [self._bindir, self._testdir]
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
4209 ]
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
4210 cov.report(ignore_errors=True, omit=omit)
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
4211
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
4212 if self.options.htmlcov:
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
4213 htmldir = os.path.join(_bytes2sys(self._outputdir), 'htmlcov')
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
4214 cov.html_report(directory=htmldir, omit=omit)
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
4215 if self.options.annotate:
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
4216 adir = os.path.join(_bytes2sys(self._outputdir), 'annotated')
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
4217 if not os.path.isdir(adir):
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
4218 os.mkdir(adir)
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
4219 cov.annotate(directory=adir, omit=omit)
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
4220
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4221 def _findprogram(self, program):
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4222 """Search PATH for a executable program"""
44468
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
4223 dpb = _sys2bytes(os.defpath)
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44467
diff changeset
4224 sepb = _sys2bytes(os.pathsep)
25038
66da89457c47 run-tests: fix _findprogram to reliably return bytes
Augie Fackler <augie@google.com>
parents: 25037
diff changeset
4225 for p in osenvironb.get(b'PATH', dpb).split(sepb):
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4226 name = os.path.join(p, program)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
4227 if WINDOWS or os.access(name, os.X_OK):
44839
383005aa9cdc run-tests: find python binary on Python 3 (issue6361)
Axel Hecht <axel@pike.org>
parents: 44828
diff changeset
4228 return _bytes2sys(name)
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4229 return None
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4230
21374
592b3d2616d7 run-tests: move checktools into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21373
diff changeset
4231 def _checktools(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
4232 """Ensure tools required to run tests are present."""
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4233 for p in self.REQUIREDTOOLS:
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
4234 if WINDOWS and not p.endswith(b'.exe'):
39605
4eb0f2452ad7 py3: add b'' to some run-tests.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39430
diff changeset
4235 p += b'.exe'
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4236 found = self._findprogram(p)
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
4237 p = p.decode("utf-8")
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4238 if found:
44839
383005aa9cdc run-tests: find python binary on Python 3 (issue6361)
Axel Hecht <axel@pike.org>
parents: 44828
diff changeset
4239 vlog("# Found prerequisite", p, "at", found)
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4240 else:
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
4241 print("WARNING: Did not find prerequisite tool: %s " % p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4242
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
4243
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4244 def aggregateexceptions(path):
36075
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4245 exceptioncounts = collections.Counter()
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4246 testsbyfailure = collections.defaultdict(set)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4247 failuresbytest = collections.defaultdict(set)
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4248
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4249 for f in os.listdir(path):
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4250 with open(os.path.join(path, f), 'rb') as fh:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4251 data = fh.read().split(b'\0')
36075
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4252 if len(data) != 5:
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4253 continue
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4254
36075
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4255 exc, mainframe, hgframe, hgline, testname = data
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4256 exc = exc.decode('utf-8')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4257 mainframe = mainframe.decode('utf-8')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4258 hgframe = hgframe.decode('utf-8')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4259 hgline = hgline.decode('utf-8')
36075
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4260 testname = testname.decode('utf-8')
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4261
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4262 key = (hgframe, hgline, exc)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4263 exceptioncounts[key] += 1
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4264 testsbyfailure[key].add(testname)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4265 failuresbytest[testname].add(key)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4266
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4267 # Find test having fewest failures for each failure.
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4268 leastfailing = {}
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4269 for key, tests in testsbyfailure.items():
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4270 fewesttest = None
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4271 fewestcount = 99999999
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4272 for test in sorted(tests):
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4273 if len(failuresbytest[test]) < fewestcount:
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4274 fewesttest = test
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4275 fewestcount = len(failuresbytest[test])
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4276
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4277 leastfailing[key] = (fewestcount, fewesttest)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4278
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4279 # Create a combined counter so we can sort by total occurrences and
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4280 # impacted tests.
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4281 combined = {}
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4282 for key in exceptioncounts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4283 combined[key] = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4284 exceptioncounts[key],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4285 len(testsbyfailure[key]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4286 leastfailing[key][0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4287 leastfailing[key][1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4288 )
36075
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4289
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4290 return {
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4291 'exceptioncounts': exceptioncounts,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4292 'total': sum(exceptioncounts.values()),
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4293 'combined': combined,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4294 'leastfailing': leastfailing,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4295 'byfailure': testsbyfailure,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4296 'bytest': failuresbytest,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36030
diff changeset
4297 }
35201
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35200
diff changeset
4298
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4299
13347
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
4300 if __name__ == '__main__':
47638
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4301 if WINDOWS and not os.getenv('MSYSTEM'):
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4302 print('cannot run test on Windows without MSYSTEM', file=sys.stderr)
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4303 print(
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4304 '(if you need to do so contact the mercurial devs: '
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4305 'mercurial@mercurial-scm.org)',
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4306 file=sys.stderr,
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4307 )
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4308 sys.exit(255)
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
4309
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
4310 runner = TestRunner()
22120
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4311
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4312 try:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4313 import msvcrt
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
4314
22120
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4315 msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4316 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4317 msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4318 except ImportError:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4319 pass
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
4320
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
4321 sys.exit(runner.run(sys.argv[1:]))