tests/run-tests.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 02 Jan 2025 14:57:40 +0100
changeset 52599 deb8afb8448e
parent 52598 003cb26c735b
child 52640 24ee91ba9aa8
permissions -rwxr-xr-x
run-tests: clean the last usage of IMPL_PATH up We no longer need this indirection, and the other users are gone.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45830
c102b704edb5 global: use python3 in shebangs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45826
diff changeset
     1
#!/usr/bin/env python3
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     2
#
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     3
# run-tests.py - Run a set of tests on Mercurial
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     4
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46754
diff changeset
     5
# Copyright 2006 Olivia Mackall <olivia@selenic.com>
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     6
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8161
diff changeset
     7
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10154
diff changeset
     8
# GNU General Public License version 2 or any later version.
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     9
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    10
# Modifying this script is tricky because it has many modes:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    11
#   - serial (default) vs parallel (-jN, N > 1)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    12
#   - no coverage (default) vs coverage (-c, -C, -s)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    13
#   - temp install (default) vs specific hg script (--with-hg, --local)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    14
#   - tests are a mix of shell scripts and Python scripts
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    15
#
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    16
# If you change this script, it is recommended that you ensure you
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    17
# haven't broken it by running it in various modes with a representative
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    18
# sample of test scripts.  For example:
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8724
diff changeset
    19
#
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    20
#  1) serial, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    21
#      ./run-tests.py test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    22
#  2) serial, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    23
#      ./run-tests.py --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    24
#  3) serial, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    25
#      ./run-tests.py -c test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    26
#  4) serial, coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    27
#      ./run-tests.py -c --local test-s*      # unsupported
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    28
#  5) parallel, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    29
#      ./run-tests.py -j2 test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    30
#  6) parallel, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    31
#      ./run-tests.py -j2 --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    32
#  7) parallel, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    33
#      ./run-tests.py -j2 -c test-s*          # currently broken
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
    34
#  8) parallel, coverage, local install:
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    35
#      ./run-tests.py -j2 -c --local test-s*  # unsupported (and broken)
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
    36
#  9) parallel, custom tmp dir:
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
    37
#      ./run-tests.py -j2 --tmpdir /tmp/myhgtests
26158
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
    38
#  10) parallel, pure, tests that call run-tests:
342ab95a1f4b run-tests: use $HGTEST_RUN_TESTS_PURE
timeless@mozdev.org
parents: 26109
diff changeset
    39
#      ./run-tests.py --pure `grep -l run-tests.py *.t`
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    40
#
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    41
# (You could use any subset of the tests: test-s* happens to match
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    42
# enough that it's worth doing parallel runs, few enough that it
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    43
# completes fairly quickly, includes both shell and Python scripts, and
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    44
# includes some scripts that run daemon processes.)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    45
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
    46
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
    47
import argparse
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
    48
import collections
45955
064449f9fdc2 run-tests: use a context manager when looking for available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    49
import contextlib
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    50
import difflib
49496
35bf7f23b84c run-tests: deal with distutil deprecation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49306
diff changeset
    51
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    52
import errno
48859
f928dec9add7 tests: unconditionalize _unified_diff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48858
diff changeset
    53
import functools
28126
562a073a2a1b tests: load json with no fallback
Yuya Nishihara <yuya@tcha.org>
parents: 28099
diff changeset
    54
import json
40245
e7e70c033783 run-tests: run tests with as many processes as cores by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40244
diff changeset
    55
import multiprocessing
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    56
import os
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44488
diff changeset
    57
import platform
48867
f547a5dee234 tests: unconditionalize some imports
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48866
diff changeset
    58
import queue
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
    59
import random
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
    60
import re
48867
f547a5dee234 tests: unconditionalize some imports
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48866
diff changeset
    61
import shlex
10905
13a1b2fb7ef2 pylint, pyflakes: remove unused or duplicate imports
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10903
diff changeset
    62
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
    63
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
    64
import socket
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
    65
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
    66
import sys
32302
8627cf4de929 run-tests: drop fallback for sysconfig for pre-py2.7
Martin von Zweigbergk <martinvonz@google.com>
parents: 31950
diff changeset
    67
import sysconfig
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
    68
import tempfile
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
    69
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
    70
import time
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
    71
import unittest
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
    72
import uuid
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
    73
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
    74
49496
35bf7f23b84c run-tests: deal with distutil deprecation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49306
diff changeset
    75
51947
737423ae03c2 run-tests: bump the minimum python to 3.8
Matt Harbison <matt_harbison@yahoo.com>
parents: 51833
diff changeset
    76
if sys.version_info < (3, 8, 0):
48880
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    77
    print(
51947
737423ae03c2 run-tests: bump the minimum python to 3.8
Matt Harbison <matt_harbison@yahoo.com>
parents: 51833
diff changeset
    78
        '%s is only supported on Python 3.8+, not %s'
48880
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    79
        % (sys.argv[0], '.'.join(str(v) for v in sys.version_info[:3]))
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    80
    )
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    81
    sys.exit(70)  # EX_SOFTWARE from `man 3 sysexit`
431084a68c4a tests: move Python 3.5 check higher in file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    82
49832
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
    83
MACOS = sys.platform == 'darwin'
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
    84
WINDOWS = os.name == r'nt'
48867
f547a5dee234 tests: unconditionalize some imports
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48866
diff changeset
    85
shellquote = shlex.quote
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
    86
52311
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
    87
# The number of HGPORTx ports allocated to each test.
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
    88
HGPORT_COUNT = 4
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
    89
52593
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
    90
RUNTEST_DIR = os.path.abspath(os.path.dirname(__file__.encode('utf-8')))
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
    91
RUNTEST_DIR_FORWARD_SLASH = RUNTEST_DIR.replace(os.sep.encode('utf-8'), b'/')
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
    92
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
    93
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
    94
processlock = threading.Lock()
19413
a4de0d3dc35a run-tests: lock popen wait/poll
Brendan Cully <brendan@kublai.com>
parents: 19407
diff changeset
    95
33552
754569f5e999 run-tests: make sure to check if pygments is installed before using it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33500
diff changeset
    96
pygmentspresent = False
47308
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
    97
try:  # is pygments installed
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
    98
    import pygments
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
    99
    import pygments.lexers as lexers
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   100
    import pygments.lexer as lexer
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   101
    import pygments.formatters as formatters
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   102
    import pygments.token as token
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   103
    import pygments.style as style
52512
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   104
    from pygments.console import ansiformat
47308
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   105
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
   106
    if WINDOWS:
47308
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   107
        hgpath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   108
        sys.path.append(hgpath)
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   109
        try:
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   110
            from mercurial import win32  # pytype: disable=import-error
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   111
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   112
            # Don't check the result code because it fails on heptapod, but
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   113
            # something is able to convert to color anyway.
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   114
            win32.enablevtmode()
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   115
        finally:
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   116
            sys.path = sys.path[:-1]
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   117
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   118
    pygmentspresent = True
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   119
    difflexer = lexers.DiffLexer()
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   120
    terminal256formatter = formatters.Terminal256Formatter()
52512
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   121
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   122
    def colorize(text: str, style: str, color: bool = True) -> str:
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   123
        if not color:
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   124
            return text
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   125
        return ansiformat(style, text)
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   126
47308
bb4606f35d37 run-tests: enable color on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47233
diff changeset
   127
except ImportError:
52512
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   128
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   129
    def colorize(text: str, style: str, color: bool = True) -> str:
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   130
        return text
c2ee1ad78414 run-tests: add a function to colorize a piece of text
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52458
diff changeset
   131
33420
e80041832eec run-tests: add color to output if pygments is available
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33203
diff changeset
   132
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   133
progress_type = {}
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   134
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   135
if pygmentspresent:
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   136
    _T_ERROR = token.string_to_tokentype("Token.Generic.Error")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   137
    _T_FAILED = token.string_to_tokentype("Token.Generic.Failed")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   138
    _T_FNAME = token.string_to_tokentype("Token.Generic.FName")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   139
    _T_IGNORED = token.string_to_tokentype("Token.Generic.Ignored")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   140
    _T_SKIPPED = token.string_to_tokentype("Token.Generic.Skipped")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   141
    _T_SNAME = token.string_to_tokentype("Token.Generic.SName")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   142
    _T_SKIPPED_DOT = token.string_to_tokentype("Token.Generic.SkippedDot")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   143
    _T_SUCCESS = token.string_to_tokentype("Token.Generic.Success")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   144
    _T_TIMEDOUT = token.string_to_tokentype("Token.Generic.TimedOut")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   145
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   146
    class TestRunnerStyle(style.Style):
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   147
        default_style = ""
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   148
        styles = {
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   149
            _T_ERROR: '#cd00cd',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   150
            _T_FAILED: '#7f0000',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   151
            _T_FNAME: '#ff0000',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   152
            _T_IGNORED: '#cdcd00',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   153
            _T_SKIPPED: '#e5e5e5',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   154
            _T_SNAME: '#00ffff',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   155
            _T_SKIPPED_DOT: '#00ffff',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   156
            _T_SUCCESS: '#00cd00',
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   157
            _T_TIMEDOUT: '#ff00ff',
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   158
        }
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   159
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   160
    class TestRunnerLexer(lexer.RegexLexer):
