annotate tests/run-tests.py @ 44588:2a98b0cd4995

setup: build C extensions with -Werror=declaration-after-statement MSVC 2008 still needs declarations at the top of the scope. I added it to the 3rd party code too in case somebody vendors a new version with a problem- they'll get an early warning. Clang seems to ignore this (at least on 10.14 with Xcode 10), and gcc 7.4 will error out as desired on Ubuntu 18.04. Thanks to Yuya for remembering the name of the option. Differential Revision: https://phab.mercurial-scm.org/D8318
author Matt Harbison <matt_harbison@yahoo.com>
date Fri, 20 Mar 2020 23:30:23 -0400
parents f8427841c8fc
children 78a8f65eacc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
1 #!/usr/bin/env python
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
2 #
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
3 # run-tests.py - Run a set of tests on Mercurial
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
4 #
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
5 # Copyright 2006 Matt Mackall <mpm@selenic.com>
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
6 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8161
diff changeset
7 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10154
diff changeset
8 # GNU General Public License version 2 or any later version.
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
9
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
10 # Modifying this script is tricky because it has many modes:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
11 # - serial (default) vs parallel (-jN, N > 1)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
12 # - no coverage (default) vs coverage (-c, -C, -s)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
13 # - temp install (default) vs specific hg script (--with-hg, --local)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
14 # - tests are a mix of shell scripts and Python scripts
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
15 #
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
16 # If you change this script, it is recommended that you ensure you
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
17 # haven't broken it by running it in various modes with a representative
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
18 # sample of test scripts. For example:
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8724
diff changeset
19 #
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
20 # 1) serial, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
21 # ./run-tests.py test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
22 # 2) serial, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
23 # ./run-tests.py --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
24 # 3) serial, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
25 # ./run-tests.py -c test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
26 # 4) serial, coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
27 # ./run-tests.py -c --local test-s* # unsupported
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
28 # 5) parallel, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
29 # ./run-tests.py -j2 test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
30 # 6) parallel, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
31 # ./run-tests.py -j2 --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
32 # 7) parallel, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
33 # ./run-tests.py -j2 -c test-s* # currently broken
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
34 # 8) parallel, coverage, local install:
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
35 # ./run-tests.py -j2 -c --local test-s* # unsupported (and broken)
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
36 # 9) parallel, custom tmp dir:
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
37 # ./run-tests.py -j2 --tmpdir /tmp/myhgtests
26158
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
38 # 10) parallel, pure, tests that call run-tests:
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
39 # ./run-tests.py --pure `grep -l run-tests.py *.t`
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
40 #
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
41 # (You could use any subset of the tests: test-s* happens to match
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
42 # enough that it's worth doing parallel runs, few enough that it
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
43 # completes fairly quickly, includes both shell and Python scripts, and
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
44 # includes some scripts that run daemon processes.)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
45
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
46 from __future__ import absolute_import, print_function
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
47
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
48 import argparse
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
49 import collections
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
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
51 import distutils.version as version
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
52 import errno
28126
562a073a2a1b tests: load json with no fallback
Yuya Nishihara <yuya@tcha.org>
parents: 28099
diff changeset
53 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
54 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
55 import os
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
56 import platform
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
57 import random
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
58 import re
10905
13a1b2fb7ef2 pylint, pyflakes: remove unused or duplicate imports
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10903
diff changeset
59 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
60 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
61 import socket
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
62 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
63 import sys
32302
8627cf4de929 run-tests: drop fallback for sysconfig for pre-py2.7
Martin von Zweigbergk <martinvonz@google.com>
parents: 31950
diff changeset
64 import sysconfig
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
65 import tempfile
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
66 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
67 import time
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
68 import unittest
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
69 import uuid
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
70 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
71
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
72 try:
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
73 import Queue as queue
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
74 except ImportError:
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
75 import queue
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
76
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
77 try:
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
78 import shlex
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
79
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
80 shellquote = shlex.quote
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
81 except (ImportError, AttributeError):
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
82 import pipes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
83
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
84 shellquote = pipes.quote
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
85
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
86 processlock = threading.Lock()
19413
a4de0d3dc35a run-tests: lock popen wait/poll
Brendan Cully <brendan@kublai.com>
parents: 19407
diff changeset
87
33552
754569f5e999 run-tests: make sure to check if pygments is installed before using it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33500
diff changeset
88 pygmentspresent = False
33500
9c6e64911de0 run-tests: disable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 33420
diff changeset
89 # ANSI color is unsupported prior to Windows 10
9c6e64911de0 run-tests: disable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 33420
diff changeset
90 if os.name != 'nt':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
91 try: # is pygments installed
33500
9c6e64911de0 run-tests: disable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 33420
diff changeset
92 import pygments
9c6e64911de0 run-tests: disable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 33420
diff changeset
93 import pygments.lexers as lexers
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
94 import pygments.lexer as lexer
33500
9c6e64911de0 run-tests: disable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 33420
diff changeset
95 import pygments.formatters as formatters
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
96 import pygments.token as token
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
97 import pygments.style as style
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
98
33552
754569f5e999 run-tests: make sure to check if pygments is installed before using it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33500
diff changeset
99 pygmentspresent = True
33580
20436925e080 run-tests: pre instantiate pygments objects
Jun Wu <quark@fb.com>
parents: 33568
diff changeset
100 difflexer = lexers.DiffLexer()
20436925e080 run-tests: pre instantiate pygments objects
Jun Wu <quark@fb.com>
parents: 33568
diff changeset
101 terminal256formatter = formatters.Terminal256Formatter()
33500
9c6e64911de0 run-tests: disable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 33420
diff changeset
102 except ImportError:
9c6e64911de0 run-tests: disable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 33420
diff changeset
103 pass
33420
e80041832eec run-tests: add color to output if pygments is available
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33203
diff changeset
104
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
105 if pygmentspresent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
106
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
107 class TestRunnerStyle(style.Style):
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
108 default_style = ""
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
109 skipped = token.string_to_tokentype("Token.Generic.Skipped")
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
110 failed = token.string_to_tokentype("Token.Generic.Failed")
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
111 skippedname = token.string_to_tokentype("Token.Generic.SName")
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
112 failedname = token.string_to_tokentype("Token.Generic.FName")
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
113 styles = {
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
114 skipped: '#e5e5e5',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
115 skippedname: '#00ffff',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
116 failed: '#7f0000',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
117 failedname: '#ff0000',
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
118 }
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
119
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
120 class TestRunnerLexer(lexer.RegexLexer):
38290
b5651ae53127 run-tests: restrict the test cases allowed characters
Boris Feld <boris.feld@octobus.net>
parents: 38251
diff changeset
121 testpattern = r'[\w-]+\.(t|py)(#[a-zA-Z0-9_\-\.]+)?'
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
122 tokens = {
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
123 'root': [
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
124 (r'^Skipped', token.Generic.Skipped, 'skipped'),
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
125 (r'^Failed ', token.Generic.Failed, 'failed'),
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
126 (r'^ERROR: ', token.Generic.Failed, 'failed'),
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
127 ],
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
128 'skipped': [
35848
8a7140ec4c89 testrunner: on error, color the "(case xxx)" part the same as filename
Martin von Zweigbergk <martinvonz@google.com>
parents: 35823
diff changeset
129 (testpattern, token.Generic.SName),
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
130 (r':.*', token.Generic.Skipped),
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
131 ],
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
132 'failed': [
35848
8a7140ec4c89 testrunner: on error, color the "(case xxx)" part the same as filename
Martin von Zweigbergk <martinvonz@google.com>
parents: 35823
diff changeset
133 (testpattern, token.Generic.FName),
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
134 (r'(:| ).*', token.Generic.Failed),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
135 ],
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
136 }
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
137
33866
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33814
diff changeset
138 runnerformatter = formatters.Terminal256Formatter(style=TestRunnerStyle)
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33814
diff changeset
139 runnerlexer = TestRunnerLexer()
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33814
diff changeset
140
39645
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
141 origenviron = os.environ.copy()
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
142
25160
fefc72523491 run-tests: insist that if people use Python 3, they use 3.5.x
Augie Fackler <augie@google.com>
parents: 25159
diff changeset
143 if sys.version_info > (3, 5, 0):
25157
a8d22895a575 run-tests: introduce PYTHON3 boolean constant (issue4668)
Augie Fackler <augie@google.com>
parents: 25156
diff changeset
144 PYTHON3 = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
145 xrange = range # we use xrange in one place, and we'd rather not use range
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
146
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
147 def _sys2bytes(p):
33710
2e43c5cd57a7 tests: fix up test-run-tests failures on Python 3.6
Augie Fackler <augie@google.com>
parents: 33696
diff changeset
148 if p is None:
2e43c5cd57a7 tests: fix up test-run-tests failures on Python 3.6
Augie Fackler <augie@google.com>
parents: 33696
diff changeset
149 return p
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
150 return p.encode('utf-8')
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
151
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
152 def _bytes2sys(p):
33710
2e43c5cd57a7 tests: fix up test-run-tests failures on Python 3.6
Augie Fackler <augie@google.com>
parents: 33696
diff changeset
153 if p is None:
2e43c5cd57a7 tests: fix up test-run-tests failures on Python 3.6
Augie Fackler <augie@google.com>
parents: 33696
diff changeset
154 return p
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
155 return p.decode('utf-8')
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
156
39645
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
157 osenvironb = getattr(os, 'environb', None)
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
158 if osenvironb is None:
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
159 # Windows lacks os.environb, for instance. A proxy over the real thing
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
160 # instead of a copy allows the environment to be updated via bytes on
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
161 # all platforms.
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
162 class environbytes(object):
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
163 def __init__(self, strenv):
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
164 self.__len__ = strenv.__len__
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
165 self.clear = strenv.clear
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
166 self._strenv = strenv
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
167
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
168 def __getitem__(self, k):
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
169 v = self._strenv.__getitem__(_bytes2sys(k))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
170 return _sys2bytes(v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
171
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
172 def __setitem__(self, k, v):
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
173 self._strenv.__setitem__(_bytes2sys(k), _bytes2sys(v))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
174
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
175 def __delitem__(self, k):
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
176 self._strenv.__delitem__(_bytes2sys(k))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
177
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
178 def __contains__(self, k):
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
179 return self._strenv.__contains__(_bytes2sys(k))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
180
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
181 def __iter__(self):
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
182 return iter([_sys2bytes(k) for k in iter(self._strenv)])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
183
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
184 def get(self, k, default=None):
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
185 v = self._strenv.get(_bytes2sys(k), _bytes2sys(default))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
186 return _sys2bytes(v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
187
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
188 def pop(self, k, default=None):
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
189 v = self._strenv.pop(_bytes2sys(k), _bytes2sys(default))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
190 return _sys2bytes(v)
39714
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
191
491fc3f4be67 py3: make osenvironb a proxy for, instead of a copy of os.environ where needed
Matt Harbison <matt_harbison@yahoo.com>
parents: 39706
diff changeset
192 osenvironb = environbytes(os.environ)
39645
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
193
39718
ac32685011a3 run-tests: avoid os.getcwdb() on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39717
diff changeset
194 getcwdb = getattr(os, 'getcwdb')
ac32685011a3 run-tests: avoid os.getcwdb() on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39717
diff changeset
195 if not getcwdb or os.name == 'nt':
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
196 getcwdb = lambda: _sys2bytes(os.getcwd())
39718
ac32685011a3 run-tests: avoid os.getcwdb() on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39717
diff changeset
197
25160
fefc72523491 run-tests: insist that if people use Python 3, they use 3.5.x
Augie Fackler <augie@google.com>
parents: 25159
diff changeset
198 elif sys.version_info >= (3, 0, 0):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
199 print(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
200 '%s is only supported on Python 3.5+ and 2.7, not %s'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
201 % (sys.argv[0], '.'.join(str(v) for v in sys.version_info[:3]))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
202 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
203 sys.exit(70) # EX_SOFTWARE from `man 3 sysexit`
25157
a8d22895a575 run-tests: introduce PYTHON3 boolean constant (issue4668)
Augie Fackler <augie@google.com>
parents: 25156
diff changeset
204 else:
a8d22895a575 run-tests: introduce PYTHON3 boolean constant (issue4668)
Augie Fackler <augie@google.com>
parents: 25156
diff changeset
205 PYTHON3 = False
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
206
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
207 # In python 2.x, path operations are generally done using
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
208 # bytestrings by default, so we don't have to do any extra
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
209 # fiddling there. We define the wrapper functions anyway just to
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
210 # help keep code consistent between platforms.
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
211 def _sys2bytes(p):
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
212 return p
25033
2bdd9e442bcc run-tests: work around the rename of xrange to range
Augie Fackler <augie@google.com>
parents: 25031
diff changeset
213
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
214 _bytes2sys = _sys2bytes
39645
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
215 osenvironb = os.environ
39718
ac32685011a3 run-tests: avoid os.getcwdb() on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39717
diff changeset
216 getcwdb = os.getcwd
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
217
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
218 # For Windows support
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
219 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
220
30984
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
221 # Whether to use IPv6
31002
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
222 def checksocketfamily(name, port=20058):
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
223 """return true if we can listen on localhost using family=name
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
224
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
225 name should be either 'AF_INET', or 'AF_INET6'.
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
226 port being used is okay - EADDRINUSE is considered as successful.
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
227 """
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
228 family = getattr(socket, name, None)
30984
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
229 if family is None:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
230 return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
231 try:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
232 s = socket.socket(family, socket.SOCK_STREAM)
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
233 s.bind(('localhost', port))
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
234 s.close()
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
235 return True
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
236 except socket.error as exc:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
237 if exc.errno == errno.EADDRINUSE:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
238 return True
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
239 elif exc.errno in (errno.EADDRNOTAVAIL, errno.EPROTONOSUPPORT):
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
240 return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
241 else:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
242 raise
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
243 else:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
244 return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
245
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
246
31011
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
247 # useipv6 will be set by parseargs
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
248 useipv6 = None
30984
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
249
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
250
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
251 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
252 """return true if a port seems free to bind on localhost"""
30985
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 30984
diff changeset
253 if useipv6:
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 30984
diff changeset
254 family = socket.AF_INET6
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 30984
diff changeset
255 else:
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 30984
diff changeset
256 family = socket.AF_INET
30987
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
257 try:
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
258 s = socket.socket(family, socket.SOCK_STREAM)
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
259 s.bind(('localhost', port))
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
260 s.close()
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
261 return True
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
262 except socket.error as exc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
263 if exc.errno not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
264 errno.EADDRINUSE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
265 errno.EADDRNOTAVAIL,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
266 errno.EPROTONOSUPPORT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
267 ):
30987
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
268 raise
30886
2aaa8bfc7bd9 runtests: check ports on IPv6 address
Jun Wu <quark@fb.com>
parents: 30716
diff changeset
269 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
270
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
271
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
272 closefds = os.name == 'posix'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
273
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
274
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
275 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
276 processlock.acquire()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
277 p = subprocess.Popen(
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
278 _bytes2sys(cmd),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
279 shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
280 bufsize=-1,
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
281 cwd=_bytes2sys(wd),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
282 env=env,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
283 close_fds=closefds,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
284 stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
285 stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
286 stderr=subprocess.STDOUT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
287 )
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
288 processlock.release()
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
289
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
290 p.fromchild = p.stdout
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
291 p.tochild = p.stdin
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
292 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
293
14337
439ed4721a6d run-tests: ignore timeout when Popen.terminate is unavailable
Patrick Mezard <pmezard@gmail.com>
parents: 14336
diff changeset
294 p.timeout = False
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
295 if timeout:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
296
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
297 def t():
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
298 start = time.time()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
299 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
300 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
301 p.timeout = True
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
302 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
303 terminate(p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
304
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
305 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
306
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
307 return p
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
308
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
309
42523
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
310 if sys.executable:
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
311 sysexecutable = sys.executable
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
312 elif os.environ.get('PYTHONEXECUTABLE'):
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
313 sysexecutable = os.environ['PYTHONEXECUTABLE']
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
314 elif os.environ.get('PYTHON'):
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
315 sysexecutable = os.environ['PYTHON']
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
316 else:
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
317 raise AssertionError('Could not find Python interpreter')
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
318
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
319 PYTHON = _sys2bytes(sysexecutable.replace('\\', '/'))
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
320 IMPL_PATH = b'PYTHONPATH'
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
321 if 'java' in sys.platform:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
322 IMPL_PATH = b'JYTHONPATH'
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
323
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
324 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
325 'jobs': ('HGTEST_JOBS', multiprocessing.cpu_count()),
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
326 'timeout': ('HGTEST_TIMEOUT', 180),
41801
9f53a4e2e193 tests: increase timeout for slow test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41759
diff changeset
327 '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
328 '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
329 '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
330 }
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
331
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
332
28644
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
333 def canonpath(path):
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
334 return os.path.realpath(os.path.expanduser(path))
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
335
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
336
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
337 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
338 entries = dict()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
339 for filename in files:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
340 try:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
341 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
342 f = open(path, "rb")
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
343 except IOError as err:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
344 if err.errno != errno.ENOENT:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
345 raise
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
346 if warn:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
347 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
348 continue
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
349
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
350 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
351 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
352 if line:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
353 entries[line] = filename
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
354
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
355 f.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
356 return entries
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
357
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
358
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
359 def parsettestcases(path):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
360 """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: 32311
diff changeset
361
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
362 If path does not exist, return an empty set.
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
363 """
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
364 cases = []
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
365 try:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
366 with open(path, 'rb') as f:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
367 for l in f:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
368 if l.startswith(b'#testcases '):
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
369 cases.append(sorted(l[11:].split()))
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
370 except IOError as ex:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
371 if ex.errno != errno.ENOENT:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
372 raise
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
373 return cases
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
374
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
375
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
376 def getparser():
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
377 """Obtain the OptionParser used by the CLI."""
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
378 parser = argparse.ArgumentParser(usage='%(prog)s [options] [tests]')
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
379
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
380 selection = parser.add_argument_group('Test Selection')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
381 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
382 '--allow-slow-tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
383 action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
384 help='allow extremely slow tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
385 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
386 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
387 "--blacklist",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
388 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
389 help="skip tests listed in the specified blacklist file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
390 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
391 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
392 "--changed",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
393 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
394 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
395 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
396 "-k", "--keywords", help="run tests matching keywords"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
397 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
398 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
399 "-r", "--retest", action="store_true", help="retest failed tests"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
400 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
401 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
402 "--test-list",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
403 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
404 help="read tests to run from the specified file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
405 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
406 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
407 "--whitelist",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
408 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
409 help="always run tests listed in the specified whitelist file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
410 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
411 selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
412 'tests', metavar='TESTS', nargs='*', help='Tests to run'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
413 )
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
414
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
415 harness = parser.add_argument_group('Test Harness Behavior')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
416 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
417 '--bisect-repo',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
418 metavar='bisect_repo',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
419 help=(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
420 "Path of a repo to bisect. Use together with " "--known-good-rev"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
421 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
422 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
423 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
424 "-d",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
425 "--debug",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
426 action="store_true",
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
427 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
428 " rather than capturing and diffing it (disables timeout)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
429 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
430 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
431 "-f",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
432 "--first",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
433 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
434 help="exit on the first test failure",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
435 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
436 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
437 "-i",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
438 "--interactive",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
439 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
440 help="prompt to accept changed output",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
441 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
442 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
443 "-j",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
444 "--jobs",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
445 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
446 help="number of jobs to run in parallel"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
447 " (default: $%s or %d)" % defaults['jobs'],
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 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
450 "--keep-tmpdir",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
451 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
452 help="keep temporary directory after running tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
453 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
454 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
455 '--known-good-rev',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
456 metavar="known_good_rev",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
457 help=(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
458 "Automatically bisect any failures using this "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
459 "revision as a known-good revision."
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
460 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
461 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
462 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
463 "--list-tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
464 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
465 help="list tests instead of running them",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
466 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
467 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
468 "--loop", action="store_true", help="loop tests repeatedly"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
469 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
470 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
471 '--random', action="store_true", help='run tests in random order'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
472 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
473 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
474 '--order-by-runtime',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
475 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
476 help='run slowest tests first, according to .testtimes',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
477 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
478 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
479 "-p",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
480 "--port",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
481 type=int,
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
482 help="port on which servers should listen"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
483 " (default: $%s or %d)" % defaults['port'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
484 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
485 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
486 '--profile-runner',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
487 action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
488 help='run statprof on run-tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
489 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
490 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
491 "-R", "--restart", action="store_true", help="restart at last error"
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 "--runs-per-test",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
495 type=int,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
496 dest="runs_per_test",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
497 help="run each test N times (default=1)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
498 default=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
499 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
500 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
501 "--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
502 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
503 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
504 '--showchannels', action='store_true', help='show scheduling channels'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
505 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
506 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
507 "--slowtimeout",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
508 type=int,
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
509 help="kill errant slow tests after SLOWTIMEOUT seconds"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
510 " (default: $%s or %d)" % defaults['slowtimeout'],
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 "-t",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
514 "--timeout",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
515 type=int,
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
516 help="kill errant tests after TIMEOUT seconds"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
517 " (default: $%s or %d)" % defaults['timeout'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
518 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
519 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
520 "--tmpdir",
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
521 help="run tests in the given temporary directory"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
522 " (implies --keep-tmpdir)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
523 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
524 harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
525 "-v", "--verbose", action="store_true", help="output verbose messages"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
526 )
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
527
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
528 hgconf = parser.add_argument_group('Mercurial Configuration')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
529 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
530 "--chg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
531 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
532 help="install and use chg wrapper in place of hg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
533 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
534 hgconf.add_argument("--compiler", help="compiler to build with")
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
535 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
536 '--extra-config-opt',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
537 action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
538 default=[],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
539 help='set the given config opt in the test hgrc',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
540 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
541 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
542 "-l",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
543 "--local",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
544 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
545 help="shortcut for --with-hg=<testdir>/../hg, "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
546 "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
547 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
548 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
549 "--ipv6",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
550 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
551 help="prefer IPv6 to IPv4 for network related tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
552 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
553 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
554 "--pure",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
555 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
556 help="use pure Python code instead of C extensions",
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 hgconf.add_argument(
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
559 "--rust",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
560 action="store_true",
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
561 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: 44488
diff changeset
562 )
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
563 hgconf.add_argument(
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
564 "--no-rust",
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
565 action="store_true",
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
566 help="do not use Rust code even if compiled",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
567 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
568 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
569 "--with-chg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
570 metavar="CHG",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
571 help="use specified chg wrapper in place of hg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
572 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
573 hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
574 "--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
575 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
576 help="test using specified hg script rather than a "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
577 "temporary installation",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
578 )
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
579
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
580 reporting = parser.add_argument_group('Results Reporting')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
581 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
582 "-C",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
583 "--annotate",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
584 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
585 help="output files annotated with coverage",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
586 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
587 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
588 "--color",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
589 choices=["always", "auto", "never"],
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
590 default=os.environ.get('HGRUNTESTSCOLOR', 'auto'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
591 help="colorisation: always|auto|never (default: auto)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
592 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
593 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
594 "-c",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
595 "--cover",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
596 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
597 help="print a test coverage report",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
598 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
599 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
600 '--exceptions',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
601 action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
602 help='log all exceptions and generate an exception report',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
603 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
604 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
605 "-H",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
606 "--htmlcov",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
607 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
608 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
609 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
610 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
611 "--json",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
612 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
613 help="store test result data in 'report.json' file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
614 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
615 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
616 "--outputdir",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
617 help="directory to write error logs to (default=test directory)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
618 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
619 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
620 "-n", "--nodiff", action="store_true", help="skip showing test changes"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
621 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
622 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
623 "-S",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
624 "--noskips",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
625 action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
626 help="don't report skip tests verbosely",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
627 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
628 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
629 "--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
630 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
631 reporting.add_argument("--view", help="external diff viewer")
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
632 reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
633 "--xunit", help="record xunit results at specified path"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
634 )
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
635
14201
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
636 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
637 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
638 parser.set_defaults(**defaults)
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
639
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
640 return parser
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
641
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
642
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
643 def parseargs(args, parser):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
644 """Parse arguments with our OptionParser and validate results."""
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
645 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
646
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
647 # 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
648 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
649 options.pure = True
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
650
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
651 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: 44488
diff changeset
652 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: 44488
diff changeset
653
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
654 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: 44488
diff changeset
655 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: 44488
diff changeset
656
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
657 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: 44488
diff changeset
658 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: 44488
diff changeset
659
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
660 if options.local:
42816
fb84730d1c5a run-tests: error out on `--local --with-[c]hg`
Martin von Zweigbergk <martinvonz@google.com>
parents: 42525
diff changeset
661 if options.with_hg or options.with_chg:
fb84730d1c5a run-tests: error out on `--local --with-[c]hg`
Martin von Zweigbergk <martinvonz@google.com>
parents: 42525
diff changeset
662 parser.error('--local cannot be used with --with-hg or --with-chg')
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
663 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
664 reporootdir = os.path.dirname(testdir)
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
665 pathandattrs = [(b'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
666 if options.chg:
6ce870dba6fa run-tests: make --local set --with-chg if --chg is used
Jun Wu <quark@fb.com>
parents: 29582
diff changeset
667 pathandattrs.append((b'contrib/chg/chg', 'with_chg'))
29582
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
668 for relpath, attr in pathandattrs:
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
669 binpath = os.path.join(reporootdir, relpath)
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
670 if os.name != 'nt' and not os.access(binpath, os.X_OK):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
671 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
672 '--local specified, but %r not found or '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
673 'not executable' % binpath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
674 )
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
675 setattr(options, attr, _bytes2sys(binpath))
42817
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
676
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
677 if options.with_hg:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
678 options.with_hg = canonpath(_sys2bytes(options.with_hg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
679 if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
680 os.path.isfile(options.with_hg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
681 and os.access(options.with_hg, os.X_OK)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
682 ):
42817
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
683 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: 42816
diff changeset
684 if os.path.basename(options.with_hg) not in [b'hg', b'hg.exe']:
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
685 sys.stderr.write('warning: --with-hg should specify an hg script\n')
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
686 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
687
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
688 if (options.chg or options.with_chg) and os.name == 'nt':
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
689 parser.error('chg does not work on %s' % os.name)
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
690 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
691 options.chg = False # no installation to temporary location
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
692 options.with_chg = canonpath(_sys2bytes(options.with_chg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
693 if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
694 os.path.isfile(options.with_chg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
695 and os.access(options.with_chg, os.X_OK)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
696 ):
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
697 parser.error('--with-chg must specify a chg executable')
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
698 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
699 # chg shares installation location with hg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
700 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
701 '--chg does not work when --with-hg is specified '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
702 '(use --with-chg instead)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
703 )
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
704
33567
d9677e2ed16a run-tests: warn if --color=always and no pygments installed
Martin von Zweigbergk <martinvonz@google.com>
parents: 33566
diff changeset
705 if options.color == 'always' and not pygmentspresent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
706 sys.stderr.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
707 'warning: --color=always ignored because '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
708 'pygments is not installed\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
709 )
33567
d9677e2ed16a run-tests: warn if --color=always and no pygments installed
Martin von Zweigbergk <martinvonz@google.com>
parents: 33566
diff changeset
710
34041
40313c63da87 run-tests: allow bisecting a different repo
Jun Wu <quark@fb.com>
parents: 34040
diff changeset
711 if options.bisect_repo and not options.known_good_rev:
40313c63da87 run-tests: allow bisecting a different repo
Jun Wu <quark@fb.com>
parents: 34040
diff changeset
712 parser.error("--bisect-repo cannot be used without --known-good-rev")
40313c63da87 run-tests: allow bisecting a different repo
Jun Wu <quark@fb.com>
parents: 34040
diff changeset
713
31011
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
714 global useipv6
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
715 if options.ipv6:
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
716 useipv6 = checksocketfamily('AF_INET6')
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
717 else:
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
718 # 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
719 useipv6 = (not checksocketfamily('AF_INET')) and checksocketfamily(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
720 'AF_INET6'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
721 )
31011
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
722
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
723 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
724 if options.anycoverage:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
725 try:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
726 import coverage
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
727
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
728 covver = version.StrictVersion(coverage.__version__).version
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
729 if covver < (3, 3):
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
730 parser.error('coverage options require coverage 3.3 or later')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
731 except ImportError:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
732 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
733
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
734 if options.anycoverage and options.local:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
735 # this needs some path mangling somewhere, I guess
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
736 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
737 "sorry, coverage options do not work when --local " "is specified"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
738 )
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
739
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
740 if options.anycoverage and options.with_hg:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
741 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
742 "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
743 )
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
744
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
745 global verbose
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
746 if options.verbose:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
747 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
748
9394
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
749 if options.tmpdir:
28644
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
750 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
751
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
752 if options.jobs < 1:
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
753 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
754 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
755 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
756 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
757 if options.timeout != defaults['timeout']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
758 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
759 if options.slowtimeout != defaults['slowtimeout']:
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
760 sys.stderr.write(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
761 'warning: --slowtimeout option ignored with --debug\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
762 )
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
763 options.timeout = 0
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
764 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
765
9959
b37b060d84c7 run-tests: add a "--blacklist target" option to skip predefined test lists
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9958
diff changeset
766 if options.blacklist:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
767 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
768 if options.whitelist:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
769 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
770 else:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
771 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
772
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
773 if options.showchannels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
774 options.nodiff = True
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
775
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
776 return options
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
777
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
778
5800
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
779 def rename(src, dst):
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
780 """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
781 for existing destination support.
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
782 """
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
783 shutil.copy(src, dst)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
784 os.remove(src)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
785
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
786
40987
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
787 def makecleanable(path):
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
788 """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
789 can be deleted"""
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
790 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
791 for d in dirnames:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
792 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
793 try:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
794 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
795 except OSError:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
796 pass
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
797
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
798
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
799 _unified_diff = difflib.unified_diff
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
800 if PYTHON3:
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
801 import functools
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
802
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
803 _unified_diff = functools.partial(difflib.diff_bytes, difflib.unified_diff)
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
804
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
805
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
806 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
807 servefail = False
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
808 lines = []
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
809 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
810 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
811 line = line.replace(b'\\', b'/')
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
812 if line.endswith(b' \n'):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
813 line = line[:-2] + b'\n'
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
814 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
815 if not servefail and line.startswith(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
816 b'+ abort: child process failed to start'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
817 ):
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
818 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
819
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
820 return servefail, lines
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
821
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
822
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
823 verbose = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
824
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
825
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
826 def vlog(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
827 """Log only when in verbose mode."""
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
828 if verbose is False:
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
829 return
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
830
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
831 return log(*msg)
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
832
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
833
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
834 # 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
835 # 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
836 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
837
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
838 # 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
839 # 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
840 #
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
841 # output..output (feature !)\n
41540
17a6e063c886 run-tests: use raw strings for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41495
diff changeset
842 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
843
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
844
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
845 def cdatasafe(data):
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
846 """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
847
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
848 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
849 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
850 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
851 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
852 """
25051
9c28f3236677 run-tests: do cdata escaping using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25050
diff changeset
853 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
854
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
855
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
856 def log(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
857 """Log something to stdout.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
858
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
859 Arguments are strings to print.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
860 """
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
861 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
862 if verbose:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
863 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
864 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
865 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
866 print()
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
867 sys.stdout.flush()
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
868
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
869
33930
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
870 def highlightdiff(line, color):
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
871 if not color:
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
872 return line
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
873 assert pygmentspresent
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
874 return pygments.highlight(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
875 line.decode('latin1'), difflexer, terminal256formatter
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
876 ).encode('latin1')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
877
33930
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
878
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
879 def highlightmsg(msg, color):
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
880 if not color:
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
881 return msg
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
882 assert pygmentspresent
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
883 return pygments.highlight(msg, runnerlexer, runnerformatter)
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
884
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
885
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
886 def terminate(proc):
32303
dc131b9772f2 run-tests: drop fallback for proc.terminate() for pre-py2.6
Martin von Zweigbergk <martinvonz@google.com>
parents: 32302
diff changeset
887 """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
888 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
889 try:
32303
dc131b9772f2 run-tests: drop fallback for proc.terminate() for pre-py2.6
Martin von Zweigbergk <martinvonz@google.com>
parents: 32302
diff changeset
890 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
891 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
892 pass
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
893
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
894
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
895 def killdaemons(pidfile):
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
896 import killdaemons as killmod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
897
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
898 return killmod.killdaemons(pidfile, tryhard=False, remove=True, logfn=vlog)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
899
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
900
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
901 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
902 """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
903
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
904 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
905 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
906 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
907 """
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
908
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
909 # 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
910 SKIPPED_STATUS = 80
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
911
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
912 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
913 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
914 path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
915 outputdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
916 tmpdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
917 keeptmpdir=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
918 debug=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
919 first=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
920 timeout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
921 startport=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
922 extraconfigopts=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
923 shell=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
924 hgcommand=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
925 slowtimeout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
926 usechg=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
927 useipv6=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
928 ):
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
929 """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
930
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
931 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
932
21504
888a5dfe1569 run-tests: pass temp dir into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21502
diff changeset
933 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
934
21509
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
935 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
936 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
937
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
938 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
939 output.
21511
3ec3e81a4110 run-tests: move diff options into arguments of Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21510
diff changeset
940
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
941 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
942 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
943
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
944 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
945
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
946 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
947 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
948 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
949 instances.
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
950
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
951 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
952 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
953 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
954
21517
af7d3a5c330b run-tests: move shell to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21516
diff changeset
955 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
956 """
34264
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
957 if timeout is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
958 timeout = defaults['timeout']
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
959 if startport is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
960 startport = defaults['port']
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
961 if slowtimeout is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
962 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
963 self.path = path
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
964 self.bname = os.path.basename(path)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
965 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
966 self._testdir = os.path.dirname(path)
32716
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32715
diff changeset
967 self._outputdir = outputdir
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
968 self._tmpname = os.path.basename(path)
32716
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32715
diff changeset
969 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
970
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
971 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
972 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
973 self._debug = debug
35541
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
974 self._first = first
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
975 self._timeout = timeout
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
976 self._slowtimeout = slowtimeout
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
977 self._startport = startport
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
978 self._extraconfigopts = extraconfigopts or []
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
979 self._shell = _sys2bytes(shell)
28099
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
980 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
981 self._usechg = usechg
31003
225f574e0645 runtests: export HGIPV6 to hint test scripts whether to use IPv6
Jun Wu <quark@fb.com>
parents: 31002
diff changeset
982 self._useipv6 = useipv6
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
983
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
984 self._aborted = False
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
985 self._daemonpids = []
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
986 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
987 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
988 self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
989 self._skipped = None
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
990 self._testtmp = None
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
991 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
992
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
993 self._refout = self.readrefout()
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
994
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
995 def readrefout(self):
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
996 """read reference output"""
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
997 # 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
998 # check test output against it.
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
999 if self._debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1000 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
1001 elif os.path.exists(self.refpath):
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
1002 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: 32943
diff changeset
1003 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
1004 else:
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
1005 return []
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
1006
24965
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1007 # 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
1008 @property
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1009 def _testMethodName(self):
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1010 return self.name
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
1011
21463
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
1012 def __str__(self):
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
1013 return self.name
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
1014
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1015 def shortDescription(self):
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1016 return self.name
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1017
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1018 def setUp(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1019 """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
1020 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
1021 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
1022 self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
1023 self._skipped = None
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1024
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1025 try:
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1026 os.mkdir(self._threadtmp)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1027 except OSError as e:
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1028 if e.errno != errno.EEXIST:
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1029 raise
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1030
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1031 name = self._tmpname
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1032 self._testtmp = os.path.join(self._threadtmp, name)
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1033 os.mkdir(self._testtmp)
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1034
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
1035 # 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
1036 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
1037 try:
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1038 os.remove(self.errpath)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1039 except OSError as e:
24332
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1040 # We might have raced another test to clean up a .err
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1041 # file, so ignore ENOENT when removing a previous .err
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1042 # file.
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1043 if e.errno != errno.ENOENT:
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
1044 raise
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
1045
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1046 if self._usechg:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1047 self._chgsockdir = os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1048 self._threadtmp, b'%s.chgsock' % name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1049 )
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1050 os.mkdir(self._chgsockdir)
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1051
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1052 def run(self, result):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1053 """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
1054 # 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
1055 # 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
1056 # function can largely go away.
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1057 self._result = result
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1058 result.startTest(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1059 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1060 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1061 self.setUp()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1062 except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1063 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1064 raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1065 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1066 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1067 return
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1068
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1069 success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1070 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1071 self.runTest()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1072 except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1073 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1074 raise
32932
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32907
diff changeset
1075 except unittest.SkipTest as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1076 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
1077 # 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
1078 # 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
1079 # 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
1080 result.testsRun -= 1
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
1081 except self.failureException as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1082 # 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
1083 # 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
1084 # 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
1085 # 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
1086 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
1087 success = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1088 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1089 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1090 else:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1091 success = True
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1092
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1093 try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1094 self.tearDown()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1095 except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1096 self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1097 raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1098 except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1099 result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1100 success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1101
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1102 if success:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1103 result.addSuccess(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1104 finally:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1105 result.stopTest(self, interrupted=self._aborted)
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1106
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
1107 def runTest(self):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
1108 """Run this test instance.
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
1109
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
1110 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
1111 """
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1112 env = self._getenv()
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1113 self._genrestoreenv(env)
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
1114 self._daemonpids.append(env['DAEMON_PIDS'])
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
1115 self._createhgrc(env['HGRCPATH'])
21300
a2774731a51a run-tests: move createhgrc() call into Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21299
diff changeset
1116
21435
f376f56a354e run-tests: rename Test._test to Test.name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21434
diff changeset
1117 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
1118
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1119 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
1120 self._finished = True
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
1121 self._ret = ret
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
1122 self._out = out
21305
d7a7825ff2cf run-tests: capture execution results in a TestResult class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21304
diff changeset
1123
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1124 def describe(ret):
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1125 if ret < 0:
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1126 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
1127 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
1128
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
1129 self._skipped = False
21336
45ab0668d1b2 run-tests: remove remaining uses of TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21335
diff changeset
1130
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
1131 if ret == self.SKIPPED_STATUS:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1132 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
1133 missing = ['unknown']
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1134 failed = None
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1135 else:
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
1136 missing, failed = TTest.parsehghaveoutput(out)
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1137
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1138 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
1139 missing = ['skipped']
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1140
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1141 if failed:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1142 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
1143 else:
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
1144 self._skipped = True
32932
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32907
diff changeset
1145 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
1146 elif ret == 'timeout':
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1147 self.fail('timed out')
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
1148 elif ret is False:
32934
6123a5267119 tests: remove WarnTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32933
diff changeset
1149 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
1150 elif out != self._refout:
21614
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
1151 # Diff generation may rely on written .err file.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1152 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1153 (ret != 0 or out != self._refout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1154 and not self._skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1155 and not self._debug
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1156 ):
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1157 with open(self.errpath, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1158 for line in out:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1159 f.write(line)
21614
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
1160
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1161 # The result object handles diff calculation for us.
35541
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
1162 with firstlock:
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
1163 if self._result.addOutputMismatch(self, ret, out, self._refout):
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
1164 # change was accepted, skip failing
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
1165 return
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
1166 if self._first:
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
1167 global firsterror
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
1168 firsterror = True
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1169
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1170 if ret:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1171 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
1172 else:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1173 msg = 'output changed'
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
1174
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1175 self.fail(msg)
21327
206814c9072a run-tests: move remaining result processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21326
diff changeset
1176 elif ret:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1177 self.fail(describe(ret))
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
1178
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1179 def tearDown(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
1180 """Tasks to perform after run()."""
21456
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1181 for entry in self._daemonpids:
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1182 killdaemons(entry)
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1183 self._daemonpids = []
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
1184
26422
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
1185 if self._keeptmpdir:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1186 log(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1187 '\nKeeping testtmp dir: %s\nKeeping threadtmp dir: %s'
44468
408a4eb41453 tests: avoid implicit bytes -> unicode -> bytes roundtrip on Python 2
Manuel Jacob <me@manueljacob.de>
parents: 44452
diff changeset
1188 % (_bytes2sys(self._testtmp), _bytes2sys(self._threadtmp),)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1189 )
26422
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
1190 else:
40987
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1191 try:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1192 shutil.rmtree(self._testtmp)
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1193 except OSError:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1194 # 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
1195 # and try again
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1196 makecleanable(self._testtmp)
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
1197 shutil.rmtree(self._testtmp, True)
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
1198 shutil.rmtree(self._threadtmp, True)
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1199
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1200 if self._usechg:
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1201 # 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
1202 # files are deleted
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1203 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
1204
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1205 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1206 (self._ret != 0 or self._out != self._refout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1207 and not self._skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1208 and not self._debug
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1209 and self._out
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1210 ):
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1211 with open(self.errpath, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1212 for line in self._out:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1213 f.write(line)
21455
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
1214
24926
3fe1e07f1a32 run-test: include test name in the return vlog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24811
diff changeset
1215 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
1216
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1217 def _run(self, env):
21339
de25e968b4d8 run-tests: refactor runone() into gettest() and scheduletests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21338
diff changeset
1218 # This should be implemented in child classes to run tests.
32932
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32907
diff changeset
1219 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
1220
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1221 def abort(self):
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1222 """Terminate execution of this test."""
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1223 self._aborted = True
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1224
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1225 def _portmap(self, i):
28284
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
1226 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
1227 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
1228
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1229 def _getreplacements(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1230 """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
1231
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1232 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
1233 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
1234 occur.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1235 """
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1236 r = [
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1237 # This list should be parallel to defineport in _getenv
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1238 self._portmap(0),
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1239 self._portmap(1),
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1240 self._portmap(2),
31008
636cf3f7620d tests: use LOCALIP
Jun Wu <quark@fb.com>
parents: 31006
diff changeset
1241 (br'([^0-9])%s' % re.escape(self._localip()), br'\1$LOCALIP'),
31741
728d37353e1e run-tests: auto-replace 'TXNID' output
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31673
diff changeset
1242 (br'\bHG_TXNID=TXN:[a-f0-9]{40}\b', br'HG_TXNID=TXN:$ID$'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1243 ]
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1244 r.append((self._escapepath(self._testtmp), b'$TESTTMP'))
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1245
35194
779c6cf2967b run-tests: avoid calculating _testdir again
Martin von Zweigbergk <martinvonz@google.com>
parents: 35193
diff changeset
1246 replacementfile = os.path.join(self._testdir, b'common-pattern.py')
35069
4fb489a998c9 run-tests: allow to register any arbitrary pattern for replacement
Boris Feld <boris.feld@octobus.net>
parents: 35066
diff changeset
1247
4fb489a998c9 run-tests: allow to register any arbitrary pattern for replacement
Boris Feld <boris.feld@octobus.net>
parents: 35066
diff changeset
1248 if os.path.exists(replacementfile):
4fb489a998c9 run-tests: allow to register any arbitrary pattern for replacement
Boris Feld <boris.feld@octobus.net>
parents: 35066
diff changeset
1249 data = {}
35092
1ac4c0887de4 run-test: drop 'execfile' usage for 'common-pattern.py' file
Boris Feld <boris.feld@octobus.net>
parents: 35091
diff changeset
1250 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: 35091
diff changeset
1251 # 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: 35091
diff changeset
1252 code = compile(source.read(), replacementfile, 'exec')
1ac4c0887de4 run-test: drop 'execfile' usage for 'common-pattern.py' file
Boris Feld <boris.feld@octobus.net>
parents: 35091
diff changeset
1253 exec(code, data)
35991
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
1254 for value in data.get('substitutions', ()):
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
1255 if len(value) != 2:
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
1256 msg = 'malformatted substitution in %s: %r'
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
1257 msg %= (replacementfile, value)
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
1258 raise ValueError(msg)
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
1259 r.append(value)
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1260 return r
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1261
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1262 def _escapepath(self, p):
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1263 if os.name == 'nt':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1264 return b''.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1265 c.isalpha()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1266 and b'[%s%s]' % (c.lower(), c.upper())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1267 or c in b'/\\'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1268 and br'[/\\]'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1269 or c.isdigit()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1270 and c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1271 or b'\\' + c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1272 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
1273 )
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1274 else:
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
1275 return re.escape(p)
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
1276
31006
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1277 def _localip(self):
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1278 if self._useipv6:
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1279 return b'::1'
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1280 else:
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1281 return b'127.0.0.1'
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1282
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1283 def _genrestoreenv(self, testenv):
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1284 """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: 33115
diff changeset
1285 environment."""
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1286 # Put the restoreenv script inside self._threadtmp
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1287 scriptpath = os.path.join(self._threadtmp, b'restoreenv.sh')
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1288 testenv['HGTEST_RESTOREENV'] = _bytes2sys(scriptpath)
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1289
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1290 # Only restore environment variable names that the shell allows
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1291 # us to export.
33140
f458a6701983 tests: fix variable name regular expression in _genrestoreenv()
Adam Simpkins <simpkins@fb.com>
parents: 33126
diff changeset
1292 name_regex = re.compile('^[a-zA-Z][a-zA-Z0-9_]*$')
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1293
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
1294 # 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: 33140
diff changeset
1295 reqnames = {'PYTHON', 'TESTDIR', 'TESTTMP'}
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
1296
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1297 with open(scriptpath, 'w') as envf:
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
1298 for name, value in origenviron.items():
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1299 if not name_regex.match(name):
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1300 # Skip environment variables with unusual names not
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1301 # allowed by most shells.
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1302 continue
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
1303 if name in reqnames:
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
1304 continue
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1305 envf.write('%s=%s\n' % (name, shellquote(value)))
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1306
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1307 for name in testenv:
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
1308 if name in origenviron or name in reqnames:
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1309 continue
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1310 envf.write('unset %s\n' % (name,))
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
1311
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
1312 def _getenv(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1313 """Obtain environment variables to use during test execution."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1314
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1315 def defineport(i):
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1316 offset = '' if i == 0 else '%s' % i
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1317 env["HGPORT%s" % offset] = '%s' % (self._startport + i)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1318
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1319 env = os.environ.copy()
35540
f948c5b3f5c9 run-tests: avoid set PYTHONUSERBASE environment variable to None
Mihai Popescu <mihai@unity3d.com>
parents: 34842
diff changeset
1320 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
1321 env['HGEMITWARNINGS'] = '1'
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1322 env['TESTTMP'] = _bytes2sys(self._testtmp)
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
1323 env['TESTNAME'] = self.name
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1324 env['HOME'] = _bytes2sys(self._testtmp)
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1325 # This number should match portneeded in _getport
28170
bc010fcd836b run-tests: stop allocating HGPORT3+HGPORT4
timeless <timeless@mozdev.org>
parents: 28169
diff changeset
1326 for port in xrange(3):
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1327 # This list should be parallel to _portmap in _getreplacements
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
1328 defineport(port)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1329 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: 44447
diff changeset
1330 env["DAEMON_PIDS"] = _bytes2sys(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1331 os.path.join(self._threadtmp, b'daemon.pids')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1332 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1333 env["HGEDITOR"] = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1334 '"' + sysexecutable + '"' + ' -c "import sys; sys.exit(0)"'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1335 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1336 env["HGUSER"] = "test"
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1337 env["HGENCODING"] = "ascii"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1338 env["HGENCODINGMODE"] = "strict"
39119
1f987f7c832b tests: force a stable hostname in patchbomb tests
Augie Fackler <raf@durin42.com>
parents: 38934
diff changeset
1339 env["HGHOSTNAME"] = "test-hostname"
31003
225f574e0645 runtests: export HGIPV6 to hint test scripts whether to use IPv6
Jun Wu <quark@fb.com>
parents: 31002
diff changeset
1340 env['HGIPV6'] = str(int(self._useipv6))
40491
c311424ea579 catapult: add a bit more documentation on how to use catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40490
diff changeset
1341 # See contrib/catapipe.py for how to use this functionality.
40490
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40489
diff changeset
1342 if 'HGTESTCATAPULTSERVERPIPE' not in env:
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40489
diff changeset
1343 # 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: 40489
diff changeset
1344 # non-test one in as a default, otherwise set to devnull
41759
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41758
diff changeset
1345 env['HGTESTCATAPULTSERVERPIPE'] = env.get(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1346 'HGCATAPULTSERVERPIPE', os.devnull
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1347 )
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1348
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1349 extraextensions = []
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1350 for opt in self._extraconfigopts:
44449
ff72bd52d56a tests: avoid implicit conversion of str to unicode
Manuel Jacob <me@manueljacob.de>
parents: 44448
diff changeset
1351 section, key = _sys2bytes(opt).split(b'.', 1)
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1352 if section != 'extensions':
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1353 continue
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1354 name = key.split(b'=', 1)[0]
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1355 extraextensions.append(name)
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1356
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1357 if extraextensions:
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1358 env['HGTESTEXTRAEXTENSIONS'] = b' '.join(extraextensions)
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
1359
31006
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1360 # 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: 31003
diff changeset
1361 # IP addresses.
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1362 env['LOCALIP'] = _bytes2sys(self._localip())
31006
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
1363
40981
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40976
diff changeset
1364 # 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: 40976
diff changeset
1365 # 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: 40976
diff changeset
1366 # dummysmtpd.py, and dumbhttp.py.
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40976
diff changeset
1367 if PYTHON3 and os.name == 'nt':
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40976
diff changeset
1368 env['PYTHONLEGACYWINDOWSSTDIO'] = '1'
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40976
diff changeset
1369
43819
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1370 # 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: 43801
diff changeset
1371 # 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: 43801
diff changeset
1372 # present and these variables aren't already defined.
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1373 cargo_home_path = os.path.expanduser('~/.cargo')
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1374 rustup_home_path = os.path.expanduser('~/.rustup')
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1375
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1376 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: 43801
diff changeset
1377 env['CARGO_HOME'] = cargo_home_path
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1378 if (
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1379 os.path.exists(rustup_home_path)
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1380 and b'RUSTUP_HOME' not in osenvironb
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1381 ):
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1382 env['RUSTUP_HOME'] = rustup_home_path
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
1383
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1384 # 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
1385 # the tests produce repeatable output.
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1386 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
1387 env['TZ'] = 'GMT'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1388 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
1389 env['COLUMNS'] = '80'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1390 env['TERM'] = 'xterm'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1391
40469
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1392 dropped = [
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1393 'CDPATH',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1394 'CHGDEBUG',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1395 'EDITOR',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1396 'GREP_OPTIONS',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1397 'HG',
40470
d6b6f1b441cf run-tests: define the default merge tool through configuration
Boris Feld <boris.feld@octobus.net>
parents: 40469
diff changeset
1398 'HGMERGE',
40469
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1399 'HGPLAIN',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1400 'HGPLAINEXCEPT',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1401 'HGPROF',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1402 'http_proxy',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1403 'no_proxy',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1404 'NO_PROXY',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1405 'PAGER',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1406 'VISUAL',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1407 ]
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1408
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
1409 for k in dropped:
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1410 if k in env:
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1411 del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1412
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1413 # unset env related to hooks
36522
c3df20906689 tests: fix run-tests environment cleanup on Python 3
Augie Fackler <augie@google.com>
parents: 36462
diff changeset
1414 for k in list(env):
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1415 if k.startswith('HG_'):
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1416 del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1417
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1418 if self._usechg:
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1419 env['CHGSOCKNAME'] = os.path.join(self._chgsockdir, b'server')
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
1420
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1421 return env
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
1422
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
1423 def _createhgrc(self, path):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
1424 """Create an hgrc file for this test."""
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1425 with open(path, 'wb') as hgrc:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1426 hgrc.write(b'[ui]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1427 hgrc.write(b'slash = True\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1428 hgrc.write(b'interactive = False\n')
40470
d6b6f1b441cf run-tests: define the default merge tool through configuration
Boris Feld <boris.feld@octobus.net>
parents: 40469
diff changeset
1429 hgrc.write(b'merge = internal:merge\n')
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1430 hgrc.write(b'mergemarkers = detailed\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1431 hgrc.write(b'promptecho = True\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1432 hgrc.write(b'[defaults]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1433 hgrc.write(b'[devel]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1434 hgrc.write(b'all-warnings = true\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1435 hgrc.write(b'default-date = 0 0\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1436 hgrc.write(b'[largefiles]\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1437 hgrc.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1438 b'usercache = %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1439 % (os.path.join(self._testtmp, b'.cache/largefiles'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1440 )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1441 hgrc.write(b'[lfs]\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1442 hgrc.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1443 b'usercache = %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1444 % (os.path.join(self._testtmp, b'.cache/lfs'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1445 )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1446 hgrc.write(b'[web]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1447 hgrc.write(b'address = localhost\n')
44446
109322cd322a tests: avoid implicit conversion of str to unicode
Manuel Jacob <me@manueljacob.de>
parents: 44144
diff changeset
1448 hgrc.write(b'ipv6 = %r\n' % self._useipv6)
37009
5890e5872f36 hgweb: allow defining Server response header for HTTP server
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36677
diff changeset
1449 hgrc.write(b'server-header = testing stub value\n')
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1451 for opt in self._extraconfigopts:
44449
ff72bd52d56a tests: avoid implicit conversion of str to unicode
Manuel Jacob <me@manueljacob.de>
parents: 44448
diff changeset
1452 section, key = _sys2bytes(opt).split(b'.', 1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1453 assert b'=' in key, (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1454 'extra config opt %s must ' 'have an = for assignment' % opt
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1455 )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1456 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
1457
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
1458 def fail(self, msg):
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
1459 # 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
1460 # 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
1461 raise AssertionError(msg)
21323
a7c677e2f6ae run-tests: move fail() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21322
diff changeset
1462
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1463 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
1464 """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
1465 stderr).
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1466
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1467 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
1468 """
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
1469 if self._debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1470 proc = subprocess.Popen(
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1471 _bytes2sys(cmd),
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1472 shell=True,
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1473 cwd=_bytes2sys(self._testtmp),
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1474 env=env,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1475 )
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1476 ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1477 return (ret, None)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1478
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
1479 proc = Popen4(cmd, self._testtmp, self._timeout, env)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1480
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1481 def cleanup():
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1482 terminate(proc)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1483 ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1484 if ret == 0:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1485 ret = signal.SIGTERM << 8
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1486 killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1487 return ret
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1488
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1489 proc.tochild.close()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1490
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1491 try:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1492 output = proc.fromchild.read()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1493 except KeyboardInterrupt:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1494 vlog('# Handling keyboard interrupt')
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1495 cleanup()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1496 raise
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1497
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1498 ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
1499 if wifexited(ret):
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1500 ret = os.WEXITSTATUS(ret)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1501
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1502 if proc.timeout:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1503 ret = 'timeout'
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1504
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1505 if ret:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1506 killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1507
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1508 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
1509 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
1510
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
1511 if normalizenewlines:
39706
030d558c6456 py3: add a missing b'' for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39663
diff changeset
1512 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
1513
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1514 return ret, output.splitlines(True)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
1515
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1516
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1517 class PythonTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1518 """A Python-based test."""
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1519
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1520 @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1521 def refpath(self):
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
1522 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
1523
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1524 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
1525 # Quote the python(3) executable for Windows
44144
bd0de73cf810 run-tests: remove --py3-warnings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44021
diff changeset
1526 cmd = b'"%s" "%s"' % (PYTHON, self.path)
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
1527 vlog("# Running", cmd.decode("utf-8"))
24510
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
1528 normalizenewlines = os.name == 'nt'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1529 result = self._runcommand(cmd, env, normalizenewlines=normalizenewlines)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1530 if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1531 raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1532
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1533 return result
21311
f9a7018a35ff run-tests: roll pytest() into PythonTest._run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21310
diff changeset
1534
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1535
29518
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
1536 # 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
1537 # 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
1538 # 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
1539 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
1540 # 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
1541 # better.
25059
0e0f1068b878 run-tests: fix checking a line to see if it needs globbing
Augie Fackler <augie@google.com>
parents: 25058
diff changeset
1542 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
1543 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
1544 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
1545 # 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
1546 # so we always glob that too.
31673
6a2959acae1a runtests: change local IP glob pattern from "127.0.0.1" to "$LOCALIP"
Jun Wu <quark@fb.com>
parents: 31635
diff changeset
1547 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
1548 ]
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
1549
25036
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
1550 bchr = chr
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
1551 if PYTHON3:
25036
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
1552 bchr = lambda x: bytes([x])
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
1553
42866
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42817
diff changeset
1554 WARN_UNDEFINED = 1
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42817
diff changeset
1555 WARN_YES = 2
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42817
diff changeset
1556 WARN_NO = 3
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42817
diff changeset
1557
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
1558 MARK_OPTIONAL = b" (?)\n"
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
1559
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1560
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
1561 def isoptional(line):
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
1562 return line.endswith(MARK_OPTIONAL)
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
1563
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1564
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1565 class TTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
1566 """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
1567
28284
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
1568 SKIPPED_PREFIX = b'skipped: '
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
1569 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
1570 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
1571
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1572 ESCAPESUB = re.compile(br'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44449
diff changeset
1573 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
1574 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
1575
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1576 def __init__(self, path, *args, **kwds):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1577 # accept an extra "case" parameter
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1578 case = kwds.pop('case', [])
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1579 self._case = case
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1580 self._allcases = {x for y in parsettestcases(path) for x in y}
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1581 super(TTest, self).__init__(path, *args, **kwds)
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1582 if case:
38934
35180ade80c1 tests: fix bytes/str issues in run-tests.py caught by python3
Augie Fackler <augie@google.com>
parents: 38824
diff changeset
1583 casepath = b'#'.join(case)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
1584 self.name = '%s#%s' % (self.name, _bytes2sys(casepath))
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1585 self.errpath = b'%s#%s.err' % (self.errpath[:-4], casepath)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1586 self._tmpname += b'-%s' % casepath
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
1587 self._have = {}
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1588
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
1589 @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
1590 def refpath(self):
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1591 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
1592
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1593 def _run(self, env):
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1594 with open(self.path, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1595 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
1596
32981
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32980
diff changeset
1597 # .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: 32980
diff changeset
1598 # 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: 32980
diff changeset
1599 # 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: 32980
diff changeset
1600 if self._refout is not None:
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32980
diff changeset
1601 self._refout = lines
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32980
diff changeset
1602
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1603 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
1604
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1605 # 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
1606 fname = b'%s.sh' % self._testtmp
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1607 with open(fname, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1608 for l in script:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
1609 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
1610
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1611 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
1612 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
1613
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
1614 exitcode, output = self._runcommand(cmd, env)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1615
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1616 if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1617 raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
1618
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
1619 # 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
1620 # 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
1621 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
1622 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
1623
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1624 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
1625
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1626 def _hghave(self, reqs):
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
1627 allreqs = b' '.join(reqs)
41803
bc1c1435a874 runtest: move slow timeout process earlier in the `_hghave` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41802
diff changeset
1628
bc1c1435a874 runtest: move slow timeout process earlier in the `_hghave` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41802
diff changeset
1629 self._detectslow(reqs)
bc1c1435a874 runtest: move slow timeout process earlier in the `_hghave` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41802
diff changeset
1630
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
1631 if allreqs in self._have:
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
1632 return self._have.get(allreqs)
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
1633
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1634 # TODO do something smarter when all other uses of hghave are gone.
44471
fb7da4759a18 run-tests: fix conditional when tests are run outside of `tests`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44451
diff changeset
1635 runtestdir = osenvironb[b'RUNTESTDIR']
25728
905c32321cfb run-tests.py: execute hghave by the path relative to run-tests.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25388
diff changeset
1636 tdir = runtestdir.replace(b'\\', b'/')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1637 proc = Popen4(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1638 b'%s -c "%s/hghave %s"' % (self._shell, tdir, allreqs),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1639 self._testtmp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1640 0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1641 self._getenv(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1642 )
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1643 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
1644 ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
1645 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
1646 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
1647 if ret == 2:
28699
5cc59dbd199f py3: convert hghave output to text
timeless <timeless@mozdev.org>
parents: 28698
diff changeset
1648 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
1649 sys.exit(1)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1650
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1651 if ret != 0:
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
1652 self._have[allreqs] = (False, stdout)
27564
80b53082a353 run-tests: report missing feature for skipped tests
timeless <timeless@mozdev.org>
parents: 27396
diff changeset
1653 return False, stdout
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
1654
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
1655 self._have[allreqs] = (True, None)
27564
80b53082a353 run-tests: report missing feature for skipped tests
timeless <timeless@mozdev.org>
parents: 27396
diff changeset
1656 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
1657
41802
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41801
diff changeset
1658 def _detectslow(self, reqs):
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41801
diff changeset
1659 """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: 41801
diff changeset
1660 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: 41801
diff changeset
1661 self._timeout = self._slowtimeout
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41801
diff changeset
1662
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1663 def _iftest(self, args):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1664 # implements "#if"
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1665 reqs = []
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1666 for arg in args:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1667 if arg.startswith(b'no-') and arg[3:] in self._allcases:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1668 if arg[3:] in self._case:
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1669 return False
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1670 elif arg in self._allcases:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1671 if arg not in self._case:
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1672 return False
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1673 else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1674 reqs.append(arg)
41804
4cbccb50df46 runtest: also update slow test timeout during `#if` clauses
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41803
diff changeset
1675 self._detectslow(reqs)
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1676 return self._hghave(reqs)[0]
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1677
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
1678 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
1679 # 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
1680 # 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
1681 # 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
1682 salt = b"SALT%d" % time.time()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1683
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1684 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
1685 if inpython:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1686 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
1687 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
1688 script.append(b'echo %s %d $?\n' % (salt, line))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1689
40489
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40488
diff changeset
1690 activetrace = []
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1691 session = str(uuid.uuid4())
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1692 if PYTHON3:
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1693 session = session.encode('ascii')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1694 hgcatapult = os.getenv('HGTESTCATAPULTSERVERPIPE') or os.getenv(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1695 'HGCATAPULTSERVERPIPE'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1696 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1697
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1698 def toggletrace(cmd=None):
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1699 if not hgcatapult or hgcatapult == os.devnull:
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1700 return
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1701
40489
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40488
diff changeset
1702 if activetrace:
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1703 script.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1704 b'echo END %s %s >> "$HGTESTCATAPULTSERVERPIPE"\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1705 % (session, activetrace[0])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1706 )
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1707 if cmd is None:
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1708 return
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1709
39396
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
1710 if isinstance(cmd, str):
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
1711 quoted = shellquote(cmd.strip())
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
1712 else:
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
1713 quoted = shellquote(cmd.strip().decode('utf8')).encode('utf8')
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
1714 quoted = quoted.replace(b'\\', b'\\\\')
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1715 script.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1716 b'echo START %s %s >> "$HGTESTCATAPULTSERVERPIPE"\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1717 % (session, quoted)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1718 )
40489
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40488
diff changeset
1719 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
1720
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1721 script = []
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1722
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1723 # 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
1724 # 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
1725 # 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
1726 # 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
1727 after = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1728
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1729 # 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
1730 expected = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1731
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1732 pos = prepos = -1
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1733
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1734 # True or False when in a true or false conditional section
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1735 skipping = None
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1736
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1737 # 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
1738 # 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
1739 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1740
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
1741 if self._debug:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1742 script.append(b'set -x\n')
28099
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
1743 if self._hgcommand != b'hg':
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
1744 script.append(b'alias hg="%s"\n' % self._hgcommand)
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1745 if os.getenv('MSYSTEM'):
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1746 script.append(b'alias pwd="pwd -W"\n')
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1747
39379
b64d36e5ca31 run-tests: replace '/dev/null' with os.devnull for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39289
diff changeset
1748 if hgcatapult and hgcatapult != os.devnull:
42525
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1749 if PYTHON3:
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1750 hgcatapult = hgcatapult.encode('utf8')
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1751 cataname = self.name.encode('utf8')
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1752 else:
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1753 cataname = self.name
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1754
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1755 # 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: 39119
diff changeset
1756 # 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: 39119
diff changeset
1757 # 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: 39119
diff changeset
1758 # 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: 39119
diff changeset
1759 script.append(
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1760 b'rtendtracing() {\n'
40490
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40489
diff changeset
1761 b' echo END %(session)s %(name)s >> %(catapult)s\n'
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1762 b' rm -f "$TESTTMP/.still-running"\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1763 b'}\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1764 b'trap "rtendtracing" 0\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1765 b'touch "$TESTTMP/.still-running"\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1766 b'while [ -f "$TESTTMP/.still-running" ]; do sleep 1; done '
40490
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40489
diff changeset
1767 b'> %(catapult)s &\n'
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1768 b'HGCATAPULTSESSION=%(session)s ; export HGCATAPULTSESSION\n'
40490
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40489
diff changeset
1769 b'echo START %(session)s %(name)s >> %(catapult)s\n'
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1770 % {
42525
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1771 b'name': cataname,
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1772 b'session': session,
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
1773 b'catapult': hgcatapult,
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1774 }
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1775 )
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1776
35536
f04d16bef2c7 tests: make #testcase available as env var in test
Martin von Zweigbergk <martinvonz@google.com>
parents: 35489
diff changeset
1777 if self._case:
38934
35180ade80c1 tests: fix bytes/str issues in run-tests.py caught by python3
Augie Fackler <augie@google.com>
parents: 38824
diff changeset
1778 casestr = b'#'.join(self._case)
44451
9803b374389a tests: fix isinstance test of wrong variable
Manuel Jacob <me@manueljacob.de>
parents: 44021
diff changeset
1779 if isinstance(casestr, str):
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1780 quoted = shellquote(casestr)
35823
4be991331a46 tests: get run-tests to reliably hand shellquote a string and not a bytes
Augie Fackler <augie@google.com>
parents: 35751
diff changeset
1781 else:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
1782 quoted = shellquote(casestr.decode('utf8')).encode('utf8')
35823
4be991331a46 tests: get run-tests to reliably hand shellquote a string and not a bytes
Augie Fackler <augie@google.com>
parents: 35751
diff changeset
1783 script.append(b'TESTCASE=%s\n' % quoted)
35536
f04d16bef2c7 tests: make #testcase available as env var in test
Martin von Zweigbergk <martinvonz@google.com>
parents: 35489
diff changeset
1784 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
1785
28812
f1de5a612a74 run-tests: handle empty tests
timeless <timeless@mozdev.org>
parents: 28701
diff changeset
1786 n = 0
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1787 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
1788 if not l.endswith(b'\n'):
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1789 l += b'\n'
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1790 if l.startswith(b'#require'):
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
1791 lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1792 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
1793 after.setdefault(pos, []).append(
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
1794 b' !!! invalid #require\n'
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
1795 )
36677
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
1796 if not skipping:
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
1797 haveresult, message = self._hghave(lsplit[1:])
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
1798 if not haveresult:
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
1799 script = [b'echo "%s"\nexit 80\n' % message]
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
1800 break
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
1801 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1802 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
1803 lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1804 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
1805 after.setdefault(pos, []).append(b' !!! invalid #if\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1806 if skipping is not None:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
1807 after.setdefault(pos, []).append(b' !!! nested #if\n')
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
1808 skipping = not 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
1809 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1810 elif l.startswith(b'#else'):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1811 if skipping is None:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
1812 after.setdefault(pos, []).append(b' !!! missing #if\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1813 skipping = not skipping
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1814 after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
1815 elif l.startswith(b'#endif'):
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1816 if skipping is None:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
1817 after.setdefault(pos, []).append(b' !!! missing #if\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1818 skipping = None
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1819 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
1820 elif skipping:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1821 after.setdefault(pos, []).append(l)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1822 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
1823 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
1824 prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1825 pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1826 if not inpython:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1827 # 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
1828 inpython = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1829 addsalt(prepos, False) # Make sure we report the exit code.
39717
7f8b7a060584 run-tests: quote PYTHON when spawning a subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents: 39714
diff changeset
1830 script.append(b'"%s" -m heredoctest <<EOF\n' % PYTHON)
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1831 addsalt(n, True)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1832 script.append(l[2:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1833 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
1834 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
1835 script.append(l[2:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1836 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
1837 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1838 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
1839 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1840 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
1841 prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1842 pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1843 addsalt(n, False)
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1844 rawcmd = l[4:]
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1845 cmd = rawcmd.split()
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1846 toggletrace(rawcmd)
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1847 if len(cmd) == 2 and cmd[0] == b'cd':
43982
bd3fa45c0662 run-tests: ensure the script exits when it fails to change directories
Matt Harbison <matt_harbison@yahoo.com>
parents: 43819
diff changeset
1848 rawcmd = b'cd %s || exit 1\n' % cmd[1]
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
1849 script.append(rawcmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1850 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
1851 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
1852 script.append(l[4:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1853 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
1854 # 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
1855 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
1856 else:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1857 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1858 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
1859 inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1860 # 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
1861 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
1862
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1863 if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
1864 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
1865 if skipping is not None:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
1866 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
1867 addsalt(n + 1, False)
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1868 # Need to end any current per-command trace
40489
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40488
diff changeset
1869 if activetrace:
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
1870 toggletrace()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
1871 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
1872
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1873 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
1874 # Merge the script output back into a unified test.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1875 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
1876 if exitcode != 0:
42866
141bb77b606b run-tests: use symbolic constant instead of arbitrary number line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42817
diff changeset
1877 warnonly = WARN_NO
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1878
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1879 pos = -1
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1880 postout = []
42867
eab66266180e run-tests: clarify "l" variable as "out_rawline"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42866
diff changeset
1881 for out_rawline in output:
42869
5ca351ba2478 run-tests: rename `lcmd` variable to `line_cmd`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42868
diff changeset
1882 out_line, cmd_line = out_rawline, None
42867
eab66266180e run-tests: clarify "l" variable as "out_rawline"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42866
diff changeset
1883 if salt in out_rawline:
42869
5ca351ba2478 run-tests: rename `lcmd` variable to `line_cmd`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42868
diff changeset
1884 out_line, cmd_line = out_rawline.split(salt, 1)
42868
35ef1e957a62 run-tests: rename `lout` variable to `out_line`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42867
diff changeset
1885
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1886 pos, postout, warnonly = self._process_out_line(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1887 out_line, pos, postout, expected, warnonly
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1888 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1889 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
1890
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1891 if pos in after:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1892 postout += after.pop(pos)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1893
42899
f461b65866e9 run-tests: extract a `process_out_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42898
diff changeset
1894 if warnonly == WARN_YES:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1895 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
1896
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
1897 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
1898
42899
f461b65866e9 run-tests: extract a `process_out_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42898
diff changeset
1899 def _process_out_line(self, out_line, pos, postout, expected, warnonly):
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1900 while out_line:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1901 if not out_line.endswith(b'\n'):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1902 out_line += b' (no-eol)\n'
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1903
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1904 # Find the expected output at the current position.
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1905 els = [None]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1906 if expected.get(pos, None):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1907 els = expected[pos]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1908
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1909 optional = []
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1910 for i, el in enumerate(els):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1911 r = False
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1912 if el:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1913 r, exact = self.linematch(el, out_line)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1914 if isinstance(r, str):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1915 if r == '-glob':
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1916 out_line = ''.join(el.rsplit(' (glob)', 1))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1917 r = '' # Warn only this line.
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1918 elif r == "retry":
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1919 postout.append(b' ' + el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1920 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1921 log('\ninfo, unknown linematch result: %r\n' % r)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1922 r = False
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1923 if r:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1924 els.pop(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1925 break
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1926 if el:
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
1927 if isoptional(el):
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1928 optional.append(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1929 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1930 m = optline.match(el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1931 if m:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1932 conditions = [c for c in m.group(2).split(b' ')]
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1933
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1934 if not self._iftest(conditions):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1935 optional.append(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1936 if exact:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1937 # 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: 42899
diff changeset
1938 # line in the output
28569
1ad0ddf8cccc run-tests: teach _processoutput to handle multiple lines of churn
timeless <timeless@mozdev.org>
parents: 28568
diff changeset
1939 els.pop(i)
1ad0ddf8cccc run-tests: teach _processoutput to handle multiple lines of churn
timeless <timeless@mozdev.org>
parents: 28568
diff changeset
1940 break
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1941
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1942 if r:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1943 if r == "retry":
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1944 continue
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1945 # clean up any optional leftovers
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1946 for i in optional:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1947 postout.append(b' ' + els[i])
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1948 for i in reversed(optional):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1949 del els[i]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1950 postout.append(b' ' + el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1951 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1952 if self.NEEDESCAPE(out_line):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1953 out_line = TTest._stringescape(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1954 b'%s (esc)\n' % out_line.rstrip(b'\n')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1955 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1956 postout.append(b' ' + out_line) # Let diff deal with it.
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
1957 if r != '': # If line failed.
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1958 warnonly = WARN_NO
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1959 elif warnonly == WARN_UNDEFINED:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1960 warnonly = WARN_YES
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1961 break
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1962 else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1963 # clean up any optional leftovers
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1964 while expected.get(pos, None):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1965 el = expected[pos].pop(0)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1966 if el:
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
1967 if not isoptional(el):
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1968 m = optline.match(el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1969 if m:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1970 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: 42899
diff changeset
1971
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1972 if self._iftest(conditions):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1973 # Don't append as optional line
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1974 continue
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
1975 else:
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1976 continue
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
1977 postout.append(b' ' + el)
42899
f461b65866e9 run-tests: extract a `process_out_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42898
diff changeset
1978 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
1979
42898
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42869
diff changeset
1980 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: 42869
diff changeset
1981 """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: 42869
diff changeset
1982 if cmd_line:
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42869
diff changeset
1983 # 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: 42869
diff changeset
1984 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: 42869
diff changeset
1985 if ret != 0:
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42869
diff changeset
1986 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: 42869
diff changeset
1987 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: 42869
diff changeset
1988 # 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: 42869
diff changeset
1989 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: 42869
diff changeset
1990 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: 42869
diff changeset
1991 return pos, postout
fc8072f38fd6 run-tests: extract a `process_cmd_line` from the main function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42869
diff changeset
1992
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
1993 @staticmethod
21316
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1994 def rematch(el, l):
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
1995 try:
43801
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43594
diff changeset
1996 # 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: 43594
diff changeset
1997 # 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: 43594
diff changeset
1998 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: 43594
diff changeset
1999 flags = flags or b''
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43594
diff changeset
2000 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
2001 # use \Z to ensure that the regex matches to the end of the string
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2002 if os.name == 'nt':
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2003 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
2004 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
2005 except re.error:
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2006 # 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
2007 return False
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2008
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
2009 @staticmethod
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2010 def globmatch(el, l):
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2011 # 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
2012 # 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
2013 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
2014 if os.altsep:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2015 # 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
2016 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
2017 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
2018 return True
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2019 return b'-glob'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2020 return True
31673
6a2959acae1a runtests: change local IP glob pattern from "127.0.0.1" to "$LOCALIP"
Jun Wu <quark@fb.com>
parents: 31635
diff changeset
2021 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
2022 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
2023 res = b''
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2024 while i < n:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2025 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
2026 i += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2027 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
2028 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
2029 i += 1
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2030 elif c == b'*':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2031 res += b'.*'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2032 elif c == b'?':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2033 res += b'.'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2034 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
2035 res += b'[/\\\\]'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2036 else:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2037 res += re.escape(c)
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
2038 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
2039
33695
eeed23508383 run-tests: drop required (feature !) style lines when the output is missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 33592
diff changeset
2040 def linematch(self, el, l):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2041 if el == l: # perfect match (fast)
38554
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2042 return True, True
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2043 retry = False
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
2044 if isoptional(el):
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2045 retry = "retry"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2046 el = el[: -len(MARK_OPTIONAL)] + b"\n"
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2047 else:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2048 m = optline.match(el)
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2049 if m:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2050 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: 38551
diff changeset
2051
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2052 el = m.group(1) + b"\n"
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2053 if not self._iftest(conditions):
42505
c1850798f995 run-tests: stop matching line for missing feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41804
diff changeset
2054 # listed feature missing, should not match
c1850798f995 run-tests: stop matching line for missing feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41804
diff changeset
2055 return "retry", False
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2056
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2057 if el.endswith(b" (esc)\n"):
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2058 if PYTHON3:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2059 el = el[:-7].decode('unicode_escape') + '\n'
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2060 el = el.encode('utf-8')
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
2061 else:
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2062 el = el[:-7].decode('string-escape') + '\n'
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2063 if el == l or os.name == 'nt' and el[:-1] + b'\r\n' == l:
38554
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2064 return True, True
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2065 if el.endswith(b" (re)\n"):
38554
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2066 return (TTest.rematch(el[:-6], l) or retry), False
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2067 if el.endswith(b" (glob)\n"):
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2068 # ignore '(glob)' added to l by 'replacements'
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2069 if l.endswith(b" (glob)\n"):
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2070 l = l[:-8] + b"\n"
38554
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2071 return (TTest.globmatch(el[:-8], l) or retry), False
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2072 if os.altsep:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2073 _l = l.replace(b'\\', b'/')
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
2074 if el == _l or os.name == 'nt' and el[:-1] + b'\r\n' == _l:
38554
f83600efa1ca tests: don't allow reodering of glob/re lines across non-glob/re lines
Martin von Zweigbergk <martinvonz@google.com>
parents: 38552
diff changeset
2075 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: 38552
diff changeset
2076 return retry, True
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
2077
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2078 @staticmethod
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2079 def parsehghaveoutput(lines):
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2080 '''Parse hghave log lines.
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2081
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2082 Return tuple of lists (missing, failed):
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2083 * the missing/unknown features
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2084 * the features for which existence check failed'''
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2085 missing = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2086 failed = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2087 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
2088 if line.startswith(TTest.SKIPPED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2089 line = line.splitlines()[0]
44469
69ae64637be5 tests: use native string type for parsed hghave log lines
Manuel Jacob <me@manueljacob.de>
parents: 44468
diff changeset
2090 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
2091 elif line.startswith(TTest.FAILED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2092 line = line.splitlines()[0]
44469
69ae64637be5 tests: use native string type for parsed hghave log lines
Manuel Jacob <me@manueljacob.de>
parents: 44468
diff changeset
2093 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
2094
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2095 return missing, failed
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
2096
21384
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2097 @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2098 def _escapef(m):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2099 return TTest.ESCAPEMAP[m.group(0)]
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2100
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2101 @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2102 def _stringescape(s):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2103 return TTest.ESCAPESUB(TTest._escapef, s)
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
2104
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2105
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
2106 iolock = threading.RLock()
35541
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
2107 firstlock = threading.RLock()
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
2108 firsterror = False
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
2109
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2110
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2111 class TestResult(unittest._TextTestResult):
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2112 """Holds results when executing via unittest."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2113
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2114 # Don't worry too much about accessing the non-public _TextTestResult.
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2115 # It is relatively common in Python testing tools.
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2116 def __init__(self, options, *args, **kwargs):
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2117 super(TestResult, self).__init__(*args, **kwargs)
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2118
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2119 self._options = options
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2120
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2121 # 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
2122 # polyfill it.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2123 self.skipped = []
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2124
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2125 # 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
2126 # 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
2127 # 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
2128 self.ignored = []
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2129
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2130 self.times = []
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27636
diff changeset
2131 self._firststarttime = None
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2132 # 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
2133 self.successes = []
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2134 self.faildata = {}
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2135
33565
0982d900dccb run-tests: pass color option via test case object , not global var
Martin von Zweigbergk <martinvonz@google.com>
parents: 33561
diff changeset
2136 if options.color == 'auto':
33568
a2c35146596b run-tests: remove unnecessary 'with_color' variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33567
diff changeset
2137 self.color = pygmentspresent and self.stream.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
2138 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
2139 self.color = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2140 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
2141 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
2142
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2143 def onStart(self, test):
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2144 """ Can be overriden by custom TestResult
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2145 """
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2146
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2147 def onEnd(self):
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2148 """ Can be overriden by custom TestResult
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2149 """
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2150
21462
8a4ef661f08d run-tests: make failure reporting in unittest mode equivalent to default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21461
diff changeset
2151 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
2152 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
2153
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2154 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
2155 self.stop()
21735
5ee547fdb0be run-tests: produce error on running a failing test
anuraggoel <anurag.dsps@gmail.com>
parents: 21733
diff changeset
2156 else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2157 with iolock:
27393
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2158 if reason == "timed out":
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2159 self.stream.write('t')
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2160 else:
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2161 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
2162 self.stream.write('\n')
8bce3e51b101 run-tests: move newline out of colorized message
Martin von Zweigbergk <martinvonz@google.com>
parents: 34804
diff changeset
2163 # 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
2164 formatted = 'ERROR: %s output changed\n' % test
33930
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
2165 self.stream.write(highlightmsg(formatted, self.color))
27393
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
2166 self.stream.write('!')
21754
7e14d026c4c4 run-tests: fixes the '--interactive' option error
anuraggoel <anurag.dsps@gmail.com>
parents: 21753
diff changeset
2167
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2168 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
2169
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2170 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
2171 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2172 super(TestResult, self).addSuccess(test)
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2173 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
2174
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2175 def addError(self, test, err):
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2176 super(TestResult, self).addError(test, err)
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2177 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
2178 self.stop()
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
2179
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2180 # Polyfill.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2181 def addSkip(self, test, reason):
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2182 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
2183 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2184 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
2185 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
2186 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2187 self.stream.write('s')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2188 self.stream.flush()
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
2189
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2190 def addIgnore(self, test, reason):
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2191 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
2192 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2193 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
2194 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
2195 else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2196 if reason not in ('not retesting', "doesn't match keyword"):
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2197 self.stream.write('i')
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2198 else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2199 self.testsRun += 1
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2200 self.stream.flush()
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
2201
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
2202 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
2203 """Record a mismatch in test output for a particular test."""
35541
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
2204 if self.shouldStop or firsterror:
22838
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
2205 # 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
2206 # 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
2207 # temp dir getting cleaned up.
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
2208 return
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
2209
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
2210 accepted = False
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2211 lines = []
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
2212
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2213 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2214 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
2215 pass
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2216 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
2217 v = self._options.view
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2218 subprocess.call(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2219 r'"%s" "%s" "%s"'
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
2220 % (v, _bytes2sys(test.refpath), _bytes2sys(test.errpath)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2221 shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2222 )
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
2223 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2224 servefail, lines = getdiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2225 expected, got, test.refpath, test.errpath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2226 )
36438
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2227 self.stream.write('\n')
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2228 for line in lines:
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2229 line = highlightdiff(line, self.color)
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2230 if PYTHON3:
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2231 self.stream.flush()
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2232 self.stream.buffer.write(line)
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2233 self.stream.buffer.flush()
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2234 else:
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2235 self.stream.write(line)
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
2236 self.stream.flush()
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
2237
36461
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36438
diff changeset
2238 if servefail:
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36438
diff changeset
2239 raise test.failureException(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2240 'server failed to start (HGPORT=%s)' % test._startport
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2241 )
36461
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36438
diff changeset
2242
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2243 # 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
2244 if self._options.interactive:
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2245 if test.readrefout() != expected:
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2246 self.stream.write(
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2247 'Reference output has changed (run again to prompt '
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2248 'changes)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2249 )
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2250 else:
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2251 self.stream.write('Accept this change? [n] ')
39909
0f8ff3ff5d5c run-tests: flush output stream before prompting to accept changes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39742
diff changeset
2252 self.stream.flush()
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2253 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: 32943
diff changeset
2254 if answer.lower() in ('y', 'yes'):
32982
573baab2a797 run-tests: fix -i when "#testcases" is used in .t test
Jun Wu <quark@fb.com>
parents: 32981
diff changeset
2255 if test.path.endswith(b'.t'):
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2256 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: 32943
diff changeset
2257 else:
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2258 rename(test.errpath, '%s.out' % test.path)
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
2259 accepted = True
28127
807bc140e915 run-tests: remove useless "failed" flag from addOutputMismatch()
Yuya Nishihara <yuya@tcha.org>
parents: 28126
diff changeset
2260 if not accepted:
25052
c4217a046b62 run-tests: record faildata using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25051
diff changeset
2261 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
2262
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
2263 return accepted
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
2264
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2265 def startTest(self, test):
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2266 super(TestResult, self).startTest(test)
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2267
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
2268 # 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
2269 # 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
2270 # This module has one limitation. It can only work for Linux user
43594
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43593
diff changeset
2271 # 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: 43593
diff changeset
2272 # for wall time calculations.
43593
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2273 test.started_times = os.times()
43594
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43593
diff changeset
2274 # 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: 43593
diff changeset
2275 test.started_time = time.time()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2276 if self._firststarttime is None: # thread racy but irrelevant
43594
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43593
diff changeset
2277 self._firststarttime = test.started_time
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2278
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2279 def stopTest(self, test, interrupted=False):
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2280 super(TestResult, self).stopTest(test)
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2281
43593
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2282 test.stopped_times = os.times()
43594
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43593
diff changeset
2283 stopped_time = time.time()
43593
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2284
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2285 starttime = test.started_times
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
2286 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
2287 origin = self._firststarttime
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2288 self.times.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2289 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2290 test.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2291 endtime[2] - starttime[2], # user space CPU time
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2292 endtime[3] - starttime[3], # sys space CPU time
43594
ac140b85aae9 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43593
diff changeset
2293 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: 43593
diff changeset
2294 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: 43593
diff changeset
2295 stopped_time - origin, # end date in run context
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2296 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2297 )
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
2298
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2299 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
2300 with iolock:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2301 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2302 'INTERRUPTED: %s (after %d seconds)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2303 % (test.name, self.times[-1][3])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2304 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2305
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2306
38616
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2307 def getTestResult():
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2308 """
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2309 Returns the relevant test result
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2310 """
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2311 if "CUSTOM_TEST_RESULT" in os.environ:
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2312 testresultmodule = __import__(os.environ["CUSTOM_TEST_RESULT"])
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2313 return testresultmodule.TestResult
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2314 else:
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2315 return TestResult
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
2316
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2317
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2318 class TestSuite(unittest.TestSuite):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
2319 """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
2320
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2321 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2322 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2323 testdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2324 jobs=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2325 whitelist=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2326 blacklist=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2327 retest=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2328 keywords=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2329 loop=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2330 runs_per_test=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2331 loadtest=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2332 showchannels=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2333 *args,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2334 **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2335 ):
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2336 """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
2337
21533
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
2338 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
2339 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
2340 repository.
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
2341
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2342 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
2343 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
2344 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
2345
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2346 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
2347
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
2348 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
2349 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
2350 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
2351 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
2352 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
2353 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
2354
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
2355 retest denotes whether to retest failed tests. This arguably belongs
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
2356 outside of TestSuite.
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2357
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2358 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
2359 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
2360
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
2361 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
2362 """
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2363 super(TestSuite, self).__init__(*args, **kwargs)
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2364
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
2365 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
2366 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
2367 self._blacklist = blacklist
21530
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
2368 self._retest = retest
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2369 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
2370 self._loop = loop
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
2371 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
2372 self._loadtest = loadtest
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2373 self._showchannels = showchannels
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2374
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2375 def run(self, result):
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2376 # 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
2377 # 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
2378 # Test simpler.
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2379 tests = []
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2380 num_tests = [0]
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2381 for test in self._tests:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2382
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2383 def get():
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2384 num_tests[0] += 1
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2385 if getattr(test, 'should_reload', False):
32310
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32303
diff changeset
2386 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
2387 return test
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2388
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2389 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
2390 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
2391 continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2392
34266
cd2ee4db8f95 tests: fix test-is-whitelisted check in run-tests
Augie Fackler <augie@google.com>
parents: 34265
diff changeset
2393 if not (self._whitelist and test.bname in self._whitelist):
25055
d79258e30499 run-tests: blacklist entries are bytes, use bname to check blacklisting
Augie Fackler <augie@google.com>
parents: 25053
diff changeset
2394 if self._blacklist and test.bname in self._blacklist:
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2395 result.addSkip(test, 'blacklisted')
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2396 continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2397
21530
78289625e986 run-tests: make retest a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21529
diff changeset
2398 if self._retest and not os.path.exists(test.errpath):
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2399 result.addIgnore(test, 'not retesting')
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2400 continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2401
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2402 if self._keywords:
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
2403 with open(test.path, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
2404 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
2405 ignored = False
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
2406 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
2407 if k not in t:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2408 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
2409 ignored = True
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2410 break
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2411
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2412 if ignored:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
2413 continue
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
2414 for _ in xrange(self._runs_per_test):
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
2415 tests.append(get())
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2416
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
2417 runtests = list(tests)
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2418 done = queue.Queue()
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2419 running = 0
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2420
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2421 channels = [""] * self._jobs
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2422
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2423 def job(test, result):
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2424 for n, v in enumerate(channels):
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2425 if not v:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2426 channel = n
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2427 break
32621
c59451e11cbf tests: make run-tests fail early if no channel is found
Augie Fackler <augie@google.com>
parents: 32414
diff changeset
2428 else:
c59451e11cbf tests: make run-tests fail early if no channel is found
Augie Fackler <augie@google.com>
parents: 32414
diff changeset
2429 raise ValueError('Could not find output channel')
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2430 channels[channel] = "=" + test.name[5:].split(".")[0]
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2431 try:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2432 test(result)
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2433 done.put(None)
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2434 except KeyboardInterrupt:
27933
a6833e464b07 run-tests: "fix" race condition in race condition fix
Bryan O'Sullivan <bryano@fb.com>
parents: 27927
diff changeset
2435 pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2436 except: # re-raises
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2437 done.put(('!', test, 'run-test raised an error, see traceback'))
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2438 raise
32622
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32621
diff changeset
2439 finally:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32621
diff changeset
2440 try:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32621
diff changeset
2441 channels[channel] = ''
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32621
diff changeset
2442 except IndexError:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32621
diff changeset
2443 pass
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2444
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2445 def stat():
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2446 count = 0
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2447 while channels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2448 d = '\n%03s ' % count
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2449 for n, v in enumerate(channels):
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2450 if v:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2451 d += v[0]
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2452 channels[n] = v[1:] or '.'
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2453 else:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2454 d += ' '
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2455 d += ' '
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2456 with iolock:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2457 sys.stdout.write(d + ' ')
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2458 sys.stdout.flush()
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2459 for x in xrange(10):
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2460 if channels:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2461 time.sleep(0.1)
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2462 count += 1
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2463
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
2464 stoppedearly = False
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
2465
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2466 if self._showchannels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2467 statthread = threading.Thread(target=stat, name="stat")
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2468 statthread.start()
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2469
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2470 try:
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2471 while tests or running:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2472 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
2473 try:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2474 done.get(True, 1)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2475 running -= 1
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2476 if result and result.shouldStop:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2477 stoppedearly = True
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2478 break
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2479 except queue.Empty:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2480 continue
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2481 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
2482 test = tests.pop(0)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2483 if self._loop:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2484 if getattr(test, 'should_reload', False):
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2485 num_tests[0] += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2486 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
2487 else:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2488 tests.append(test)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2489 if self._jobs == 1:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2490 job(test, result)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2491 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2492 t = threading.Thread(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2493 target=job, name=test.name, args=(test, result)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2494 )
27689
50e621fe0362 run-tests: skip threading for a single test
timeless <timeless@mozdev.org>
parents: 27686
diff changeset
2495 t.start()
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2496 running += 1
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
2497
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2498 # 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
2499 # 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
2500 # 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
2501 # test reporting incorrect.
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2502 if stoppedearly:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2503 while running:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2504 try:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2505 done.get(True, 1)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2506 running -= 1
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2507 except queue.Empty:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
2508 continue
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
2509 except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
2510 for test in runtests:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
2511 test.abort()
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2512
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2513 channels = []
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
2514
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2515 return result
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
2516
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2517
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2518 # 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
2519 # 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
2520 # 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
2521 # newest.
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2522
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2523
32717
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32716
diff changeset
2524 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
2525 times = []
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2526 try:
35855
69d7fcd91696 testrunner: fix updating of .testtimes file
Martin von Zweigbergk <martinvonz@google.com>
parents: 35854
diff changeset
2527 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
2528 for line in fp:
35854
568917059243 testrunner: make reading of test times work with #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 35848
diff changeset
2529 m = re.match('(.*?) ([0-9. ]+)', line)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2530 times.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2531 (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
2532 )
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2533 except IOError as err:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2534 if err.errno != errno.ENOENT:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2535 raise
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2536 return times
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2537
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2538
32717
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32716
diff changeset
2539 def savetimes(outputdir, result):
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32716
diff changeset
2540 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
2541 maxruns = 5
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44449
diff changeset
2542 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
2543 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
2544 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
2545 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
2546 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
2547 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
2548 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
2549
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2550 fd, tmpname = tempfile.mkstemp(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2551 prefix=b'.testtimes', dir=outputdir, text=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2552 )
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2553 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
2554 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
2555 fp.write('%s %s\n' % (name, ' '.join(['%.3f' % (t,) for t in ts])))
32717
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32716
diff changeset
2556 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
2557 try:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2558 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
2559 except OSError:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2560 pass
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2561 try:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2562 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
2563 except OSError:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2564 pass
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
2565
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2566
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
2567 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
2568 """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
2569
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2570 def __init__(self, runner, *args, **kwargs):
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2571 super(TextTestRunner, self).__init__(*args, **kwargs)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2572
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2573 self._runner = runner
38620
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
2574
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2575 self._result = getTestResult()(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2576 self._runner.options, self.stream, self.descriptions, self.verbosity
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2577 )
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2578
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2579 def listtests(self, test):
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2580 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
2581
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2582 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
2583
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2584 for t in test:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2585 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
2586 self._result.addSuccess(t)
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2587
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2588 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: 32703
diff changeset
2589 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
2590 self._writexunit(self._result, xuf)
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2591
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2592 if self._runner.options.json:
32718
232875623c27 run-tests: write JSON reports to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32717
diff changeset
2593 jsonpath = os.path.join(self._runner._outputdir, b'report.json')
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2594 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
2595 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
2596
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2597 return self._result
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
2598
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2599 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
2600 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
2601 test(self._result)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2602
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2603 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
2604 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
2605 ignored = len(self._result.ignored)
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2606
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2607 with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2608 self.stream.writeln('')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2609
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2610 if not self._runner.options.noskips:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2611 for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2612 self._result.skipped, key=lambda s: s[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2613 ):
33929
5d2ce90c71f1 run-tests: include "\n" in formatted message instead of calling writeln()
Yuya Nishihara <yuya@tcha.org>
parents: 33871
diff changeset
2614 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
2615 msg = highlightmsg(formatted, self._result.color)
fa6edc6a02a9 run-tests: fix a too long line
Boris Feld <boris.feld@octobus.net>
parents: 38620
diff changeset
2616 self.stream.write(msg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2617 for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2618 self._result.failures, key=lambda f: f[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2619 ):
33929
5d2ce90c71f1 run-tests: include "\n" in formatted message instead of calling writeln()
Yuya Nishihara <yuya@tcha.org>
parents: 33871
diff changeset
2620 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
2621 self.stream.write(highlightmsg(formatted, self._result.color))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2622 for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2623 self._result.errors, key=lambda e: e[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2624 ):
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2625 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
2626
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2627 if self._runner.options.xunit:
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2628 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
2629 self._writexunit(self._result, xuf)
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
2630
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2631 if self._runner.options.json:
32718
232875623c27 run-tests: write JSON reports to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32717
diff changeset
2632 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
2633 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
2634 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
2635
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2636 self._runner._checkhglib('Tested')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
2637
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2638 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
2639
9949950664cd run-tests: add support for automatically bisecting test failures
Augie Fackler <augie@google.com>
parents: 28582
diff changeset
2640 if failed and self._runner.options.known_good_rev:
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2641 self._bisecttests(t for t, m in self._result.failures)
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2642 self.stream.writeln(
32942
5af78c524f34 tests: remove support for warned tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32934
diff changeset
2643 '# Ran %d tests, %d skipped, %d failed.'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2644 % (self._result.testsRun, skipped + ignored, failed)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2645 )
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2646 if failed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2647 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2648 'python hash seed: %s' % os.environ['PYTHONHASHSEED']
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2649 )
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
2650 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
2651 self.printtimes(self._result.times)
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
2652
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
2653 if self._runner.options.exceptions:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
2654 exceptions = aggregateexceptions(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2655 os.path.join(self._runner._outputdir, b'exceptions')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2656 )
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
2657
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
2658 self.stream.writeln('Exceptions Report:')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2659 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2660 '%d total from %d frames'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2661 % (exceptions['total'], len(exceptions['exceptioncounts']))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2662 )
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
2663 combined = exceptions['combined']
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
2664 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: 35991
diff changeset
2665 frame, line, exc = key
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
2666 totalcount, testcount, leastcount, leasttest = combined[key]
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
2667
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2668 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2669 '%d (%d tests)\t%s: %s (%s - %d total)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2670 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2671 totalcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2672 testcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2673 frame,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2674 exc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2675 leasttest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2676 leastcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2677 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2678 )
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
2679
32907
bd77ac2bd23a run-tests: explicitly flush test runner output for Windows stability
Matt Harbison <matt_harbison@yahoo.com>
parents: 32853
diff changeset
2680 self.stream.flush()
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
2681
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
2682 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
2683
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2684 def _bisecttests(self, tests):
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2685 bisectcmd = ['hg', 'bisect']
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2686 bisectrepo = self._runner.options.bisect_repo
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2687 if bisectrepo:
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2688 bisectcmd.extend(['-R', os.path.abspath(bisectrepo)])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2689
34803
d817bf1fc675 run-tests: extract Popen logic to a single method
Jun Wu <quark@fb.com>
parents: 34802
diff changeset
2690 def pread(args):
34804
149109c96904 run-tests: set HGPLAIN=1 when bisecting
Jun Wu <quark@fb.com>
parents: 34803
diff changeset
2691 env = os.environ.copy()
149109c96904 run-tests: set HGPLAIN=1 when bisecting
Jun Wu <quark@fb.com>
parents: 34803
diff changeset
2692 env['HGPLAIN'] = '1'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2693 p = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2694 args, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, env=env
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2695 )
34803
d817bf1fc675 run-tests: extract Popen logic to a single method
Jun Wu <quark@fb.com>
parents: 34802
diff changeset
2696 data = p.stdout.read()
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2697 p.wait()
34803
d817bf1fc675 run-tests: extract Popen logic to a single method
Jun Wu <quark@fb.com>
parents: 34802
diff changeset
2698 return data
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2699
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2700 for test in tests:
34803
d817bf1fc675 run-tests: extract Popen logic to a single method
Jun Wu <quark@fb.com>
parents: 34802
diff changeset
2701 pread(bisectcmd + ['--reset']),
d817bf1fc675 run-tests: extract Popen logic to a single method
Jun Wu <quark@fb.com>
parents: 34802
diff changeset
2702 pread(bisectcmd + ['--bad', '.'])
d817bf1fc675 run-tests: extract Popen logic to a single method
Jun Wu <quark@fb.com>
parents: 34802
diff changeset
2703 pread(bisectcmd + ['--good', self._runner.options.known_good_rev])
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2704 # TODO: we probably need to forward more options
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2705 # that alter hg's behavior inside the tests.
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2706 opts = ''
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2707 withhg = self._runner.options.with_hg
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2708 if withhg:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
2709 opts += ' --with-hg=%s ' % shellquote(_bytes2sys(withhg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2710 rtc = '%s %s %s %s' % (sysexecutable, sys.argv[0], opts, test)
34803
d817bf1fc675 run-tests: extract Popen logic to a single method
Jun Wu <quark@fb.com>
parents: 34802
diff changeset
2711 data = pread(bisectcmd + ['--command', rtc])
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2712 m = re.search(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2713 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2714 br'\nThe first (?P<goodbad>bad|good) revision '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2715 br'is:\nchangeset: +\d+:(?P<node>[a-f0-9]+)\n.*\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2716 br'summary: +(?P<summary>[^\n]+)\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2717 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2718 data,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2719 (re.MULTILINE | re.DOTALL),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2720 )
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2721 if m is None:
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2722 self.stream.writeln(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2723 'Failed to identify failure point for %s' % test
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2724 )
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2725 continue
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2726 dat = m.groupdict()
37741
700aaa19de63 tests: fix up a couple of minor bytes inconsistencies in run-tests.py
Augie Fackler <augie@google.com>
parents: 37342
diff changeset
2727 verb = 'broken' if dat['goodbad'] == b'bad' else 'fixed'
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2728 self.stream.writeln(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2729 '%s %s by %s (%s)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2730 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2731 test,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2732 verb,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2733 dat['node'].decode('ascii'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2734 dat['summary'].decode('utf8', 'ignore'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2735 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2736 )
34802
9c7548eb7d1c run-tests: move bisect logic to a separate method
Jun Wu <quark@fb.com>
parents: 34444
diff changeset
2737
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
2738 def printtimes(self, times):
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
2739 # iolock held by run
21494
dcefc4091c86 run-tests: move outputtimes() into unittest runner class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21493
diff changeset
2740 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
2741 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
2742 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
2743 self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2744 '%-7s %-7s %-7s %-7s %-7s %s'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2745 % ('start', 'end', 'cuser', 'csys', 'real', 'Test')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2746 )
24982
5c15f7e0f52b run-tests: stop explicit expansion of time data
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24981
diff changeset
2747 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
2748 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
2749 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
2750 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
2751
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2752 @staticmethod
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2753 def _writexunit(result, outf):
32714
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
2754 # See http://llg.cubic.org/docs/junit/ for a reference.
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44449
diff changeset
2755 timesd = {t[0]: t[3] for t in result.times}
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2756 doc = minidom.Document()
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2757 s = doc.createElement('testsuite')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2758 s.setAttribute('errors', "0") # TODO
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2759 s.setAttribute('failures', str(len(result.failures)))
41546
20e62312e016 run-tests: set attributes in sorted order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41540
diff changeset
2760 s.setAttribute('name', 'run-tests')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2761 s.setAttribute(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2762 'skipped', str(len(result.skipped) + len(result.ignored))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2763 )
41546
20e62312e016 run-tests: set attributes in sorted order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41540
diff changeset
2764 s.setAttribute('tests', str(result.testsRun))
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2765 doc.appendChild(s)
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2766 for tc in result.successes:
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2767 t = doc.createElement('testcase')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2768 t.setAttribute('name', tc.name)
32702
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
2769 tctime = timesd.get(tc.name)
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
2770 if tctime is not None:
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
2771 t.setAttribute('time', '%.3f' % tctime)
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2772 s.appendChild(t)
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2773 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: 32622
diff changeset
2774 t = doc.createElement('testcase')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2775 t.setAttribute('name', tc)
32702
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
2776 tctime = timesd.get(tc)
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
2777 if tctime is not None:
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
2778 t.setAttribute('time', '%.3f' % tctime)
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2779 # createCDATASection expects a unicode or it will
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2780 # convert using default conversion rules, which will
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2781 # fail if string isn't ASCII.
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2782 err = cdatasafe(err).decode('utf-8', 'replace')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2783 cd = doc.createCDATASection(err)
32714
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
2784 # 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: 32711
diff changeset
2785 # failures = len(result.failures) in the testsuite element.
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
2786 failelem = doc.createElement('failure')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
2787 failelem.setAttribute('message', 'output changed')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
2788 failelem.setAttribute('type', 'output-mismatch')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
2789 failelem.appendChild(cd)
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
2790 t.appendChild(failelem)
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2791 s.appendChild(t)
32715
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2792 for tc, message in result.skipped:
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2793 # 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: 32714
diff changeset
2794 # 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: 32714
diff changeset
2795 t = doc.createElement('testcase')
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2796 t.setAttribute('name', tc.name)
34269
20f547806a4d tests: fix run-tests XML reporting on Python 3
Augie Fackler <augie@google.com>
parents: 34268
diff changeset
2797 binmessage = message.encode('utf-8')
20f547806a4d tests: fix run-tests XML reporting on Python 3
Augie Fackler <augie@google.com>
parents: 34268
diff changeset
2798 message = cdatasafe(binmessage).decode('utf-8', 'replace')
32715
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2799 cd = doc.createCDATASection(message)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2800 skipelem = doc.createElement('skipped')
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2801 skipelem.appendChild(cd)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2802 t.appendChild(skipelem)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
2803 s.appendChild(t)
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
2804 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: 32622
diff changeset
2805
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2806 @staticmethod
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2807 def _writejson(result, outf):
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2808 timesd = {}
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2809 for tdata in result.times:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2810 test = tdata[0]
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2811 timesd[test] = tdata[1:]
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2812
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2813 outcome = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2814 groups = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2815 ('success', ((tc, None) for tc in result.successes)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2816 ('failure', result.failures),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2817 ('skip', result.skipped),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2818 ]
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2819 for res, testcases in groups:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2820 for tc, __ in testcases:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2821 if tc.name in timesd:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2822 diff = result.faildata.get(tc.name, b'')
32853
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32720
diff changeset
2823 try:
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32720
diff changeset
2824 diff = diff.decode('unicode_escape')
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32720
diff changeset
2825 except UnicodeDecodeError as e:
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32720
diff changeset
2826 diff = '%r decoding diff, sorry' % e
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2827 tres = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2828 'result': res,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2829 'time': ('%0.3f' % timesd[tc.name][2]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2830 'cuser': ('%0.3f' % timesd[tc.name][0]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2831 'csys': ('%0.3f' % timesd[tc.name][1]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2832 'start': ('%0.3f' % timesd[tc.name][3]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2833 'end': ('%0.3f' % timesd[tc.name][4]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2834 'diff': diff,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2835 }
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2836 else:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2837 # blacklisted test
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2838 tres = {'result': res}
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2839
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2840 outcome[tc.name] = tres
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2841 jsonout = json.dumps(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2842 outcome, sort_keys=True, indent=4, separators=(',', ': ')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2843 )
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2844 outf.writelines(("testreport =", jsonout))
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
2845
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2846
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2847 def sorttests(testdescs, previoustimes, shuffle=False):
35489
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2848 """Do an in-place sort of tests."""
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2849 if shuffle:
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2850 random.shuffle(testdescs)
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2851 return
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2852
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2853 if previoustimes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2854
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2855 def sortkey(f):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2856 f = f['path']
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2857 if f in previoustimes:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2858 # Use most recent time as estimate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2859 return -(previoustimes[f][-1])
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2860 else:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2861 # 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: 36522
diff changeset
2862 return -1.0
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2863
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2864 else:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2865 # keywords for slow tests
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2866 slow = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2867 b'svn': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2868 b'cvs': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2869 b'hghave': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2870 b'largefiles-update': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2871 b'run-tests': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2872 b'corruption': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2873 b'race': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2874 b'i18n': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2875 b'check': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2876 b'gendoc': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2877 b'contrib-perf': 200,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2878 b'merge-combination': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2879 }
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2880 perf = {}
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2881
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2882 def sortkey(f):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2883 # 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: 36522
diff changeset
2884 f = f['path']
35489
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2885 try:
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2886 return perf[f]
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2887 except KeyError:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2888 try:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2889 val = -os.stat(f).st_size
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2890 except OSError as e:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2891 if e.errno != errno.ENOENT:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2892 raise
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2893 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: 36522
diff changeset
2894 return -1e9
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2895 for kw, mul in slow.items():
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2896 if kw in f:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2897 val *= mul
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2898 if f.endswith(b'.py'):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2899 val /= 10.0
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2900 perf[f] = val / 1000.0
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2901 return perf[f]
35489
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2902
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2903 testdescs.sort(key=sortkey)
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
2904
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2905
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
2906 class TestRunner(object):
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
2907 """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
2908
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
2909 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
2910 """
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
2911
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2912 # Programs required to run tests.
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2913 REQUIREDTOOLS = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2914 b'diff',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2915 b'grep',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2916 b'unzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2917 b'gunzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2918 b'bunzip2',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2919 b'sed',
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2920 ]
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
2921
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
2922 # Maps file extensions to test class.
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
2923 TESTTYPES = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2924 (b'.py', PythonTest),
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
2925 (b'.t', TTest),
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
2926 ]
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
2927
21341
cb88d4a04f58 run-tests: move TESTDIR out of a global
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21340
diff changeset
2928 def __init__(self):
21348
b3399154505f run-tests: add options to runner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21347
diff changeset
2929 self.options = None
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
2930 self._hgroot = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2931 self._testdir = None
32716
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32715
diff changeset
2932 self._outputdir = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2933 self._hgtmp = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2934 self._installdir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2935 self._bindir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2936 self._tmpbinddir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2937 self._pythondir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
2938 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
2939 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
2940 self._hgcommand = None
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
2941 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
2942 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
2943 self._ports = {}
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
2944
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
2945 def run(self, args, parser=None):
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
2946 """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
2947 oldmask = os.umask(0o22)
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
2948 try:
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
2949 parser = parser or getparser()
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
2950 options = parseargs(args, parser)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
2951 tests = [_sys2bytes(a) for a in options.tests]
34263
1533371769b5 tests: add support for listing tests to run in a file
Augie Fackler <augie@google.com>
parents: 34041
diff changeset
2952 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: 34041
diff changeset
2953 for listfile in options.test_list:
1533371769b5 tests: add support for listing tests to run in a file
Augie Fackler <augie@google.com>
parents: 34041
diff changeset
2954 with open(listfile, 'rb') as f:
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
2955 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
2956 self.options = options
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
2957
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
2958 self._checktools()
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
2959 testdescs = self.findtests(tests)
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2960 if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2961 import statprof
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
2962
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2963 statprof.start()
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
2964 result = self._run(testdescs)
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2965 if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2966 statprof.stop()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2967 statprof.display()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2968 return result
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
2969
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
2970 finally:
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
2971 os.umask(oldmask)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
2972
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
2973 def _run(self, testdescs):
40487
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40479
diff changeset
2974 testdir = getcwdb()
39718
ac32685011a3 run-tests: avoid os.getcwdb() on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39717
diff changeset
2975 self._testdir = osenvironb[b'TESTDIR'] = getcwdb()
34962
a18eef03d879 run-tests: $TESTDIR can be something else than $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34842
diff changeset
2976 # 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
2977 if testdescs:
a18eef03d879 run-tests: $TESTDIR can be something else than $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34842
diff changeset
2978 pathname = os.path.dirname(testdescs[0]['path'])
35066
57d56f603f70 run-tests: fix TESTDIR if testdescs are absolute paths
Kyle Lippincott <spectral@google.com>
parents: 34969
diff changeset
2979 if pathname:
40487
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40479
diff changeset
2980 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: 40479
diff changeset
2981 self._testdir = osenvironb[b'TESTDIR'] = testdir
32716
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32715
diff changeset
2982 if self.options.outputdir:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
2983 self._outputdir = canonpath(_sys2bytes(self.options.outputdir))
32716
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32715
diff changeset
2984 else:
40487
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40479
diff changeset
2985 self._outputdir = getcwdb()
35097
fc0f3ed071fc run-tests: outputdir also has to be changed if $TESTDIR is not $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 35092
diff changeset
2986 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: 35092
diff changeset
2987 self._outputdir = os.path.join(self._outputdir, pathname)
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2988 previoustimes = {}
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2989 if self.options.order_by_runtime:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2990 previoustimes = dict(loadtimes(self._outputdir))
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
2991 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
2992
21370
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
2993 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
2994 # 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
2995 # 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
2996 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
2997
44518
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Raphaël Gomès <rgomes@octobus.net>
parents: 44489
diff changeset
2998 # 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: 44489
diff changeset
2999 # 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: 44489
diff changeset
3000 # 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: 44489
diff changeset
3001 # 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: 44489
diff changeset
3002 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: 44489
diff changeset
3003
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3004 if self.options.tmpdir:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3005 self.options.keep_tmpdir = True
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3006 tmpdir = _sys2bytes(self.options.tmpdir)
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3007 if os.path.exists(tmpdir):
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3008 # 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
3009 # 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
3010 # tmpdir already exists.
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3011 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
3012 return 1
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3013
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3014 os.makedirs(tmpdir)
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3015 else:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3016 d = None
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3017 if os.name == 'nt':
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
3018 # 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
3019 # 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
3020 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
3021 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
3022
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3023 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
3024
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3025 if self.options.with_hg:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3026 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
3027 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
3028 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
3029 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
3030 self._hgcommand = os.path.basename(whg)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3031 self._tmpbindir = os.path.join(self._hgtmp, b'install', b'bin')
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3032 os.makedirs(self._tmpbindir)
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3033
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3034 normbin = os.path.normpath(os.path.abspath(whg))
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3035 normbin = normbin.replace(_sys2bytes(os.sep), b'/')
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3036
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3037 # Other Python scripts in the test harness need to
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3038 # `import mercurial`. If `hg` is a Python script, we assume
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3039 # the Mercurial modules are relative to its path and tell the tests
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3040 # to load Python modules from its directory.
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3041 with open(whg, 'rb') as fh:
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3042 initial = fh.read(1024)
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3043
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3044 if re.match(b'#!.*python', initial):
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3045 self._pythondir = self._bindir
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3046 # 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: 35536
diff changeset
3047 # 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: 35536
diff changeset
3048 # 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
3049 elif re.search(b'/rust/target/[^/]+/hg', normbin):
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3050 self._pythondir = os.path.dirname(self._testdir)
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3051 # Fall back to the legacy behavior.
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3052 else:
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3053 self._pythondir = self._bindir
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
3054
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3055 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3056 self._installdir = os.path.join(self._hgtmp, b"install")
28098
d7b0e81b84c2 run-tests: drop redundant assignment to BINDIR
Yuya Nishihara <yuya@tcha.org>
parents: 28097
diff changeset
3057 self._bindir = os.path.join(self._installdir, b"bin")
28099
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
3058 self._hgcommand = b'hg'
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3059 self._tmpbindir = self._bindir
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3060 self._pythondir = os.path.join(self._installdir, b"lib", b"python")
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3061
40976
ef7119cd4965 py3: enable legacy stdio mode in exewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40975
diff changeset
3062 # 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: 40975
diff changeset
3063 # 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: 40975
diff changeset
3064 # 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: 40975
diff changeset
3065 # anyway.
40975
2465e0b27a0d run-tests: alias hg to hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40930
diff changeset
3066 if os.name == 'nt' and not self._hgcommand.endswith(b'.exe'):
2465e0b27a0d run-tests: alias hg to hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40930
diff changeset
3067 self._hgcommand += b'.exe'
2465e0b27a0d run-tests: alias hg to hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40930
diff changeset
3068
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
3069 # 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
3070 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
3071 if self.options.chg or 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
3072 osenvironb[b'CHGHG'] = os.path.join(self._bindir, self._hgcommand)
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
3073 else:
f74eed3115fd hghave: add "chg" flag to skip tests that can't be compatible with chg
Yuya Nishihara <yuya@tcha.org>
parents: 28829
diff changeset
3074 osenvironb.pop(b'CHGHG', None) # drop flag for hghave
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3075 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
3076 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
3077 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
3078 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
3079 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
3080
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3081 osenvironb[b"BINDIR"] = self._bindir
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
3082 osenvironb[b"PYTHON"] = PYTHON
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
3083
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3084 fileb = _sys2bytes(__file__)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3085 runtestdir = os.path.abspath(os.path.dirname(fileb))
25729
57dfadc4f46c run-tests.py: add RUNTESTDIR to refer `tests` of Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25728
diff changeset
3086 osenvironb[b'RUNTESTDIR'] = runtestdir
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
3087 if PYTHON3:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3088 sepb = _sys2bytes(os.pathsep)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3089 else:
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3090 sepb = os.pathsep
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3091 path = [self._bindir, runtestdir] + osenvironb[b"PATH"].split(sepb)
24742
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
3092 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
3093 # 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
3094 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
3095 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
3096 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
3097 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
3098 path.insert(1, chgbindir)
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
3099 if self._testdir != runtestdir:
c380d5273e91 run-tests.py: add TESTDIR to PATH if it differs from RUNTESTDIR
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25729
diff changeset
3100 path = [self._testdir] + path
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3101 if self._tmpbindir != self._bindir:
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3102 path = [self._tmpbindir] + path
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3103 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
3104
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3105 # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3106 # can run .../tests/run-tests.py test-foo where test-foo
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3107 # adds an extension to HGRC. Also include run-test.py directory to
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3108 # import modules like heredoctest.
23859
661b246bf1c4 run-tests: include testdir in $PATH so tests easily can use helper tools
Mads Kiilerich <madski@unity3d.com>
parents: 23728
diff changeset
3109 pypath = [self._pythondir, self._testdir, runtestdir]
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3110 # We have to augment PYTHONPATH, rather than simply replacing
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3111 # it, in case external libraries are only available via current
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3112 # PYTHONPATH. (In particular, the Subversion bindings on OS X
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3113 # are in /opt/subversion.)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3114 oldpypath = osenvironb.get(IMPL_PATH)
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3115 if oldpypath:
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3116 pypath.append(oldpypath)
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3117 osenvironb[IMPL_PATH] = sepb.join(pypath)
21367
522e3d24a461 run-tests: move pypath manipulation into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21366
diff changeset
3118
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
3119 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
3120 os.environ["HGTEST_RUN_TESTS_PURE"] = "--pure"
28905
c969c72d6cbc run-tests: set HGMODULEPOLICY for --pure
timeless <timeless@mozdev.org>
parents: 28880
diff changeset
3121 os.environ["HGMODULEPOLICY"] = "py"
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
3122 if self.options.rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
3123 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: 44488
diff changeset
3124 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: 44488
diff changeset
3125 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: 44488
diff changeset
3126 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: 44488
diff changeset
3127 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: 44488
diff changeset
3128 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
3129
26109
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
3130 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
3131 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
3132 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
3133 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
3134
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3135 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
3136
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3137 if self.options.exceptions:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3138 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: 35189
diff changeset
3139 try:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3140 os.makedirs(exceptionsdir)
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3141 except OSError as e:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3142 if e.errno != errno.EEXIST:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3143 raise
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3144
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3145 # Remove all existing exception reports.
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3146 for f in os.listdir(exceptionsdir):
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3147 os.unlink(os.path.join(exceptionsdir, f))
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3148
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3149 osenvironb[b'HGEXCEPTIONSDIR'] = exceptionsdir
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3150 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: 35189
diff changeset
3151 self.options.extra_config_opt.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3152 'extensions.logexceptions=%s' % logexceptions.decode('utf-8')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3153 )
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3154
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3155 vlog("# Using TESTDIR", _bytes2sys(self._testdir))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3156 vlog("# Using RUNTESTDIR", _bytes2sys(osenvironb[b'RUNTESTDIR']))
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3157 vlog("# Using HGTMP", _bytes2sys(self._hgtmp))
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3158 vlog("# Using PATH", os.environ["PATH"])
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
3159 vlog(
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3160 "# Using", _bytes2sys(IMPL_PATH), _bytes2sys(osenvironb[IMPL_PATH]),
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
3161 )
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3162 vlog("# Writing to directory", _bytes2sys(self._outputdir))
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3163
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3164 try:
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3165 return self._runtests(testdescs) or 0
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3166 finally:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3167 time.sleep(0.1)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3168 self._cleanup()
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3169
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3170 def findtests(self, args):
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3171 """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
3172
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3173 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
3174 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
3175 """
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3176 if not args:
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3177 if self.options.changed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3178 proc = Popen4(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3179 b'hg st --rev "%s" -man0 .'
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3180 % _sys2bytes(self.options.changed),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3181 None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3182 0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3183 )
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3184 stdout, stderr = proc.communicate()
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3185 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
3186 else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3187 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
3188
34969
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3189 expanded_args = []
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3190 for arg in args:
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3191 if os.path.isdir(arg):
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3192 if not arg.endswith(b'/'):
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3193 arg += b'/'
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3194 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: 34966
diff changeset
3195 else:
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3196 expanded_args.append(arg)
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3197 args = expanded_args
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
3198
44021
6d3b67a837a6 cleanup: drop redundant character escapes from `[]` character sets
Matt Harbison <matt_harbison@yahoo.com>
parents: 43982
diff changeset
3199 testcasepattern = re.compile(br'([\w-]+\.t|py)(?:#([a-zA-Z0-9_\-.#]+))')
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3200 tests = []
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3201 for t in args:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3202 case = []
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3203
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3204 if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3205 os.path.basename(t).startswith(b'test-')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3206 and (t.endswith(b'.py') or t.endswith(b'.t'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3207 ):
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3208
41138
8ddc5d8bea25 tests: support passing testcase after .t paths that have path separators
Kyle Lippincott <spectral@google.com>
parents: 40989
diff changeset
3209 m = testcasepattern.match(os.path.basename(t))
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3210 if m is not None:
41141
89d103fc9c19 testrunner: avoid capturing a regex group we don't care about
Martin von Zweigbergk <martinvonz@google.com>
parents: 41138
diff changeset
3211 t_basename, casestr = m.groups()
41138
8ddc5d8bea25 tests: support passing testcase after .t paths that have path separators
Kyle Lippincott <spectral@google.com>
parents: 40989
diff changeset
3212 t = os.path.join(os.path.dirname(t), t_basename)
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3213 if casestr:
38934
35180ade80c1 tests: fix bytes/str issues in run-tests.py caught by python3
Augie Fackler <augie@google.com>
parents: 38824
diff changeset
3214 case = casestr.split(b'#')
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3215 else:
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3216 continue
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3217
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3218 if t.endswith(b'.t'):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3219 # .t file may contain multiple test cases
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3220 casedimensions = parsettestcases(t)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3221 if casedimensions:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3222 cases = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3223
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3224 def addcases(case, casedimensions):
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3225 if not casedimensions:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3226 cases.append(case)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3227 else:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3228 for c in casedimensions[0]:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3229 addcases(case + [c], casedimensions[1:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3230
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3231 addcases([], casedimensions)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3232 if case and case in cases:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3233 cases = [case]
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3234 elif case:
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3235 # Ignore invalid cases
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3236 cases = []
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
3237 else:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3238 pass
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3239 tests += [{'path': t, 'case': c} for c in sorted(cases)]
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3240 else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3241 tests.append({'path': t})
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3242 else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3243 tests.append({'path': t})
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3244 return tests
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
3245
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3246 def _runtests(self, testdescs):
32310
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32303
diff changeset
3247 def _reloadtest(test, i):
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32303
diff changeset
3248 # 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: 32303
diff changeset
3249 desc = {'path': test.path}
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3250 case = getattr(test, '_case', [])
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3251 if case:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3252 desc['case'] = case
32310
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32303
diff changeset
3253 return self._gettest(desc, i)
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32303
diff changeset
3254
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3255 try:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3256 if self.options.restart:
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3257 orig = list(testdescs)
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3258 while testdescs:
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3259 desc = testdescs[0]
32720
0cd641bfbf57 run-tests: make --restart work with output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32719
diff changeset
3260 # desc['path'] is a relative path
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3261 if 'case' in desc:
38934
35180ade80c1 tests: fix bytes/str issues in run-tests.py caught by python3
Augie Fackler <augie@google.com>
parents: 38824
diff changeset
3262 casestr = b'#'.join(desc['case'])
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
3263 errpath = b'%s#%s.err' % (desc['path'], casestr)
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3264 else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3265 errpath = b'%s.err' % desc['path']
32720
0cd641bfbf57 run-tests: make --restart work with output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32719
diff changeset
3266 errpath = os.path.join(self._outputdir, errpath)
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3267 if os.path.exists(errpath):
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3268 break
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3269 testdescs.pop(0)
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3270 if not testdescs:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3271 print("running all tests")
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3272 testdescs = orig
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3273
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3274 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: 41141
diff changeset
3275 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: 41141
diff changeset
3276
53327bfbf35d testrunner: make `-j100 --runs-per-test=100 test-foo.t` use 100 jobs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41141
diff changeset
3277 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: 39909
diff changeset
3278
21458
c42219733f30 run-tests: don't print results in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21457
diff changeset
3279 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
3280 kws = self.options.keywords
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
3281 if kws is not None and PYTHON3:
25050
28526bb5b3b5 run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com>
parents: 25049
diff changeset
3282 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
3283
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3284 suite = TestSuite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3285 self._testdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3286 jobs=jobs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3287 whitelist=self.options.whitelisted,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3288 blacklist=self.options.blacklist,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3289 retest=self.options.retest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3290 keywords=kws,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3291 loop=self.options.loop,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3292 runs_per_test=self.options.runs_per_test,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3293 showchannels=self.options.showchannels,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3294 tests=tests,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3295 loadtest=_reloadtest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3296 )
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
3297 verbosity = 1
38620
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
3298 if self.options.list_tests:
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
3299 verbosity = 0
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
3300 elif self.options.verbose:
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
3301 verbosity = 2
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
3302 runner = TextTestRunner(self, verbosity=verbosity)
32703
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32702
diff changeset
3303
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3304 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: 32703
diff changeset
3305 result = runner.listtests(suite)
32703
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32702
diff changeset
3306 else:
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3307 if self._installdir:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3308 self._installhg()
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3309 self._checkhglib("Testing")
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3310 else:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3311 self._usecorrectpython()
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3312 if self.options.chg:
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3313 assert self._installdir
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3314 self._installchg()
32703
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32702
diff changeset
3315
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3316 log(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3317 'running %d tests using %d parallel processes'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3318 % (num_tests, jobs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3319 )
40244
1039404c5e1d run-tests: print number of tests and parallel process count
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39909
diff changeset
3320
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
3321 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
3322
42386
15d5a2de44aa tests: make run-tests exit non-zero if there are "errors"
Kyle Lippincott <spectral@google.com>
parents: 41804
diff changeset
3323 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
3324 failed = True
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3325
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
3326 result.onEnd()
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
3327
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3328 if self.options.anycoverage:
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3329 self._outputcoverage()
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3330 except KeyboardInterrupt:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3331 failed = True
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3332 print("\ninterrupted!")
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3333
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3334 if failed:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3335 return 1
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
3336
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
3337 def _getport(self, count):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3338 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
3339 if port is None:
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3340 portneeded = 3
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3341 # above 100 tries we just give up and let test reports failure
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3342 for tries in xrange(100):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3343 allfree = True
27602
67aa88e00fc7 run-tests: fix get port to try differing ports
timeless <timeless@mozdev.org>
parents: 27567
diff changeset
3344 port = self.options.port + self._portoffset
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
3345 for idx in xrange(portneeded):
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
3346 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
3347 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
3348 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
3349 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
3350 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
3351 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
3352 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
3353 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
3354
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3355 def _gettest(self, testdesc, count):
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3356 """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
3357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3358 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
3359 map to a known type.
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3360 """
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
3361 path = testdesc['path']
32310
b96be0098624 run-tests: change test identity from a path to a dict
Jun Wu <quark@fb.com>
parents: 32303
diff changeset
3362 lctest = path.lower()
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3363 testcls = Test
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3364
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
3365 for ext, cls in self.TESTTYPES:
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3366 if lctest.endswith(ext):
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3367 testcls = cls
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3368 break
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3369
40487
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40479
diff changeset
3370 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
3371 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
3372
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3373 # extra keyword parameters. 'case' is used by .t tests
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44449
diff changeset
3374 kwds = {k: testdesc[k] for k in ['case'] if k in testdesc}
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
3375
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3376 t = testcls(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3377 refpath,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3378 self._outputdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3379 tmpdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3380 keeptmpdir=self.options.keep_tmpdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3381 debug=self.options.debug,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3382 first=self.options.first,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3383 timeout=self.options.timeout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3384 startport=self._getport(count),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3385 extraconfigopts=self.options.extra_config_opt,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3386 shell=self.options.shell,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3387 hgcommand=self._hgcommand,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3388 usechg=bool(self.options.with_chg or self.options.chg),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3389 useipv6=useipv6,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3390 **kwds
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3391 )
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
3392 t.should_reload = True
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
3393 return t
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
3394
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
3395 def _cleanup(self):
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3396 """Clean up state from this test invocation."""
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3397 if self.options.keep_tmpdir:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3398 return
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3399
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3400 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
3401 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
3402 for f in self._createdfiles:
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3403 try:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3404 os.remove(f)
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3405 except OSError:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3406 pass
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
3407
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3408 def _usecorrectpython(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3409 """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
3410 # Tests must use the same interpreter as us or bad things will happen.
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
3411 pyexename = sys.platform == 'win32' and b'python.exe' or b'python'
39647
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39646
diff changeset
3412
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39646
diff changeset
3413 # 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: 39646
diff changeset
3414 # Administrator rights.
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39646
diff changeset
3415 if getattr(os, 'symlink', None) and os.name != 'nt':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3416 vlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3417 "# Making python executable in test path a symlink to '%s'"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3418 % sysexecutable
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3419 )
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3420 mypython = os.path.join(self._tmpbindir, pyexename)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3421 try:
42523
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
3422 if os.readlink(mypython) == sysexecutable:
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3423 return
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3424 os.unlink(mypython)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3425 except OSError as err:
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3426 if err.errno != errno.ENOENT:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3427 raise
42523
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
3428 if self._findprogram(pyexename) != sysexecutable:
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3429 try:
42523
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
3430 os.symlink(sysexecutable, mypython)
21352
39fd89fbbc3c run-tests: move createdfiles out of a global and into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21351
diff changeset
3431 self._createdfiles.append(mypython)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3432 except OSError as err:
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3433 # child processes may race, which is harmless
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3434 if err.errno != errno.EEXIST:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3435 raise
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3436 else:
42523
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
3437 exedir, exename = os.path.split(sysexecutable)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3438 vlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3439 "# Modifying search path to find %s as %s in '%s'"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3440 % (exename, pyexename, exedir)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3441 )
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3442 path = os.environ['PATH'].split(os.pathsep)
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3443 while exedir in path:
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3444 path.remove(exedir)
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3445 os.environ['PATH'] = os.pathsep.join([exedir] + path)
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3446 if not self._findprogram(pyexename):
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3447 print("WARNING: Cannot find %s in search path" % pyexename)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
3448
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3449 def _installhg(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3450 """Install hg into the test environment.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3451
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3452 This will also configure hg with the appropriate testing settings.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3453 """
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3454 vlog("# Performing temporary installation of HG")
28829
65fb87479792 run-tests: move install.err into test area
timeless <timeless@mozdev.org>
parents: 28823
diff changeset
3455 installerrs = os.path.join(self._hgtmp, b"install.err")
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3456 compiler = ''
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3457 if self.options.compiler:
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3458 compiler = '--compiler ' + self.options.compiler
44488
0d9ad84a28d9 run-tests: rename "pure" variable to setup_opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44470
diff changeset
3459 setup_opts = b""
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24075
diff changeset
3460 if self.options.pure:
44488
0d9ad84a28d9 run-tests: rename "pure" variable to setup_opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44470
diff changeset
3461 setup_opts = b"--pure"
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
3462 elif self.options.rust:
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
3463 setup_opts = b"--rust"
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Raphaël Gomès <rgomes@octobus.net>
parents: 44488
diff changeset
3464 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: 44488
diff changeset
3465 setup_opts = b"--no-rust"
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3466
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3467 # Run installer in hg root
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3468 script = os.path.realpath(sys.argv[0])
42523
49998d5ba66a pycompat: make fewer assumptions about sys.executable
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42512
diff changeset
3469 exe = sysexecutable
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
3470 if PYTHON3:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3471 compiler = _sys2bytes(compiler)
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3472 script = _sys2bytes(script)
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3473 exe = _sys2bytes(exe)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3474 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
3475 self._hgroot = hgroot
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3476 os.chdir(hgroot)
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
3477 nohome = b'--home=""'
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3478 if os.name == 'nt':
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3479 # The --home="" trick works only on OS where os.sep == '/'
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3480 # because of a distutils convert_path() fast-path. Avoid it at
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3481 # least on Windows for now, deal with .pydistutils.cfg bugs
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3482 # when they happen.
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
3483 nohome = b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3484 cmd = (
44488
0d9ad84a28d9 run-tests: rename "pure" variable to setup_opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44470
diff changeset
3485 b'"%(exe)s" setup.py %(setup_opts)s clean --all'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3486 b' build %(compiler)s --build-base="%(base)s"'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3487 b' install --force --prefix="%(prefix)s"'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3488 b' --install-lib="%(libdir)s"'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3489 b' --install-scripts="%(bindir)s" %(nohome)s >%(logfile)s 2>&1'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3490 % {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3491 b'exe': exe,
44488
0d9ad84a28d9 run-tests: rename "pure" variable to setup_opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44470
diff changeset
3492 b'setup_opts': setup_opts,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3493 b'compiler': compiler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3494 b'base': os.path.join(self._hgtmp, b"build"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3495 b'prefix': self._installdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3496 b'libdir': self._pythondir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3497 b'bindir': self._bindir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3498 b'nohome': nohome,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3499 b'logfile': installerrs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3500 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3501 )
24075
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3502
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3503 # setuptools requires install directories to exist.
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3504 def makedirs(p):
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3505 try:
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3506 os.makedirs(p)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3507 except OSError as e:
24075
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3508 if e.errno != errno.EEXIST:
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3509 raise
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3510
24075
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3511 makedirs(self._pythondir)
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3512 makedirs(self._bindir)
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
3513
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
3514 vlog("# Running", cmd.decode("utf-8"))
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3515 if subprocess.call(_bytes2sys(cmd), shell=True) == 0:
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3516 if not self.options.verbose:
26087
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
3517 try:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
3518 os.remove(installerrs)
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
3519 except OSError as e:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
3520 if e.errno != errno.ENOENT:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
3521 raise
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3522 else:
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3523 with open(installerrs, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3524 for line in f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3525 if PYTHON3:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3526 sys.stdout.buffer.write(line)
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3527 else:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3528 sys.stdout.write(line)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3529 sys.exit(1)
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
3530 os.chdir(self._testdir)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3531
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3532 self._usecorrectpython()
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3533
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
3534 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
3535 if os.path.isfile(hgbat):
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3536 # 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
3537 # installation layout put it in bin/ directly. Fix it
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3538 with open(hgbat, 'rb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3539 data = f.read()
41540
17a6e063c886 run-tests: use raw strings for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41495
diff changeset
3540 if br'"%~dp0..\python" "%~dp0hg" %*' in data:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3541 data = data.replace(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3542 br'"%~dp0..\python" "%~dp0hg" %*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3543 b'"%~dp0python" "%~dp0hg" %*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3544 )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3545 with open(hgbat, 'wb') as f:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
3546 f.write(data)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3547 else:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3548 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
3549
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3550 if self.options.anycoverage:
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3551 custom = os.path.join(
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3552 osenvironb[b'RUNTESTDIR'], b'sitecustomize.py'
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3553 )
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3554 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
3555 vlog('# Installing coverage trigger to %s' % target)
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3556 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
3557 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
3558 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
3559 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
3560 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
3561 try:
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3562 os.mkdir(covdir)
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
3563 except OSError as e:
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3564 if e.errno != errno.EEXIST:
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3565 raise
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3566
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3567 osenvironb[b'COVERAGE_DIR'] = covdir
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
3568
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3569 def _checkhglib(self, verb):
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
3570 """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
3571 the one we expect it to be. If not, print a warning to stderr."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3572 if (self._bindir == self._pythondir) and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3573 self._bindir != self._tmpbindir
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3574 ):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
3575 # 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
3576 # 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
3577 return
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
3578 expecthg = os.path.join(self._pythondir, b'mercurial')
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3579 actualhg = self._gethgpath()
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
3580 if os.path.abspath(actualhg) != os.path.abspath(expecthg):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3581 sys.stderr.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3582 'warning: %s with unexpected mercurial lib: %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3583 ' (expected %s)\n' % (verb, actualhg, expecthg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3584 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3585
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3586 def _gethgpath(self):
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3587 """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
3588 the current Python interpreter."""
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3589 if self._hgpath is not None:
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3590 return self._hgpath
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3591
40930
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40491
diff changeset
3592 cmd = b'"%s" -c "import mercurial; print (mercurial.__path__[0])"'
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
3593 cmd = cmd % PYTHON
25159
138dc8381049 run-tests: move all open-coded sys.version_info checks to PYTHON3 (issue4668)
Augie Fackler <augie@google.com>
parents: 25158
diff changeset
3594 if PYTHON3:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3595 cmd = _bytes2sys(cmd)
40930
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40491
diff changeset
3596
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40491
diff changeset
3597 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: 40491
diff changeset
3598 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: 40491
diff changeset
3599
fcdff048a8e5 py3: teach run-tests.py to handle exe with spaces when --local isn't specified
Matt Harbison <matt_harbison@yahoo.com>
parents: 40491
diff changeset
3600 self._hgpath = out.strip()
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3601
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
3602 return self._hgpath
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
3603
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3604 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
3605 """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
3606 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
3607 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
3608 assert self._hgroot, 'must be called after _installhg()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3609 cmd = b'"%(make)s" clean install PREFIX="%(prefix)s"' % {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3610 b'make': b'make', # TODO: switch by option or environment?
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3611 b'prefix': self._installdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3612 }
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3613 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
3614 vlog("# Running", cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3615 proc = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3616 cmd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3617 shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3618 cwd=cwd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3619 stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3620 stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3621 stderr=subprocess.STDOUT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3622 )
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3623 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
3624 if proc.returncode != 0:
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3625 if PYTHON3:
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3626 sys.stdout.buffer.write(out)
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3627 else:
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3628 sys.stdout.write(out)
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
3629 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
3630
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
3631 def _outputcoverage(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3632 """Produce code coverage output."""
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
3633 import coverage
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3634
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
3635 coverage = coverage.coverage
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
3636
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
3637 vlog('# Producing coverage report')
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
3638 # 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
3639 # output.
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
3640 os.chdir(self._hgroot)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3641 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
3642 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
3643
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
3644 # Map install directory paths back to source directory.
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3645 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
3646
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
3647 cov.combine()
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
3648
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
3649 omit = [
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3650 _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
3651 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
3652 ]
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
3653 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
3654
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
3655 if self.options.htmlcov:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3656 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
3657 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
3658 if self.options.annotate:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3659 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
3660 if not os.path.isdir(adir):
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
3661 os.mkdir(adir)
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
3662 cov.annotate(directory=adir, omit=omit)
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
3663
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3664 def _findprogram(self, program):
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3665 """Search PATH for a executable program"""
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3666 dpb = _sys2bytes(os.defpath)
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3667 sepb = _sys2bytes(os.pathsep)
25038
66da89457c47 run-tests: fix _findprogram to reliably return bytes
Augie Fackler <augie@google.com>
parents: 25037
diff changeset
3668 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
3669 name = os.path.join(p, program)
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3670 if os.name == 'nt' or os.access(name, os.X_OK):
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3671 return name
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3672 return None
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3673
21374
592b3d2616d7 run-tests: move checktools into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21373
diff changeset
3674 def _checktools(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
3675 """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
3676 for p in self.REQUIREDTOOLS:
39589
4eb0f2452ad7 py3: add b'' to some run-tests.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39403
diff changeset
3677 if os.name == 'nt' and not p.endswith(b'.exe'):
4eb0f2452ad7 py3: add b'' to some run-tests.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39403
diff changeset
3678 p += b'.exe'
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3679 found = self._findprogram(p)
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
3680 p = p.decode("utf-8")
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3681 if found:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
3682 vlog("# Found prerequisite", p, "at", _bytes2sys(found))
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3683 else:
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
3684 print("WARNING: Did not find prerequisite tool: %s " % p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3685
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
3686
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3687 def aggregateexceptions(path):
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3688 exceptioncounts = collections.Counter()
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3689 testsbyfailure = collections.defaultdict(set)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3690 failuresbytest = collections.defaultdict(set)
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3691
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3692 for f in os.listdir(path):
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3693 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: 35189
diff changeset
3694 data = fh.read().split(b'\0')
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3695 if len(data) != 5:
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3696 continue
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3697
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3698 exc, mainframe, hgframe, hgline, testname = data
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3699 exc = exc.decode('utf-8')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3700 mainframe = mainframe.decode('utf-8')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3701 hgframe = hgframe.decode('utf-8')
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3702 hgline = hgline.decode('utf-8')
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3703 testname = testname.decode('utf-8')
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3704
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3705 key = (hgframe, hgline, exc)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3706 exceptioncounts[key] += 1
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3707 testsbyfailure[key].add(testname)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3708 failuresbytest[testname].add(key)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3709
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3710 # Find test having fewest failures for each failure.
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3711 leastfailing = {}
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3712 for key, tests in testsbyfailure.items():
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3713 fewesttest = None
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3714 fewestcount = 99999999
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3715 for test in sorted(tests):
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3716 if len(failuresbytest[test]) < fewestcount:
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3717 fewesttest = test
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3718 fewestcount = len(failuresbytest[test])
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3719
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3720 leastfailing[key] = (fewestcount, fewesttest)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3721
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3722 # 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: 35991
diff changeset
3723 # impacted tests.
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3724 combined = {}
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3725 for key in exceptioncounts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3726 combined[key] = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3727 exceptioncounts[key],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3728 len(testsbyfailure[key]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3729 leastfailing[key][0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3730 leastfailing[key][1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3731 )
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3732
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3733 return {
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3734 'exceptioncounts': exceptioncounts,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3735 'total': sum(exceptioncounts.values()),
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3736 'combined': combined,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3737 'leastfailing': leastfailing,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3738 'byfailure': testsbyfailure,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3739 'bytest': failuresbytest,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
3740 }
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
3741
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3742
13347
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
3743 if __name__ == '__main__':
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
3744 runner = TestRunner()
22120
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
3745
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
3746 try:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
3747 import msvcrt
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
3748
22120
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
3749 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
3750 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
3751 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
3752 except ImportError:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
3753 pass
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
3754
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
3755 sys.exit(runner.run(sys.argv[1:]))