annotate tests/run-tests.py @ 5456:a58d415b272e

fix typo
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Thu, 11 Oct 2007 16:28:30 +0200
parents 557e4a916e12
children 8374f3f081f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
1 #!/usr/bin/env python
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
2 #
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
3 # run-tests.py - Run a set of tests on Mercurial
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
4 #
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
5 # Copyright 2006 Matt Mackall <mpm@selenic.com>
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
6 #
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
7 # This software may be used and distributed according to the terms
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
8 # of the GNU General Public License, incorporated herein by reference.
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
9
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
10 import difflib
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
11 import errno
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
12 import optparse
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
13 import os
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
14 import popen2
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
15 import re
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
16 import shutil
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
17 import signal
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
18 import sys
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
19 import tempfile
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
20 import time
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
21
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
22 # hghave reserved exit code to skip test
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
23 SKIPPED_STATUS = 80
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
24
4361
46280c004f22 change tests to use simplemerge by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4321
diff changeset
25 required_tools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"]
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
26
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
27 parser = optparse.OptionParser("%prog [options] [tests]")
5383
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
28 parser.add_option("-C", "--annotate", action="store_true",
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
29 help="output files annotated with coverage")
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
30 parser.add_option("--child", type="int",
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
31 help="run as child process, summary to given fd")
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
32 parser.add_option("-c", "--cover", action="store_true",
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
33 help="print a test coverage report")
5383
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
34 parser.add_option("-f", "--first", action="store_true",
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
35 help="exit on the first test failure")
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
36 parser.add_option("-i", "--interactive", action="store_true",
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
37 help="prompt to accept changed output")
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
38 parser.add_option("-j", "--jobs", type="int",
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
39 help="number of jobs to run in parallel")
5383
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
40 parser.add_option("-R", "--restart", action="store_true",
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
41 help="restart at last error")
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
42 parser.add_option("-p", "--port", type="int",
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
43 help="port on which servers should listen")
5383
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
44 parser.add_option("-r", "--retest", action="store_true",
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
45 help="retest failed tests")
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
46 parser.add_option("-s", "--cover_stdlib", action="store_true",
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
47 help="print a test coverage report inc. standard libraries")
5383
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
48 parser.add_option("-t", "--timeout", type="int",
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
49 help="kill errant tests after TIMEOUT seconds")
5388
557e4a916e12 run-tests.py: allow a different temporary directory to be specified
Bryan O'Sullivan <bos@serpentine.com>
parents: 5384
diff changeset
50 parser.add_option("--tmpdir", type="string",
557e4a916e12 run-tests.py: allow a different temporary directory to be specified
Bryan O'Sullivan <bos@serpentine.com>
parents: 5384
diff changeset
51 help="run tests in the given temporary directory")
5383
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
52 parser.add_option("-v", "--verbose", action="store_true",
7cdc896fdcd5 run-tests.py: reorder options alphabetically.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5265
diff changeset
53 help="output verbose messages")
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
54 parser.add_option("--with-hg", type="string",
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
55 help="test existing install at given location")
3306
642e5faf6bf0 run-tests: add --retest switch
Matt Mackall <mpm@selenic.com>
parents: 3215
diff changeset
56
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
57 parser.set_defaults(jobs=1, port=20059, timeout=180)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
58 (options, args) = parser.parse_args()
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
59 verbose = options.verbose
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
60 coverage = options.cover or options.cover_stdlib or options.annotate
4319
8ece1ba156c7 run-tests.py: use coverage.py with *.py tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4318
diff changeset
61 python = sys.executable
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
62
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
63 if options.jobs < 1:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
64 print >> sys.stderr, 'ERROR: -j/--jobs must be positive'
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
65 sys.exit(1)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
66 if options.interactive and options.jobs > 1:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
67 print >> sys.stderr, 'ERROR: cannot mix -interactive and --jobs > 1'
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
68 sys.exit(1)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
69
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
70 def vlog(*msg):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
71 if verbose:
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
72 for m in msg:
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
73 print m,
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
74 print
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
75
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
76 def splitnewlines(text):
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
77 '''like str.splitlines, but only split on newlines.
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
78 keep line endings.'''
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
79 i = 0
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
80 lines = []
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
81 while True:
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
82 n = text.find('\n', i)
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
83 if n == -1:
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
84 last = text[i:]
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
85 if last:
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
86 lines.append(last)
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
87 return lines
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
88 lines.append(text[i:n+1])
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
89 i = n + 1
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
90
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
91 def extract_missing_features(lines):
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
92 '''Extract missing/unknown features log lines as a list'''
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
93 missing = []
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
94 for line in lines:
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
95 if not line.startswith('hghave: '):
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
96 continue
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
97 line = line.splitlines()[0]
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
98 missing.append(line[8:])
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
99
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
100 return missing
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
101
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
102 def show_diff(expected, output):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
103 for line in difflib.unified_diff(expected, output,
2409
4068d6a7a99e Fix diff header (line endings) for failed test output in run-tests.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2408
diff changeset
104 "Expected output", "Test output"):
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
105 sys.stdout.write(line)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
106
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
107 def find_program(program):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
108 """Search PATH for a executable program"""
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
109 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
110 name = os.path.join(p, program)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
111 if os.access(name, os.X_OK):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
112 return name
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
113 return None
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
114
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
115 def check_required_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
116 # 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
117 # stuff from coreutils (cat, rm, etc) are not tested
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
118 for p in required_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
119 if os.name == 'nt':
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
120 p += '.exe'
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
121 found = find_program(p)
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
122 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
123 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
124 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
125 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
126
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
127 def cleanup_exit():
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
128 if verbose:
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
129 print "# Cleaning up HGTMP", HGTMP
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
130 shutil.rmtree(HGTMP, True)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
131
2569
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
132 def use_correct_python():
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
133 # 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
134 # interpreter we use or bad things will happen.
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
135 exedir, exename = os.path.split(sys.executable)
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
136 if exename == 'python':
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
137 path = find_program('python')
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
138 if os.path.dirname(path) == exedir:
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
139 return
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
140 vlog('# Making python executable in test path use correct Python')
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
141 my_python = os.path.join(BINDIR, 'python')
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
142 try:
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
143 os.symlink(sys.executable, my_python)
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
144 except AttributeError:
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
145 # windows fallback
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
146 shutil.copyfile(sys.executable, my_python)
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
147 shutil.copymode(sys.executable, my_python)
3215
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2975
diff changeset
148
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
149 def install_hg():
4319
8ece1ba156c7 run-tests.py: use coverage.py with *.py tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4318
diff changeset
150 global python
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
151 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
152 installerrs = os.path.join("tests", "install.err")
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
153
5264
b817d17c7ee5 Make run-tests.py work when invoked outside of tests.
Brendan Cully <brendan@kublai.com>
parents: 5247
diff changeset
154 # Run installer in hg root
b817d17c7ee5 Make run-tests.py work when invoked outside of tests.
Brendan Cully <brendan@kublai.com>
parents: 5247
diff changeset
155 os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '..'))
2183
a56fc34d6e23 Always clean the build directory before installing for running the tests.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2146
diff changeset
156 cmd = ('%s setup.py clean --all'
5194
1843098e665a run-tests.py: pass --install-scripts to setup.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5115
diff changeset
157 ' install --force --home="%s" --install-lib="%s"'
1843098e665a run-tests.py: pass --install-scripts to setup.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5115
diff changeset
158 ' --install-scripts="%s" >%s 2>&1'
1843098e665a run-tests.py: pass --install-scripts to setup.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5115
diff changeset
159 % (sys.executable, INST, PYTHONDIR, BINDIR, 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
160 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
161 if os.system(cmd) == 0:
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
162 if not verbose:
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
163 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
164 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
165 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
166 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
167 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
168 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
169 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
170 os.chdir(TESTDIR)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
171
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
172 os.environ["PATH"] = "%s%s%s" % (BINDIR, os.pathsep, os.environ["PATH"])
5247
90919a6f5c8f run-tests: append PYTHONPATH instead of overwriting it
Patrick Mezard <pmezard@gmail.com>
parents: 5194
diff changeset
173
5265
980da86fc66a Include . in PYTHONPATH (makes testing unbundled extensions easier)
Brendan Cully <brendan@kublai.com>
parents: 5264
diff changeset
174 pydir = os.pathsep.join([PYTHONDIR, TESTDIR])
5247
90919a6f5c8f run-tests: append PYTHONPATH instead of overwriting it
Patrick Mezard <pmezard@gmail.com>
parents: 5194
diff changeset
175 pythonpath = os.environ.get("PYTHONPATH")
90919a6f5c8f run-tests: append PYTHONPATH instead of overwriting it
Patrick Mezard <pmezard@gmail.com>
parents: 5194
diff changeset
176 if pythonpath:
5265
980da86fc66a Include . in PYTHONPATH (makes testing unbundled extensions easier)
Brendan Cully <brendan@kublai.com>
parents: 5264
diff changeset
177 pythonpath = pydir + os.pathsep + pythonpath
5247
90919a6f5c8f run-tests: append PYTHONPATH instead of overwriting it
Patrick Mezard <pmezard@gmail.com>
parents: 5194
diff changeset
178 else:
5265
980da86fc66a Include . in PYTHONPATH (makes testing unbundled extensions easier)
Brendan Cully <brendan@kublai.com>
parents: 5264
diff changeset
179 pythonpath = pydir
5247
90919a6f5c8f run-tests: append PYTHONPATH instead of overwriting it
Patrick Mezard <pmezard@gmail.com>
parents: 5194
diff changeset
180 os.environ["PYTHONPATH"] = pythonpath
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
181
2569
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
182 use_correct_python()
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
183
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
184 if coverage:
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
185 vlog("# Installing coverage wrapper")
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
186 os.environ['COVERAGE_FILE'] = COVERAGE_FILE
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
187 if os.path.exists(COVERAGE_FILE):
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
188 os.unlink(COVERAGE_FILE)
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
189 # Create a wrapper script to invoke hg via coverage.py
2146
eb1ed410aa34 run-tests.py: remove trailing white space
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2145
diff changeset
190 os.rename(os.path.join(BINDIR, "hg"), os.path.join(BINDIR, "_hg.py"))
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
191 f = open(os.path.join(BINDIR, 'hg'), 'w')
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
192 f.write('#!' + sys.executable + '\n')
4633
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4529
diff changeset
193 f.write('import sys, os; os.execv(sys.executable, [sys.executable, '
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4529
diff changeset
194 '"%s", "-x", "%s"] + sys.argv[1:])\n' %
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4529
diff changeset
195 (os.path.join(TESTDIR, 'coverage.py'),
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4529
diff changeset
196 os.path.join(BINDIR, '_hg.py')))
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
197 f.close()
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
198 os.chmod(os.path.join(BINDIR, 'hg'), 0700)
4319
8ece1ba156c7 run-tests.py: use coverage.py with *.py tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4318
diff changeset
199 python = '"%s" "%s" -x' % (sys.executable,
8ece1ba156c7 run-tests.py: use coverage.py with *.py tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4318
diff changeset
200 os.path.join(TESTDIR,'coverage.py'))
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
201
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
202 def output_coverage():
2145
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
203 vlog("# Producing coverage report")
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
204 omit = [BINDIR, TESTDIR, PYTHONDIR]
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
205 if not options.cover_stdlib:
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
206 # Exclude as system paths (ignoring empty strings seen on win)
2146
eb1ed410aa34 run-tests.py: remove trailing white space
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2145
diff changeset
207 omit += [x for x in sys.path if x != '']
2145
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
208 omit = ','.join(omit)
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
209 os.chdir(PYTHONDIR)
4318
b95a42114616 run-tests.py: tell coverage.py to ignore errors
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3777
diff changeset
210 cmd = '"%s" "%s" -i -r "--omit=%s"' % (
2145
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
211 sys.executable, os.path.join(TESTDIR, 'coverage.py'), omit)
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
212 vlog("# Running: "+cmd)
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
213 os.system(cmd)
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
214 if options.annotate:
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
215 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
216 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
217 os.mkdir(adir)
4318
b95a42114616 run-tests.py: tell coverage.py to ignore errors
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3777
diff changeset
218 cmd = '"%s" "%s" -i -a "--directory=%s" "--omit=%s"' % (
2145
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
219 sys.executable, os.path.join(TESTDIR, 'coverage.py'),
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
220 adir, 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
221 vlog("# Running: "+cmd)
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
222 os.system(cmd)
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
223
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
224 class Timeout(Exception):
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
225 pass
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
226
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
227 def alarmed(signum, frame):
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
228 raise Timeout
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
229
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
230 def run(cmd):
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
231 """Run command in a sub-process, capturing the output (stdout and stderr).
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
232 Return the exist code, and output."""
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
233 # TODO: Use subprocess.Popen if we're running on Python 2.4
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
234 if os.name == 'nt':
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
235 tochild, fromchild = os.popen4(cmd)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
236 tochild.close()
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
237 output = fromchild.read()
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
238 ret = fromchild.close()
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
239 if ret == None:
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
240 ret = 0
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
241 else:
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
242 proc = popen2.Popen4(cmd)
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
243 try:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
244 output = ''
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
245 proc.tochild.close()
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
246 output = proc.fromchild.read()
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
247 ret = proc.wait()
4880
6403f948bd6b run-tests: extract correct status when script terminates with exit
Patrick Mezard <pmezard@gmail.com>
parents: 4633
diff changeset
248 if os.WIFEXITED(ret):
6403f948bd6b run-tests: extract correct status when script terminates with exit
Patrick Mezard <pmezard@gmail.com>
parents: 4633
diff changeset
249 ret = os.WEXITSTATUS(ret)
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
250 except Timeout:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
251 vlog('# Process %d timed out - killing it' % proc.pid)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
252 os.kill(proc.pid, signal.SIGTERM)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
253 ret = proc.wait()
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
254 if ret == 0:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
255 ret = signal.SIGTERM << 8
5095
d27ed83289ee Add message to test output if a test is aborted due to a timeout.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4881
diff changeset
256 output += ("\n### Abort: timeout after %d seconds.\n"
d27ed83289ee Add message to test output if a test is aborted due to a timeout.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4881
diff changeset
257 % options.timeout)
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
258 return ret, splitnewlines(output)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
259
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
260 def run_one(test):
2709
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
261 '''tristate output:
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
262 None -> skipped
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
263 True -> passed
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
264 False -> failed'''
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
265
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
266 vlog("# Test", test)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
267 if not verbose:
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
268 sys.stdout.write('.')
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
269 sys.stdout.flush()
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
270
2975
3091b1153e2c Clear contents of global hgrc for tests before running each test.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2709
diff changeset
271 # create a fresh hgrc
3091b1153e2c Clear contents of global hgrc for tests before running each test.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2709
diff changeset
272 hgrc = file(HGRCPATH, 'w+')
4529
860478527568 run-tests.py: set ui.slash = True
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4385
diff changeset
273 hgrc.write('[ui]\n')
860478527568 run-tests.py: set ui.slash = True
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4385
diff changeset
274 hgrc.write('slash = True\n')
2975
3091b1153e2c Clear contents of global hgrc for tests before running each test.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2709
diff changeset
275 hgrc.close()
3091b1153e2c Clear contents of global hgrc for tests before running each test.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2709
diff changeset
276
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
277 err = os.path.join(TESTDIR, test+".err")
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
278 ref = os.path.join(TESTDIR, test+".out")
4320
f9b61e0fc929 run-tests.py: small cleanup
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4319
diff changeset
279 testpath = os.path.join(TESTDIR, test)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
280
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
281 if os.path.exists(err):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
282 os.remove(err) # Remove any previous output files
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
283
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
284 # Make a tmp subdirectory to work in
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
285 tmpd = os.path.join(HGTMP, test)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
286 os.mkdir(tmpd)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
287 os.chdir(tmpd)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
288
4321
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
289 try:
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
290 tf = open(testpath)
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
291 firstline = tf.readline().rstrip()
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
292 tf.close()
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
293 except:
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
294 firstline = ''
2709
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
295 lctest = test.lower()
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
296
4321
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
297 if lctest.endswith('.py') or firstline == '#!/usr/bin/env python':
4320
f9b61e0fc929 run-tests.py: small cleanup
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4319
diff changeset
298 cmd = '%s "%s"' % (python, testpath)
2709
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
299 elif lctest.endswith('.bat'):
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
300 # do not run batch scripts on non-windows
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
301 if os.name != 'nt':
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
302 print '\nSkipping %s: batch script' % test
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
303 return None
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
304 # To reliably get the error code from batch files on WinXP,
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
305 # the "cmd /c call" prefix is needed. Grrr
4320
f9b61e0fc929 run-tests.py: small cleanup
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4319
diff changeset
306 cmd = 'cmd /c call "%s"' % testpath
2709
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
307 else:
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
308 # do not run shell scripts on windows
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
309 if os.name == 'nt':
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
310 print '\nSkipping %s: shell script' % test
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
311 return None
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
312 # do not try to run non-executable programs
4320
f9b61e0fc929 run-tests.py: small cleanup
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4319
diff changeset
313 if not os.access(testpath, os.X_OK):
2709
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
314 print '\nSkipping %s: not executable' % test
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
315 return None
4320
f9b61e0fc929 run-tests.py: small cleanup
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4319
diff changeset
316 cmd = '"%s"' % testpath
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
317
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
318 if options.timeout > 0:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
319 signal.alarm(options.timeout)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
320
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
321 vlog("# Running", cmd)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
322 ret, out = run(cmd)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
323 vlog("# Ret was:", ret)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
324
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
325 if options.timeout > 0:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
326 signal.alarm(0)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
327
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
328 skipped = (ret == SKIPPED_STATUS)
2213
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
329 diffret = 0
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
330 # If reference output file exists, check test output against it
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
331 if os.path.exists(ref):
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
332 f = open(ref, "r")
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
333 ref_out = splitnewlines(f.read())
2213
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
334 f.close()
2246
3fd603eb6add run-tests.py: print diff if reference output not existing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2213
diff changeset
335 else:
2703
d32b31e88391 run-tests.py: fix diff output when test-foo.out doesn't exist.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2702
diff changeset
336 ref_out = []
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
337 if not skipped and out != ref_out:
2246
3fd603eb6add run-tests.py: print diff if reference output not existing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2213
diff changeset
338 diffret = 1
3fd603eb6add run-tests.py: print diff if reference output not existing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2213
diff changeset
339 print "\nERROR: %s output changed" % (test)
3fd603eb6add run-tests.py: print diff if reference output not existing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2213
diff changeset
340 show_diff(ref_out, out)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
341 if skipped:
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
342 missing = extract_missing_features(out)
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
343 if not missing:
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
344 missing = ['irrelevant']
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
345 print '\nSkipping %s: %s' % (test, missing[-1])
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
346 elif ret:
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
347 print "\nERROR: %s failed with error code %d" % (test, ret)
2213
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
348 elif diffret:
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
349 ret = diffret
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
350
5115
ea7b982b6c08 Remove trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5095
diff changeset
351 if ret != 0 and not skipped:
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
352 # Save errors to a file for diagnosis
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
353 f = open(err, "wb")
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
354 for line in out:
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
355 f.write(line)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
356 f.close()
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
357
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
358 # Kill off any leftover daemon processes
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
359 try:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
360 fp = file(DAEMON_PIDS)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
361 for line in fp:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
362 try:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
363 pid = int(line)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
364 except ValueError:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
365 continue
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
366 try:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
367 os.kill(pid, 0)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
368 vlog('# Killing daemon process %d' % pid)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
369 os.kill(pid, signal.SIGTERM)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
370 time.sleep(0.25)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
371 os.kill(pid, 0)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
372 vlog('# Daemon process %d is stuck - really killing it' % pid)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
373 os.kill(pid, signal.SIGKILL)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
374 except OSError, err:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
375 if err.errno != errno.ESRCH:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
376 raise
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
377 fp.close()
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
378 os.unlink(DAEMON_PIDS)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
379 except IOError:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
380 pass
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
381
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
382 os.chdir(TESTDIR)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
383 shutil.rmtree(tmpd, True)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
384 if skipped:
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
385 return None
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
386 return ret == 0
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
387
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
388 if not options.child:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
389 os.umask(022)
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
390
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
391 check_required_tools()
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
392
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
393 # Reset some environment variables to well-known values so that
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
394 # the tests produce repeatable output.
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
395 os.environ['LANG'] = os.environ['LC_ALL'] = 'C'
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
396 os.environ['TZ'] = 'GMT'
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
397
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
398 TESTDIR = os.environ["TESTDIR"] = os.getcwd()
5388
557e4a916e12 run-tests.py: allow a different temporary directory to be specified
Bryan O'Sullivan <bos@serpentine.com>
parents: 5384
diff changeset
399 HGTMP = os.environ['HGTMP'] = tempfile.mkdtemp('', 'hgtests.', options.tmpdir)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
400 DAEMON_PIDS = None
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
401 HGRCPATH = None
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
402
4361
46280c004f22 change tests to use simplemerge by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4321
diff changeset
403 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
4385
93a4e72b4f83 run-tests.py: pass -L/--label to simplemerge
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4361
diff changeset
404 os.environ["HGMERGE"] = ('python "%s" -L my -L other'
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
405 % os.path.join(TESTDIR, os.path.pardir,
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
406 'contrib', 'simplemerge'))
4361
46280c004f22 change tests to use simplemerge by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4321
diff changeset
407 os.environ["HGUSER"] = "test"
46280c004f22 change tests to use simplemerge by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4321
diff changeset
408 os.environ["HGENCODING"] = "ascii"
46280c004f22 change tests to use simplemerge by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4321
diff changeset
409 os.environ["HGENCODINGMODE"] = "strict"
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
410 os.environ["HGPORT"] = str(options.port)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
411 os.environ["HGPORT1"] = str(options.port + 1)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
412 os.environ["HGPORT2"] = str(options.port + 2)
4361
46280c004f22 change tests to use simplemerge by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4321
diff changeset
413
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
414 if options.with_hg:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
415 INST = options.with_hg
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
416 else:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
417 INST = os.path.join(HGTMP, "install")
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
418 BINDIR = os.path.join(INST, "bin")
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
419 PYTHONDIR = os.path.join(INST, "lib", "python")
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
420 COVERAGE_FILE = os.path.join(TESTDIR, ".coverage")
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
421
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
422 def run_children(tests):
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
423 if not options.with_hg:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
424 install_hg()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
425
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
426 optcopy = dict(options.__dict__)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
427 optcopy['jobs'] = 1
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
428 optcopy['with_hg'] = INST
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
429 opts = []
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
430 for opt, value in optcopy.iteritems():
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
431 name = '--' + opt.replace('_', '-')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
432 if value is True:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
433 opts.append(name)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
434 elif value is not None:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
435 opts.append(name + '=' + str(value))
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
436
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
437 tests.reverse()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
438 jobs = [[] for j in xrange(options.jobs)]
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
439 while tests:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
440 for j in xrange(options.jobs):
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
441 if not tests: break
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
442 jobs[j].append(tests.pop())
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
443 fps = {}
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
444 for j in xrange(len(jobs)):
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
445 job = jobs[j]
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
446 if not job:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
447 continue
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
448 rfd, wfd = os.pipe()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
449 childopts = ['--child=%d' % wfd, '--port=%d' % (options.port + j * 3)]
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
450 cmdline = [python, sys.argv[0]] + opts + childopts + job
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
451 vlog(' '.join(cmdline))
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
452 fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
453 os.close(wfd)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
454 failures = 0
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
455 tested, skipped, failed = 0, 0, 0
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
456 while fps:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
457 pid, status = os.wait()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
458 fp = fps.pop(pid)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
459 test, skip, fail = map(int, fp.read().splitlines())
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
460 tested += test
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
461 skipped += skip
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
462 failed += fail
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
463 vlog('pid %d exited, status %d' % (pid, status))
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
464 failures |= status
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
465 print "\n# Ran %d tests, %d skipped, %d failed." % (
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
466 tested, skipped, failed)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
467 sys.exit(failures != 0)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
468
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
469 def run_tests(tests):
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
470 global DAEMON_PIDS, HGRCPATH
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
471 DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
472 HGRCPATH = os.environ["HGRCPATH"] = os.path.join(HGTMP, '.hgrc')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
473
2258
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
474 try:
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
475 if not options.with_hg:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
476 install_hg()
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
477
2570
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
478 if options.timeout > 0:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
479 try:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
480 signal.signal(signal.SIGALRM, alarmed)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
481 vlog('# Running tests with %d-second timeout' %
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
482 options.timeout)
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
483 except AttributeError:
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
484 print 'WARNING: cannot run tests with timeouts'
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
485 options.timeout = 0
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
486
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
487 tested = 0
2258
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
488 failed = 0
2709
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
489 skipped = 0
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
490
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
491 if options.restart:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
492 orig = list(tests)
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
493 while tests:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
494 if os.path.exists(tests[0] + ".err"):
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
495 break
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
496 tests.pop(0)
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
497 if not tests:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
498 print "running all tests"
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
499 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
500
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
501 for test in tests:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
502 if options.retest and not os.path.exists(test + ".err"):
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
503 skipped += 1
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
504 continue
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
505 ret = run_one(test)
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
506 if ret is None:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
507 skipped += 1
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
508 elif not ret:
3626
02e9355c3420 tests: add -i switch
Matt Mackall <mpm@selenic.com>
parents: 3625
diff changeset
509 if options.interactive:
02e9355c3420 tests: add -i switch
Matt Mackall <mpm@selenic.com>
parents: 3625
diff changeset
510 print "Accept this change? [n] ",
02e9355c3420 tests: add -i switch
Matt Mackall <mpm@selenic.com>
parents: 3625
diff changeset
511 answer = sys.stdin.readline().strip()
02e9355c3420 tests: add -i switch
Matt Mackall <mpm@selenic.com>
parents: 3625
diff changeset
512 if answer.lower() in "y yes".split():
02e9355c3420 tests: add -i switch
Matt Mackall <mpm@selenic.com>
parents: 3625
diff changeset
513 os.rename(test + ".err", test + ".out")
02e9355c3420 tests: add -i switch
Matt Mackall <mpm@selenic.com>
parents: 3625
diff changeset
514 tested += 1
02e9355c3420 tests: add -i switch
Matt Mackall <mpm@selenic.com>
parents: 3625
diff changeset
515 continue
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
516 failed += 1
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
517 if options.first:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
518 break
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
519 tested += 1
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
520
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
521 if options.child:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
522 fp = os.fdopen(options.child, 'w')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
523 fp.write('%d\n%d\n%d\n' % (tested, skipped, failed))
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
524 fp.close()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
525 else:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
526 print "\n# Ran %d tests, %d skipped, %d failed." % (
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
527 tested, skipped, failed)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
528
2258
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
529 if coverage:
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
530 output_coverage()
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
531 except KeyboardInterrupt:
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
532 failed = True
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
533 print "\ninterrupted!"
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
534
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
535 if failed:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
536 sys.exit(1)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
537
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
538 if len(args) == 0:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
539 args = os.listdir(".")
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
540 args.sort()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
541
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
542 tests = []
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
543 for test in args:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
544 if (test.startswith("test-") and '~' not in test and
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
545 ('.' not in test or test.endswith('.py') or
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
546 test.endswith('.bat'))):
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
547 tests.append(test)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
548
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
549 vlog("# Using TESTDIR", TESTDIR)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
550 vlog("# Using HGTMP", HGTMP)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
551
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
552 try:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
553 if len(tests) > 1 and options.jobs > 1:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
554 run_children(tests)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
555 else:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
556 run_tests(tests)
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
557 finally:
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
558 cleanup_exit()