38290
b5651ae53127 run-tests: restrict the test cases allowed characters
Boris Feld <boris.feld@octobus.net>
parents: 38251
diff changeset
   161
        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
   162
        tokens = {
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   163
            'root': [
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   164
                (r'^Skipped', _T_SKIPPED, 'skipped'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   165
                (r'^Failed ', _T_FAILED, 'failed'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   166
                (r'^ERROR: ', _T_FAILED, 'failed'),
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   167
            ],
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   168
            'skipped': [
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   169
                (testpattern, _T_SNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   170
                (r':.*', _T_SKIPPED),
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   171
            ],
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   172
            'failed': [
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   173
                (testpattern, _T_FNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   174
                (r'(:| ).*', _T_FAILED),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   175
            ],
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   176
        }
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   177
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   178
    progress_type['.'] = _T_SUCCESS
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   179
    progress_type['s'] = _T_SKIPPED_DOT
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   180
    progress_type['i'] = _T_IGNORED
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   181
    progress_type['!'] = _T_FAILED
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   182
    progress_type['E'] = _T_ERROR
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   183
    progress_type['t'] = _T_TIMEDOUT
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   184
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   185
    class progressLexer(lexer.RegexLexer):
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   186
        testpattern = r'[\w-]+\.(t|py)(#[a-zA-Z0-9_\-\.]+)?'
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   187
        tokens = {
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   188
            'root': [
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   189
                (r'^Skipped', _T_SKIPPED, 'skipped'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   190
                (r'^Failed ', _T_FAILED, 'failed'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   191
                (r'^ERROR: ', _T_FAILED, 'failed'),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   192
            ],
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   193
            'skipped': [
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   194
                (testpattern, _T_SNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   195
                (r':.*', _T_SKIPPED),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   196
            ],
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   197
            'failed': [
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   198
                (testpattern, _T_FNAME),
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
   199
                (r'(:| ).*', _T_FAILED),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   200
            ],
33814
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   201
        }
81b12f69ef5b run-tests: also color the summary messages (skipped, failed...)
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33710
diff changeset
   202
33866
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33814
diff changeset
   203
    runnerformatter = formatters.Terminal256Formatter(style=TestRunnerStyle)
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33814
diff changeset
   204
    runnerlexer = TestRunnerLexer()
4e8a46c25fac run-tests: pre instantiate pygments objects
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 33814
diff changeset
   205
39645
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
   206
origenviron = os.environ.copy()
13179f97f697 py3: ensure run-tests.osenvironb is actually bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39589
diff changeset
   207
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
   208
48856
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   209
def _sys2bytes(p):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   210
    if p is None:
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   211
        return p
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   212
    return p.encode('utf-8')
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   213
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   214
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   215
def _bytes2sys(p):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   216
    if p is None:
25161
4d30467d944e run-tests: move unicode-to-bytes operations on paths to a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25160
diff changeset
   217
        return p
48856
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   218
    return p.decode('utf-8')
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   219
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   220
50928
a4ec7a92d2c5 tests: avoid test environment affecting setup.py
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50335
diff changeset
   221
original_env = os.environ.copy()
48856
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   222
osenvironb = getattr(os, 'environb', None)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   223
if osenvironb is None:
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   224
    # Windows lacks os.environb, for instance.  A proxy over the real thing
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   225
    # instead of a copy allows the environment to be updated via bytes on
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   226
    # all platforms.
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48880
diff changeset
   227
    class environbytes:
48856
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   228
        def __init__(self, strenv):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   229
            self.__len__ = strenv.__len__
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   230
            self.clear = strenv.clear
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   231
            self._strenv = strenv
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   232
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   233
        def __getitem__(self, k):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   234
            v = self._strenv.__getitem__(_bytes2sys(k))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   235
            return _sys2bytes(v)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   236
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   237
        def __setitem__(self, k, v):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   238
            self._strenv.__setitem__(_bytes2sys(k), _bytes2sys(v))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   239
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   240
        def __delitem__(self, k):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   241
            self._strenv.__delitem__(_bytes2sys(k))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   242
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   243
        def __contains__(self, k):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   244
            return self._strenv.__contains__(_bytes2sys(k))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   245
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   246
        def __iter__(self):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   247
            return iter([_sys2bytes(k) for k in iter(self._strenv)])
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   248
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   249
        def get(self, k, default=None):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   250
            v = self._strenv.get(_bytes2sys(k), _bytes2sys(default))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   251
            return _sys2bytes(v)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   252
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   253
        def pop(self, k, default=None):
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   254
            v = self._strenv.pop(_bytes2sys(k), _bytes2sys(default))
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   255
            return _sys2bytes(v)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   256
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   257
    osenvironb = environbytes(os.environ)
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   258
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   259
getcwdb = getattr(os, 'getcwdb')
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   260
if not getcwdb or WINDOWS:
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   261
    getcwdb = lambda: _sys2bytes(os.getcwd())
078e1e1cc7da tests: require Python 3.5+ in run-tests.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48735
diff changeset
   262
25162
153b9c5235c2 run-tests: replace open-coded .decode()s on paths with a helper (issue4667)
Augie Fackler <augie@google.com>
parents: 25161
diff changeset
   263
47619
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   264
if WINDOWS:
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   265
    _getcwdb = getcwdb
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   266
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   267
    def getcwdb():
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   268
        cwd = _getcwdb()
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   269
        if re.match(b'^[a-z]:', cwd):
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   270
            # os.getcwd() is inconsistent on the capitalization of the drive
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   271
            # letter, so adjust it. see https://bugs.python.org/issue40368
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   272
            cwd = cwd[0:1].upper() + cwd[1:]
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   273
        return cwd
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   274
f0fbe8f4faa6 run-tests: enforce the drive letter from `getcwd` to upper case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47588
diff changeset
   275
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
   276
# For Windows support
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
   277
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
   278
51954
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51912
diff changeset
   279
30984
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   280
# Whether to use IPv6
31002
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
   281
def checksocketfamily(name, port=20058):
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
   282
    """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
   283
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
   284
    name should be either 'AF_INET', or 'AF_INET6'.
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
   285
    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
   286
    """
a489ee9b2852 runtests: prefer IPv4 to IPv6
Jun Wu <quark@fb.com>
parents: 30987
diff changeset
   287
    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
   288
    if family is None:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   289
        return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   290
    try:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   291
        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
   292
        s.bind(('localhost', port))
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   293
        s.close()
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   294
        return True
48956
c194e93d1ebc tests: support another error case when detecting ipv4/ipv6 support
Kyle Lippincott <spectral@google.com>
parents: 48946
diff changeset
   295
    except (socket.error, OSError) as exc:
30984
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   296
        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
   297
            return True
48963
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 48956
diff changeset
   298
        elif exc.errno in (
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 48956
diff changeset
   299
            errno.EADDRNOTAVAIL,
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 48956
diff changeset
   300
            errno.EPROTONOSUPPORT,
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 48956
diff changeset
   301
            errno.EAFNOSUPPORT,
7e18fc0bc46c tests: fix formatting issue in run-tests.py after c194e93d1ebc
Kyle Lippincott <spectral@google.com>
parents: 48956
diff changeset
   302
        ):
30984
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   303
            return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   304
        else:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   305
            raise
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   306
    else:
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   307
        return False
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   308
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   309
31011
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   310
# useipv6 will be set by parseargs
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   311
useipv6 = None
30984
15f9084a9a0c runtests: add a function to test if IPv6 is available
Jun Wu <quark@fb.com>
parents: 30896
diff changeset
   312
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   313
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
   314
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
   315
    """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
   316
    if useipv6:
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 30984
diff changeset
   317
        family = socket.AF_INET6
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 30984
diff changeset
   318
    else:
1f803482844a runtests: checkportisavailable should only check one family
Jun Wu <quark@fb.com>
parents: 30984
diff changeset
   319
        family = socket.AF_INET
30987
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
   320
    try:
45955
064449f9fdc2 run-tests: use a context manager when looking for available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
   321
        with contextlib.closing(socket.socket(family, socket.SOCK_STREAM)) as s:
064449f9fdc2 run-tests: use a context manager when looking for available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
   322
            s.bind(('localhost', port))
30987
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
   323
        return True
49875
a77c1375c316 run-tests: drop a workaround for python2
Matt Harbison <matt_harbison@yahoo.com>
parents: 49833
diff changeset
   324
    except PermissionError:
a77c1375c316 run-tests: drop a workaround for python2
Matt Harbison <matt_harbison@yahoo.com>
parents: 49833
diff changeset
   325
        return False
30987
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
   326
    except socket.error as exc:
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
   327
        if WINDOWS and exc.errno == errno.WSAEACCES:
46327
85c0c7145f8e run-tests: catch a Windows specific error when testing for a free socket
Matt Harbison <matt_harbison@yahoo.com>
parents: 46326
diff changeset
   328
            return False
47181
6e0af81c43b2 run-tests: ignore PermissionError when checking available ports
Matt Harbison <matt_harbison@yahoo.com>
parents: 47040
diff changeset
   329
        if exc.errno not in (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   330
            errno.EADDRINUSE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   331
            errno.EADDRNOTAVAIL,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   332
            errno.EPROTONOSUPPORT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   333
        ):
30987
1ee685defe80 runtests: unindent an "if True" block
Jun Wu <quark@fb.com>
parents: 30986
diff changeset
   334
            raise
30886
2aaa8bfc7bd9 runtests: check ports on IPv6 address
Jun Wu <quark@fb.com>
parents: 30716
diff changeset
   335
    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
   336
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   337
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
   338
closefds = os.name == 'posix'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   339
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   340
19262
7864e8f274fe run-tests: add env dict to isolate test environment
Matt Mackall <mpm@selenic.com>
parents: 19252
diff changeset
   341
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
   342
    processlock.acquire()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   343
    p = subprocess.Popen(
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
   344
        _bytes2sys(cmd),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   345
        shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   346
        bufsize=-1,
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
   347
        cwd=_bytes2sys(wd),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   348
        env=env,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   349
        close_fds=closefds,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   350
        stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   351
        stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   352
        stderr=subprocess.STDOUT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   353
    )
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   354
    processlock.release()
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   355
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
   356
    p.fromchild = p.stdout
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
   357
    p.tochild = p.stdin
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
   358
    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
   359
14337
439ed4721a6d run-tests: ignore timeout when Popen.terminate is unavailable
Patrick Mezard <pmezard@gmail.com>
parents: 14336
diff changeset
   360
    p.timeout = False
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   361
    if timeout:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   362
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   363
        def t():
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   364
            start = time.time()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   365
            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
   366
                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
   367
            p.timeout = True
46918
248cbe173203 run-test: make it clearer why we terminating process
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46870
diff changeset
   368
            vlog('# Timout reached for process %d' % p.pid)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   369
            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
   370
                terminate(p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   371
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   372
        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
   373
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
   374
    return p
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
   375
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   376
44632
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44615
diff changeset
   377
default_defaults = {
40245
e7e70c033783 run-tests: run tests with as many processes as cores by default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40244
diff changeset
   378
    'jobs': ('HGTEST_JOBS', multiprocessing.cpu_count()),
51948
f4c038081561 run-tests: bump the default timeout on Windows to 4x the normal value
Matt Harbison <matt_harbison@yahoo.com>
parents: 51947
diff changeset
   379
    'timeout': ('HGTEST_TIMEOUT', 360 if not WINDOWS else 360 * 4),
41801
9f53a4e2e193 tests: increase timeout for slow test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41759
diff changeset
   380
    '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
   381
    '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
   382
    '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
   383
}
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
   384
44632
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44615
diff changeset
   385
defaults = default_defaults.copy()
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44615
diff changeset
   386
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   387
28644
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
   388
def canonpath(path):
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
   389
    return os.path.realpath(os.path.expanduser(path))
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
   390
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   391
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   392
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
   393
    entries = dict()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   394
    for filename in files:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   395
        try:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   396
            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
   397
            f = open(path, "rb")
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
   398
        except FileNotFoundError:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   399
            if warn:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
   400
                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
   401
            continue
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   402
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   403
        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
   404
            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
   405
            if line:
47182
dff19fe2973c run-tests: fix whitelist/blacklist with directories on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47181
diff changeset
   406
                # Ensure path entries are compatible with os.path.relpath()
dff19fe2973c run-tests: fix whitelist/blacklist with directories on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 47181
diff changeset
   407
                entries[os.path.normpath(line)] = filename
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   408
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   409
        f.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   410
    return entries
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   411
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   412
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   413
def parsettestcases(path):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   414
    """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
   415
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   416
    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
   417
    """
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   418
    cases = []
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   419
    try:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   420
        with open(path, 'rb') as f:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   421
            for l in f:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   422
                if l.startswith(b'#testcases '):
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   423
                    cases.append(sorted(l[11:].split()))
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
   424
    except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
   425
        pass
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   426
    return cases
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
   427
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   428
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
   429
def getparser():
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
   430
    """Obtain the OptionParser used by the CLI."""
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
   431
    parser = argparse.ArgumentParser(usage='%(prog)s [options] [tests]')
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   432
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   433
    selection = parser.add_argument_group('Test Selection')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   434
    selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   435
        '--allow-slow-tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   436
        action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   437
        help='allow extremely slow tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   438
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   439
    selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   440
        "--blacklist",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   441
        action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   442
        help="skip tests listed in the specified blacklist file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   443
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   444
    selection.add_argument(
52211
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   445
        "--shard-total",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   446
        type=int,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   447
        default=None,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   448
        help="total number of shard to use (enable sharding)",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   449
    )
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   450
    selection.add_argument(
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   451
        "--shard-index",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   452
        type=int,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   453
        default=None,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   454
        help="index of this shard [1-N]",
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   455
    )
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   456
    selection.add_argument(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   457
        "--changed",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   458
        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
   459
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   460
    selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   461
        "-k", "--keywords", help="run tests matching keywords"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   462
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   463
    selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   464
        "-r", "--retest", action="store_true", help="retest failed tests"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   465
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   466
    selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   467
        "--test-list",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   468
        action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   469
        help="read tests to run from the specified file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   470
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   471
    selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   472
        "--whitelist",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   473
        action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   474
        help="always run tests listed in the specified whitelist file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   475
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   476
    selection.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   477
        'tests', metavar='TESTS', nargs='*', help='Tests to run'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   478
    )
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   479
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   480
    harness = parser.add_argument_group('Test Harness Behavior')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   481
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   482
        "-d",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   483
        "--debug",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   484
        action="store_true",
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   485
        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
   486
        " rather than capturing and diffing it (disables timeout)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   487
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   488
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   489
        "-f",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   490
        "--first",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   491
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   492
        help="exit on the first test failure",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   493
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   494
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   495
        "-i",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   496
        "--interactive",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   497
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   498
        help="prompt to accept changed output",
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
        "-j",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   502
        "--jobs",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   503
        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
   504
        help="number of jobs to run in parallel"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   505
        " (default: $%s or %d)" % defaults['jobs'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   506
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   507
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   508
        "--keep-tmpdir",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   509
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   510
        help="keep temporary directory after running tests",
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
        "--list-tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   514
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   515
        help="list tests instead of running them",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   516
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   517
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   518
        "--loop", action="store_true", help="loop tests repeatedly"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   519
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   520
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   521
        '--random', action="store_true", help='run tests in random order'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   522
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   523
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   524
        '--order-by-runtime',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   525
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   526
        help='run slowest tests first, according to .testtimes',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   527
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   528
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   529
        "-p",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   530
        "--port",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   531
        type=int,
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   532
        help="port on which servers should listen"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   533
        " (default: $%s or %d)" % defaults['port'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   534
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   535
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   536
        '--profile-runner',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   537
        action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   538
        help='run statprof on run-tests',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   539
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   540
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   541
        "-R", "--restart", action="store_true", help="restart at last error"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   542
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   543
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   544
        "--runs-per-test",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   545
        type=int,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   546
        dest="runs_per_test",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   547
        help="run each test N times (default=1)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   548
        default=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   549
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   550
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   551
        "--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
   552
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   553
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   554
        '--showchannels', action='store_true', help='show scheduling channels'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   555
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   556
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   557
        "--slowtimeout",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   558
        type=int,
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   559
        help="kill errant slow tests after SLOWTIMEOUT seconds"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   560
        " (default: $%s or %d)" % defaults['slowtimeout'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   561
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   562
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   563
        "-t",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   564
        "--timeout",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   565
        type=int,
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   566
        help="kill errant tests after TIMEOUT seconds"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   567
        " (default: $%s or %d)" % defaults['timeout'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   568
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   569
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   570
        "--tmpdir",
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   571
        help="run tests in the given temporary directory"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   572
        " (implies --keep-tmpdir)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   573
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   574
    harness.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   575
        "-v", "--verbose", action="store_true", help="output verbose messages"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   576
    )
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   577
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   578
    hgconf = parser.add_argument_group('Mercurial Configuration')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   579
    hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   580
        "--chg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   581
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   582
        help="install and use chg wrapper in place of hg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   583
    )
44615
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44577
diff changeset
   584
    hgconf.add_argument(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   585
        "--chg-debug",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   586
        action="store_true",
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   587
        help="show chg debug logs",
44615
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44577
diff changeset
   588
    )
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   589
    hgconf.add_argument(
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   590
        "--rhg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   591
        action="store_true",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   592
        help="install and use rhg Rust implementation in place of hg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   593
    )
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
   594
    hgconf.add_argument(
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
   595
        "--pyoxidized",
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
   596
        action="store_true",
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
   597
        help="build the hg binary using pyoxidizer",
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
   598
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   599
    hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   600
        '--extra-config-opt',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   601
        action="append",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   602
        default=[],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   603
        help='set the given config opt in the test hgrc',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   604
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   605
    hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   606
        "-l",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   607
        "--local",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   608
        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
   609
        help="shortcut for --with-hg=<testdir>/../hg, "
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   610
        "--with-rhg=<testdir>/../rust/target/release/rhg if --rhg is set, "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   611
        "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
   612
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   613
    hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   614
        "--ipv6",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   615
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   616
        help="prefer IPv6 to IPv4 for network related tests",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   617
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   618
    hgconf.add_argument(
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
   619
        "--hg-wheel",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
   620
        default=None,
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
   621
        metavar="WHEEL_PATH",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
   622
        dest="wheel",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
   623
        help="install mercurial from the given wheel",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
   624
    )
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
   625
    hgconf.add_argument(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   626
        "--pure",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   627
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   628
        help="use pure Python code instead of C extensions",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   629
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   630
    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
   631
        "--rust",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   632
        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
   633
        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
   634
    )
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44488
diff changeset
   635
    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
   636
        "--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
   637
        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
   638
        help="do not use Rust code even if compiled",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   639
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   640
    hgconf.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   641
        "--with-chg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   642
        metavar="CHG",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   643
        help="use specified chg wrapper in place of hg",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   644
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   645
    hgconf.add_argument(
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   646
        "--with-rhg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   647
        metavar="RHG",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   648
        help="use specified rhg Rust implementation in place of hg",
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   649
    )
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   650
    hgconf.add_argument(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   651
        "--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
   652
        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
   653
        help="test using specified hg script rather than a "
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   654
        "temporary installation",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   655
    )
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   656
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   657
    reporting = parser.add_argument_group('Results Reporting')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   658
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   659
        "-C",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   660
        "--annotate",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   661
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   662
        help="output files annotated with coverage",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   663
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   664
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   665
        "--color",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   666
        choices=["always", "auto", "never"],
35188
d997b82152e8 run-tests: organize options into argument groups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35187
diff changeset
   667
        default=os.environ.get('HGRUNTESTSCOLOR', 'auto'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   668
        help="colorisation: always|auto|never (default: auto)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   669
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   670
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   671
        "-c",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   672
        "--cover",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   673
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   674
        help="print a test coverage report",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   675
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   676
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   677
        '--exceptions',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   678
        action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   679
        help='log all exceptions and generate an exception report',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   680
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   681
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   682
        "-H",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   683
        "--htmlcov",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   684
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   685
        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
   686
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   687
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   688
        "--json",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   689
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   690
        help="store test result data in 'report.json' file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   691
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   692
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   693
        "--outputdir",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   694
        help="directory to write error logs to (default=test directory)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   695
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   696
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   697
        "-n", "--nodiff", action="store_true", help="skip showing test changes"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   698
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   699
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   700
        "-S",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   701
        "--noskips",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   702
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   703
        help="don't report skip tests verbosely",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   704
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   705
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   706
        "--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
   707
    )
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
   708
    reporting.add_argument(
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
   709
        "--tail-report",
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
   710
        action="store_true",
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
   711
        help="display information about the final test of each thread",
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
   712
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   713
    reporting.add_argument("--view", help="external diff viewer")
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   714
    reporting.add_argument(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   715
        "--xunit", help="record xunit results at specified path"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   716
    )
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   717
14201
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
   718
    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
   719
        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
   720
    parser.set_defaults(**defaults)
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
   721
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
   722
    return parser
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
   723
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   724
21008
c1dd04be3d9a run-tests: allow option parser to be extended
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21007
diff changeset
   725
def parseargs(args, parser):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
   726
    """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
   727
    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
   728
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
   729
    # 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
   730
    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
   731
        options.pure = True
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
   732
44489
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44488
diff changeset
   733
    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
   734
        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
   735
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44488
diff changeset
   736
    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
   737
        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
   738
9183b7dcfa8d run-tests: add option for running with and without Rust extensions
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44488
diff changeset
   739
    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
   740
        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
   741
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
   742
    if options.local:
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   743
        if options.with_hg or options.with_rhg or options.with_chg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   744
            parser.error(
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   745
                '--local cannot be used with --with-hg or --with-rhg or --with-chg'
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   746
            )
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
   747
        if options.pyoxidized:
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
   748
            parser.error('--pyoxidized does not work with --local (yet)')
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
   749
        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
   750
        reporootdir = os.path.dirname(testdir)
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
   751
        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
   752
        if options.chg:
6ce870dba6fa run-tests: make --local set --with-chg if --chg is used
Jun Wu <quark@fb.com>
parents: 29582
diff changeset
   753
            pathandattrs.append((b'contrib/chg/chg', 'with_chg'))
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   754
        if options.rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   755
            pathandattrs.append((b'rust/target/release/rhg', 'with_rhg'))
29582
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
   756
        for relpath, attr in pathandattrs:
ee96d95e81a4 run-tests: allow --local to set multiple attributes
Jun Wu <quark@fb.com>
parents: 29518
diff changeset
   757
            binpath = os.path.join(reporootdir, relpath)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
   758
            if not (WINDOWS or os.access(binpath, os.X_OK)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   759
                parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   760
                    '--local specified, but %r not found or '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   761
                    'not executable' % binpath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   762
                )
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
   763
            setattr(options, attr, _bytes2sys(binpath))
42817
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
   764
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
   765
    if options.with_hg:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
   766
        options.with_hg = canonpath(_sys2bytes(options.with_hg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   767
        if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   768
            os.path.isfile(options.with_hg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   769
            and os.access(options.with_hg, os.X_OK)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   770
        ):
42817
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
   771
            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
   772
        if os.path.basename(options.with_hg) not in [b'hg', b'hg.exe']:
47583
05abe1ff1edd run-test: clarify the error with a bad --with-hg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47577
diff changeset
   773
            msg = 'warning: --with-hg should specify an hg script, not: %s\n'
05abe1ff1edd run-test: clarify the error with a bad --with-hg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47577
diff changeset
   774
            msg %= _bytes2sys(os.path.basename(options.with_hg))
05abe1ff1edd run-test: clarify the error with a bad --with-hg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47577
diff changeset
   775
            sys.stderr.write(msg)
42817
69506e1b3214 run-tests: handle --local before --with-hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 42816
diff changeset
   776
            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
   777
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
   778
    if (options.chg or options.with_chg) and WINDOWS:
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
   779
        parser.error('chg does not work on %s' % os.name)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
   780
    if (options.rhg or options.with_rhg) and WINDOWS:
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   781
        parser.error('rhg does not work on %s' % os.name)
49832
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
   782
    if options.pyoxidized and not (MACOS or WINDOWS):
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
   783
        parser.error('--pyoxidized is currently macOS and Windows only')
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
   784
    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
   785
        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
   786
        options.with_chg = canonpath(_sys2bytes(options.with_chg))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   787
        if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   788
            os.path.isfile(options.with_chg)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   789
            and os.access(options.with_chg, os.X_OK)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   790
        ):
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
   791
            parser.error('--with-chg must specify a chg executable')
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   792
    if options.with_rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   793
        options.rhg = False  # no installation to temporary location
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   794
        options.with_rhg = canonpath(_sys2bytes(options.with_rhg))
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   795
        if not (
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   796
            os.path.isfile(options.with_rhg)
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   797
            and os.access(options.with_rhg, os.X_OK)
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   798
        ):
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   799
            parser.error('--with-rhg must specify a rhg executable')
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
   800
    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
   801
        # chg shares installation location with hg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   802
        parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   803
            '--chg does not work when --with-hg is specified '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   804
            '(use --with-chg instead)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   805
        )
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   806
    if options.rhg and options.with_hg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   807
        # rhg shares installation location with hg
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   808
        parser.error(
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   809
            '--rhg does not work when --with-hg is specified '
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   810
            '(use --with-rhg instead)'
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   811
        )
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   812
    if options.rhg and options.chg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
   813
        parser.error('--rhg and --chg do not work together')
28142
85e28a46c7f1 run-tests: add --with-chg option to run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28127
diff changeset
   814
33567
d9677e2ed16a run-tests: warn if --color=always and no pygments installed
Martin von Zweigbergk <martinvonz@google.com>
parents: 33566
diff changeset
   815
    if options.color == 'always' and not pygmentspresent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   816
        sys.stderr.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   817
            'warning: --color=always ignored because '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   818
            'pygments is not installed\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   819
        )
33567
d9677e2ed16a run-tests: warn if --color=always and no pygments installed
Martin von Zweigbergk <martinvonz@google.com>
parents: 33566
diff changeset
   820
31011
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   821
    global useipv6
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   822
    if options.ipv6:
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   823
        useipv6 = checksocketfamily('AF_INET6')
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   824
    else:
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   825
        # 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
   826
        useipv6 = (not checksocketfamily('AF_INET')) and checksocketfamily(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   827
            'AF_INET6'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   828
        )
31011
01eebb65a61d runtests: add an IPv6 command line flag
Jun Wu <quark@fb.com>
parents: 31010
diff changeset
   829
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gr?ndemann <info@keimlink.de>
parents: 15858
diff changeset
   830
    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
   831
    if options.anycoverage:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   832
        try:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   833
            import coverage
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   834
50335
787e7caf887a run-tests: remove obsolete coverage check and packaging import (issue6805)
pacien <pacien.trangirard@pacien.net>
parents: 50275
diff changeset
   835
            coverage.__version__  # silence unused import warning
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   836
        except ImportError:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   837
            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
   838
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   839
    if options.anycoverage and options.local:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   840
        # this needs some path mangling somewhere, I guess
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   841
        parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   842
            "sorry, coverage options do not work when --local " "is specified"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   843
        )
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
   844
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
   845
    if options.anycoverage and options.with_hg:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   846
        parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   847
            "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
   848
        )
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
   849
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
   850
    global verbose
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   851
    if options.verbose:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
   852
        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
   853
9394
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
   854
    if options.tmpdir:
28644
2e50eb6304bd run-tests: add canonpath function
timeless <timeless@mozdev.org>
parents: 28620
diff changeset
   855
        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
   856
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   857
    if options.jobs < 1:
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
   858
        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
   859
    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
   860
        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
   861
    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
   862
        if options.timeout != defaults['timeout']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   863
            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
   864
        if options.slowtimeout != defaults['slowtimeout']:
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
   865
            sys.stderr.write(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   866
                'warning: --slowtimeout option ignored with --debug\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   867
            )
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
   868
        options.timeout = 0
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
   869
        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
   870
9959
b37b060d84c7 run-tests: add a "--blacklist target" option to skip predefined test lists
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9958
diff changeset
   871
    if options.blacklist:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   872
        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
   873
    if options.whitelist:
19279
3868c9ab4bf8 run-tests: drop options.child and users
Matt Mackall <mpm@selenic.com>
parents: 19278
diff changeset
   874
        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
   875
    else:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   876
        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
   877
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
   878
    if options.showchannels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
   879
        options.nodiff = True
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
   880
52211
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   881
    if options.shard_total is not None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   882
        if options.shard_index is None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   883
            parser.error("--shard-total requires --shard-index to be set")
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   884
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   885
    if options.shard_index is not None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   886
        if options.shard_total is None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   887
            parser.error("--shard-index requires --shard-total to be set")
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   888
        elif options.shard_index <= 0:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   889
            msg = "--shard-index must be > 0 (%d)"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   890
            msg %= options.shard_index
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   891
            parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   892
        elif options.shard_index > options.shard_total:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   893
            msg = (
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   894
                "--shard-index must be <= than --shard-total (%d not in [1,%d])"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   895
            )
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   896
            msg %= (options.shard_index, options.shard_total)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   897
            parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   898
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   899
    if options.shard_total is not None and options.order_by_runtime:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   900
        msg = "cannot use --order-by-runtime when sharding"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   901
        parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   902
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   903
    if options.shard_total is not None and options.random:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   904
        msg = "cannot use --random when sharding"
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   905
        parser.error(msg)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
   906
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
   907
    return options
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
   908
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   909
5800
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   910
def rename(src, dst):
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   911
    """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
   912
    for existing destination support.
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   913
    """
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   914
    shutil.copy(src, dst)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   915
    os.remove(src)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   916
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   917
40987
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
   918
def makecleanable(path):
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
   919
    """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
   920
    can be deleted"""
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
   921
    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
   922
        for d in dirnames:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
   923
            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
   924
            try:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
   925
                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
   926
            except OSError:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
   927
                pass
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
   928
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   929
48859
f928dec9add7 tests: unconditionalize _unified_diff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48858
diff changeset
   930
_unified_diff = functools.partial(difflib.diff_bytes, difflib.unified_diff)
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
   931
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   932
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
   933
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
   934
    servefail = False
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
   935
    lines = []
25045
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
   936
    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
   937
        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
   938
            line = line.replace(b'\\', b'/')
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
   939
            if line.endswith(b' \n'):
8a425c2eef5d run-tests: use difflib.diff_bytes on Python 3
Augie Fackler <augie@google.com>
parents: 25044
diff changeset
   940
                line = line[:-2] + b'\n'
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
   941
        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
   942
        if not servefail and line.startswith(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   943
            b'+  abort: child process failed to start'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   944
        ):
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
   945
            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
   946
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
   947
    return servefail, lines
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   948
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   949
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
   950
verbose = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   951
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   952
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
   953
def vlog(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   954
    """Log only when in verbose mode."""
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   955
    if verbose is False:
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   956
        return
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   957
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   958
    return log(*msg)
19250
5fa946330970 run-tests: make vlog a proper function
Matt Mackall <mpm@selenic.com>
parents: 19249
diff changeset
   959
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   960
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
   961
# 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
   962
# 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
   963
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
   964
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
   965
# 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
   966
# 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
   967
#
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
   968
#   output..output (feature !)\n
41540
17a6e063c886 run-tests: use raw strings for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41495
diff changeset
   969
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
   970
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   971
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
   972
def cdatasafe(data):
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
   973
    """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
   974
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
   975
    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
   976
    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
   977
    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
   978
    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
   979
    """
25051
9c28f3236677 run-tests: do cdata escaping using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25050
diff changeset
   980
    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
   981
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   982
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
   983
def log(*msg):
21535
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   984
    """Log something to stdout.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   985
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   986
    Arguments are strings to print.
ab7e224bc089 run-tests: avoid duplicate code in vlog()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21534
diff changeset
   987
    """
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
   988
    with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
   989
        if verbose:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
   990
            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
   991
        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
   992
            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
   993
        print()
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
   994
        sys.stdout.flush()
19251
6857f53456f2 run-tests: add a log function
Matt Mackall <mpm@selenic.com>
parents: 19250
diff changeset
   995
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
   996
33930
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
   997
def highlightdiff(line, color):
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
   998
    if not color:
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
   999
        return line
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1000
    assert pygmentspresent
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1001
    return pygments.highlight(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1002
        line.decode('latin1'), difflexer, terminal256formatter
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1003
    ).encode('latin1')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1004
33930
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1005
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1006
def highlightmsg(msg, color):
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1007
    if not color:
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1008
        return msg
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1009
    assert pygmentspresent
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1010
    return pygments.highlight(msg, runnerlexer, runnerformatter)
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  1011
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1012
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1013
def highlight_progress(progress, color):
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1014
    if not color:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1015
        return progress
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1016
    assert pygmentspresent
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1017
    token = progress_type.get(progress)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1018
    if token is None:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1019
        return progress
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1020
    style = runnerformatter.style_string.get(str(token))
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1021
    if style is None:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1022
        return progress
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1023
    else:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1024
        return style[0] + progress + style[1]
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1025
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  1026
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
  1027
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
  1028
    """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
  1029
    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
  1030
    try:
32303
dc131b9772f2 run-tests: drop fallback for proc.terminate() for pre-py2.6
Martin von Zweigbergk <martinvonz@google.com>
parents: 32302
diff changeset
  1031
        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
  1032
    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
  1033
        pass
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
  1034
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1035
19263
062c0a0a5549 run-tests: use env dict to kill daemons
Matt Mackall <mpm@selenic.com>
parents: 19262
diff changeset
  1036
def killdaemons(pidfile):
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
  1037
    import killdaemons as killmod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1038
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1039
    return killmod.killdaemons(pidfile, tryhard=False, remove=True, logfn=vlog)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1040
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
  1041
49234
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 49215
diff changeset
  1042
# sysconfig is not thread-safe (https://github.com/python/cpython/issues/92452)
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 49215
diff changeset
  1043
sysconfiglock = threading.Lock()
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 49215
diff changeset
  1044
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 49215
diff changeset
  1045
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1046
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
  1047
    """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
  1048
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
  1049
    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
  1050
    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
  1051
    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
  1052
    """
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
  1053
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
  1054
    # 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
  1055
    SKIPPED_STATUS = 80
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
  1056
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1057
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1058
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1059
        path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1060
        outputdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1061
        tmpdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1062
        keeptmpdir=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1063
        debug=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1064
        first=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1065
        timeout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1066
        startport=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1067
        extraconfigopts=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1068
        shell=None,
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1069
        python=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1070
        hgcommand=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1071
        slowtimeout=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1072
        usechg=False,
44615
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44577
diff changeset
  1073
        chgdebug=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1074
        useipv6=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1075
    ):
21502
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
  1076
        """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
  1077
f8515564d617 run-tests: pass a full test path into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21501
diff changeset
  1078
        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
  1079
21504
888a5dfe1569 run-tests: pass temp dir into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21502
diff changeset
  1080
        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
  1081
21509
d21d53ee0d7a run-tests: factor options.keep_tmpdir into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21508
diff changeset
  1082
        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
  1083
        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
  1084
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
  1085
        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
  1086
        output.
21511
3ec3e81a4110 run-tests: move diff options into arguments of Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21510
diff changeset
  1087
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
  1088
        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
  1089
        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
  1090
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
  1091
        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
  1092
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
  1093
        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
  1094
        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
  1095
        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
  1096
        instances.
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
  1097
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
  1098
        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
  1099
        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
  1100
        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
  1101
21517
af7d3a5c330b run-tests: move shell to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21516
diff changeset
  1102
        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
  1103
        """
34264
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
  1104
        if timeout is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
  1105
            timeout = defaults['timeout']
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
  1106
        if startport is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
  1107
            startport = defaults['port']
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
  1108
        if slowtimeout is None:
8999851a503f tests: fix run-tests default values in Test constructor
Augie Fackler <augie@google.com>
parents: 34263
diff changeset
  1109
            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
  1110
        self.path = path
45513
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  1111
        self.relpath = os.path.relpath(path)
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
  1112
        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
  1113
        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
  1114
        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
  1115
        self._outputdir = outputdir
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1116
        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
  1117
        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
  1118
25039
8505eb1bafb1 run-tests: be more judicious about bytes vs string on test attrs
Augie Fackler <augie@google.com>
parents: 25038
diff changeset
  1119
        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
  1120
        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
  1121
        self._debug = debug
35541
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  1122
        self._first = first
21513
acfd19f3e79c run-tests: move timeout into Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21512
diff changeset
  1123
        self._timeout = timeout
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
  1124
        self._slowtimeout = slowtimeout
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
  1125
        self._startport = startport
21515
9978ff48b1e8 run-tests: move extra config options to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21514
diff changeset
  1126
        self._extraconfigopts = extraconfigopts or []
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1127
        self._shell = _sys2bytes(shell)
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1128
        assert python is not None
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1129
        self._python = python
28099
a5f0c0aab2bb run-tests: allow to specify executable of any name by --with-hg
Yuya Nishihara <yuya@tcha.org>
parents: 28098
diff changeset
  1130
        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
  1131
        self._usechg = usechg
44615
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44577
diff changeset
  1132
        self._chgdebug = chgdebug
31003
225f574e0645 runtests: export HGIPV6 to hint test scripts whether to use IPv6
Jun Wu <quark@fb.com>
parents: 31002
diff changeset
  1133
        self._useipv6 = useipv6
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1134
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1135
        self._aborted = False
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
  1136
        self._daemonpids = []
21447
f8c5b8a288c5 run-tests: keep track of test execution state in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21446
diff changeset
  1137
        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
  1138
        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
  1139
        self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
  1140
        self._skipped = None
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1141
        self._testtmp = None
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1142
        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
  1143
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
  1144
        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
  1145
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1146
    @property
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1147
    def _pythonb(self):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1148
        return _sys2bytes(self._python.replace('\\', '/'))
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1149
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
  1150
    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
  1151
        """read reference output"""
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
  1152
        # 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
  1153
        # 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
  1154
        if self._debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1155
            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
  1156
        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
  1157
            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
  1158
                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
  1159
        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
  1160
            return []
21318
6b3d66e4d3be run-tests: capture reference output in Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21317
diff changeset
  1161
24965
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
  1162
    # 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
  1163
    @property
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
  1164
    def _testMethodName(self):
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
  1165
        return self.name
cecbe207cebd run-tests: implement Test._testMethodName
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24926
diff changeset
  1166
21463
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
  1167
    def __str__(self):
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
  1168
        return self.name
c908ff887589 run-tests: implement Test.__str__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21462
diff changeset
  1169
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1170
    def shortDescription(self):
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1171
        return self.name
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1172
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
  1173
    def setUp(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
  1174
        """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
  1175
        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
  1176
        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
  1177
        self._out = None
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
  1178
        self._skipped = None
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
  1179
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
  1180
        try:
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
  1181
            os.mkdir(self._threadtmp)
49305
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  1182
        except FileExistsError:
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  1183
            pass
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
  1184
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1185
        name = self._tmpname
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1186
        self._testtmp = os.path.join(self._threadtmp, name)
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1187
        os.mkdir(self._testtmp)
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1188
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
  1189
        # 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
  1190
        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
  1191
            try:
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
  1192
                os.remove(self.errpath)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  1193
            except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  1194
                # We might have raced another test to clean up a .err file,
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  1195
                # so ignore FileNotFoundError when removing a previous .err
24332
9612b96730d7 run-tests: ignore ENOENT failures when removing old .err results
Augie Fackler <augie@google.com>
parents: 24331
diff changeset
  1196
                # file.
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  1197
                pass
21457
12dd94e32102 run-tests: move errpath deletion to setUp()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21456
diff changeset
  1198
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1199
        if self._usechg:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1200
            self._chgsockdir = os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1201
                self._threadtmp, b'%s.chgsock' % name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1202
            )
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1203
            os.mkdir(self._chgsockdir)
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1204
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1205
    def run(self, result):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  1206
        """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
  1207
        # 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
  1208
        # 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
  1209
        # function can largely go away.
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  1210
        self._result = result
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1211
        result.startTest(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1212
        try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1213
            try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1214
                self.setUp()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1215
            except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1216
                self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1217
                raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1218
            except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1219
                result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1220
                return
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1221
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1222
            success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1223
            try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1224
                self.runTest()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1225
            except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1226
                self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1227
                raise
32932
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32907
diff changeset
  1228
            except unittest.SkipTest as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1229
                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
  1230
                # 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
  1231
                # 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
  1232
                # 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
  1233
                result.testsRun -= 1
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
  1234
            except self.failureException as e:
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1235
                # 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
  1236
                # 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
  1237
                # 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
  1238
                # 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
  1239
                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
  1240
                    success = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1241
            except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1242
                result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1243
            else:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1244
                success = True
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1245
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1246
            try:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1247
                self.tearDown()
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1248
            except (KeyboardInterrupt, SystemExit):
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1249
                self._aborted = True
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1250
                raise
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1251
            except Exception:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1252
                result.addError(self, sys.exc_info())
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1253
                success = False
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1254
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1255
            if success:
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1256
                result.addSuccess(self)
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1257
        finally:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1258
            result.stopTest(self, interrupted=self._aborted)
21488
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1259
feb8ad2d57ee run-tests: merge MercurialTest into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21464
diff changeset
  1260
    def runTest(self):
21383
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
  1261
        """Run this test instance.
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
  1262
772ed56e2519 run-tests: add some docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21382
diff changeset
  1263
        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
  1264
        """
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
  1265
        env = self._getenv()
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1266
        self._genrestoreenv(env)
21319
44c96e2bab20 run-tests: kill daemons during Test.cleanup()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21318
diff changeset
  1267
        self._daemonpids.append(env['DAEMON_PIDS'])
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
  1268
        self._createhgrc(env['HGRCPATH'])
21300
a2774731a51a run-tests: move createhgrc() call into Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21299
diff changeset
  1269
21435
f376f56a354e run-tests: rename Test._test to Test.name
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21434
diff changeset
  1270
        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
  1271
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
  1272
        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
  1273
        self._finished = True
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
  1274
        self._ret = ret
130cc0d7bfde run-tests: don't trap exceptions in Test.runTest()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21499
diff changeset
  1275
        self._out = out
21305
d7a7825ff2cf run-tests: capture execution results in a TestResult class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21304
diff changeset
  1276
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
  1277
        def describe(ret):
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
  1278
            if ret < 0:
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
  1279
                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
  1280
            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
  1281
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
  1282
        self._skipped = False
21336
45ab0668d1b2 run-tests: remove remaining uses of TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21335
diff changeset
  1283
21380
de6ea36ca9f7 run-tests: move SKIPPED_STATUS into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21379
diff changeset
  1284
        if ret == self.SKIPPED_STATUS:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1285
            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
  1286
                missing = ['unknown']
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
  1287
                failed = None
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
  1288
            else:
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  1289
                missing, failed = TTest.parsehghaveoutput(out)
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
  1290
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
  1291
            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
  1292
                missing = ['skipped']
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
  1293
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
  1294
            if failed:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
  1295
                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
  1296
            else:
21453
aaf52b78327e run-tests: store skipped state on Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21452
diff changeset
  1297
                self._skipped = True
32932
240183a04429 tests: use unittest.SkipTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32907
diff changeset
  1298
                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
  1299
        elif ret == 'timeout':
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
  1300
            self.fail('timed out')
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
  1301
        elif ret is False:
32934
6123a5267119 tests: remove WarnTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32933
diff changeset
  1302
            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
  1303
        elif out != self._refout:
21614
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
  1304
            # Diff generation may rely on written .err file.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1305
            if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1306
                (ret != 0 or out != self._refout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1307
                and not self._skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1308
                and not self._debug
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1309
            ):
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1310
                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
  1311
                    for line in out:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1312
                        f.write(line)
21614
609a642dff61 run-tests: write .err files earlier
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21613
diff changeset
  1313
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  1314
            # 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
  1315
            with firstlock:
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  1316
                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
  1317
                    # change was accepted, skip failing
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  1318
                    return
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  1319
                if self._first:
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  1320
                    global firsterror
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  1321
                    firsterror = True
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  1322
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
  1323
            if ret:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  1324
                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
  1325
            else:
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  1326
                msg = 'output changed'
21326
04e04766065f run-tests: move output difference processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21325
diff changeset
  1327
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
  1328
            self.fail(msg)
21327
206814c9072a run-tests: move remaining result processing to Test.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21326
diff changeset
  1329
        elif ret:
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
  1330
            self.fail(describe(ret))
21324
6454ddaee991 run-tests: add skip processing to Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21323
diff changeset
  1331
21446
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
  1332
    def tearDown(self):
9a3b4f795f62 run-tests: support setUp() and tearDown() in TestCase wrapper
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21445
diff changeset
  1333
        """Tasks to perform after run()."""
21456
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
  1334
        for entry in self._daemonpids:
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
  1335
            killdaemons(entry)
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
  1336
        self._daemonpids = []
a06a4142ad1f run-tests: kill daemons during tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21455
diff changeset
  1337
26422
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
  1338
        if self._keeptmpdir:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1339
            log(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1340
                '\nKeeping testtmp dir: %s\nKeeping threadtmp dir: %s'
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  1341
                % (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  1342
                    _bytes2sys(self._testtmp),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  1343
                    _bytes2sys(self._threadtmp),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  1344
                )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1345
            )
26422
41436beaf463 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org
parents: 26158
diff changeset
  1346
        else:
40987
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
  1347
            try:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
  1348
                shutil.rmtree(self._testtmp)
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
  1349
            except OSError:
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
  1350
                # 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
  1351
                # and try again
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
  1352
                makecleanable(self._testtmp)
bb5d74a35477 run-tests: fix permission to clean up unreadable directories
Yuya Nishihara <yuya@tcha.org>
parents: 40270
diff changeset
  1353
                shutil.rmtree(self._testtmp, True)
21497
798c81e32b5e run-tests: refactor temporary directories in Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21496
diff changeset
  1354
            shutil.rmtree(self._threadtmp, True)
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1355
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1356
        if self._usechg:
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1357
            # 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
  1358
            # files are deleted
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1359
            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
  1360
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1361
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1362
            (self._ret != 0 or self._out != self._refout)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1363
            and not self._skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1364
            and not self._debug
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1365
            and self._out
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1366
        ):
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1367
            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
  1368
                for line in self._out:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1369
                    f.write(line)
21455
0f0bace82149 run-tests: move err file writing to tearDown()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21454
diff changeset
  1370
24926
3fe1e07f1a32 run-test: include test name in the return vlog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24811
diff changeset
  1371
        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
  1372
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
  1373
    def _run(self, env):
21339
de25e968b4d8 run-tests: refactor runone() into gettest() and scheduletests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21338
diff changeset
  1374
        # 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
  1375
        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
  1376
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1377
    def abort(self):
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1378
        """Terminate execution of this test."""
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1379
        self._aborted = True
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1380
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
  1381
    def _portmap(self, i):
28284
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
  1382
        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
  1383
        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
  1384
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1385
    def _getreplacements(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  1386
        """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
  1387
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  1388
        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
  1389
        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
  1390
        occur.
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  1391
        """
52311
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1392
        r = [self._portmap(port) for port in range(HGPORT_COUNT)]
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1393
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1394
        r.extend(
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1395
            [
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1396
                (br'([^0-9])%s' % re.escape(self._localip()), br'\1$LOCALIP'),
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1397
                (br'\bHG_TXNID=TXN:[a-f0-9]{40}\b', br'HG_TXNID=TXN:$ID$'),
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1398
                (self._escapepath(self._testtmp), b'$TESTTMP'),
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1399
            ]
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1400
        )
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1401
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  1402
        if WINDOWS:
47571
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47500
diff changeset
  1403
            # JSON output escapes backslashes in Windows paths, so also catch a
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47500
diff changeset
  1404
            # double-escape.
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47500
diff changeset
  1405
            replaced = self._testtmp.replace(b'\\', br'\\')
e9c5c368be17 run-tests: also catch double-escapes for $TESTTMP
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47500
diff changeset
  1406
            r.append((self._escapepath(replaced), b'$STR_REPR_TESTTMP'))
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
  1407
35194
779c6cf2967b run-tests: avoid calculating _testdir again
Martin von Zweigbergk <martinvonz@google.com>
parents: 35193
diff changeset
  1408
        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
  1409
4fb489a998c9 run-tests: allow to register any arbitrary pattern for replacement
Boris Feld <boris.feld@octobus.net>
parents: 35066
diff changeset
  1410
        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
  1411
            data = {}
35092
1ac4c0887de4 run-test: drop 'execfile' usage for 'common-pattern.py' file
Boris Feld <boris.feld@octobus.net>
parents: 35091
diff changeset
  1412
            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
  1413
                # 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
  1414
                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
  1415
                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
  1416
                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
  1417
                    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
  1418
                        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
  1419
                        msg %= (replacementfile, value)
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
  1420
                        raise ValueError(msg)
04304b779df1 tests: raise a better error when patterns are wrongly formatted
Boris Feld <boris.feld@octobus.net>
parents: 35855
diff changeset
  1421
                    r.append(value)
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
  1422
        return r
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
  1423
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
  1424
    def _escapepath(self, p):
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  1425
        if WINDOWS:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1426
            return b''.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1427
                c.isalpha()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1428
                and b'[%s%s]' % (c.lower(), c.upper())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1429
                or c in b'/\\'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1430
                and br'[/\\]'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1431
                or c.isdigit()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1432
                and c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1433
                or b'\\' + c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1434
                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
  1435
            )
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
  1436
        else:
28055
92e8e3f20a6f run-tests: factor out _escapepath
timeless <timeless@mozdev.org>
parents: 28037
diff changeset
  1437
            return re.escape(p)
21298
ba4750352180 run-tests: move replacements generation into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21297
diff changeset
  1438
31006
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1439
    def _localip(self):
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1440
        if self._useipv6:
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1441
            return b'::1'
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1442
        else:
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1443
            return b'127.0.0.1'
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1444
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1445
    def _genrestoreenv(self, testenv):
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1446
        """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
  1447
        environment."""
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1448
        # 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
  1449
        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
  1450
        testenv['HGTEST_RESTOREENV'] = _bytes2sys(scriptpath)
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1451
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1452
        # 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
  1453
        # us to export.
33140
f458a6701983 tests: fix variable name regular expression in _genrestoreenv()
Adam Simpkins <simpkins@fb.com>
parents: 33126
diff changeset
  1454
        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
  1455
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
  1456
        # 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
  1457
        reqnames = {'PYTHON', 'TESTDIR', 'TESTTMP'}
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
  1458
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1459
        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
  1460
            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
  1461
                if not name_regex.match(name):
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1462
                    # 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
  1463
                    # allowed by most shells.
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1464
                    continue
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
  1465
                if name in reqnames:
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
  1466
                    continue
33126
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1467
                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
  1468
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1469
            for name in testenv:
33203
cf826b9e9ea4 tests: actually restore the original environment before running syshg
Yuya Nishihara <yuya@tcha.org>
parents: 33140
diff changeset
  1470
                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
  1471
                    continue
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1472
                envf.write('unset %s\n' % (name,))
98e2c78e309c tests: more completely restore the environment in syshgenv
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
  1473
21514
59fe123dbb00 run-tests: refactor port number declaration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21513
diff changeset
  1474
    def _getenv(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  1475
        """Obtain environment variables to use during test execution."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1476
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
  1477
        def defineport(i):
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
  1478
            offset = '' if i == 0 else '%s' % i
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
  1479
            env["HGPORT%s" % offset] = '%s' % (self._startport + i)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1480
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1481
        env = os.environ.copy()
49234
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 49215
diff changeset
  1482
        with sysconfiglock:
9dad328434c7 tests: work around non-thread-safeness of sysconfig.get_config_var()
Manuel Jacob <me@manueljacob.de>
parents: 49215
diff changeset
  1483
            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
  1484
        env['HGEMITWARNINGS'] = '1'
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1485
        env['TESTTMP'] = _bytes2sys(self._testtmp)
49047
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48735
diff changeset
  1486
        # the FORWARD_SLASH version is useful when running `sh` on non unix
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48735
diff changeset
  1487
        # system (e.g. Windows)
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48735
diff changeset
  1488
        env['TESTTMP_FORWARD_SLASH'] = env['TESTTMP'].replace(os.sep, '/')
47312
7ea39d633cf3 docket: move the uid logic in the `revlogutils.docket` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47310
diff changeset
  1489
        uid_file = os.path.join(_bytes2sys(self._testtmp), 'UID')
7ea39d633cf3 docket: move the uid logic in the `revlogutils.docket` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47310
diff changeset
  1490
        env['HGTEST_UUIDFILE'] = uid_file
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  1491
        env['TESTNAME'] = self.name
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1492
        env['HOME'] = _bytes2sys(self._testtmp)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  1493
        if WINDOWS:
46870
41d43d12c2c4 tests: restore the ability to run `black` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
  1494
            env['REALUSERPROFILE'] = env['USERPROFILE']
46092
08fd76a553c9 run-tests: configure the environment to expand `~` properly with Windows py38+
Matt Harbison <matt_harbison@yahoo.com>
parents: 46091
diff changeset
  1495
            # py3.8+ ignores HOME: https://bugs.python.org/issue36264
08fd76a553c9 run-tests: configure the environment to expand `~` properly with Windows py38+
Matt Harbison <matt_harbison@yahoo.com>
parents: 46091
diff changeset
  1496
            env['USERPROFILE'] = env['HOME']
44632
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44615
diff changeset
  1497
        formated_timeout = _bytes2sys(b"%d" % default_defaults['timeout'][1])
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44615
diff changeset
  1498
        env['HGTEST_TIMEOUT_DEFAULT'] = formated_timeout
82543879b48e testlib: adjust wait-on-file timeout according to the global test timeout
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44615
diff changeset
  1499
        env['HGTEST_TIMEOUT'] = _bytes2sys(b"%d" % self._timeout)
52311
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1500
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  1501
        for port in range(HGPORT_COUNT):
28169
1b07331f5900 run-tests: refactor port allocation into functions
timeless <timeless@mozdev.org>
parents: 28143
diff changeset
  1502
            defineport(port)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1503
        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
  1504
        env["DAEMON_PIDS"] = _bytes2sys(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1505
            os.path.join(self._threadtmp, b'daemon.pids')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1506
        )
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1507
        env["HGEDITOR"] = f'"{self._python}" -c "import sys; sys.exit(0)"'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1508
        env["HGUSER"] = "test"
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1509
        env["HGENCODING"] = "ascii"
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1510
        env["HGENCODINGMODE"] = "strict"
39119
1f987f7c832b tests: force a stable hostname in patchbomb tests
Augie Fackler <raf@durin42.com>
parents: 38934
diff changeset
  1511
        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
  1512
        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
  1513
        # 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
  1514
        if 'HGTESTCATAPULTSERVERPIPE' not in env:
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40489
diff changeset
  1515
            # 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
  1516
            # 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
  1517
            env['HGTESTCATAPULTSERVERPIPE'] = env.get(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1518
                'HGCATAPULTSERVERPIPE', os.devnull
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1519
            )
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1520
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1521
        extraextensions = []
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1522
        for opt in self._extraconfigopts:
46091
af3a6900f893 run-tests: fix `HGTESTEXTRAEXTENSIONS` with py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 46068
diff changeset
  1523
            section, key = opt.split('.', 1)
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1524
            if section != 'extensions':
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1525
                continue
46091
af3a6900f893 run-tests: fix `HGTESTEXTRAEXTENSIONS` with py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 46068
diff changeset
  1526
            name = key.split('=', 1)[0]
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1527
            extraextensions.append(name)
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1528
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1529
        if extraextensions:
46091
af3a6900f893 run-tests: fix `HGTESTEXTRAEXTENSIONS` with py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 46068
diff changeset
  1530
            env['HGTESTEXTRAEXTENSIONS'] = ' '.join(extraextensions)
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37009
diff changeset
  1531
31006
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1532
        # 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
  1533
        # IP addresses.
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1534
        env['LOCALIP'] = _bytes2sys(self._localip())
31006
d4916aebf3d0 runtests: export LOCALIP
Jun Wu <quark@fb.com>
parents: 31003
diff changeset
  1535
40981
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40976
diff changeset
  1536
        # 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
  1537
        # 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
  1538
        # dummysmtpd.py, and dumbhttp.py.
48866
2ccd5e71bcd3 tests: remove last references to PYTHON3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48865
diff changeset
  1539
        if WINDOWS:
40981
08f5482a6755 py3: spawn all python instances with legacy stdio enabled on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40976
diff changeset
  1540
            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
  1541
43819
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1542
        # 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
  1543
        # 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
  1544
        # 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
  1545
        cargo_home_path = os.path.expanduser('~/.cargo')
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1546
        rustup_home_path = os.path.expanduser('~/.rustup')
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1547
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1548
        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
  1549
            env['CARGO_HOME'] = cargo_home_path
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1550
        if (
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1551
            os.path.exists(rustup_home_path)
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1552
            and b'RUSTUP_HOME' not in osenvironb
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1553
        ):
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1554
            env['RUSTUP_HOME'] = rustup_home_path
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43801
diff changeset
  1555
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1556
        # 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
  1557
        # the tests produce repeatable output.
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1558
        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
  1559
        env['TZ'] = 'GMT'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1560
        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
  1561
        env['COLUMNS'] = '80'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1562
        env['TERM'] = 'xterm'
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1563
40469
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1564
        dropped = [
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1565
            'CDPATH',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1566
            'CHGDEBUG',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1567
            'EDITOR',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1568
            'GREP_OPTIONS',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1569
            'HG',
40470
d6b6f1b441cf run-tests: define the default merge tool through configuration
Boris Feld <boris.feld@octobus.net>
parents: 40469
diff changeset
  1570
            'HGMERGE',
40469
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1571
            'HGPLAIN',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1572
            'HGPLAINEXCEPT',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1573
            'HGPROF',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1574
            'http_proxy',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1575
            'no_proxy',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1576
            'NO_PROXY',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1577
            'PAGER',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1578
            'VISUAL',
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1579
        ]
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1580
f8154ddaaed3 run-tests: explicitly declare the list of dropped environment variable
Boris Feld <boris.feld@octobus.net>
parents: 40270
diff changeset
  1581
        for k in dropped:
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1582
            if k in env:
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1583
                del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1584
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1585
        # 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
  1586
        for k in list(env):
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1587
            if k.startswith('HG_'):
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1588
                del env[k]
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1589
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1590
        if self._usechg:
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1591
            env['CHGSOCKNAME'] = os.path.join(self._chgsockdir, b'server')
44615
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44577
diff changeset
  1592
        if self._chgdebug:
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44577
diff changeset
  1593
            env['CHGDEBUG'] = 'true'
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  1594
21299
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1595
        return env
7861de61583b run-tests: move createenv() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21298
diff changeset
  1596
21382
4b8ffe3abdd2 run-tests: move createhgrc into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21381
diff changeset
  1597
    def _createhgrc(self, path):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  1598
        """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
  1599
        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
  1600
            hgrc.write(b'[ui]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1601
            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
  1602
            hgrc.write(b'interactive = False\n')
45826
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45513
diff changeset
  1603
            hgrc.write(b'detailed-exit-code = True\n')
40470
d6b6f1b441cf run-tests: define the default merge tool through configuration
Boris Feld <boris.feld@octobus.net>
parents: 40469
diff changeset
  1604
            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
  1605
            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
  1606
            hgrc.write(b'promptecho = True\n')
47919
a28a7dcb9158 tests: setup dummyssh as the default ssh
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47834
diff changeset
  1607
            dummyssh = os.path.join(self._testdir, b'dummyssh')
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1608
            hgrc.write(b'ssh = "%s" "%s"\n' % (self._pythonb, dummyssh))
46015
f44b9c72f061 run-tests: allow some slack about 'waiting on lock' message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45955
diff changeset
  1609
            hgrc.write(b'timeout.warn=15\n')
47776
036b9b3cc79a run-tests: use a small timeout for chg instance
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
  1610
            hgrc.write(b'[chgserver]\n')
036b9b3cc79a run-tests: use a small timeout for chg instance
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47775
diff changeset
  1611
            hgrc.write(b'idletimeout=60\n')
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1612
            hgrc.write(b'[defaults]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1613
            hgrc.write(b'[devel]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1614
            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
  1615
            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
  1616
            hgrc.write(b'[largefiles]\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1617
            hgrc.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1618
                b'usercache = %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1619
                % (os.path.join(self._testtmp, b'.cache/largefiles'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1620
            )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1621
            hgrc.write(b'[lfs]\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1622
            hgrc.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1623
                b'usercache = %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1624
                % (os.path.join(self._testtmp, b'.cache/lfs'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1625
            )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1626
            hgrc.write(b'[web]\n')
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1627
            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
  1628
            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
  1629
            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
  1630
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1631
            for opt in self._extraconfigopts:
44449
ff72bd52d56a tests: avoid implicit conversion of str to unicode
Manuel Jacob <me@manueljacob.de>
parents: 44448
diff changeset
  1632
                section, key = _sys2bytes(opt).split(b'.', 1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1633
                assert b'=' in key, (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1634
                    'extra config opt %s must ' 'have an = for assignment' % opt
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1635
                )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1636
                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
  1637
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
  1638
    def fail(self, msg):
21522
eeaec308ad5f run-tests: raise WarnTest outside of Test.fail()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21521
diff changeset
  1639
        # 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
  1640
        # 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
  1641
        raise AssertionError(msg)
21323
a7c677e2f6ae run-tests: move fail() into Test
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21322
diff changeset
  1642
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
  1643
    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
  1644
        """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
  1645
        stderr).
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1646
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1647
        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
  1648
        """
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
  1649
        if self._debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1650
            proc = subprocess.Popen(
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1651
                _bytes2sys(cmd),
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1652
                shell=True,
47775
c405c089611a run-tests: do not inherit file descriptor when running a command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47639
diff changeset
  1653
                close_fds=closefds,
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1654
                cwd=_bytes2sys(self._testtmp),
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1655
                env=env,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1656
            )
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1657
            ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1658
            return (ret, None)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1659
24509
27092bb70293 run-tests: remove arguments from Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24508
diff changeset
  1660
        proc = Popen4(cmd, self._testtmp, self._timeout, env)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1661
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1662
        def cleanup():
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1663
            terminate(proc)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1664
            ret = proc.wait()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1665
            if ret == 0:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1666
                ret = signal.SIGTERM << 8
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1667
            killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1668
            return ret
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1669
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1670
        proc.tochild.close()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1671
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1672
        try:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1673
            output = proc.fromchild.read()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1674
        except KeyboardInterrupt:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1675
            vlog('# Handling keyboard interrupt')
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1676
            cleanup()
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1677
            raise
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1678
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1679
        ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
  1680
        if wifexited(ret):
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1681
            ret = os.WEXITSTATUS(ret)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1682
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1683
        if proc.timeout:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1684
            ret = 'timeout'
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1685
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1686
        if ret:
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1687
            killdaemons(env['DAEMON_PIDS'])
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1688
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
  1689
        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
  1690
            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
  1691
8d6fd0b8f622 run-tests: separate newline normalization from replacements
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24509
diff changeset
  1692
        if normalizenewlines:
39706
030d558c6456 py3: add a missing b'' for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39663
diff changeset
  1693
            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
  1694
24508
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1695
        return ret, output.splitlines(True)
fbe2fb71a6e6 run-tests: move run into Test class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24507
diff changeset
  1696
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1697
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
  1698
class PythonTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
  1699
    """A Python-based test."""
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
  1700
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
  1701
    @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  1702
    def refpath(self):
25058
caa2043cc322 run-tests: unblock running python tests in python 3
Augie Fackler <augie@google.com>
parents: 25057
diff changeset
  1703
        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
  1704
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
  1705
    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
  1706
        # Quote the python(3) executable for Windows
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  1707
        cmd = b'"%s" "%s"' % (self._pythonb, self.path)
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
  1708
        vlog("# Running", cmd.decode("utf-8"))
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  1709
        result = self._runcommand(cmd, env, normalizenewlines=WINDOWS)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1710
        if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1711
            raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1712
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1713
        return result
21311
f9a7018a35ff run-tests: roll pytest() into PythonTest._run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21310
diff changeset
  1714
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1715
29518
348b2b9da703 run-tests: add support for using 127.0.0.1 as a glob
Augie Fackler <raf@durin42.com>
parents: 29485
diff changeset
  1716
# 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
  1717
# 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
  1718
# 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
  1719
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
  1720
    # 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
  1721
    # better.
25059
0e0f1068b878 run-tests: fix checking a line to see if it needs globbing
Augie Fackler <augie@google.com>
parents: 25058
diff changeset
  1722
    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
  1723
    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
  1724
    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
  1725
    # 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
  1726
    # 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
  1727
    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
  1728
]
5bd04faaa3ee run-tests: don't warn on unnecessary globs mandated by check-code.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 23347
diff changeset
  1729
48860
4cea98b32d95 tests: unconditionalize bchr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48859
diff changeset
  1730
bchr = lambda x: bytes([x])
25036
61fc2cdbc57c run-tests: work around chr() producing unicode in Python 3
Augie Fackler <augie@google.com>
parents: 25035
diff changeset
  1731
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
  1732
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
  1733
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
  1734
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
  1735
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
  1736
MARK_OPTIONAL = b" (?)\n"
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
  1737
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1738
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
  1739
def isoptional(line):
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
  1740
    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
  1741
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1742
21296
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
  1743
class TTest(Test):
cd8776030833 run-tests: create classes for representing tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21231
diff changeset
  1744
    """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
  1745
28284
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
  1746
    SKIPPED_PREFIX = b'skipped: '
0fe00bdb2f4f run-tests: fix Python 3 incompatibilities
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28180
diff changeset
  1747
    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
  1748
    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
  1749
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  1750
    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
  1751
    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
  1752
    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
  1753
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1754
    def __init__(self, path, *args, **kwds):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1755
        # accept an extra "case" parameter
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  1756
        case = kwds.pop('case', [])
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1757
        self._case = case
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  1758
        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
  1759
        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
  1760
        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
  1761
            casepath = b'#'.join(case)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  1762
            self.name = '%s#%s' % (self.name, _bytes2sys(casepath))
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  1763
            self.errpath = b'%s#%s.err' % (self.errpath[:-4], casepath)
45108
a659d5a4d2d5 run-tests: replace '#' with '-' in temp path of repos created for tests
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45046
diff changeset
  1764
            self._tmpname += b'-%s' % casepath.replace(b'#', b'-')
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
  1765
        self._have = {}
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1766
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
  1767
    @property
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  1768
    def refpath(self):
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  1769
        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
  1770
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
  1771
    def _run(self, env):
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1772
        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
  1773
            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
  1774
32981
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32980
diff changeset
  1775
        # .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
  1776
        # 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
  1777
        # 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
  1778
        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
  1779
            self._refout = lines
02bca6dc5f41 run-tests: update .t reference output after reading the test
Jun Wu <quark@fb.com>
parents: 32980
diff changeset
  1780
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1781
        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
  1782
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
  1783
        # 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
  1784
        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
  1785
        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
  1786
            for l in script:
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  1787
                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
  1788
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  1789
        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
  1790
        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
  1791
24516
62fb03e0d990 run-tests: obtain replacements inside Test._runcommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24510
diff changeset
  1792
        exitcode, output = self._runcommand(cmd, env)
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1793
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1794
        if self._aborted:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1795
            raise KeyboardInterrupt()
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  1796
21313
a2bd02a3b6d2 run-tests: move t test execution from tsttest() to TTest.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21312
diff changeset
  1797
        # 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
  1798
        # 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
  1799
        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
  1800
            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
  1801
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  1802
        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
  1803
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1804
    def _hghave(self, reqs):
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
  1805
        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
  1806
bc1c1435a874 runtest: move slow timeout process earlier in the `_hghave` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41802
diff changeset
  1807
        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
  1808
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
  1809
        if allreqs in self._have:
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
  1810
            return self._have.get(allreqs)
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
  1811
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1812
        # TODO do something smarter when all other uses of hghave are gone.
52593
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  1813
        cmd = b'%s -c "%s/hghave %s"'
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  1814
        cmd %= (self._shell, RUNTEST_DIR_FORWARD_SLASH, allreqs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1815
        proc = Popen4(
52593
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  1816
            cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1817
            self._testtmp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1818
            0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1819
            self._getenv(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1820
        )
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1821
        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
  1822
        ret = proc.wait()
25177
c3459555318e run-tests: resurrect the wifexited polyfill (backout 6ab5a1c9ea3c)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25162
diff changeset
  1823
        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
  1824
            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
  1825
        if ret == 2:
28699
5cc59dbd199f py3: convert hghave output to text
timeless <timeless@mozdev.org>
parents: 28698
diff changeset
  1826
            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
  1827
            sys.exit(1)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1828
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
  1829
        if ret != 0:
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
  1830
            self._have[allreqs] = (False, stdout)
27564
80b53082a353 run-tests: report missing feature for skipped tests
timeless <timeless@mozdev.org>
parents: 27396
diff changeset
  1831
            return False, stdout
27141
a4e3dec3010e run-tests: add --slowtimeout and use it for slow tests
timeless <timeless@mozdev.org>
parents: 27101
diff changeset
  1832
36462
5c1cea8a3e60 run-tests: cache hghave results
Matt Harbison <matt_harbison@yahoo.com>
parents: 36461
diff changeset
  1833
        self._have[allreqs] = (True, None)
27564
80b53082a353 run-tests: report missing feature for skipped tests
timeless <timeless@mozdev.org>
parents: 27396
diff changeset
  1834
        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
  1835
41802
7eb4e62d4760 runtest: extract the logic that update timeout for slow tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41801
diff changeset
  1836
    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
  1837
        """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
  1838
        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
  1839
            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
  1840
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1841
    def _iftest(self, args):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1842
        # implements "#if"
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1843
        reqs = []
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1844
        for arg in args:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1845
            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
  1846
                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
  1847
                    return False
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1848
            elif arg in self._allcases:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  1849
                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
  1850
                    return False
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1851
            else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1852
                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
  1853
        self._detectslow(reqs)
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1854
        return self._hghave(reqs)[0]
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  1855
21454
046587aa1c8a run-tests: refactor testtmp
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21453
diff changeset
  1856
    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
  1857
        # 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
  1858
        # 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
  1859
        # 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
  1860
        salt = b"SALT%d" % time.time()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1861
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1862
        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
  1863
            if inpython:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  1864
                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
  1865
            else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  1866
                script.append(b'echo %s %d $?\n' % (salt, line))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1867
40489
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40488
diff changeset
  1868
        activetrace = []
48861
7265e5b1d18e tests: always encode session
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48860
diff changeset
  1869
        session = str(uuid.uuid4()).encode('ascii')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1870
        hgcatapult = os.getenv('HGTESTCATAPULTSERVERPIPE') or os.getenv(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1871
            'HGCATAPULTSERVERPIPE'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1872
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1873
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1874
        def toggletrace(cmd=None):
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1875
            if not hgcatapult or hgcatapult == os.devnull:
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1876
                return
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1877
40489
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40488
diff changeset
  1878
            if activetrace:
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1879
                script.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1880
                    b'echo END %s %s >> "$HGTESTCATAPULTSERVERPIPE"\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1881
                    % (session, activetrace[0])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1882
                )
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1883
            if cmd is None:
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1884
                return
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1885
39396
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
  1886
            if isinstance(cmd, str):
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
  1887
                quoted = shellquote(cmd.strip())
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
  1888
            else:
f57682dca1c1 tests: avoid shellquoting bytes on Python 3
Augie Fackler <augie@google.com>
parents: 39379
diff changeset
  1889
                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
  1890
            quoted = quoted.replace(b'\\', b'\\\\')
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  1891
            script.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1892
                b'echo START %s %s >> "$HGTESTCATAPULTSERVERPIPE"\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1893
                % (session, quoted)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  1894
            )
40489
a9e00c48c5ef catapult: rename 'active' to 'activetrace'; this isn't storing a boolean state
Kyle Lippincott <spectral@google.com>
parents: 40488
diff changeset
  1895
            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
  1896
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1897
        script = []
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1898
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1899
        # 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
  1900
        # 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
  1901
        # 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
  1902
        # 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
  1903
        after = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1904
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1905
        # 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
  1906
        expected = {}
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1907
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1908
        pos = prepos = -1
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1909
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1910
        # The current stack of conditionnal section.
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1911
        # Each relevant conditionnal section can have the following value:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1912
        #  - True:  we should run this block
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1913
        #  - False: we should skip this block
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1914
        #  - None:  The parent block is skipped,
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1915
        #           (no branch of this one will ever run)
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1916
        condition_stack = []
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1917
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1918
        def run_line():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1919
            """return True if the current line should be run"""
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1920
            if not condition_stack:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1921
                return True
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1922
            return bool(condition_stack[-1])
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1923
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1924
        def push_conditional_block(should_run):
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1925
            """Push a new conditional context, with its initial state
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1926
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1927
            i.e. entry a #if block"""
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1928
            if not run_line():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1929
                condition_stack.append(None)
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1930
            else:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1931
                condition_stack.append(should_run)
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1932
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1933
        def flip_conditional():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1934
            """reverse the current condition state
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1935
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1936
            i.e. enter a #else
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1937
            """
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1938
            assert condition_stack
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1939
            if condition_stack[-1] is not None:
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1940
                condition_stack[-1] = not condition_stack[-1]
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1941
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1942
        def pop_conditional():
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1943
            """exit the current skipping context
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1944
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1945
            i.e. reach the #endif"""
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1946
            assert condition_stack
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  1947
            condition_stack.pop()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1948
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1949
        # 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
  1950
        # 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
  1951
        inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1952
21510
97127c4ce460 run-tests: move debug into an argument to Test.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21509
diff changeset
  1953
        if self._debug:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
  1954
            script.append(b'set -x\n')
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1955
        if os.getenv('MSYSTEM'):
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
  1956
            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
  1957
39379
b64d36e5ca31 run-tests: replace '/dev/null' with os.devnull for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39289
diff changeset
  1958
        if hgcatapult and hgcatapult != os.devnull:
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  1959
            hgcatapult = hgcatapult.encode('utf8')
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  1960
            cataname = self.name.encode('utf8')
42525
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
  1961
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  1962
            # 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
  1963
            # 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
  1964
            # 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
  1965
            # 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
  1966
            script.append(
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  1967
                b'rtendtracing() {\n'
40490
889424be7ad2 catapult: introduce HGTESTCATAPULTSERVERPIPE to control run-tests' tracing
Kyle Lippincott <spectral@google.com>
parents: 40489
diff changeset
  1968
                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
  1969
                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
  1970
                b'}\n'
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  1971
                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
  1972
                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
  1973
                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
  1974
                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
  1975
                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
  1976
                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
  1977
                % {
42525
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
  1978
                    b'name': cataname,
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
  1979
                    b'session': session,
9913fffd744b py3: make catapult usable from the test runner in py3
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 42523
diff changeset
  1980
                    b'catapult': hgcatapult,
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  1981
                }
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  1982
            )
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  1983
35536
f04d16bef2c7 tests: make #testcase available as env var in test
Martin von Zweigbergk <martinvonz@google.com>
parents: 35489
diff changeset
  1984
        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
  1985
            casestr = b'#'.join(self._case)
44451
9803b374389a tests: fix isinstance test of wrong variable
Manuel Jacob <me@manueljacob.de>
parents: 44021
diff changeset
  1986
            if isinstance(casestr, str):
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  1987
                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
  1988
            else:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  1989
                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
  1990
            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
  1991
            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
  1992
28812
f1de5a612a74 run-tests: handle empty tests
timeless <timeless@mozdev.org>
parents: 28701
diff changeset
  1993
        n = 0
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  1994
        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
  1995
            if not l.endswith(b'\n'):
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
  1996
                l += b'\n'
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
  1997
            if l.startswith(b'#require'):
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
  1998
                lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
  1999
                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
  2000
                    after.setdefault(pos, []).append(
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
  2001
                        b'  !!! invalid #require\n'
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
  2002
                    )
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2003
                if run_line():
36677
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
  2004
                    haveresult, message = self._hghave(lsplit[1:])
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
  2005
                    if not haveresult:
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
  2006
                        script = [b'echo "%s"\nexit 80\n' % message]
a247a0e82e7d run-tests: allow #require inside #if
Jun Wu <quark@fb.com>
parents: 36665
diff changeset
  2007
                        break
22045
769198c6a62d run-tests: add #require to abort full test
Matt Mackall <mpm@selenic.com>
parents: 22044
diff changeset
  2008
                after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
  2009
            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
  2010
                lsplit = l.split()
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
  2011
                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
  2012
                    after.setdefault(pos, []).append(b'  !!! invalid #if\n')
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2013
                push_conditional_block(self._iftest(lsplit[1:]))
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2014
                after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
  2015
            elif l.startswith(b'#else'):
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2016
                if not condition_stack:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
  2017
                    after.setdefault(pos, []).append(b'  !!! missing #if\n')
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2018
                flip_conditional()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2019
                after.setdefault(pos, []).append(l)
25035
1203ca7005fa run-tests: use bytes when constructing shell script
Augie Fackler <augie@google.com>
parents: 25034
diff changeset
  2020
            elif l.startswith(b'#endif'):
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2021
                if not condition_stack:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
  2022
                    after.setdefault(pos, []).append(b'  !!! missing #if\n')
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2023
                pop_conditional()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2024
                after.setdefault(pos, []).append(l)
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2025
            elif not run_line():
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2026
                after.setdefault(pos, []).append(l)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2027
            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
  2028
                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
  2029
                prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2030
                pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2031
                if not inpython:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2032
                    # 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
  2033
                    inpython = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2034
                    addsalt(prepos, False)  # Make sure we report the exit code.
52594
b0ecab6773cf run-tests: call heredoctest.py directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52593
diff changeset
  2035
                    pyh = b'"%s"  %s/testlib/heredoctest.py <<EOF\n'
b0ecab6773cf run-tests: call heredoctest.py directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52593
diff changeset
  2036
                    pyh %= (self._pythonb, RUNTEST_DIR_FORWARD_SLASH)
b0ecab6773cf run-tests: call heredoctest.py directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52593
diff changeset
  2037
                    script.append(pyh)
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2038
                addsalt(n, True)
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2039
                script.append(l[2:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2040
            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
  2041
                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
  2042
                script.append(l[2:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2043
            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
  2044
                if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
  2045
                    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
  2046
                    inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2047
                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
  2048
                prepos = pos
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2049
                pos = n
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2050
                addsalt(n, False)
39253
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  2051
                rawcmd = l[4:]
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  2052
                cmd = rawcmd.split()
c496e8c14b9e tests: add support for emitting trace events to run-tests
Augie Fackler <augie@google.com>
parents: 39119
diff changeset
  2053
                toggletrace(rawcmd)
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
  2054
                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
  2055
                    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
  2056
                script.append(rawcmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2057
            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
  2058
                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
  2059
                script.append(l[4:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2060
            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
  2061
                # 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
  2062
                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
  2063
            else:
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2064
                if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
  2065
                    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
  2066
                    inpython = False
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2067
                # 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
  2068
                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
  2069
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2070
        if inpython:
25060
29e54fe22a3f run-tests: make sure all script lines are bytes
Augie Fackler <augie@google.com>
parents: 25059
diff changeset
  2071
            script.append(b'EOF\n')
50210
6515d9a6592d run-tests: make it possible to nest conditionals
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49833
diff changeset
  2072
        if condition_stack:
43408
d9e7ac50b80a run-tests: use byte strings for inserted output
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43346
diff changeset
  2073
            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
  2074
        addsalt(n + 1, False)
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  2075
        # 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
  2076
        if activetrace:
40488
d95358143ce6 catapult: fix broken run-tests catapult tracing
Kyle Lippincott <spectral@google.com>
parents: 40487
diff changeset
  2077
            toggletrace()
21312
986b8a58a6d3 run-tests: move t test parsing into its own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21311
diff changeset
  2078
        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
  2079
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2080
    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
  2081
        # Merge the script output back into a unified test.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2082
        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
  2083
        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
  2084
            warnonly = WARN_NO
21314
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2085
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2086
        pos = -1
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2087
        postout = []
42867
eab66266180e run-tests: clarify "l" variable as "out_rawline"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42866
diff changeset
  2088
        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
  2089
            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
  2090
            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
  2091
                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
  2092
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2093
            pos, postout, warnonly = self._process_out_line(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2094
                out_line, pos, postout, expected, warnonly
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2095
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2096
            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
  2097
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2098
        if pos in after:
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2099
            postout += after.pop(pos)
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2100
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
  2101
        if warnonly == WARN_YES:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2102
            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
  2103
76d7967d8f3d run-tests: finish moving tsttest() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21313
diff changeset
  2104
        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
  2105
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
  2106
    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
  2107
        while out_line:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2108
            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
  2109
                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
  2110
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2111
            # 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
  2112
            els = [None]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2113
            if expected.get(pos, None):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2114
                els = expected[pos]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2115
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2116
            optional = []
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2117
            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
  2118
                r = False
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2119
                if el:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2120
                    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
  2121
                if isinstance(r, str):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2122
                    if r == '-glob':
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2123
                        out_line = ''.join(el.rsplit(' (glob)', 1))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2124
                        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
  2125
                    elif r == "retry":
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2126
                        postout.append(b'  ' + el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2127
                    else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2128
                        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
  2129
                        r = False
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2130
                if r:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2131
                    els.pop(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2132
                    break
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2133
                if el:
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
  2134
                    if isoptional(el):
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2135
                        optional.append(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2136
                    else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2137
                        m = optline.match(el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2138
                        if m:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2139
                            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
  2140
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2141
                            if not self._iftest(conditions):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2142
                                optional.append(i)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2143
                    if exact:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2144
                        # 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
  2145
                        # line in the output
28569
1ad0ddf8cccc run-tests: teach _processoutput to handle multiple lines of churn
timeless <timeless@mozdev.org>
parents: 28568
diff changeset
  2146
                        els.pop(i)
1ad0ddf8cccc run-tests: teach _processoutput to handle multiple lines of churn
timeless <timeless@mozdev.org>
parents: 28568
diff changeset
  2147
                        break
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2148
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2149
            if r:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2150
                if r == "retry":
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2151
                    continue
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2152
                # clean up any optional leftovers
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2153
                for i in optional:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2154
                    postout.append(b'  ' + els[i])
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2155
                for i in reversed(optional):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2156
                    del els[i]
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2157
                postout.append(b'  ' + el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2158
            else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2159
                if self.NEEDESCAPE(out_line):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2160
                    out_line = TTest._stringescape(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2161
                        b'%s (esc)\n' % out_line.rstrip(b'\n')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2162
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2163
                postout.append(b'  ' + out_line)  # Let diff deal with it.
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2164
                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
  2165
                    warnonly = WARN_NO
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2166
                elif warnonly == WARN_UNDEFINED:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2167
                    warnonly = WARN_YES
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2168
            break
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2169
        else:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2170
            # clean up any optional leftovers
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2171
            while expected.get(pos, None):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2172
                el = expected[pos].pop(0)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2173
                if el:
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
  2174
                    if not isoptional(el):
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2175
                        m = optline.match(el)
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2176
                        if m:
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2177
                            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
  2178
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2179
                            if self._iftest(conditions):
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2180
                                # 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
  2181
                                continue
31829
4eec2f04a672 run-tests: support per-line conditional output in tests
Matt Harbison <matt_harbison@yahoo.com>
parents: 31827
diff changeset
  2182
                        else:
42900
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2183
                            continue
8510566b2bef run-tests: remove the artificial indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42899
diff changeset
  2184
                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
  2185
        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
  2186
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
  2187
    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
  2188
        """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
  2189
        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
  2190
            # 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
  2191
            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
  2192
            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
  2193
                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
  2194
            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
  2195
                # 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
  2196
                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
  2197
            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
  2198
        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
  2199
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
  2200
    @staticmethod
21316
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
  2201
    def rematch(el, l):
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
  2202
        try:
43801
3fe91bcd5199 tests: fix deprecation warning about regex flags not at beginning of expr
Kyle Lippincott <spectral@google.com>
parents: 43594
diff changeset
  2203
            # 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
  2204
            # 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
  2205
            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
  2206
            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
  2207
            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
  2208
            # use \Z to ensure that the regex matches to the end of the string
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  2209
            if WINDOWS:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  2210
                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
  2211
            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
  2212
        except re.error:
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
  2213
            # 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
  2214
            return False
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
  2215
ab9bf8a5e573 run-tests: make rematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21315
diff changeset
  2216
    @staticmethod
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2217
    def globmatch(el, l):
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2218
        # 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
  2219
        # 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
  2220
        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
  2221
            if os.altsep:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2222
                # 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
  2223
                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
  2224
                    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
  2225
                        return True
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  2226
                return b'-glob'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2227
            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
  2228
        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
  2229
        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
  2230
        res = b''
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2231
        while i < n:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2232
            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
  2233
            i += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2234
            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
  2235
                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
  2236
                i += 1
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  2237
            elif c == b'*':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  2238
                res += b'.*'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  2239
            elif c == b'?':
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  2240
                res += b'.'
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  2241
            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
  2242
                res += b'[/\\\\]'
21317
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2243
            else:
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2244
                res += re.escape(c)
58a599784a0c run-tests: make globmatch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21316
diff changeset
  2245
        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
  2246
33695
eeed23508383 run-tests: drop required (feature !) style lines when the output is missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 33592
diff changeset
  2247
    def linematch(self, el, l):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2248
        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
  2249
            return True, True
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2250
        retry = False
42901
75bd5990d8fe run-tests: add a dedicated 'isoptional' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
  2251
        if isoptional(el):
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2252
            retry = "retry"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2253
            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
  2254
        else:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2255
            m = optline.match(el)
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2256
            if m:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2257
                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
  2258
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2259
                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
  2260
                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
  2261
                    # 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
  2262
                    return "retry", False
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2263
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2264
        if el.endswith(b" (esc)\n"):
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  2265
            el = el[:-7].decode('unicode_escape') + '\n'
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  2266
            el = el.encode('latin-1')
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  2267
        if el == l or WINDOWS 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
  2268
            return True, True
38552
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2269
        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
  2270
            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
  2271
        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
  2272
            # 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
  2273
            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
  2274
                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
  2275
            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
  2276
        if os.altsep:
5a20b6090a6e tests: move handling of None "el" out of linematch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38551
diff changeset
  2277
            _l = l.replace(b'\\', b'/')
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  2278
            if el == _l or WINDOWS 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
  2279
                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
  2280
        return retry, True
21315
56610da39b48 run-tests: make linematch a static method of TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21314
diff changeset
  2281
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2282
    @staticmethod
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2283
    def parsehghaveoutput(lines):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  2284
        """Parse hghave log lines.
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2285
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2286
        Return tuple of lists (missing, failed):
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2287
          * the missing/unknown features
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  2288
          * the features for which existence check failed"""
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2289
        missing = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2290
        failed = []
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2291
        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
  2292
            if line.startswith(TTest.SKIPPED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2293
                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
  2294
                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
  2295
            elif line.startswith(TTest.FAILED_PREFIX):
21379
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2296
                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
  2297
                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
  2298
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2299
        return missing, failed
ab1a95270a50 run-tests: move parsehghaveoutput() into TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21378
diff changeset
  2300
21384
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2301
    @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2302
    def _escapef(m):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2303
        return TTest.ESCAPEMAP[m.group(0)]
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2304
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2305
    @staticmethod
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2306
    def _stringescape(s):
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2307
        return TTest.ESCAPESUB(TTest._escapef, s)
a36cc85a5b7b run-tests: move string escaping to TTest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21383
diff changeset
  2308
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2309
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
  2310
iolock = threading.RLock()
35541
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  2311
firstlock = threading.RLock()
87676e8ee056 test-run-tests: stabilize the test (issue5735)
Jun Wu <quark@fb.com>
parents: 35540
diff changeset
  2312
firsterror = False
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
  2313
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  2314
base_class = unittest.TextTestResult
48273
3a95a4e660b9 python: compatibility for python 3.11 (issue6604)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47834
diff changeset
  2315
3a95a4e660b9 python: compatibility for python 3.11 (issue6604)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47834
diff changeset
  2316
3a95a4e660b9 python: compatibility for python 3.11 (issue6604)
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47834
diff changeset
  2317
class TestResult(base_class):
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
  2318
    """Holds results when executing via unittest."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2319
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
  2320
    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
  2321
        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
  2322
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
  2323
        self._options = options
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
  2324
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
  2325
        # 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
  2326
        # polyfill it.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
  2327
        self.skipped = []
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
  2328
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
  2329
        # 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
  2330
        # 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
  2331
        # 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
  2332
        self.ignored = []
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
  2333
51989
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51959
diff changeset
  2334
        self._dot_printed = 0
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2335
        self.times = []
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27636
diff changeset
  2336
        self._firststarttime = None
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
  2337
        # 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
  2338
        self.successes = []
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
  2339
        self.faildata = {}
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2340
33565
0982d900dccb run-tests: pass color option via test case object , not global var
Martin von Zweigbergk <martinvonz@google.com>
parents: 33561
diff changeset
  2341
        if options.color == 'auto':
47309
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47308
diff changeset
  2342
            isatty = self.stream.isatty()
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47308
diff changeset
  2343
            # For some reason, redirecting stdout on Windows disables the ANSI
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47308
diff changeset
  2344
            # color processing of stderr, which is what is used to print the
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47308
diff changeset
  2345
            # output.  Therefore, both must be tty on Windows to enable color.
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  2346
            if WINDOWS:
47309
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47308
diff changeset
  2347
                isatty = isatty and sys.stdout.isatty()
af4d1a177548 run-tests: disable color in 'auto' mode on Windows if stdout is redirected
Matt Harbison <matt_harbison@yahoo.com>
parents: 47308
diff changeset
  2348
            self.color = pygmentspresent and isatty
33565
0982d900dccb run-tests: pass color option via test case object , not global var
Martin von Zweigbergk <martinvonz@google.com>
parents: 33561
diff changeset
  2349
        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
  2350
            self.color = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2351
        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
  2352
            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
  2353
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2354
    def _write_dot(self, progress):
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2355
        """write an item of the "dot" progress"""
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2356
        formated = highlight_progress(progress, self.color)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2357
        self.stream.write(formated)
51989
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51959
diff changeset
  2358
        self._dot_printed += 1
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51959
diff changeset
  2359
        if not self._dot_printed % 75:
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51959
diff changeset
  2360
            self.stream.write(f' [{self._dot_printed}]\n'.rjust(8))
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2361
        self.stream.flush()
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2362
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2363
    def onStart(self, test):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  2364
        """Can be overriden by custom TestResult"""
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2365
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2366
    def onEnd(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
  2367
        """Can be overriden by custom TestResult"""
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2368
21462
8a4ef661f08d run-tests: make failure reporting in unittest mode equivalent to default
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21461
diff changeset
  2369
    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
  2370
        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
  2371
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
  2372
        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
  2373
            self.stop()
21735
5ee547fdb0be run-tests: produce error on running a failing test
anuraggoel <anurag.dsps@gmail.com>
parents: 21733
diff changeset
  2374
        else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2375
            with iolock:
27393
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
  2376
                if reason == "timed out":
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2377
                    self._write_dot('t')
27393
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
  2378
                else:
a40b623e6380 run-tests: report timeouts in a less alarming fashion
Matt Mackall <mpm@selenic.com>
parents: 27141
diff changeset
  2379
                    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
  2380
                        self.stream.write('\n')
8bce3e51b101 run-tests: move newline out of colorized message
Martin von Zweigbergk <martinvonz@google.com>
parents: 34804
diff changeset
  2381
                        # 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
  2382
                        formatted = 'ERROR: %s output changed\n' % test
33930
f5d4bb8e944d run-tests: factor out highlight functions
Yuya Nishihara <yuya@tcha.org>
parents: 33929
diff changeset
  2383
                        self.stream.write(highlightmsg(formatted, self.color))
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2384
                    self._write_dot('!')
21754
7e14d026c4c4 run-tests: fixes the '--interactive' option error
anuraggoel <anurag.dsps@gmail.com>
parents: 21753
diff changeset
  2385
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2386
                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
  2387
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
  2388
    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
  2389
        with iolock:
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2390
            # bypass the TextTestResult method as do deal with the output ourself
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2391
            super(base_class, self).addSuccess(test)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2392
            if self.showAll:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2393
                self._write_status(test, "ok")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2394
            elif self.dots:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2395
                self._write_dot('.')
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
  2396
        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
  2397
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
  2398
    def addError(self, test, err):
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2399
        super(base_class, self).addError(test, err)
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2400
        if self.showAll:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2401
            self._write_status(test, "ERROR")
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2402
        elif self.dots:
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2403
            self._write_dot('E')
21460
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
  2404
        if self._options.first:
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
  2405
            self.stop()
df580990507e run-tests: abort tests after first failure in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21459
diff changeset
  2406
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
  2407
    # Polyfill.
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
  2408
    def addSkip(self, test, reason):
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
  2409
        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
  2410
        with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2411
            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
  2412
                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
  2413
            else:
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2414
                self._write_dot('s')
21430
cf2992656bf8 run-tests: teach unittest about skipped tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21429
diff changeset
  2415
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
  2416
    def addIgnore(self, test, reason):
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
  2417
        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
  2418
        with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2419
            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
  2420
                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
  2421
            else:
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2422
                if reason not in ('not retesting', "doesn't match keyword"):
51833
7933bcb02bfc run-tests: add color to the progress output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51699
diff changeset
  2423
                    self._write_dot('i')
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2424
                else:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2425
                    self.testsRun += 1
21431
0f12bc8aed80 run-tests: teach unittest about ignored tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21430
diff changeset
  2426
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
  2427
    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
  2428
        """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
  2429
        if self.shouldStop or firsterror:
22838
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
  2430
            # 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
  2431
            # 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
  2432
            # temp dir getting cleaned up.
9a20f53e436f run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com>
parents: 22486
diff changeset
  2433
            return
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  2434
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
  2435
        accepted = False
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
  2436
        lines = []
21763
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
  2437
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2438
        with iolock:
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2439
            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
  2440
                pass
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2441
            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
  2442
                v = self._options.view
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2443
                subprocess.call(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2444
                    r'"%s" "%s" "%s"'
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  2445
                    % (v, _bytes2sys(test.refpath), _bytes2sys(test.errpath)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2446
                    shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2447
                )
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  2448
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2449
                servefail, lines = getdiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2450
                    expected, got, test.refpath, test.errpath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2451
                )
36438
93228b2a1fc0 run-tests: don't mask errors when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36037
diff changeset
  2452
                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
  2453
                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
  2454
                    line = highlightdiff(line, self.color)
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  2455
                    self.stream.flush()
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  2456
                    self.stream.buffer.write(line)
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  2457
                    self.stream.buffer.flush()
21521
855f092c96e5 run-tests: move diff generation into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21520
diff changeset
  2458
36461
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36438
diff changeset
  2459
                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
  2460
                    raise test.failureException(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2461
                        'server failed to start (HGPORT=%s)' % test._startport
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2462
                    )
36461
51a9f0246931 run-tests: resume raising an exception when a server fails to start
Matt Harbison <matt_harbison@yahoo.com>
parents: 36438
diff changeset
  2463
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2464
            # 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
  2465
            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
  2466
                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
  2467
                    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
  2468
                        'Reference output has changed (run again to prompt '
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2469
                        'changes)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2470
                    )
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
  2471
                else:
44944
617cd3b1e9cd tests: make it clear what happen when no response entered
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 44632
diff changeset
  2472
                    self.stream.write('Accept this change? [y/N] ')
39909
0f8ff3ff5d5c run-tests: flush output stream before prompting to accept changes
Matt Harbison <matt_harbison@yahoo.com>
parents: 39742
diff changeset
  2473
                    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
  2474
                    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
  2475
                    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
  2476
                        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
  2477
                            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
  2478
                        else:
46384
7bb31c367847 run-test: avoid byte issue when replacing output file of python test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46327
diff changeset
  2479
                            rename(test.errpath, b'%s.out' % test.path)
32980
8dc62c97a665 run-tests: do not prompt changes (-i) if a race condition is detected
Jun Wu <quark@fb.com>
parents: 32943
diff changeset
  2480
                        accepted = True
28127
807bc140e915 run-tests: remove useless "failed" flag from addOutputMismatch()
Yuya Nishihara <yuya@tcha.org>
parents: 28126
diff changeset
  2481
            if not accepted:
25052
c4217a046b62 run-tests: record faildata using bytes instead of str
Augie Fackler <augie@google.com>
parents: 25051
diff changeset
  2482
                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
  2483
84cd5ee787ed run-tests: hold iolock across diff/prompt when interactive
Matt Mackall <mpm@selenic.com>
parents: 21754
diff changeset
  2484
        return accepted
21523
9fb6f328576a run-tests: move interactive test acceptance into TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21522
diff changeset
  2485
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2486
    def startTest(self, test):
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2487
        super(TestResult, self).startTest(test)
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2488
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
  2489
        # 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
  2490
        # 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
  2491
        # 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
  2492
        # 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
  2493
        # 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
  2494
        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
  2495
        # 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
  2496
        test.started_time = time.time()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2497
        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
  2498
            self._firststarttime = test.started_time
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2499
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2500
    def stopTest(self, test, interrupted=False):
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2501
        super(TestResult, self).stopTest(test)
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2502
43593
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
  2503
        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
  2504
        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
  2505
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
  2506
        starttime = test.started_times
ae91e4e4c9b0 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43408
diff changeset
  2507
        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
  2508
        origin = self._firststarttime
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2509
        self.times.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2510
            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2511
                test.name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2512
                endtime[2] - starttime[2],  # user space CPU time
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2513
                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
  2514
                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
  2515
                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
  2516
                stopped_time - origin,  # end date in run context
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2517
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2518
        )
21977
4ca4e1572022 run-tests: '--time' option provide more details to Linux users
anuraggoel <anurag.dsps@gmail.com>
parents: 21919
diff changeset
  2519
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2520
        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
  2521
            with iolock:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2522
                self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2523
                    'INTERRUPTED: %s (after %d seconds)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2524
                    % (test.name, self.times[-1][3])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2525
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2526
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2527
38616
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2528
def getTestResult():
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2529
    """
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2530
    Returns the relevant test result
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2531
    """
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2532
    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
  2533
        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
  2534
        return testresultmodule.TestResult
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2535
    else:
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2536
        return TestResult
c44ae5997869 run-tests: add support for external test result
Boris Feld <boris.feld@octobus.net>
parents: 38554
diff changeset
  2537
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2538
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
  2539
class TestSuite(unittest.TestSuite):
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
  2540
    """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
  2541
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2542
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2543
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2544
        testdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2545
        jobs=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2546
        whitelist=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2547
        blacklist=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2548
        keywords=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2549
        loop=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2550
        runs_per_test=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2551
        loadtest=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2552
        showchannels=False,
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2553
        tail_report=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2554
        *args,
51989
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51959
diff changeset
  2555
        **kwargs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2556
    ):
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
  2557
        """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
  2558
21533
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
  2559
        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
  2560
        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
  2561
        repository.
aecac8059c00 run-tests: make testdir an argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21532
diff changeset
  2562
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
  2563
        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
  2564
        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
  2565
        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
  2566
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2567
        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
  2568
21529
117e027390ab run-tests: move whitelist and blacklist to named arguments of TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21528
diff changeset
  2569
        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
  2570
        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
  2571
        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
  2572
        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
  2573
        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
  2574
        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
  2575
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
  2576
        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
  2577
        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
  2578
9d2ba7e2324d run-tests: move loop to a named argument of TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21531
diff changeset
  2579
        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
  2580
        """
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
  2581
        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
  2582
21528
32b9bbca2052 run-tests: pass jobs into TestSuite constructor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21523
diff changeset
  2583
        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
  2584
        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
  2585
        self._blacklist = blacklist
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
  2586
        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
  2587
        self._loop = loop
24329
e7ca4d4b10e1 run-tests: add --runs-per-test flag
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
  2588
        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
  2589
        self._loadtest = loadtest
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2590
        self._showchannels = showchannels
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2591
        self._tail_report = tail_report
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
  2592
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
  2593
    def run(self, result):
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2594
        # 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
  2595
        # 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
  2596
        # Test simpler.
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2597
        tests = []
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
  2598
        num_tests = [0]
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2599
        for test in self._tests:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2600
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
  2601
            def get():
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
  2602
                num_tests[0] += 1
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
  2603
                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
  2604
                    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
  2605
                return test
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2606
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2607
            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
  2608
                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
  2609
                continue
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2610
45513
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2611
            is_whitelisted = self._whitelist and (
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2612
                test.relpath in self._whitelist or test.bname in self._whitelist
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2613
            )
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2614
            if not is_whitelisted:
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2615
                is_blacklisted = self._blacklist and (
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2616
                    test.relpath in self._blacklist
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2617
                    or test.bname in self._blacklist
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2618
                )
22140fd783d2 run-test: allow relative path in `--blacklist` and `--whitelist` (issue6351)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45442
diff changeset
  2619
                if is_blacklisted:
21507
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2620
                    result.addSkip(test, 'blacklisted')
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2621
                    continue
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
  2622
                if self._keywords:
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  2623
                    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
  2624
                        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
  2625
                    ignored = False
21531
7fcda22acc43 run-tests: make keywords a named argument to TestSuite.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21530
diff changeset
  2626
                    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
  2627
                        if k not in t:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2628
                            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
  2629
                            ignored = True
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2630
                            break
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2631
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2632
                    if ignored:
d839e4820da7 run-tests: move test filtering into TestSuite.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21506
diff changeset
  2633
                        continue
49285
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49244
diff changeset
  2634
            for _ in range(self._runs_per_test):
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
  2635
                tests.append(get())
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2636
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  2637
        runtests = list(tests)
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2638
        done = queue.Queue()
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2639
        running = 0
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2640
49215
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2641
        channels_lock = threading.Lock()
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2642
        channels = [""] * self._jobs
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2643
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2644
        def job(test, result):
49215
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2645
            with channels_lock:
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2646
                for n, v in enumerate(channels):
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2647
                    if not v:
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2648
                        channel = n
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2649
                        break
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2650
                else:
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2651
                    raise ValueError('Could not find output channel')
8d31ef3017c9 run-tests: prevent race-condition when picking a channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49214
diff changeset
  2652
                channels[channel] = "=" + test.name[5:].split(".")[0]
49214
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49213
diff changeset
  2653
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2654
            r = (None, test, None)
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2655
            try:
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2656
                test(result)
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2657
            except KeyboardInterrupt:
49214
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49213
diff changeset
  2658
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2659
            except:  # re-raises
49214
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49213
diff changeset
  2660
                r = ('!', test, 'run-test raised an error, see traceback')
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2661
                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
  2662
            finally:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32621
diff changeset
  2663
                try:
931bb962e0eb tests: fix run-tests when there's a bad #if in a test
Augie Fackler <augie@google.com>
parents: 32621
diff changeset
  2664
                    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
  2665
                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
  2666
                    pass
49214
eca367970253 run-tests: send the test result after freeing the channel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49213
diff changeset
  2667
                done.put(r)
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2668
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2669
        def stat():
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2670
            count = 0
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2671
            while channels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2672
                d = '\n%03s  ' % count
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2673
                for n, v in enumerate(channels):
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2674
                    if v:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2675
                        d += v[0]
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2676
                        channels[n] = v[1:] or '.'
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2677
                    else:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2678
                        d += ' '
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2679
                    d += ' '
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2680
                with iolock:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2681
                    sys.stdout.write(d + '  ')
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2682
                    sys.stdout.flush()
49285
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49244
diff changeset
  2683
                for x in range(10):
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2684
                    if channels:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2685
                        time.sleep(0.1)
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2686
                count += 1
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2687
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
  2688
        stoppedearly = False
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
  2689
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2690
        if self._showchannels:
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2691
            statthread = threading.Thread(target=stat, name="stat")
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2692
            statthread.start()
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2693
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2694
        start_time = time.monotonic()
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2695
        tail_data = []
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2696
        try:
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2697
            while tests or running:
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2698
                finished = None
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2699
                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
  2700
                    try:
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2701
                        _, finished, _ = done.get(True, 1)
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2702
                        running -= 1
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2703
                        if result and result.shouldStop:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2704
                            stoppedearly = True
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2705
                            break
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2706
                    except queue.Empty:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2707
                        continue
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2708
                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
  2709
                    test = tests.pop(0)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2710
                    if self._loop:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2711
                        if getattr(test, 'should_reload', False):
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2712
                            num_tests[0] += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2713
                            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
  2714
                        else:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2715
                            tests.append(test)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2716
                    if self._jobs == 1:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2717
                        job(test, result)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2718
                    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2719
                        t = threading.Thread(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2720
                            target=job, name=test.name, args=(test, result)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2721
                        )
27689
50e621fe0362 run-tests: skip threading for a single test
timeless <timeless@mozdev.org>
parents: 27686
diff changeset
  2722
                        t.start()
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2723
                    running += 1
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2724
                if finished is not None and running < self._jobs:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2725
                    tail_data.append((finished, running, time.monotonic()))
24507
a0668a587c04 run-tests: wait for test threads after first error
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24506
diff changeset
  2726
27880
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2727
            # 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
  2728
            # 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
  2729
            # 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
  2730
            # test reporting incorrect.
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2731
            if stoppedearly:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2732
                while running:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2733
                    try:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2734
                        done.get(True, 1)
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2735
                        running -= 1
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2736
                    except queue.Empty:
b04df9ce1fb0 run-tests: skip threading for a single test (issue5040)
timeless <timeless@mozdev.org>
parents: 27777
diff changeset
  2737
                        continue
21496
f145914e698d run-tests: move _executetests into TestSuite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21495
diff changeset
  2738
        except KeyboardInterrupt:
21520
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  2739
            for test in runtests:
fa6ba4372678 run-tests: remove global abort flag
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21518
diff changeset
  2740
                test.abort()
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
  2741
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2742
        if self._tail_report:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2743
            with iolock:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2744
                sys.stdout.write('\n### test tail-report ###\n')
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2745
                sys.stdout.flush()
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2746
                channels = []
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2747
                for test, remaining, end_time in tail_data:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2748
                    m = "[% 13.6f s] %d tests still running; finished %s\n"
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2749
                    m %= (end_time - start_time, remaining, test)
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2750
                    sys.stdout.write(m)
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2751
                    sys.stdout.flush()
27396
64c584070fc7 run-tests: show scheduling with --showchannels
Matt Mackall <mpm@selenic.com>
parents: 27394
diff changeset
  2752
21439
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
  2753
        return result
2e22954b97e3 run-tests: define a custom TestSuite that uses _executetests()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21438
diff changeset
  2754
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2755
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2756
# 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
  2757
# 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
  2758
# 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
  2759
# newest.
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2760
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2761
32717
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32716
diff changeset
  2762
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
  2763
    times = []
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2764
    try:
35855
69d7fcd91696 testrunner: fix updating of .testtimes file
Martin von Zweigbergk <martinvonz@google.com>
parents: 35854
diff changeset
  2765
        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
  2766
            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
  2767
                m = re.match('(.*?) ([0-9. ]+)', line)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2768
                times.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2769
                    (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
  2770
                )
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  2771
    except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  2772
        pass
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2773
    return times
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2774
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2775
32717
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32716
diff changeset
  2776
def savetimes(outputdir, result):
e5680cb1414f run-tests: write test times to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32716
diff changeset
  2777
    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
  2778
    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
  2779
    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
  2780
    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
  2781
        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
  2782
        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
  2783
            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
  2784
            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
  2785
            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
  2786
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2787
    fd, tmpname = tempfile.mkstemp(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2788
        prefix=b'.testtimes', dir=outputdir, text=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2789
    )
27634
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2790
    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
  2791
        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
  2792
            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
  2793
    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
  2794
    try:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2795
        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
  2796
    except OSError:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2797
        pass
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2798
    try:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2799
        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
  2800
    except OSError:
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2801
        pass
a1eff44c432b tests: write recent run times to a file named tests/.testtimes
Bryan O'Sullivan <bos@serpentine.com>
parents: 27602
diff changeset
  2802
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2803
21429
203ed3cf6c81 run-tests: define custom result and runner classes for unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21428
diff changeset
  2804
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
  2805
    """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
  2806
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2807
    def __init__(self, runner, *args, **kwargs):
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2808
        super(TextTestRunner, self).__init__(*args, **kwargs)
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2809
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2810
        self._runner = runner
38620
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
  2811
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2812
        self._result = getTestResult()(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2813
            self._runner.options, self.stream, self.descriptions, self.verbosity
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2814
        )
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2815
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  2816
    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
  2817
        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
  2818
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2819
        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
  2820
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  2821
        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
  2822
            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
  2823
            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
  2824
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  2825
        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
  2826
            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
  2827
                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
  2828
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  2829
        if self._runner.options.json:
32718
232875623c27 run-tests: write JSON reports to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32717
diff changeset
  2830
            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
  2831
            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
  2832
                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
  2833
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2834
        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
  2835
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2836
    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
  2837
        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
  2838
        test(self._result)
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2839
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2840
        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
  2841
        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
  2842
        ignored = len(self._result.ignored)
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2843
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2844
        with iolock:
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2845
            if not self._runner.options.tail_report:
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  2846
                self.stream.writeln('')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2847
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2848
            if not self._runner.options.noskips:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2849
                for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2850
                    self._result.skipped, key=lambda s: s[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2851
                ):
33929
5d2ce90c71f1 run-tests: include "\n" in formatted message instead of calling writeln()
Yuya Nishihara <yuya@tcha.org>
parents: 33871
diff changeset
  2852
                    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
  2853
                    msg = highlightmsg(formatted, self._result.color)
fa6edc6a02a9 run-tests: fix a too long line
Boris Feld <boris.feld@octobus.net>
parents: 38620
diff changeset
  2854
                    self.stream.write(msg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2855
            for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2856
                self._result.failures, key=lambda f: f[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2857
            ):
33929
5d2ce90c71f1 run-tests: include "\n" in formatted message instead of calling writeln()
Yuya Nishihara <yuya@tcha.org>
parents: 33871
diff changeset
  2858
                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
  2859
                self.stream.write(highlightmsg(formatted, self._result.color))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2860
            for test, msg in sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2861
                self._result.errors, key=lambda e: e[0].name
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2862
            ):
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2863
                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
  2864
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2865
            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
  2866
                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
  2867
                    self._writexunit(self._result, xuf)
22044
a06172e85fd4 run-tests: add support for xunit test reports
Augie Fackler <raf@durin42.com>
parents: 21997
diff changeset
  2868
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2869
            if self._runner.options.json:
32718
232875623c27 run-tests: write JSON reports to output dir
Siddharth Agarwal <sid0@fb.com>
parents: 32717
diff changeset
  2870
                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
  2871
                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
  2872
                    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
  2873
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  2874
            self._runner._check_hg('Tested')
21459
d5945324b130 run-tests: print compatible output from TextTestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21458
diff changeset
  2875
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2876
            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
  2877
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2878
            self.stream.writeln(
32942
5af78c524f34 tests: remove support for warned tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32934
diff changeset
  2879
                '# Ran %d tests, %d skipped, %d failed.'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2880
                % (self._result.testsRun, skipped + ignored, failed)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2881
            )
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2882
            if failed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2883
                self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2884
                    'python hash seed: %s' % os.environ['PYTHONHASHSEED']
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2885
                )
25046
40b4308d5653 run-tests: switch all uses of iolock.acquire() to a context manager
Augie Fackler <augie@google.com>
parents: 25045
diff changeset
  2886
            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
  2887
                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
  2888
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  2889
            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
  2890
                exceptions = aggregateexceptions(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2891
                    os.path.join(self._runner._outputdir, b'exceptions')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2892
                )
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  2893
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  2894
                self.stream.writeln('Exceptions Report:')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2895
                self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2896
                    '%d total from %d frames'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2897
                    % (exceptions['total'], len(exceptions['exceptioncounts']))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2898
                )
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  2899
                combined = exceptions['combined']
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  2900
                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
  2901
                    frame, line, exc = key
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  2902
                    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
  2903
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2904
                    self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2905
                        '%d (%d tests)\t%s: %s (%s - %d total)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2906
                        % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2907
                            totalcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2908
                            testcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2909
                            frame,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2910
                            exc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2911
                            leasttest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2912
                            leastcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2913
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2914
                    )
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  2915
32907
bd77ac2bd23a run-tests: explicitly flush test runner output for Windows stability
Matt Harbison <matt_harbison@yahoo.com>
parents: 32853
diff changeset
  2916
            self.stream.flush()
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
  2917
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  2918
        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
  2919
21495
b162bdc78bef run-tests: capture execution times in TestResult
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21494
diff changeset
  2920
    def printtimes(self, times):
22104
70bdf59d27b6 run-tests: attempt to fix iolock handling
Matt Mackall <mpm@selenic.com>
parents: 22045
diff changeset
  2921
        # iolock held by run
21494
dcefc4091c86 run-tests: move outputtimes() into unittest runner class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21493
diff changeset
  2922
        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
  2923
        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
  2924
        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
  2925
        self.stream.writeln(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2926
            '%-7s %-7s %-7s %-7s %-7s   %s'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2927
            % ('start', 'end', 'cuser', 'csys', 'real', 'Test')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2928
        )
24982
5c15f7e0f52b run-tests: stop explicit expansion of time data
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24981
diff changeset
  2929
        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
  2930
            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
  2931
            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
  2932
            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
  2933
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2934
    @staticmethod
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2935
    def _writexunit(result, outf):
32714
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
  2936
        # 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
  2937
        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
  2938
        doc = minidom.Document()
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2939
        s = doc.createElement('testsuite')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2940
        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
  2941
        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
  2942
        s.setAttribute('name', 'run-tests')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2943
        s.setAttribute(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2944
            'skipped', str(len(result.skipped) + len(result.ignored))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2945
        )
41546
20e62312e016 run-tests: set attributes in sorted order
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41540
diff changeset
  2946
        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
  2947
        doc.appendChild(s)
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2948
        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
  2949
            t = doc.createElement('testcase')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2950
            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
  2951
            tctime = timesd.get(tc.name)
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
  2952
            if tctime is not None:
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
  2953
                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
  2954
            s.appendChild(t)
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2955
        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
  2956
            t = doc.createElement('testcase')
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2957
            t.setAttribute('name', tc)
32702
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
  2958
            tctime = timesd.get(tc)
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
  2959
            if tctime is not None:
d0b9c36851f5 run-tests: make time field optional for xunit report
Siddharth Agarwal <sid0@fb.com>
parents: 32701
diff changeset
  2960
                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
  2961
            # 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
  2962
            # 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
  2963
            # 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
  2964
            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
  2965
            cd = doc.createCDATASection(err)
32714
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
  2966
            # 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
  2967
            # 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
  2968
            failelem = doc.createElement('failure')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
  2969
            failelem.setAttribute('message', 'output changed')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
  2970
            failelem.setAttribute('type', 'output-mismatch')
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
  2971
            failelem.appendChild(cd)
ef8d24539612 run-tests: wrap failures in an XUnit 'failure' element
Siddharth Agarwal <sid0@fb.com>
parents: 32711
diff changeset
  2972
            t.appendChild(failelem)
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2973
            s.appendChild(t)
32715
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
  2974
        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
  2975
            # 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
  2976
            # 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
  2977
            t = doc.createElement('testcase')
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
  2978
            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
  2979
            binmessage = message.encode('utf-8')
20f547806a4d tests: fix run-tests XML reporting on Python 3
Augie Fackler <augie@google.com>
parents: 34268
diff changeset
  2980
            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
  2981
            cd = doc.createCDATASection(message)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
  2982
            skipelem = doc.createElement('skipped')
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
  2983
            skipelem.appendChild(cd)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
  2984
            t.appendChild(skipelem)
a4d0e816a672 run-tests: add information about skipped tests to XUnit output
Siddharth Agarwal <sid0@fb.com>
parents: 32714
diff changeset
  2985
            s.appendChild(t)
32700
3afe258fb0fe run-tests: factor out xunit write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32622
diff changeset
  2986
        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
  2987
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  2988
    @staticmethod
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  2989
    def _writejson(result, outf):
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  2990
        timesd = {}
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  2991
        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
  2992
            test = tdata[0]
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  2993
            timesd[test] = tdata[1:]
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  2994
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  2995
        outcome = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2996
        groups = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2997
            ('success', ((tc, None) for tc in result.successes)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2998
            ('failure', result.failures),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  2999
            ('skip', result.skipped),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3000
        ]
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3001
        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
  3002
            for tc, __ in testcases:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3003
                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
  3004
                    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
  3005
                    try:
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32720
diff changeset
  3006
                        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
  3007
                    except UnicodeDecodeError as e:
3139a7a1e7d4 tests: try and fail more gracefully with broken unicode escapes
Augie Fackler <augie@google.com>
parents: 32720
diff changeset
  3008
                        diff = '%r decoding diff, sorry' % e
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3009
                    tres = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3010
                        'result': res,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3011
                        'time': ('%0.3f' % timesd[tc.name][2]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3012
                        'cuser': ('%0.3f' % timesd[tc.name][0]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3013
                        'csys': ('%0.3f' % timesd[tc.name][1]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3014
                        'start': ('%0.3f' % timesd[tc.name][3]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3015
                        'end': ('%0.3f' % timesd[tc.name][4]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3016
                        'diff': diff,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3017
                    }
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3018
                else:
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3019
                    # blacklisted test
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3020
                    tres = {'result': res}
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3021
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3022
                outcome[tc.name] = tres
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3023
        jsonout = json.dumps(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3024
            outcome, sort_keys=True, indent=4, separators=(',', ': ')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3025
        )
32701
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3026
        outf.writelines(("testreport =", jsonout))
60c921ff4104 run-tests: factor out json write code into another method
Siddharth Agarwal <sid0@fb.com>
parents: 32700
diff changeset
  3027
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3028
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3029
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
  3030
    """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
  3031
    if shuffle:
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
  3032
        random.shuffle(testdescs)
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
  3033
        return
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
  3034
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3035
    if previoustimes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3036
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3037
        def sortkey(f):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3038
            f = f['path']
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3039
            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
  3040
                # Use most recent time as estimate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3041
                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
  3042
            else:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3043
                # 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
  3044
                return -1.0
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3045
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3046
    else:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3047
        # keywords for slow tests
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3048
        slow = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3049
            b'svn': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3050
            b'cvs': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3051
            b'hghave': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3052
            b'largefiles-update': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3053
            b'run-tests': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3054
            b'corruption': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3055
            b'race': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3056
            b'i18n': 10,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3057
            b'check': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3058
            b'gendoc': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3059
            b'contrib-perf': 200,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3060
            b'merge-combination': 100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3061
        }
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3062
        perf = {}
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3063
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3064
        def sortkey(f):
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3065
            # 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
  3066
            f = f['path']
35489
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
  3067
            try:
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3068
                return perf[f]
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3069
            except KeyError:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3070
                try:
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3071
                    val = -os.stat(f).st_size
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  3072
                except FileNotFoundError:
36665
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3073
                    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
  3074
                    return -1e9
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3075
                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
  3076
                    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
  3077
                        val *= mul
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3078
                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
  3079
                    val /= 10.0
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3080
                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
  3081
                return perf[f]
35489
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
  3082
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
  3083
    testdescs.sort(key=sortkey)
212a6e9aecb0 run-tests: extract sorting of tests to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35488
diff changeset
  3084
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3085
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48880
diff changeset
  3086
class TestRunner:
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
  3087
    """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
  3088
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
  3089
    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
  3090
    """
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3091
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  3092
    # Programs required to run tests.
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  3093
    REQUIREDTOOLS = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3094
        b'diff',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3095
        b'grep',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3096
        b'unzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3097
        b'gunzip',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3098
        b'bunzip2',
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3099
        b'sed',
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  3100
    ]
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  3101
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  3102
    # Maps file extensions to test class.
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3103
    TESTTYPES = [
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3104
        (b'.py', PythonTest),
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3105
        (b'.t', TTest),
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3106
    ]
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3107
21341
cb88d4a04f58 run-tests: move TESTDIR out of a global
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21340
diff changeset
  3108
    def __init__(self):
21348
b3399154505f run-tests: add options to runner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21347
diff changeset
  3109
        self.options = None
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
  3110
        self._hgroot = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3111
        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
  3112
        self._outputdir = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3113
        self._hgtmp = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3114
        self._installdir = None
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3115
        self._bindir = None
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
  3116
        # a place for run-tests.py to generate executable it needs
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
  3117
        self._custom_bin_dir = None
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3118
        self._pythondir = None
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3119
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3120
        if sys.executable:
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3121
            self._python = sys.executable
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3122
        elif os.environ.get('PYTHONEXECUTABLE'):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3123
            self._python = os.environ['PYTHONEXECUTABLE']
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3124
        elif os.environ.get('PYTHON'):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3125
            self._python = os.environ['PYTHON']
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3126
        else:
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3127
            raise AssertionError('Could not find Python interpreter')
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3128
47574
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
  3129
        # True if we had to infer the pythondir from --with-hg
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
  3130
        self._pythondir_inferred = False
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3131
        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
  3132
        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
  3133
        self._hgcommand = None
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
  3134
        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
  3135
        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
  3136
        self._ports = {}
21340
fda36de1cb0e run-tests: establish a class to hold testing state
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21339
diff changeset
  3137
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3138
    @property
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3139
    def _pythonb(self):
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3140
        return _sys2bytes(self._python.replace('\\', '/'))
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3141
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
  3142
    def run(self, args, parser=None):
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3143
        """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
  3144
        oldmask = os.umask(0o22)
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
  3145
        try:
21376
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
  3146
            parser = parser or getparser()
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
  3147
            options = parseargs(args, parser)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  3148
            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
  3149
            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
  3150
                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
  3151
                    with open(listfile, 'rb') as f:
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
  3152
                        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
  3153
            self.options = options
e4366bc08879 run-tests: move option parser logic to TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21375
diff changeset
  3154
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
  3155
            self._checktools()
35187
b4b0aed7bfaf run-tests: convert to argparse
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35155
diff changeset
  3156
            testdescs = self.findtests(tests)
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3157
            if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3158
                import statprof
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3159
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3160
                statprof.start()
52211
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3161
            result = self._run(
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3162
                testdescs,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3163
                shard_index=options.shard_index,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3164
                shard_total=options.shard_total,
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3165
            )
25107
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3166
            if options.profile_runner:
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3167
                statprof.stop()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3168
                statprof.display()
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3169
            return result
149cc7663ac8 run-tests: add a --profile-runner option
Augie Fackler <augie@google.com>
parents: 25098
diff changeset
  3170
21375
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
  3171
        finally:
bd70dcb91af6 run-tests: move umask into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21374
diff changeset
  3172
            os.umask(oldmask)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3173
52211
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3174
    def _run(self, testdescs, shard_index=None, shard_total=None):
40487
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40479
diff changeset
  3175
        testdir = getcwdb()
34962
a18eef03d879 run-tests: $TESTDIR can be something else than $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34842
diff changeset
  3176
        # 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
  3177
        if testdescs:
a18eef03d879 run-tests: $TESTDIR can be something else than $PWD
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34842
diff changeset
  3178
            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
  3179
            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
  3180
                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
  3181
        self._testdir = osenvironb[b'TESTDIR'] = testdir
49047
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48735
diff changeset
  3182
        osenvironb[b'TESTDIR_FORWARD_SLASH'] = osenvironb[b'TESTDIR'].replace(
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48735
diff changeset
  3183
            os.sep.encode('ascii'), b'/'
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48735
diff changeset
  3184
        )
c827bb7b5806 run-tests: introduce "forward-slash" version of everything on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48735
diff changeset
  3185
32716
2146f01a2577 run-tests: allow specifying an output dir to write .errs to
Siddharth Agarwal <sid0@fb.com>
parents: 32715
diff changeset
  3186
        if self.options.outputdir:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  3187
            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
  3188
        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
  3189
            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
  3190
            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
  3191
                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
  3192
        previoustimes = {}
6276cbc704a6 testrunner: add option to sort tests by previous run time
Martin von Zweigbergk <martinvonz@google.com>
parents: 36522
diff changeset
  3193
        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
  3194
            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
  3195
        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
  3196
21370
97475f27bebe run-tests: move hash seed logic to TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21369
diff changeset
  3197
        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
  3198
            # 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
  3199
            # 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
  3200
            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
  3201
44518
b2e41723f886 run-tests: restrict Rust thread pool to 3 threads during tests
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44489
diff changeset
  3202
        # 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
  3203
        # 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
  3204
        # 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
  3205
        # 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
  3206
        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
  3207
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3208
        if self.options.tmpdir:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3209
            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
  3210
            tmpdir = _sys2bytes(self.options.tmpdir)
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3211
            if os.path.exists(tmpdir):
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3212
                # 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
  3213
                # 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
  3214
                # tmpdir already exists.
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
  3215
                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
  3216
                return 1
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3217
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3218
            os.makedirs(tmpdir)
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3219
        else:
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3220
            d = None
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  3221
            if WINDOWS:
21369
1d0aa8bccc87 run-tests: move tmpdir calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21368
diff changeset
  3222
                # 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
  3223
                # 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
  3224
                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
  3225
            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
  3226
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3227
        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
  3228
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
  3229
        self._custom_bin_dir = os.path.join(self._hgtmp, b'custom-bin')
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
  3230
        os.makedirs(self._custom_bin_dir)
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
  3231
50929
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  3232
        # detect and enforce an alternative way to specify rust extension usage
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  3233
        if (
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3234
            not (
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3235
                self.options.wheel
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3236
                or self.options.pure
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3237
                or self.options.rust
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3238
                or self.options.no_rust
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3239
            )
50929
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  3240
            and os.environ.get("HGWITHRUSTEXT") == "cpython"
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  3241
        ):
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  3242
            self.options.rust = True
afb3cccc90f7 run-tests: detect HGWITHRUSTEXT value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50928
diff changeset
  3243
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
  3244
        if self.options.with_hg:
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3245
            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
  3246
            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
  3247
            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
  3248
            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
  3249
            self._hgcommand = os.path.basename(whg)
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
  3250
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3251
            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
  3252
            normbin = normbin.replace(_sys2bytes(os.sep), b'/')
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3253
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3254
            # Other Python scripts in the test harness need to
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3255
            # `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
  3256
            # 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
  3257
            # to load Python modules from its directory.
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3258
            with open(whg, 'rb') as fh:
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3259
                initial = fh.read(1024)
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3260
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3261
            if re.match(b'#!.*python', initial):
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3262
                self._pythondir = self._bindir
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3263
            # 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
  3264
            # 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
  3265
            # 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
  3266
            elif re.search(b'/rust/target/[^/]+/hg', normbin):
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3267
                self._pythondir = os.path.dirname(self._testdir)
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3268
            # Fall back to the legacy behavior.
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3269
            else:
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3270
                self._pythondir = self._bindir
47574
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
  3271
            self._pythondir_inferred = True
35569
964212780daf rust: implementation of `hg`
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35536
diff changeset
  3272
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
  3273
        else:
52553
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3274
            self._hgcommand = b'hg'
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3275
            self._installdir = os.path.join(self._hgtmp, b"install")
52553
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3276
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3277
            # create a virtual env where hg is going to be installed
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3278
            command_create_venv = [
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3279
                self._python,
52553
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3280
                "-m",
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3281
                "venv",
52590
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52589
diff changeset
  3282
                "--system-site-packages",
52553
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3283
                self._installdir,
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3284
            ]
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3285
            subprocess.run(command_create_venv, check=True)
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3286
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3287
            bindir = b"Scripts" if WINDOWS else b"bin"
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3288
            self._bindir = os.path.join(self._installdir, bindir)
52590
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52589
diff changeset
  3289
            self._python = _bytes2sys(os.path.join(self._bindir, b"python"))
52553
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3290
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3291
            self._pythondir = subprocess.run(
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3292
                [
52590
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52589
diff changeset
  3293
                    self._python,
52553
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3294
                    "-c",
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3295
                    "import sys; print([p for p in sys.path if p.startswith(sys.prefix) and p.endswith('site-packages')][0])",
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3296
                ],
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3297
                check=True,
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3298
                capture_output=True,
1a0d8556fd00 run-tests: create a virtual env to install hg
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52552
diff changeset
  3299
            ).stdout.strip()
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
  3300
40976
ef7119cd4965 py3: enable legacy stdio mode in exewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40975
diff changeset
  3301
        # 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
  3302
        # 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
  3303
        # 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
  3304
        # anyway.
52228
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52226
diff changeset
  3305
        #
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52226
diff changeset
  3306
        # We do not do it when using wheels and they do not install a .exe.
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52226
diff changeset
  3307
        if (
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52226
diff changeset
  3308
            WINDOWS
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52226
diff changeset
  3309
            and not self.options.wheel
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52226
diff changeset
  3310
            and not self._hgcommand.endswith(b'.exe')
763817eca85e wheel: make --hg-wheel works on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52226
diff changeset
  3311
        ):
40975
2465e0b27a0d run-tests: alias hg to hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40930
diff changeset
  3312
            self._hgcommand += b'.exe'
2465e0b27a0d run-tests: alias hg to hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40930
diff changeset
  3313
52513
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52512
diff changeset
  3314
        self._real_hg = os.path.join(self._bindir, self._hgcommand)
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52512
diff changeset
  3315
        osenvironb[b'HGTEST_REAL_HG'] = self._real_hg
28620
759d167f75cf run-tests: use different chg socket directories for different tests
Jun Wu <quark@fb.com>
parents: 28596
diff changeset
  3316
        # 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
  3317
        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
  3318
        if self.options.chg or self.options.with_chg:
47586
a8e33ab50c4f run-tests: use more explicit signaling for `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47585
diff changeset
  3319
            osenvironb[b'CHG_INSTALLED_AS_HG'] = b'1'
52513
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52512
diff changeset
  3320
            osenvironb[b'CHGHG'] = self._real_hg
28880
f74eed3115fd hghave: add "chg" flag to skip tests that can't be compatible with chg
Yuya Nishihara <yuya@tcha.org>
parents: 28829
diff changeset
  3321
        else:
47586
a8e33ab50c4f run-tests: use more explicit signaling for `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47585
diff changeset
  3322
            # drop flag for hghave
a8e33ab50c4f run-tests: use more explicit signaling for `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47585
diff changeset
  3323
            osenvironb.pop(b'CHG_INSTALLED_AS_HG', None)
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
  3324
        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
  3325
            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
  3326
        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
  3327
            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
  3328
            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
  3329
46723
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46668
diff changeset
  3330
        # configure fallback and replace "hg" command by "rhg"
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3331
        rhgbindir = self._bindir
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3332
        if self.options.rhg or self.options.with_rhg:
46724
78e6700ab009 tests: Add `rhg` and `no-rhg` for #require and #if in .t files
Simon Sapin <simon.sapin@octobus.net>
parents: 46723
diff changeset
  3333
            # Affects hghave.py
78e6700ab009 tests: Add `rhg` and `no-rhg` for #require and #if in .t files
Simon Sapin <simon.sapin@octobus.net>
parents: 46723
diff changeset
  3334
            osenvironb[b'RHG_INSTALLED_AS_HG'] = b'1'
46723
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46668
diff changeset
  3335
            # Affects configuration. Alternatives would be setting configuration through
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46668
diff changeset
  3336
            # `$HGRCPATH` but some tests override that, or changing `_hgcommand` to include
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46668
diff changeset
  3337
            # `--config` but that disrupts tests that print command lines and check expected
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46668
diff changeset
  3338
            # output.
a6553ba1c598 tests: Enable rhg fallback to Python by default in tests
Simon Sapin <simon.sapin@octobus.net>
parents: 46668
diff changeset
  3339
            osenvironb[b'RHG_ON_UNSUPPORTED'] = b'fallback'
52513
7fd3a9309d0e run-test: keep track of the "real hg" binary before we replace it with a proxy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52512
diff changeset
  3340
            osenvironb[b'RHG_FALLBACK_EXECUTABLE'] = self._real_hg
47585
5654323832f0 run-tests: drop the `rhg` flag for `hghave.py` if unset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47584
diff changeset
  3341
        else:
5654323832f0 run-tests: drop the `rhg` flag for `hghave.py` if unset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47584
diff changeset
  3342
            # drop flag for hghave
5654323832f0 run-tests: drop the `rhg` flag for `hghave.py` if unset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47584
diff changeset
  3343
            osenvironb.pop(b'RHG_INSTALLED_AS_HG', None)
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3344
        if self.options.rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3345
            self._hgcommand = b'rhg'
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3346
        elif self.options.with_rhg:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3347
            rhgbindir = os.path.dirname(os.path.realpath(self.options.with_rhg))
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3348
            self._hgcommand = os.path.basename(self.options.with_rhg)
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3349
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3350
        if self.options.pyoxidized:
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3351
            testdir = os.path.dirname(_sys2bytes(canonpath(sys.argv[0])))
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3352
            reporootdir = os.path.dirname(testdir)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3353
            # XXX we should ideally install stuff instead of using the local build
49832
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3354
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3355
            exe = b'hg'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3356
            triple = b''
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3357
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3358
            if WINDOWS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3359
                triple = b'x86_64-pc-windows-msvc'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3360
                exe = b'hg.exe'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3361
            elif MACOS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3362
                # TODO: support Apple silicon too
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3363
                triple = b'x86_64-apple-darwin'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3364
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  3365
            bin_path = b'build/pyoxidizer/%s/release/app/%s' % (triple, exe)
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3366
            full_path = os.path.join(reporootdir, bin_path)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3367
            self._hgcommand = full_path
47831
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47826
diff changeset
  3368
            # Affects hghave.py
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47826
diff changeset
  3369
            osenvironb[b'PYOXIDIZED_INSTALLED_AS_HG'] = b'1'
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47826
diff changeset
  3370
        else:
94158c541c74 pyoxidized: add a `pyoxidizer` hghave keyword for line matching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47826
diff changeset
  3371
            osenvironb.pop(b'PYOXIDIZED_INSTALLED_AS_HG', None)
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3372
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3373
        osenvironb[b"BINDIR"] = self._bindir
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3374
        osenvironb[b"PYTHON"] = self._pythonb
21368
a884548f5421 run-tests: move more path calculations into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21367
diff changeset
  3375
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  3376
        fileb = _sys2bytes(__file__)
52593
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  3377
        osenvironb[b'RUNTESTDIR'] = RUNTEST_DIR
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  3378
        osenvironb[b'RUNTESTDIR_FORWARD_SLASH'] = RUNTEST_DIR_FORWARD_SLASH
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  3379
        sepb = _sys2bytes(os.pathsep)
52593
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  3380
        path = [self._bindir, RUNTEST_DIR] + osenvironb[b"PATH"].split(sepb)
24742
39ee0444e27c run-tests: also follow symlink when update PATH with 'run-tests.py' dir
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24516
diff changeset
  3381
        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
  3382
            # 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
  3383
            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
  3384
            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
  3385
            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
  3386
        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
  3387
            path.insert(1, chgbindir)
46668
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3388
        if rhgbindir != self._bindir:
fb2368598281 tests: Add `--rhg` and `--with-rhg=<path>` options for `run-tests.py`
Simon Sapin <simon.sapin@octobus.net>
parents: 46384
diff changeset
  3389
            path.insert(1, rhgbindir)
52593
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  3390
        if self._testdir != RUNTEST_DIR:
25730
c380d5273e91 run-tests.py: add TESTDIR to PATH if it differs from RUNTESTDIR
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25729
diff changeset
  3391
            path = [self._testdir] + path
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
  3392
        path = [self._custom_bin_dir] + path
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3393
        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
  3394
51954
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51912
diff changeset
  3395
        os.environ["HGTEST_BASE_HGMODULEPOLICY"] = os.environ.get(
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51912
diff changeset
  3396
            "HGMODULEPOLICY", ""
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51912
diff changeset
  3397
        )
16574ca8b155 test: preserve the existing module policy config for testrepohg resuse
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51912
diff changeset
  3398
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
  3399
        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
  3400
            os.environ["HGTEST_RUN_TESTS_PURE"] = "--pure"
28905
c969c72d6cbc run-tests: set HGMODULEPOLICY for --pure
timeless <timeless@mozdev.org>
parents: 28880
diff changeset
  3401
            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
  3402
        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
  3403
            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
  3404
        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
  3405
            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
  3406
            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
  3407
                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
  3408
            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
  3409
26109
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26087
diff changeset
  3410
        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
  3411
            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
  3412
        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
  3413
            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
  3414
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3415
        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
  3416
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3417
        if self.options.exceptions:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3418
            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
  3419
            try:
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3420
                os.makedirs(exceptionsdir)
49305
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  3421
            except FileExistsError:
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  3422
                pass
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3423
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3424
            # 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
  3425
            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
  3426
                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
  3427
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3428
            osenvironb[b'HGEXCEPTIONSDIR'] = exceptionsdir
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3429
            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
  3430
            self.options.extra_config_opt.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3431
                'extensions.logexceptions=%s' % logexceptions.decode('utf-8')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3432
            )
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  3433
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  3434
        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
  3435
        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
  3436
        vlog("# Using HGTMP", _bytes2sys(self._hgtmp))
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3437
        vlog("# Using PATH", os.environ["PATH"])
52599
deb8afb8448e run-tests: clean the last usage of IMPL_PATH up
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52598
diff changeset
  3438
        vlog("# Using PYTHONPATH", os.environ.get("PYTHONPATH", ""))
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  3439
        vlog("# Writing to directory", _bytes2sys(self._outputdir))
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3440
52211
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3441
        if shard_total is not None:
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3442
            slot = shard_index - 1
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3443
            testdescs = [
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3444
                t
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3445
                for (idx, t) in enumerate(testdescs)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3446
                if (idx % shard_total == slot)
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3447
            ]
36e4d1457c6b run-tests: implement crude sharding support
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52201
diff changeset
  3448
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3449
        try:
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3450
            return self._runtests(testdescs) or 0
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3451
        finally:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3452
            time.sleep(0.1)
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3453
            self._cleanup()
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3454
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
  3455
    def findtests(self, args):
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
  3456
        """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
  3457
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
  3458
        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
  3459
        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
  3460
        """
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
  3461
        if not args:
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
  3462
            if self.options.changed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3463
                proc = Popen4(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3464
                    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
  3465
                    % _sys2bytes(self.options.changed),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3466
                    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3467
                    0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3468
                )
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
  3469
                stdout, stderr = proc.communicate()
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3470
                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
  3471
            else:
25041
09c71e3da704 run-tests: even more bytestring annotations for Python 3
Augie Fackler <augie@google.com>
parents: 25040
diff changeset
  3472
                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
  3473
34969
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
  3474
        expanded_args = []
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
  3475
        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
  3476
            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
  3477
                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
  3478
                    arg += b'/'
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
  3479
                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
  3480
            else:
d600bda4a3e1 run-tests: allow automatic test discovery when providing folder as argument
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34966
diff changeset
  3481
                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
  3482
        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
  3483
44021
6d3b67a837a6 cleanup: drop redundant character escapes from `[]` character sets
Matt Harbison <matt_harbison@yahoo.com>
parents: 43982
diff changeset
  3484
        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
  3485
        tests = []
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3486
        for t in args:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3487
            case = []
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
  3488
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3489
            if not (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3490
                os.path.basename(t).startswith(b'test-')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3491
                and (t.endswith(b'.py') or t.endswith(b'.t'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3492
            ):
41138
8ddc5d8bea25 tests: support passing testcase after .t paths that have path separators
Kyle Lippincott <spectral@google.com>
parents: 40989
diff changeset
  3493
                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
  3494
                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
  3495
                    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
  3496
                    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
  3497
                    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
  3498
                        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
  3499
                else:
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
  3500
                    continue
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
  3501
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3502
            if t.endswith(b'.t'):
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3503
                # .t file may contain multiple test cases
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3504
                casedimensions = parsettestcases(t)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3505
                if casedimensions:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3506
                    cases = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3507
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3508
                    def addcases(case, casedimensions):
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3509
                        if not casedimensions:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3510
                            cases.append(case)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3511
                        else:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3512
                            for c in casedimensions[0]:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3513
                                addcases(case + [c], casedimensions[1:])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3514
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3515
                    addcases([], casedimensions)
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3516
                    if case and case in cases:
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3517
                        cases = [case]
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3518
                    elif case:
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
  3519
                        # Ignore invalid cases
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3520
                        cases = []
38222
507bdc40bb17 run-tests: add support for running specific test cases
Boris Feld <boris.feld@octobus.net>
parents: 37741
diff changeset
  3521
                    else:
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3522
                        pass
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3523
                    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
  3524
                else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3525
                    tests.append({'path': t})
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3526
            else:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3527
                tests.append({'path': t})
45407
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
  3528
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
  3529
        if self.options.retest:
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
  3530
            retest_args = []
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
  3531
            for test in tests:
45408
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3532
                errpath = self._geterrpath(test)
45407
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
  3533
                if os.path.exists(errpath):
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
  3534
                    retest_args.append(test)
de9ec12ee53c run-tests: refactor filtering logic for --retest flag
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45108
diff changeset
  3535
            tests = retest_args
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3536
        return tests
21363
00e5f5b9fc90 run-tests: move test discovery logic into a function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21362
diff changeset
  3537
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3538
    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
  3539
        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
  3540
            # 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
  3541
            desc = {'path': test.path}
38824
3086a8627b29 testrunner: allow multiple #testcases
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
  3542
            case = getattr(test, '_case', [])
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3543
            if case:
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3544
                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
  3545
            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
  3546
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3547
        try:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3548
            if self.options.restart:
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3549
                orig = list(testdescs)
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3550
                while testdescs:
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3551
                    desc = testdescs[0]
45408
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3552
                    errpath = self._geterrpath(desc)
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3553
                    if os.path.exists(errpath):
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3554
                        break
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3555
                    testdescs.pop(0)
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3556
                if not testdescs:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
  3557
                    print("running all tests")
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3558
                    testdescs = orig
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3559
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3560
            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
  3561
            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
  3562
53327bfbf35d testrunner: make `-j100 --runs-per-test=100 test-foo.t` use 100 jobs
Martin von Zweigbergk <martinvonz@google.com>
parents: 41141
diff changeset
  3563
            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
  3564
21458
c42219733f30 run-tests: don't print results in unittest mode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21457
diff changeset
  3565
            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
  3566
            kws = self.options.keywords
48866
2ccd5e71bcd3 tests: remove last references to PYTHON3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48865
diff changeset
  3567
            if kws is not None:
25050
28526bb5b3b5 run-tests: make sure keyword(s) are in bytes and not str
Augie Fackler <augie@google.com>
parents: 25049
diff changeset
  3568
                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
  3569
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3570
            suite = TestSuite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3571
                self._testdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3572
                jobs=jobs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3573
                whitelist=self.options.whitelisted,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3574
                blacklist=self.options.blacklist,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3575
                keywords=kws,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3576
                loop=self.options.loop,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3577
                runs_per_test=self.options.runs_per_test,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3578
                showchannels=self.options.showchannels,
52458
a814534aaedd run-tests: add a "--tail-report" argument to analyse run parallelism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52326
diff changeset
  3579
                tail_report=self.options.tail_report,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3580
                tests=tests,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3581
                loadtest=_reloadtest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3582
            )
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
  3583
            verbosity = 1
38620
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
  3584
            if self.options.list_tests:
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
  3585
                verbosity = 0
875e033fbbdd run-tests: fix test result verbosity
Boris Feld <boris.feld@octobus.net>
parents: 38617
diff changeset
  3586
            elif self.options.verbose:
21464
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
  3587
                verbosity = 2
d19164a018a1 run-tests: execute tests via unittest
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21463
diff changeset
  3588
            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
  3589
49833
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  3590
            osenvironb.pop(b'PYOXIDIZED_IN_MEMORY_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  3591
            osenvironb.pop(b'PYOXIDIZED_FILESYSTEM_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  3592
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  3593
            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
  3594
                result = runner.listtests(suite)
32703
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32702
diff changeset
  3595
            else:
49497
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49496
diff changeset
  3596
                install_start_time = time.monotonic()
47577
2ee81806831f run-tests: setup "correct" python earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47576
diff changeset
  3597
                self._usecorrectpython()
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  3598
                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
  3599
                    self._installhg()
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3600
                    self._check_hg("Testing")
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  3601
                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
  3602
                    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
  3603
                    self._installchg()
46754
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  3604
                if self.options.rhg:
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  3605
                    assert self._installdir
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  3606
                    self._installrhg()
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3607
                elif self.options.pyoxidized:
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  3608
                    self._build_pyoxidized()
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3609
                self._use_correct_mercurial()
49497
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49496
diff changeset
  3610
                install_end_time = time.monotonic()
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49496
diff changeset
  3611
                if self._installdir:
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49496
diff changeset
  3612
                    msg = 'installed Mercurial in %.2f seconds'
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49496
diff changeset
  3613
                    msg %= install_end_time - install_start_time
1baf0fffd82f run-tests: display the time it took to install Mercurial
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49496
diff changeset
  3614
                    log(msg)
32703
9d1d3199382e run-tests: install hg after computing tests to run
Siddharth Agarwal <sid0@fb.com>
parents: 32702
diff changeset
  3615
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3616
                log(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3617
                    'running %d tests using %d parallel processes'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3618
                    % (num_tests, jobs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3619
                )
40244
1039404c5e1d run-tests: print number of tests and parallel process count
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39909
diff changeset
  3620
32704
1270b00a385d run-tests: add a way to list tests, with JSON and XUnit support
Siddharth Agarwal <sid0@fb.com>
parents: 32703
diff changeset
  3621
                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
  3622
42386
15d5a2de44aa tests: make run-tests exit non-zero if there are "errors"
Kyle Lippincott <spectral@google.com>
parents: 41804
diff changeset
  3623
            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
  3624
                failed = True
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3625
38617
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  3626
            result.onEnd()
948691ea92a9 run-tests: extract onStart and onEnd into the test result
Boris Feld <boris.feld@octobus.net>
parents: 38616
diff changeset
  3627
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3628
            if self.options.anycoverage:
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
  3629
                self._outputcoverage()
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3630
        except KeyboardInterrupt:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3631
            failed = True
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
  3632
            print("\ninterrupted!")
21360
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3633
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3634
        if failed:
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3635
            return 1
becce297ae0c run-tests: move runtests() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21359
diff changeset
  3636
45408
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3637
    def _geterrpath(self, test):
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3638
        # test['path'] is a relative path
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3639
        if 'case' in test:
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3640
            # for multiple dimensions test cases
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3641
            casestr = b'#'.join(test['case'])
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3642
            errpath = b'%s#%s.err' % (test['path'], casestr)
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3643
        else:
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3644
            errpath = b'%s.err' % test['path']
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3645
        if self.options.outputdir:
45442
c6e332a451d0 py3: fix bytes and str mixup in run-tests
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45408
diff changeset
  3646
            self._outputdir = canonpath(_sys2bytes(self.options.outputdir))
c6e332a451d0 py3: fix bytes and str mixup in run-tests
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45408
diff changeset
  3647
            errpath = os.path.join(self._outputdir, errpath)
45408
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3648
        return errpath
543e446204c6 run-tests: extract logic to get errpath in a utility func
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 45407
diff changeset
  3649
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
  3650
    def _getport(self, count):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3651
        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
  3652
        if port is None:
52311
d49144a1422f run-tests: refactor the HGPORT handling code to use a constant for the max val
Matt Harbison <matt_harbison@yahoo.com>
parents: 52284
diff changeset
  3653
            portneeded = HGPORT_COUNT
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
  3654
            # above 100 tries we just give up and let test reports failure
49285
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49244
diff changeset
  3655
            for tries in range(100):
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
  3656
                allfree = True
27602
67aa88e00fc7 run-tests: fix get port to try differing ports
timeless <timeless@mozdev.org>
parents: 27567
diff changeset
  3657
                port = self.options.port + self._portoffset
49285
56f98406831b py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents: 49244
diff changeset
  3658
                for idx in range(portneeded):
24967
00790cc2b753 run-test: ensure the test ports are available before launching test
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24965
diff changeset
  3659
                    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
  3660
                        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
  3661
                        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
  3662
                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
  3663
                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
  3664
                    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
  3665
            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
  3666
        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
  3667
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3668
    def _gettest(self, testdesc, count):
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3669
        """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
  3670
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3671
        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
  3672
        map to a known type.
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3673
        """
32311
a77a75a428f7 run-tests: rename test description dict to testdesc
Jun Wu <quark@fb.com>
parents: 32310
diff changeset
  3674
        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
  3675
        lctest = path.lower()
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3676
        testcls = Test
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3677
21501
98a0c58ee200 run-tests: factor refpath into Test classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21500
diff changeset
  3678
        for ext, cls in self.TESTTYPES:
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3679
            if lctest.endswith(ext):
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3680
                testcls = cls
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3681
                break
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3682
40487
78e5b9d815fa test: fix self._testdir to use the right mercurial library during testing
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 40479
diff changeset
  3683
        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
  3684
        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
  3685
32316
7340465bd788 run-tests: support multiple cases in .t test
Jun Wu <quark@fb.com>
parents: 32311
diff changeset
  3686
        # 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
  3687
        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
  3688
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3689
        t = testcls(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3690
            refpath,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3691
            self._outputdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3692
            tmpdir,
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3693
            python=self._python,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3694
            keeptmpdir=self.options.keep_tmpdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3695
            debug=self.options.debug,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3696
            first=self.options.first,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3697
            timeout=self.options.timeout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3698
            startport=self._getport(count),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3699
            extraconfigopts=self.options.extra_config_opt,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3700
            shell=self.options.shell,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3701
            hgcommand=self._hgcommand,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3702
            usechg=bool(self.options.with_chg or self.options.chg),
44615
78a8f65eacc8 run-tests: add --chg-debug flag to show chg debug output
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44577
diff changeset
  3703
            chgdebug=self.options.chg_debug,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3704
            useipv6=useipv6,
51989
daeb85ebee48 run-test: add regular line break and test count in the dot output
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51959
diff changeset
  3705
            **kwds,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3706
        )
24330
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
  3707
        t.should_reload = True
799bc18e14d1 run-tests: avoid running the same test instance concurrently
Augie Fackler <augie@google.com>
parents: 24329
diff changeset
  3708
        return t
21357
4c4f64b8df3c run-tests: move gettest() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21356
diff changeset
  3709
21366
5047248536c5 run-tests: establish TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21365
diff changeset
  3710
    def _cleanup(self):
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3711
        """Clean up state from this test invocation."""
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3712
        if self.options.keep_tmpdir:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3713
            return
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3714
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  3715
        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
  3716
        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
  3717
        for f in self._createdfiles:
21350
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3718
            try:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3719
                os.remove(f)
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3720
            except OSError:
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3721
                pass
dfcef61f5bd4 run-tests: move cleanup() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21349
diff changeset
  3722
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
  3723
    def _usecorrectpython(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  3724
        """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
  3725
        # Tests must use the same interpreter as us or bad things will happen.
52591
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3726
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3727
        # install dir != None means we did install mercurial within a temporary
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3728
        # virtual env and do need to make sure the right python will be in
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3729
        # front of the PATH. Except for Windows who lack a `python3` executable
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3730
        # in this case.
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3731
        if self._installdir is None:
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3732
            pyexe_names = [b'python', b'python3']
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3733
        elif WINDOWS:
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3734
            pyexe_names = [b'python3']
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3735
        else:
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3736
            return
39647
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39646
diff changeset
  3737
543a788eea2d py3: allow run-tests.py to run on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39646
diff changeset
  3738
        # 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
  3739
        # Administrator rights.
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3740
        if not WINDOWS and getattr(os, 'symlink', None):
47494
81d70de39c7e run-tests: unroll a non-so-one-liner
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47312
diff changeset
  3741
            msg = "# Making python executable in test path a symlink to '%s'"
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3742
            msg %= self._python
47494
81d70de39c7e run-tests: unroll a non-so-one-liner
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47312
diff changeset
  3743
            vlog(msg)
47500
23f5ed6dbcb1 run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47498
diff changeset
  3744
            for pyexename in pyexe_names:
47575
27fb9f32e1a3 run-tests: always define a custom-bin directory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47574
diff changeset
  3745
                mypython = os.path.join(self._custom_bin_dir, pyexename)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
  3746
                try:
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3747
                    if os.readlink(mypython) == self._python:
47498
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47497
diff changeset
  3748
                        continue
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47497
diff changeset
  3749
                    os.unlink(mypython)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  3750
                except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  3751
                    pass
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3752
                if self._findprogram(pyexename) != self._python:
47498
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47497
diff changeset
  3753
                    try:
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3754
                        os.symlink(self._python, mypython)
47498
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47497
diff changeset
  3755
                        self._createdfiles.append(mypython)
49305
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  3756
                    except FileExistsError:
47498
9d929f9cb9b4 run-tests: avoid an early return
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47497
diff changeset
  3757
                        # child processes may race, which is harmless
49305
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  3758
                        pass
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3759
        elif WINDOWS and not os.getenv('MSYSTEM'):
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3760
            raise AssertionError('cannot run test on Windows without MSYSTEM')
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
  3761
        else:
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3762
            # Generate explicit file instead of symlink
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3763
            #
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3764
            # This is especially important as Windows doesn't have
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3765
            # `python3.exe`, and MSYS cannot understand the reparse point with
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3766
            # that name provided by Microsoft.  Create a simple script on PATH
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3767
            # with that name that delegates to the py3 launcher so the shebang
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3768
            # lines work.
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3769
            esc_executable = _sys2bytes(shellquote(self._python))
47500
23f5ed6dbcb1 run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47498
diff changeset
  3770
            for pyexename in pyexe_names:
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3771
                stub_exec_path = os.path.join(self._custom_bin_dir, pyexename)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3772
                with open(stub_exec_path, 'wb') as f:
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3773
                    f.write(b'#!/bin/sh\n')
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3774
                    f.write(b'%s "$@"\n' % esc_executable)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3775
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3776
            if WINDOWS:
52226
7a568296296e windows: simply rely on the PATH adjustment to find python.exe in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52211
diff changeset
  3777
                # adjust the path to make sur the main python finds itself and
7a568296296e windows: simply rely on the PATH adjustment to find python.exe in tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52211
diff changeset
  3778
                # its own dll
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3779
                path = os.environ['PATH'].split(os.pathsep)
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  3780
                main_exec_dir = os.path.dirname(self._python)
47639
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3781
                extra_paths = [_bytes2sys(self._custom_bin_dir), main_exec_dir]
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3782
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3783
                # Binaries installed by pip into the user area like pylint.exe may
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3784
                # not be in PATH by default.
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3785
                appdata = os.environ.get('APPDATA')
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3786
                vi = sys.version_info
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3787
                if appdata is not None:
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3788
                    python_dir = 'Python%d%d' % (vi[0], vi[1])
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3789
                    scripts_path = [appdata, 'Python', python_dir, 'Scripts']
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3790
                    scripts_dir = os.path.join(*scripts_path)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3791
                    extra_paths.append(scripts_dir)
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3792
e1130abae834 run-test: rework the redirection script for python on windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47638
diff changeset
  3793
                os.environ['PATH'] = os.pathsep.join(extra_paths + path)
21351
fe5647506565 run-tests: move usecorrectpython() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21350
diff changeset
  3794
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3795
    def _use_correct_mercurial(self):
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3796
        target_exec = os.path.join(self._custom_bin_dir, b'hg')
52591
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3797
        # hgcommand is ≠ hg in case like `rhg` and `chg` or with windows .exe's
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3798
        if self._hgcommand != b'hg':
52588
9b5e058a7fb9 run-tests: use shutil.which now that we can
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52587
diff changeset
  3799
            real_exec = shutil.which(self._hgcommand)
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3800
            if real_exec is None:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3801
                raise ValueError('could not find exec path for "%s"', real_exec)
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3802
            if real_exec == target_exec:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3803
                # do not overwrite something with itself
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3804
                return
52591
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3805
            if os.path.exists(target_exec):
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3806
                # there is already something at the destination. Let's not
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3807
                # overwrite it.
69b64f8da6cd run-tests: lean more on the virtual env binary when we use one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52590
diff changeset
  3808
                return
47588
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3809
            if WINDOWS:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3810
                with open(target_exec, 'wb') as f:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3811
                    f.write(b'#!/bin/sh\n')
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3812
                    escaped_exec = shellquote(_bytes2sys(real_exec))
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3813
                    f.write(b'%s "$@"\n' % _sys2bytes(escaped_exec))
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3814
            else:
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3815
                os.symlink(real_exec, target_exec)
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3816
            self._createdfiles.append(target_exec)
eb611ecb435c run-tests: rely on an actual executable in PATH instead of alias for `hg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47586
diff changeset
  3817
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3818
    def _install_hg_cmd_wheel(self):
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3819
        wheel_path = self.options.wheel
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3820
        assert wheel_path
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3821
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3822
        script = _sys2bytes(os.path.realpath(sys.argv[0]))
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3823
        hgroot = os.path.dirname(os.path.dirname(script))
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3824
        self._hgroot = hgroot
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3825
        os.chdir(hgroot)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3826
        cmd = [
52590
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52589
diff changeset
  3827
            self._pythonb,
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3828
            b"-m",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3829
            b"pip",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3830
            b"install",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3831
            wheel_path,
52325
a782fb584b29 run-tests: disable caching of the wheels when installing test Mercurial
Matt Harbison <matt_harbison@yahoo.com>
parents: 52228
diff changeset
  3832
            b"--no-cache-dir",
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3833
            b"--force",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3834
            b"--ignore-installed",
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3835
        ]
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3836
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3837
        return cmd
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3838
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3839
    def _install_hg_cmd_setup(self):
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3840
        # Run installer in hg root
44488
0d9ad84a28d9 run-tests: rename "pure" variable to setup_opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44470
diff changeset
  3841
        setup_opts = b""
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents: 24075
diff changeset
  3842
        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
  3843
            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
  3844
        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
  3845
            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
  3846
        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
  3847
            setup_opts = b"--no-rust"
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3848
48862
2336e79a119c tests: remove Python 3 conditionalizing from variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48861
diff changeset
  3849
        script = _sys2bytes(os.path.realpath(sys.argv[0]))
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3850
        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
  3851
        self._hgroot = hgroot
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3852
        os.chdir(hgroot)
52143
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3853
        cmd = [
52590
c7674da2f7ea run-tests: use the venv python as the main python
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52589
diff changeset
  3854
            self._pythonb,
52143
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3855
            b"setup.py",
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3856
        ]
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3857
        if setup_opts:
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3858
            cmd.append(setup_opts)
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3859
        cmd.extend(
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3860
            [
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3861
                b"clean",
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3862
                b"--all",
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3863
                b"build",
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3864
            ]
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3865
        )
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3866
        cmd.extend(
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3867
            [
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3868
                b"--build-base=%s" % os.path.join(self._hgtmp, b"build"),
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3869
                b"install",
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3870
                b"--force",
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3871
            ]
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3872
        )
24075
4bf484276787 run-tests: ensure install directories exist
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24074
diff changeset
  3873
52144
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3874
        return cmd
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3875
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3876
    def _installhg(self):
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3877
        """Install hg into the test environment.
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3878
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3879
        This will also configure hg with the appropriate testing settings.
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3880
        """
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3881
        vlog("# Performing temporary installation of HG")
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3882
        install_env = original_env.copy()
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3883
        if self.options.wheel is None:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3884
            cmd = self._install_hg_cmd_setup()
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3885
        else:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3886
            cmd = self._install_hg_cmd_wheel()
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3887
            install_env["PYTHONUSERBASE"] = _bytes2sys(self._installdir)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3888
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3889
        installerrs = os.path.join(self._hgtmp, b"install.err")
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3890
        if self.options.pure:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3891
            install_env.pop('HGWITHRUSTEXT', None)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3892
        elif self.options.no_rust:
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3893
            install_env.pop('HGWITHRUSTEXT', None)
1dbbb957bbe6 run-tests: add a --hg-wheel options to test a pre-built wheel
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52143
diff changeset
  3894
52143
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3895
        vlog("# Running", cmd)
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3896
        with open(installerrs, "wb") as logfile:
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3897
            r = subprocess.call(
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3898
                cmd,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3899
                env=install_env,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3900
                stdout=logfile,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3901
                stderr=subprocess.STDOUT,
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3902
            )
6f7cc970bfda run-tests: don't use shell call for subprocess
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52004
diff changeset
  3903
        if r == 0:
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3904
            if not self.options.verbose:
26087
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
  3905
                try:
06cd67a5044f run-tests: ignore failed removal of nonexistent installerrs
Augie Fackler <augie@google.com>
parents: 25730
diff changeset
  3906
                    os.remove(installerrs)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  3907
                except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
  3908
                    pass
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3909
        else:
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  3910
            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
  3911
                for line in f:
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  3912
                    sys.stdout.buffer.write(line)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3913
            sys.exit(1)
21534
3ece55d16044 run-tests: make attributes of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21533
diff changeset
  3914
        os.chdir(self._testdir)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3915
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
  3916
        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
  3917
        if os.path.isfile(hgbat):
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3918
            # 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
  3919
            # 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
  3920
            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
  3921
                data = f.read()
41540
17a6e063c886 run-tests: use raw strings for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41495
diff changeset
  3922
            if br'"%~dp0..\python" "%~dp0hg" %*' in data:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3923
                data = data.replace(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3924
                    br'"%~dp0..\python" "%~dp0hg" %*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3925
                    b'"%~dp0python" "%~dp0hg" %*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3926
                )
35450
e31773898197 run-tests: use context managers for file descriptors
Matt Harbison <matt_harbison@yahoo.com>
parents: 35449
diff changeset
  3927
                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
  3928
                    f.write(data)
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3929
            else:
25031
0adc22a0b6b3 python3: update killdaemons and run-tests print and exception syntax
Augie Fackler <augie@google.com>
parents: 24984
diff changeset
  3930
                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
  3931
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3932
        if self.options.anycoverage:
52593
eef540baab65 run-tests: handle RUNTESTDIR earlier and in a more unified way
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52592
diff changeset
  3933
            custom = os.path.join(RUNTEST_DIR, b'sitecustomize.py')
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
  3934
            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
  3935
            vlog('# Installing coverage trigger to %s' % target)
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3936
            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
  3937
            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
  3938
            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
  3939
            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
  3940
            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
  3941
            try:
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
  3942
                os.mkdir(covdir)
49305
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  3943
            except FileExistsError:
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 49285
diff changeset
  3944
                pass
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
  3945
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
  3946
            osenvironb[b'COVERAGE_DIR'] = covdir
21353
a42a5195a182 run-tests: move installhg() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21352
diff changeset
  3947
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3948
    def _check_hg(self, verb):
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
  3949
        """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
  3950
        the one we expect it to be.  If not, print a warning to stderr."""
47574
2b2f5cf979c3 run-tests: explicitly track that `pythondir` was inferred
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47573
diff changeset
  3951
        if self._pythondir_inferred:
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23077
diff changeset
  3952
            # 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
  3953
            # 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
  3954
            return
25044
9de94acfde8a run-tests: fix installation of hg by bytesifying more constants
Augie Fackler <augie@google.com>
parents: 25042
diff changeset
  3955
        expecthg = os.path.join(self._pythondir, b'mercurial')
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3956
        actual_bin_hg = self._get_hg_bin_path()
52515
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  3957
        actual_py_hg = self._get_hg_py_path()
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3958
        if actual_bin_hg != actual_py_hg:
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3959
            msg = (
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3960
                b'fatal: "python" and "hg" disagree about mercurial lib path:\n'
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3961
                b'  hg: %s:\n'
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3962
                b'  py: %s:\n'
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3963
            )
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3964
            msg %= (actual_bin_hg, actual_py_hg)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3965
            msg = colorize(msg.decode(), "red", self.options.color)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3966
            sys.stderr.write(msg)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  3967
            sys.exit(2)
52515
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  3968
        if os.path.abspath(actual_py_hg) != os.path.abspath(expecthg):
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  3969
            msg = (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3970
                'warning: %s with unexpected mercurial lib: %s\n'
52515
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  3971
                '         (expected %s)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  3972
            )
52515
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  3973
            msg %= (verb, actual_py_hg.decode(), expecthg.decode())
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  3974
            msg = colorize(msg, "yellow", self.options.color)
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  3975
            sys.stderr.write(msg)
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3976
        policy = self._get_hg_module_policy()
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3977
        msg = b"fatal: mercurial binary has unexpected flavor for %s: %s\n"
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3978
        err = None
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3979
        if self.options.pure and policy != b"py":
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3980
            err = msg % (b"--pure", policy)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3981
        elif self.options.rust and b"rust" not in policy:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3982
            err = msg % (b"--rust", policy)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3983
        elif self.options.no_rust and b"rust" in policy:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3984
            err = msg % (b"--no-rust", policy)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3985
        if err is not None:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3986
            err = colorize(err.decode(), "red", self.options.color)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3987
            sys.stderr.write(err)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3988
            sys.exit(3)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3989
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3990
    def _get_hg_module_policy(self):
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3991
        """return the module policy as seen by the "hg" binary"""
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3992
        cmd = [
52538
8adfaa5ad484 run-tests: align call argument on string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52537
diff changeset
  3993
            _bytes2sys(self._real_hg),
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3994
            "debuginstall",
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3995
            "--template",
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3996
            "{hgmodulepolicy}",
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3997
        ]
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  3998
        p = subprocess.Popen(
52539
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52538
diff changeset
  3999
            " ".join(cmd),
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4000
            stdout=subprocess.PIPE,
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4001
            stderr=subprocess.PIPE,
52539
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52538
diff changeset
  4002
            shell=True,
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4003
        )
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4004
        out, err = p.communicate()
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4005
        if p.returncode != 0:
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4006
            msg = "fatal: fetching module policy from `hg` failed:\n"
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4007
            msg = colorize(msg, "red", self.options.color)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4008
            sys.stderr.write(msg)
52537
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52516
diff changeset
  4009
            cmd_err = colorize(err.decode(), "magenta", self.options.color)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52516
diff changeset
  4010
            sys.stderr.write(cmd_err)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52516
diff changeset
  4011
            cmd_err = colorize(out.decode(), "yellow", self.options.color)
52514
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4012
            sys.stderr.write(cmd_err)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4013
            sys.exit(4)
824877fd613b run-tests: check that the mercurial we run with respect the flavor flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52513
diff changeset
  4014
        return out
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4015
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4016
    def _get_hg_bin_path(self):
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4017
        """return the path to the mercurial lib according to the "hg" binary"""
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4018
        cmd = [
52538
8adfaa5ad484 run-tests: align call argument on string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52537
diff changeset
  4019
            _bytes2sys(self._real_hg),
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4020
            "debuginstall",
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4021
            "--template",
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4022
            "{hgmodules}",
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4023
        ]
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4024
        p = subprocess.Popen(
52539
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52538
diff changeset
  4025
            " ".join(cmd),
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4026
            stdout=subprocess.PIPE,
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4027
            stderr=subprocess.PIPE,
52539
4f2bbad82e4b run-tests: call the command using shell=True to please Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52538
diff changeset
  4028
            shell=True,
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4029
        )
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4030
        out, err = p.communicate()
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4031
        if p.returncode != 0:
52537
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52516
diff changeset
  4032
            msg = f"fatal: fetching library from `hg` failed with {p.returncode}:\n"
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4033
            msg = colorize(msg, "red", self.options.color)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4034
            sys.stderr.write(msg)
52537
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52516
diff changeset
  4035
            cmd_err = colorize(err.decode(), "magenta", self.options.color)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52516
diff changeset
  4036
            sys.stderr.write(cmd_err)
3b63f90f351c run-tests: provide more information when calling hg fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52516
diff changeset
  4037
            cmd_err = colorize(out.decode(), "yellow", self.options.color)
52516
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4038
            sys.stderr.write(cmd_err)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4039
            sys.exit(4)
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4040
        return out
20690cff1bd8 run-test: check that the "hg" binary and "python" agree on mercurial path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52515
diff changeset
  4041
52515
d63ab79ed01d run-tests: small rework of the infamous lib warning to colorize it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52514
diff changeset
  4042
    def _get_hg_py_path(self):
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
  4043
        """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
  4044
        the current Python interpreter."""
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
  4045
        if self._hgpath is not None:
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
  4046
            return self._hgpath
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
  4047
52313
0b708a375490 tests: use PYTHONSAFEPATH (-P) to check mercurial lib path
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52311
diff changeset
  4048
        # PYTHONSAFEPATH (-P) new in 3.11
0b708a375490 tests: use PYTHONSAFEPATH (-P) to check mercurial lib path
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52311
diff changeset
  4049
        if sys.version_info >= (3, 11, 0):
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  4050
            python_safe_path = "-P "
52313
0b708a375490 tests: use PYTHONSAFEPATH (-P) to check mercurial lib path
paugier <pierre.augier@univ-grenoble-alpes.fr>
parents: 52311
diff changeset
  4051
        else:
52589
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  4052
            python_safe_path = ""
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  4053
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  4054
        cmd = '"%s" %s-c "import mercurial; print (mercurial.__path__[0])"'
484a4d5d360e run-tests: no longer rely on global variable for python path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52588
diff changeset
  4055
        cmd %= (self._python, python_safe_path)
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
  4056
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
  4057
        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
  4058
        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
  4059
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
  4060
        self._hgpath = out.strip()
21385
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
  4061
28414e5ac9ec run-tests: move _gethgpath() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21384
diff changeset
  4062
        return self._hgpath
21354
29629ef43d39 run-tests: move checkhglib into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21353
diff changeset
  4063
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
  4064
    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
  4065
        """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
  4066
        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
  4067
        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
  4068
        assert self._hgroot, 'must be called after _installhg()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4069
        cmd = b'"%(make)s" clean install PREFIX="%(prefix)s"' % {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4070
            b'make': b'make',  # TODO: switch by option or environment?
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4071
            b'prefix': self._installdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4072
        }
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
  4073
        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
  4074
        vlog("# Running", cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4075
        proc = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4076
            cmd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4077
            shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4078
            cwd=cwd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4079
            stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4080
            stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4081
            stderr=subprocess.STDOUT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4082
        )
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
  4083
        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
  4084
        if proc.returncode != 0:
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  4085
            sys.stdout.buffer.write(out)
28143
c754996fd41f run-tests: add --chg option to install and run tests using chg
Yuya Nishihara <yuya@tcha.org>
parents: 28142
diff changeset
  4086
            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
  4087
46754
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4088
    def _installrhg(self):
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4089
        """Install rhg into the test environment"""
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4090
        vlog('# Performing temporary installation of rhg')
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4091
        assert os.path.dirname(self._bindir) == self._installdir
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4092
        assert self._hgroot, 'must be called after _installhg()'
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4093
        cmd = b'"%(make)s" install-rhg PREFIX="%(prefix)s"' % {
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4094
            b'make': b'make',  # TODO: switch by option or environment?
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4095
            b'prefix': self._installdir,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4096
        }
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4097
        cwd = self._hgroot
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4098
        vlog("# Running", cmd)
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4099
        proc = subprocess.Popen(
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4100
            cmd,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4101
            shell=True,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4102
            cwd=cwd,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4103
            stdin=subprocess.PIPE,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4104
            stdout=subprocess.PIPE,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4105
            stderr=subprocess.STDOUT,
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4106
        )
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4107
        out, _err = proc.communicate()
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4108
        if proc.returncode != 0:
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  4109
            sys.stdout.buffer.write(out)
46754
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4110
            sys.exit(1)
9ba00a9dc6ea run-test: install rhg if --rhg is passed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46724
diff changeset
  4111
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4112
    def _build_pyoxidized(self):
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4113
        """build a pyoxidized version of mercurial into the test environment
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4114
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4115
        Ideally this function would be `install_pyoxidier` and would both build
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4116
        and install pyoxidier. However we are starting small to get pyoxidizer
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4117
        build binary to testing quickly.
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4118
        """
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4119
        vlog('# build a pyoxidized version of Mercurial')
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4120
        assert os.path.dirname(self._bindir) == self._installdir
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4121
        assert self._hgroot, 'must be called after _installhg()'
49832
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4122
        target = b''
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4123
        if WINDOWS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4124
            target = b'windows'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4125
        elif MACOS:
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4126
            target = b'macos'
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4127
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4128
        cmd = b'"%(make)s" pyoxidizer-%(platform)s-tests' % {
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4129
            b'make': b'make',
49832
9a4c76cc8fe6 run-tests: support --pyoxidized on macOS
Matt Harbison <matt_harbison@yahoo.com>
parents: 49497
diff changeset
  4130
            b'platform': target,
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4131
        }
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4132
        cwd = self._hgroot
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4133
        vlog("# Running", cmd)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4134
        proc = subprocess.Popen(
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4135
            _bytes2sys(cmd),
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4136
            shell=True,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4137
            cwd=_bytes2sys(cwd),
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4138
            stdin=subprocess.PIPE,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4139
            stdout=subprocess.PIPE,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4140
            stderr=subprocess.STDOUT,
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4141
        )
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4142
        out, _err = proc.communicate()
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4143
        if proc.returncode != 0:
48857
41c552a20716 tests: collapse some more trivial if PYTHON3 blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48856
diff changeset
  4144
            sys.stdout.buffer.write(out)
47826
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4145
            sys.exit(1)
83235fb50e1c run-tests: introduce a --pyoxidized option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47776
diff changeset
  4146
49833
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4147
        cmd = _bytes2sys(b"%s debuginstall -Tjson" % self._hgcommand)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4148
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4149
        out, err = p.communicate()
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4150
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4151
        props = json.loads(out)[0]
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4152
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4153
        # Affects hghave.py
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4154
        osenvironb.pop(b'PYOXIDIZED_IN_MEMORY_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4155
        osenvironb.pop(b'PYOXIDIZED_FILESYSTEM_RSRC', None)
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4156
        if props["hgmodules"] == props["pythonexe"]:
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4157
            osenvironb[b'PYOXIDIZED_IN_MEMORY_RSRC'] = b'1'
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4158
        else:
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4159
            osenvironb[b'PYOXIDIZED_FILESYSTEM_RSRC'] = b'1'
a2356e15200a hghave: add predicates for embedded and filesystem pyoxidizer resources
Matt Harbison <matt_harbison@yahoo.com>
parents: 49832
diff changeset
  4160
21378
f7ac3c63d844 run-tests: make some methods of TestRunner internal
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21377
diff changeset
  4161
    def _outputcoverage(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  4162
        """Produce code coverage output."""
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
  4163
        import coverage
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4164
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29282
diff changeset
  4165
        coverage = coverage.coverage
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
  4166
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
  4167
        vlog('# Producing coverage report')
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
  4168
        # 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
  4169
        # output.
24506
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
  4170
        os.chdir(self._hgroot)
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  4171
        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
  4172
        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
  4173
60bbb4079c28 run-tests: report code coverage from source directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24505
diff changeset
  4174
        # 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
  4175
        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
  4176
24505
031947baf4d0 run-tests: collect aggregate code coverage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24504
diff changeset
  4177
        cov.combine()
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
  4178
43283
96eb9ef777a8 run-tests: make code coverage work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
  4179
        omit = [
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  4180
            _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
  4181
            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
  4182
        ]
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
  4183
        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
  4184
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
  4185
        if self.options.htmlcov:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  4186
            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
  4187
            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
  4188
        if self.options.annotate:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  4189
            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
  4190
            if not os.path.isdir(adir):
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
  4191
                os.mkdir(adir)
24504
7046ecabd9a8 run-tests: obtain code coverage via Python API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24500
diff changeset
  4192
            cov.annotate(directory=adir, omit=omit)
21356
f96d7dfd8cb5 run-tests: move outputcoverage() into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21355
diff changeset
  4193
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4194
    def _findprogram(self, program):
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4195
        """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
  4196
        dpb = _sys2bytes(os.defpath)
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44447
diff changeset
  4197
        sepb = _sys2bytes(os.pathsep)
25038
66da89457c47 run-tests: fix _findprogram to reliably return bytes
Augie Fackler <augie@google.com>
parents: 25037
diff changeset
  4198
        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
  4199
            name = os.path.join(p, program)
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  4200
            if WINDOWS or os.access(name, os.X_OK):
45031
383005aa9cdc run-tests: find python binary on Python 3 (issue6361)
Axel Hecht <axel@pike.org>
parents: 45013
diff changeset
  4201
                return _bytes2sys(name)
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4202
        return None
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4203
21374
592b3d2616d7 run-tests: move checktools into TestRunner.run()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21373
diff changeset
  4204
    def _checktools(self):
21536
92a6b16c9186 run-tests: add docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21535
diff changeset
  4205
        """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
  4206
        for p in self.REQUIREDTOOLS:
47573
75b623801f6a run-tests: use a global WINDOWS constant instead of multiple tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47571
diff changeset
  4207
            if WINDOWS and not p.endswith(b'.exe'):
39589
4eb0f2452ad7 py3: add b'' to some run-tests.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39403
diff changeset
  4208
                p += b'.exe'
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4209
            found = self._findprogram(p)
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
  4210
            p = p.decode("utf-8")
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4211
            if found:
45031
383005aa9cdc run-tests: find python binary on Python 3 (issue6361)
Axel Hecht <axel@pike.org>
parents: 45013
diff changeset
  4212
                vlog("# Found prerequisite", p, "at", found)
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4213
            else:
43309
b4b1131187c4 py3: decode bytes before logging in run-tests.py
Denis Laxalde <denis@laxalde.org>
parents: 43283
diff changeset
  4214
                print("WARNING: Did not find prerequisite tool: %s " % p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4215
21365
10cf9054d941 run-tests: move program searching into TestRunner
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21364
diff changeset
  4216
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  4217
def aggregateexceptions(path):
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4218
    exceptioncounts = collections.Counter()
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4219
    testsbyfailure = collections.defaultdict(set)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4220
    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
  4221
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  4222
    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
  4223
        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
  4224
            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
  4225
            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
  4226
                continue
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  4227
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4228
            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
  4229
            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
  4230
            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
  4231
            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
  4232
            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
  4233
            testname = testname.decode('utf-8')
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4234
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4235
            key = (hgframe, hgline, exc)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4236
            exceptioncounts[key] += 1
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4237
            testsbyfailure[key].add(testname)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4238
            failuresbytest[testname].add(key)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4239
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4240
    # 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
  4241
    leastfailing = {}
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4242
    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
  4243
        fewesttest = None
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4244
        fewestcount = 99999999
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4245
        for test in sorted(tests):
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4246
            if len(failuresbytest[test]) < fewestcount:
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4247
                fewesttest = test
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4248
                fewestcount = len(failuresbytest[test])
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4249
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4250
        leastfailing[key] = (fewestcount, fewesttest)
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4251
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4252
    # 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
  4253
    # impacted tests.
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4254
    combined = {}
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4255
    for key in exceptioncounts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4256
        combined[key] = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4257
            exceptioncounts[key],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4258
            len(testsbyfailure[key]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4259
            leastfailing[key][0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4260
            leastfailing[key][1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4261
        )
36037
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4262
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4263
    return {
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4264
        'exceptioncounts': exceptioncounts,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4265
        'total': sum(exceptioncounts.values()),
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4266
        'combined': combined,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4267
        'leastfailing': leastfailing,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4268
        'byfailure': testsbyfailure,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4269
        'bytest': failuresbytest,
8de90e006c78 run-tests: report tests that exception occurred in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35991
diff changeset
  4270
    }
35190
bd8875b6473c run-tests: mechanism to report exceptions during test execution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35189
diff changeset
  4271
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4272
13347
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
  4273
if __name__ == '__main__':
47638
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4274
    if WINDOWS and not os.getenv('MSYSTEM'):
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4275
        print('cannot run test on Windows without MSYSTEM', file=sys.stderr)
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4276
        print(
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4277
            '(if you need to do so contact the mercurial devs: '
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4278
            'mercurial@mercurial-scm.org)',
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4279
            file=sys.stderr,
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4280
        )
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4281
        sys.exit(255)
55a715c36e3b run-test: act that we requires MSYS to run the test on Windows
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47619
diff changeset
  4282
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
  4283
    runner = TestRunner()
22120
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
  4284
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
  4285
    try:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
  4286
        import msvcrt
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43073
diff changeset
  4287
22120
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
  4288
        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
  4289
        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
  4290
        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
  4291
    except ImportError:
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
  4292
        pass
68a7ef4311ce run-tests: self-test on Windows needs binary streams
Matt Mackall <mpm@selenic.com>
parents: 21919
diff changeset
  4293
21377
71081f7f9e52 run-tests: eliminate main()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21376
diff changeset
  4294
    sys.exit(runner.run(sys.argv[1:]))