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