blob: 285acba138e983b059a08c43b034ae4dfb0201cd [file] [log] [blame]
Guido van Rossum152494a1996-12-20 03:12:20 +00001#! /usr/bin/env python
2
3"""Regression test.
4
5This will find all modules whose name is "test_*" in the test
6directory, and run them. Various command line options provide
7additional facilities.
8
9Command line options:
10
Barry Warsawa873b032000-08-03 15:50:37 +000011-v: verbose -- run tests in verbose mode with output to stdout
12-q: quiet -- don't print anything except if a test fails
13-g: generate -- write the output file for a test instead of comparing it
14-x: exclude -- arguments are tests to *exclude*
15-s: single -- run only a single test (see below)
16-r: random -- randomize test execution order
Neil Schemenauer8a00abc2000-10-13 01:32:42 +000017-l: findleaks -- if GC is available detect tests that leak memory
Trent Mickf29f47b2000-08-11 19:02:59 +000018--have-resources -- run tests that require large resources (time/space)
Guido van Rossum152494a1996-12-20 03:12:20 +000019
20If non-option arguments are present, they are names for tests to run,
21unless -x is given, in which case they are names for tests not to run.
22If no test names are given, all tests are run.
Guido van Rossumf58ed251997-03-07 21:04:33 +000023
Guido van Rossuma4122201997-08-18 20:08:24 +000024-v is incompatible with -g and does not compare test output files.
Barry Warsawe11e3de1999-01-28 19:51:51 +000025
Barry Warsaw22e41822001-02-23 18:31:40 +000026-s means to run only a single test and exit. This is useful when doing memory
27analysis on the Python interpreter (which tend to consume to many resources to
28run the full regression test non-stop). The file /tmp/pynexttest is read to
29find the next test to run. If this file is missing, the first test_*.py file
30in testdir or on the command line is used. (actually tempfile.gettempdir() is
31used instead of /tmp).
Barry Warsawe11e3de1999-01-28 19:51:51 +000032
Guido van Rossum152494a1996-12-20 03:12:20 +000033"""
34
35import sys
Guido van Rossum152494a1996-12-20 03:12:20 +000036import os
37import getopt
Guido van Rossum9e48b271997-07-16 01:56:13 +000038import traceback
Skip Montanaroab1c7912000-06-30 16:39:27 +000039import random
Fred Drakeae1bb172001-05-21 21:08:12 +000040import StringIO
Guido van Rossum152494a1996-12-20 03:12:20 +000041
42import test_support
43
Skip Montanaroab1c7912000-06-30 16:39:27 +000044def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
Neil Schemenauerd569f232000-09-22 15:29:28 +000045 exclude=0, single=0, randomize=0, findleaks=0,
Trent Mickf29f47b2000-08-11 19:02:59 +000046 use_large_resources=0):
Guido van Rossum6fd83b71998-08-01 17:04:08 +000047 """Execute a test suite.
48
Thomas Wouters7e474022000-07-16 12:04:32 +000049 This also parses command-line options and modifies its behavior
Fred Drake004d5e62000-10-23 17:22:08 +000050 accordingly.
Guido van Rossum6fd83b71998-08-01 17:04:08 +000051
52 tests -- a list of strings containing test names (optional)
53 testdir -- the directory in which to look for tests (optional)
54
55 Users other than the Python test suite will certainly want to
56 specify testdir; if it's omitted, the directory containing the
Fred Drake004d5e62000-10-23 17:22:08 +000057 Python test suite is searched for.
Guido van Rossum6fd83b71998-08-01 17:04:08 +000058
59 If the tests argument is omitted, the tests listed on the
60 command-line will be used. If that's empty, too, then all *.py
61 files beginning with test_ will be used.
Skip Montanaroab1c7912000-06-30 16:39:27 +000062
Barry Warsawa873b032000-08-03 15:50:37 +000063 The other seven default arguments (verbose, quiet, generate, exclude,
Neil Schemenauerd569f232000-09-22 15:29:28 +000064 single, randomize, and findleaks) allow programmers calling main()
Barry Warsawa873b032000-08-03 15:50:37 +000065 directly to set the values that would normally be set by flags on the
66 command line.
67
Guido van Rossum6fd83b71998-08-01 17:04:08 +000068 """
Fred Drake004d5e62000-10-23 17:22:08 +000069
Guido van Rossum152494a1996-12-20 03:12:20 +000070 try:
Trent Mickf29f47b2000-08-11 19:02:59 +000071 opts, args = getopt.getopt(sys.argv[1:], 'vgqxsrl', ['have-resources'])
Guido van Rossum152494a1996-12-20 03:12:20 +000072 except getopt.error, msg:
Guido van Rossum41360a41998-03-26 19:42:58 +000073 print msg
74 print __doc__
75 return 2
Guido van Rossum152494a1996-12-20 03:12:20 +000076 for o, a in opts:
Guido van Rossum41360a41998-03-26 19:42:58 +000077 if o == '-v': verbose = verbose+1
78 if o == '-q': quiet = 1; verbose = 0
79 if o == '-g': generate = 1
80 if o == '-x': exclude = 1
Barry Warsawe11e3de1999-01-28 19:51:51 +000081 if o == '-s': single = 1
Skip Montanaroab1c7912000-06-30 16:39:27 +000082 if o == '-r': randomize = 1
Neil Schemenauerd569f232000-09-22 15:29:28 +000083 if o == '-l': findleaks = 1
Trent Mickf29f47b2000-08-11 19:02:59 +000084 if o == '--have-resources': use_large_resources = 1
Guido van Rossuma4122201997-08-18 20:08:24 +000085 if generate and verbose:
Guido van Rossum41360a41998-03-26 19:42:58 +000086 print "-g and -v don't go together!"
87 return 2
Guido van Rossum152494a1996-12-20 03:12:20 +000088 good = []
89 bad = []
90 skipped = []
Barry Warsawe11e3de1999-01-28 19:51:51 +000091
Neil Schemenauerd569f232000-09-22 15:29:28 +000092 if findleaks:
Barry Warsawa873b032000-08-03 15:50:37 +000093 try:
94 import gc
95 except ImportError:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +000096 print 'No GC available, disabling findleaks.'
Neil Schemenauerd569f232000-09-22 15:29:28 +000097 findleaks = 0
Barry Warsawa873b032000-08-03 15:50:37 +000098 else:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +000099 # Uncomment the line below to report garbage that is not
100 # freeable by reference counting alone. By default only
101 # garbage that is not collectable by the GC is reported.
102 #gc.set_debug(gc.DEBUG_SAVEALL)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000103 found_garbage = []
Barry Warsawa873b032000-08-03 15:50:37 +0000104
Barry Warsawe11e3de1999-01-28 19:51:51 +0000105 if single:
106 from tempfile import gettempdir
107 filename = os.path.join(gettempdir(), 'pynexttest')
108 try:
109 fp = open(filename, 'r')
Eric S. Raymondfc170b12001-02-09 11:51:27 +0000110 next = fp.read().strip()
Barry Warsawe11e3de1999-01-28 19:51:51 +0000111 tests = [next]
112 fp.close()
113 except IOError:
114 pass
Guido van Rossuma4122201997-08-18 20:08:24 +0000115 for i in range(len(args)):
Guido van Rossum41360a41998-03-26 19:42:58 +0000116 # Strip trailing ".py" from arguments
117 if args[i][-3:] == '.py':
118 args[i] = args[i][:-3]
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000119 stdtests = STDTESTS[:]
120 nottests = NOTTESTS[:]
Guido van Rossum152494a1996-12-20 03:12:20 +0000121 if exclude:
Guido van Rossum6c74fea1998-08-25 12:29:08 +0000122 for arg in args:
123 if arg in stdtests:
124 stdtests.remove(arg)
125 nottests[:0] = args
Guido van Rossum41360a41998-03-26 19:42:58 +0000126 args = []
Guido van Rossum747e1ca1998-08-24 13:48:36 +0000127 tests = tests or args or findtests(testdir, stdtests, nottests)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000128 if single:
129 tests = tests[:1]
Skip Montanaroab1c7912000-06-30 16:39:27 +0000130 if randomize:
131 random.shuffle(tests)
Guido van Rossum41360a41998-03-26 19:42:58 +0000132 test_support.verbose = verbose # Tell tests to be moderately quiet
Trent Mickf29f47b2000-08-11 19:02:59 +0000133 test_support.use_large_resources = use_large_resources
Guido van Rossum5796d262000-04-21 21:35:06 +0000134 save_modules = sys.modules.keys()
Guido van Rossum152494a1996-12-20 03:12:20 +0000135 for test in tests:
Guido van Rossum41360a41998-03-26 19:42:58 +0000136 if not quiet:
137 print test
Trent Mickf29f47b2000-08-11 19:02:59 +0000138 ok = runtest(test, generate, verbose, quiet, testdir)
Guido van Rossum41360a41998-03-26 19:42:58 +0000139 if ok > 0:
140 good.append(test)
141 elif ok == 0:
142 bad.append(test)
143 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000144 skipped.append(test)
Neil Schemenauerd569f232000-09-22 15:29:28 +0000145 if findleaks:
146 gc.collect()
147 if gc.garbage:
Neil Schemenauer8a00abc2000-10-13 01:32:42 +0000148 print "Warning: test created", len(gc.garbage),
149 print "uncollectable object(s)."
150 # move the uncollectable objects somewhere so we don't see
151 # them again
Neil Schemenauerd569f232000-09-22 15:29:28 +0000152 found_garbage.extend(gc.garbage)
153 del gc.garbage[:]
Guido van Rossum5796d262000-04-21 21:35:06 +0000154 # Unload the newly imported modules (best effort finalization)
155 for module in sys.modules.keys():
Guido van Rossum51931142000-05-05 14:27:39 +0000156 if module not in save_modules and module.startswith("test."):
Guido van Rossum5796d262000-04-21 21:35:06 +0000157 test_support.unload(module)
Guido van Rossum152494a1996-12-20 03:12:20 +0000158 if good and not quiet:
Guido van Rossum41360a41998-03-26 19:42:58 +0000159 if not bad and not skipped and len(good) > 1:
160 print "All",
161 print count(len(good), "test"), "OK."
Tim Peters1a4d77b2000-12-30 22:21:22 +0000162 if verbose:
163 print "CAUTION: stdout isn't compared in verbose mode: a test"
164 print "that passes in verbose mode may fail without it."
Guido van Rossum152494a1996-12-20 03:12:20 +0000165 if bad:
Tim Petersa45da922001-08-12 03:45:50 +0000166 print count(len(bad), "test"), "failed:"
167 printlist(bad)
Guido van Rossum152494a1996-12-20 03:12:20 +0000168 if skipped and not quiet:
Tim Petersa45da922001-08-12 03:45:50 +0000169 print count(len(skipped), "test"), "skipped:"
170 printlist(skipped)
Barry Warsawe11e3de1999-01-28 19:51:51 +0000171
Tim Petersb5b7b782001-08-12 01:20:39 +0000172 e = _ExpectedSkips()
Tim Petersa2be2d62001-08-12 02:01:09 +0000173 plat = sys.platform
Tim Petersb5b7b782001-08-12 01:20:39 +0000174 if e.isvalid():
175 surprise = _Set(skipped) - e.getexpected()
Tim Petersb5b7b782001-08-12 01:20:39 +0000176 if surprise:
177 print count(len(surprise), "skip"), \
Tim Petersa45da922001-08-12 03:45:50 +0000178 "unexpected on", plat + ":"
179 printlist(surprise)
Tim Petersb5b7b782001-08-12 01:20:39 +0000180 else:
181 print "Those skips are all expected on", plat + "."
182 else:
183 print "Ask someone to teach regrtest.py about which tests are"
184 print "expected to get skipped on", plat + "."
185
Barry Warsawe11e3de1999-01-28 19:51:51 +0000186 if single:
187 alltests = findtests(testdir, stdtests, nottests)
188 for i in range(len(alltests)):
189 if tests[0] == alltests[i]:
190 if i == len(alltests) - 1:
191 os.unlink(filename)
192 else:
193 fp = open(filename, 'w')
194 fp.write(alltests[i+1] + '\n')
195 fp.close()
196 break
197 else:
198 os.unlink(filename)
199
Guido van Rossume8387011997-08-14 19:40:34 +0000200 return len(bad) > 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000201
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000202STDTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000203 'test_grammar',
204 'test_opcodes',
205 'test_operations',
206 'test_builtin',
207 'test_exceptions',
208 'test_types',
209 ]
210
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000211NOTTESTS = [
Guido van Rossum152494a1996-12-20 03:12:20 +0000212 'test_support',
213 'test_b1',
214 'test_b2',
Jeremy Hylton62e2c7e2001-02-28 17:48:06 +0000215 'test_future1',
216 'test_future2',
Guido van Rossum152494a1996-12-20 03:12:20 +0000217 ]
218
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000219def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
Guido van Rossum152494a1996-12-20 03:12:20 +0000220 """Return a list of all applicable test modules."""
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000221 if not testdir: testdir = findtestdir()
Guido van Rossum152494a1996-12-20 03:12:20 +0000222 names = os.listdir(testdir)
223 tests = []
224 for name in names:
Guido van Rossum41360a41998-03-26 19:42:58 +0000225 if name[:5] == "test_" and name[-3:] == ".py":
226 modname = name[:-3]
227 if modname not in stdtests and modname not in nottests:
228 tests.append(modname)
Guido van Rossum152494a1996-12-20 03:12:20 +0000229 tests.sort()
230 return stdtests + tests
231
Trent Mickf29f47b2000-08-11 19:02:59 +0000232def runtest(test, generate, verbose, quiet, testdir = None):
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000233 """Run a single test.
234 test -- the name of the test
235 generate -- if true, generate output, instead of running the test
236 and comparing it to a previously created output file
237 verbose -- if true, print more messages
Trent Mickf29f47b2000-08-11 19:02:59 +0000238 quiet -- if true, don't print 'skipped' messages (probably redundant)
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000239 testdir -- test directory
240 """
Guido van Rossum152494a1996-12-20 03:12:20 +0000241 test_support.unload(test)
Guido van Rossum6fd83b71998-08-01 17:04:08 +0000242 if not testdir: testdir = findtestdir()
Guido van Rossum152494a1996-12-20 03:12:20 +0000243 outputdir = os.path.join(testdir, "output")
244 outputfile = os.path.join(outputdir, test)
245 try:
Guido van Rossum41360a41998-03-26 19:42:58 +0000246 if generate:
Fred Drakee51fe8d2001-05-29 17:10:51 +0000247 cfp = StringIO.StringIO()
Guido van Rossum41360a41998-03-26 19:42:58 +0000248 elif verbose:
249 cfp = sys.stdout
250 else:
251 cfp = Compare(outputfile)
Guido van Rossum152494a1996-12-20 03:12:20 +0000252 except IOError:
Guido van Rossum41360a41998-03-26 19:42:58 +0000253 cfp = None
254 print "Warning: can't open", outputfile
Guido van Rossum152494a1996-12-20 03:12:20 +0000255 try:
Guido van Rossum41360a41998-03-26 19:42:58 +0000256 save_stdout = sys.stdout
257 try:
258 if cfp:
259 sys.stdout = cfp
260 print test # Output file starts with test name
Tim Petersd9742212001-05-22 18:28:25 +0000261 the_module = __import__(test, globals(), locals(), [])
262 # Most tests run to completion simply as a side-effect of
263 # being imported. For the benefit of tests that can't run
264 # that way (like test_threaded_import), explicitly invoke
265 # their test_main() function (if it exists).
266 indirect_test = getattr(the_module, "test_main", None)
267 if indirect_test is not None:
268 indirect_test()
Jeremy Hyltonfff9e202000-07-11 15:15:31 +0000269 if cfp and not (generate or verbose):
270 cfp.close()
Guido van Rossum41360a41998-03-26 19:42:58 +0000271 finally:
272 sys.stdout = save_stdout
Thomas Wouters3af826e2000-08-04 13:17:51 +0000273 except (ImportError, test_support.TestSkipped), msg:
Trent Mickf29f47b2000-08-11 19:02:59 +0000274 if not quiet:
275 print "test", test,
276 print "skipped -- ", msg
Guido van Rossum41360a41998-03-26 19:42:58 +0000277 return -1
Fred Drakefe5c22a2000-08-18 16:04:05 +0000278 except KeyboardInterrupt:
279 raise
Guido van Rossum152494a1996-12-20 03:12:20 +0000280 except test_support.TestFailed, msg:
Guido van Rossum41360a41998-03-26 19:42:58 +0000281 print "test", test, "failed --", msg
282 return 0
Guido van Rossum9e48b271997-07-16 01:56:13 +0000283 except:
Guido van Rossum41360a41998-03-26 19:42:58 +0000284 type, value = sys.exc_info()[:2]
Fred Drake27c4b392000-08-23 20:34:40 +0000285 print "test", test, "crashed --", str(type) + ":", value
Guido van Rossum41360a41998-03-26 19:42:58 +0000286 if verbose:
287 traceback.print_exc(file=sys.stdout)
288 return 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000289 else:
Fred Drakee51fe8d2001-05-29 17:10:51 +0000290 if generate:
291 output = cfp.getvalue()
292 if output == test + "\n":
293 if os.path.exists(outputfile):
294 # Write it since it already exists (and the contents
295 # may have changed), but let the user know it isn't
296 # needed:
297 fp = open(outputfile, "w")
298 fp.write(output)
299 fp.close()
300 print "output file", outputfile, \
301 "is no longer needed; consider removing it"
302 # else:
303 # We don't need it, so don't create it.
304 else:
305 fp = open(outputfile, "w")
306 fp.write(output)
307 fp.close()
Guido van Rossum41360a41998-03-26 19:42:58 +0000308 return 1
Guido van Rossum152494a1996-12-20 03:12:20 +0000309
310def findtestdir():
311 if __name__ == '__main__':
Guido van Rossum41360a41998-03-26 19:42:58 +0000312 file = sys.argv[0]
Guido van Rossum152494a1996-12-20 03:12:20 +0000313 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000314 file = __file__
Guido van Rossum152494a1996-12-20 03:12:20 +0000315 testdir = os.path.dirname(file) or os.curdir
316 return testdir
317
318def count(n, word):
319 if n == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +0000320 return "%d %s" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +0000321 else:
Guido van Rossum41360a41998-03-26 19:42:58 +0000322 return "%d %ss" % (n, word)
Guido van Rossum152494a1996-12-20 03:12:20 +0000323
Tim Petersa45da922001-08-12 03:45:50 +0000324def printlist(x, width=70, indent=4):
325 """Print the elements of a sequence to stdout.
326
327 Optional arg width (default 70) is the maximum line length.
328 Optional arg indent (default 4) is the number of blanks with which to
329 begin each line.
330 """
331
332 line = ' ' * indent
333 for one in map(str, x):
334 w = len(line) + len(one)
335 if line[-1:] == ' ':
336 pad = ''
337 else:
338 pad = ' '
339 w += 1
340 if w > width:
341 print line
342 line = ' ' * indent + one
343 else:
344 line += pad + one
345 if len(line) > indent:
346 print line
347
Guido van Rossum152494a1996-12-20 03:12:20 +0000348class Compare:
349
350 def __init__(self, filename):
Fred Drakeae1bb172001-05-21 21:08:12 +0000351 if os.path.exists(filename):
352 self.fp = open(filename, 'r')
353 else:
354 self.fp = StringIO.StringIO(
355 os.path.basename(filename) + "\n")
Tim Peters1a4d77b2000-12-30 22:21:22 +0000356 self.stuffthatmatched = []
Guido van Rossum152494a1996-12-20 03:12:20 +0000357
358 def write(self, data):
Guido van Rossum41360a41998-03-26 19:42:58 +0000359 expected = self.fp.read(len(data))
Tim Peters1a4d77b2000-12-30 22:21:22 +0000360 if data == expected:
361 self.stuffthatmatched.append(expected)
362 else:
363 # This Compare instance is spoofing stdout, so we need to write
364 # to stderr instead.
365 from sys import stderr as e
366 print >> e, "The actual stdout doesn't match the expected stdout."
367 if self.stuffthatmatched:
368 print >> e, "This much did match (between asterisk lines):"
369 print >> e, "*" * 70
370 good = "".join(self.stuffthatmatched)
371 e.write(good)
372 if not good.endswith("\n"):
373 e.write("\n")
374 print >> e, "*" * 70
375 print >> e, "Then ..."
376 else:
377 print >> e, "The first write to stdout clashed:"
378 # Note that the prompts are the same length in next two lines.
379 # This is so what we expected and what we got line up.
380 print >> e, "We expected (repr):", `expected`
381 print >> e, "But instead we got:", `data`
382 raise test_support.TestFailed('Writing: ' + `data`+
383 ', expected: ' + `expected`)
Guido van Rossum152494a1996-12-20 03:12:20 +0000384
Guido van Rossume87ed5f1998-04-23 13:33:21 +0000385 def writelines(self, listoflines):
386 map(self.write, listoflines)
387
Guido van Rossum75fce301997-07-17 14:51:37 +0000388 def flush(self):
Guido van Rossum41360a41998-03-26 19:42:58 +0000389 pass
Guido van Rossum75fce301997-07-17 14:51:37 +0000390
Guido van Rossum152494a1996-12-20 03:12:20 +0000391 def close(self):
Guido van Rossum41360a41998-03-26 19:42:58 +0000392 leftover = self.fp.read()
393 if leftover:
Tim Peters1a4d77b2000-12-30 22:21:22 +0000394 raise test_support.TestFailed('Tail of expected stdout unseen: ' +
395 `leftover`)
Guido van Rossum41360a41998-03-26 19:42:58 +0000396 self.fp.close()
Guido van Rossum152494a1996-12-20 03:12:20 +0000397
398 def isatty(self):
Guido van Rossum41360a41998-03-26 19:42:58 +0000399 return 0
Guido van Rossum152494a1996-12-20 03:12:20 +0000400
Tim Petersb5b7b782001-08-12 01:20:39 +0000401class _Set:
402 def __init__(self, seq=[]):
403 data = self.data = {}
404 for x in seq:
405 data[x] = 1
406
407 def __len__(self):
408 return len(self.data)
409
410 def __sub__(self, other):
411 "Return set of all elements in self not in other."
412 result = _Set()
413 data = result.data = self.data.copy()
414 for x in other.data:
415 if x in data:
416 del data[x]
417 return result
418
419 def tolist(self, sorted=1):
420 "Return _Set elements as a list."
421 data = self.data.keys()
422 if sorted:
423 data.sort()
424 return data
425
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000426_expectations = {
427 'win32':
428 """
429 test_al
430 test_cd
431 test_cl
432 test_commands
433 test_crypt
434 test_dbm
435 test_dl
436 test_fcntl
437 test_fork1
438 test_gdbm
439 test_gl
440 test_grp
441 test_imgfile
442 test_largefile
443 test_linuxaudiodev
444 test_mhlib
445 test_nis
446 test_openpty
447 test_poll
448 test_pty
449 test_pwd
450 test_signal
451 test_socketserver
452 test_sunaudiodev
453 test_timing
454 """,
455 'linux2':
456 """
457 test_al
458 test_cd
459 test_cl
460 test_dl
461 test_gl
462 test_imgfile
463 test_largefile
464 test_nis
465 test_ntpath
466 test_socketserver
467 test_sunaudiodev
468 test_unicode_file
469 test_winreg
470 test_winsound
471 """,
472}
473
Tim Petersb5b7b782001-08-12 01:20:39 +0000474class _ExpectedSkips:
475 def __init__(self):
476 self.valid = 0
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000477 if _expectations.has_key(sys.platform):
478 s = _expectations[sys.platform]
Tim Petersb5b7b782001-08-12 01:20:39 +0000479 self.expected = _Set(s.split())
Guido van Rossumf73e30c2001-08-12 02:22:19 +0000480 self.valid = 1
Tim Petersb5b7b782001-08-12 01:20:39 +0000481
482 def isvalid(self):
483 "Return true iff _ExpectedSkips knows about the current platform."
484 return self.valid
485
486 def getexpected(self):
487 """Return set of test names we expect to skip on current platform.
488
489 self.isvalid() must be true.
490 """
491
492 assert self.isvalid()
493 return self.expected
494
Guido van Rossum152494a1996-12-20 03:12:20 +0000495if __name__ == '__main__':
Guido van Rossume8387011997-08-14 19:40:34 +0000496 sys.exit(main())