AddressList.__str__(): Get rid of useless, and broken method. Closes
[python/dscho.git] / Lib / test / regrtest.py
blob5b7c41eab4c0d368362266f23a643ea0dedc6157
1 #! /usr/bin/env python
3 """Regression test.
5 This will find all modules whose name is "test_*" in the test
6 directory, and run them. Various command line options provide
7 additional facilities.
9 Command line options:
11 -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
17 -f: fromfile -- read names of tests to run from a file (see below)
18 -l: findleaks -- if GC is available detect tests that leak memory
19 -u: use -- specify which special resource intensive tests to run
20 -h: help -- print this text and exit
21 -t: threshold -- call gc.set_threshold(N)
23 If non-option arguments are present, they are names for tests to run,
24 unless -x is given, in which case they are names for tests not to run.
25 If no test names are given, all tests are run.
27 -v is incompatible with -g and does not compare test output files.
29 -s means to run only a single test and exit. This is useful when
30 doing memory analysis on the Python interpreter (which tend to consume
31 too many resources to run the full regression test non-stop). The
32 file /tmp/pynexttest is read to find the next test to run. If this
33 file is missing, the first test_*.py file in testdir or on the command
34 line is used. (actually tempfile.gettempdir() is used instead of
35 /tmp).
37 -f reads the names of tests from the file given as f's argument, one
38 or more test names per line. Whitespace is ignored. Blank lines and
39 lines beginning with '#' are ignored. This is especially useful for
40 whittling down failures involving interactions among tests.
42 -u is used to specify which special resource intensive tests to run,
43 such as those requiring large file support or network connectivity.
44 The argument is a comma-separated list of words indicating the
45 resources to test. Currently only the following are defined:
47 all - Enable all special resources.
49 audio - Tests that use the audio device. (There are known
50 cases of broken audio drivers that can crash Python or
51 even the Linux kernel.)
53 curses - Tests that use curses and will modify the terminal's
54 state and output modes.
56 largefile - It is okay to run some test that may create huge
57 files. These tests can take a long time and may
58 consume >2GB of disk space temporarily.
60 network - It is okay to run tests that use external network
61 resource, e.g. testing SSL support for sockets.
63 bsddb - It is okay to run the bsddb testsuite, which takes
64 a long time to complete.
66 To enable all resources except one, use '-uall,-<resource>'. For
67 example, to run all the tests except for the bsddb tests, give the
68 option '-uall,-bsddb'.
69 """
71 import sys
72 import os
73 import getopt
74 import traceback
75 import random
76 import cStringIO
77 import warnings
78 from sets import Set
80 # I see no other way to suppress these warnings;
81 # putting them in test_grammar.py has no effect:
82 warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
83 ".*test.test_grammar$")
84 if sys.maxint > 0x7fffffff:
85 # Also suppress them in <string>, because for 64-bit platforms,
86 # that's where test_grammar.py hides them.
87 warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning,
88 "<string>")
90 # MacOSX (a.k.a. Darwin) has a default stack size that is too small
91 # for deeply recursive regular expressions. We see this as crashes in
92 # the Python test suite when running test_re.py and test_sre.py. The
93 # fix is to set the stack limit to 2048.
94 # This approach may also be useful for other Unixy platforms that
95 # suffer from small default stack limits.
96 if sys.platform == 'darwin':
97 try:
98 import resource
99 except ImportError:
100 pass
101 else:
102 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
103 newsoft = min(hard, max(soft, 1024*2048))
104 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
106 from test import test_support
108 RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb')
111 def usage(code, msg=''):
112 print __doc__
113 if msg: print msg
114 sys.exit(code)
117 def main(tests=None, testdir=None, verbose=0, quiet=0, generate=0,
118 exclude=0, single=0, randomize=0, fromfile=None, findleaks=0,
119 use_resources=None):
120 """Execute a test suite.
122 This also parses command-line options and modifies its behavior
123 accordingly.
125 tests -- a list of strings containing test names (optional)
126 testdir -- the directory in which to look for tests (optional)
128 Users other than the Python test suite will certainly want to
129 specify testdir; if it's omitted, the directory containing the
130 Python test suite is searched for.
132 If the tests argument is omitted, the tests listed on the
133 command-line will be used. If that's empty, too, then all *.py
134 files beginning with test_ will be used.
136 The other default arguments (verbose, quiet, generate, exclude,
137 single, randomize, findleaks, and use_resources) allow programmers
138 calling main() directly to set the values that would normally be
139 set by flags on the command line.
143 test_support.record_original_stdout(sys.stdout)
144 try:
145 opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:',
146 ['help', 'verbose', 'quiet', 'generate',
147 'exclude', 'single', 'random', 'fromfile',
148 'findleaks', 'use=', 'threshold='])
149 except getopt.error, msg:
150 usage(2, msg)
152 # Defaults
153 if use_resources is None:
154 use_resources = []
155 for o, a in opts:
156 if o in ('-h', '--help'):
157 usage(0)
158 elif o in ('-v', '--verbose'):
159 verbose += 1
160 elif o in ('-q', '--quiet'):
161 quiet = 1;
162 verbose = 0
163 elif o in ('-g', '--generate'):
164 generate = 1
165 elif o in ('-x', '--exclude'):
166 exclude = 1
167 elif o in ('-s', '--single'):
168 single = 1
169 elif o in ('-r', '--randomize'):
170 randomize = 1
171 elif o in ('-f', '--fromfile'):
172 fromfile = a
173 elif o in ('-l', '--findleaks'):
174 findleaks = 1
175 elif o in ('-t', '--threshold'):
176 import gc
177 gc.set_threshold(int(a))
178 elif o in ('-u', '--use'):
179 u = [x.lower() for x in a.split(',')]
180 for r in u:
181 if r == 'all':
182 use_resources[:] = RESOURCE_NAMES
183 continue
184 remove = False
185 if r[0] == '-':
186 remove = True
187 r = r[1:]
188 if r not in RESOURCE_NAMES:
189 usage(1, 'Invalid -u/--use option: ' + a)
190 if remove:
191 if r in use_resources:
192 use_resources.remove(r)
193 elif r not in use_resources:
194 use_resources.append(r)
195 if generate and verbose:
196 usage(2, "-g and -v don't go together!")
197 if single and fromfile:
198 usage(2, "-s and -f don't go together!")
200 good = []
201 bad = []
202 skipped = []
203 resource_denieds = []
205 if findleaks:
206 try:
207 import gc
208 except ImportError:
209 print 'No GC available, disabling findleaks.'
210 findleaks = 0
211 else:
212 # Uncomment the line below to report garbage that is not
213 # freeable by reference counting alone. By default only
214 # garbage that is not collectable by the GC is reported.
215 #gc.set_debug(gc.DEBUG_SAVEALL)
216 found_garbage = []
218 if single:
219 from tempfile import gettempdir
220 filename = os.path.join(gettempdir(), 'pynexttest')
221 try:
222 fp = open(filename, 'r')
223 next = fp.read().strip()
224 tests = [next]
225 fp.close()
226 except IOError:
227 pass
229 if fromfile:
230 tests = []
231 fp = open(fromfile)
232 for line in fp:
233 guts = line.split() # assuming no test has whitespace in its name
234 if guts and not guts[0].startswith('#'):
235 tests.extend(guts)
236 fp.close()
238 # Strip .py extensions.
239 if args:
240 args = map(removepy, args)
241 if tests:
242 tests = map(removepy, tests)
244 stdtests = STDTESTS[:]
245 nottests = NOTTESTS[:]
246 if exclude:
247 for arg in args:
248 if arg in stdtests:
249 stdtests.remove(arg)
250 nottests[:0] = args
251 args = []
252 tests = tests or args or findtests(testdir, stdtests, nottests)
253 if single:
254 tests = tests[:1]
255 if randomize:
256 random.shuffle(tests)
257 test_support.verbose = verbose # Tell tests to be moderately quiet
258 test_support.use_resources = use_resources
259 save_modules = sys.modules.keys()
260 for test in tests:
261 if not quiet:
262 print test
263 sys.stdout.flush()
264 ok = runtest(test, generate, verbose, quiet, testdir)
265 if ok > 0:
266 good.append(test)
267 elif ok == 0:
268 bad.append(test)
269 else:
270 skipped.append(test)
271 if ok == -2:
272 resource_denieds.append(test)
273 if findleaks:
274 gc.collect()
275 if gc.garbage:
276 print "Warning: test created", len(gc.garbage),
277 print "uncollectable object(s)."
278 # move the uncollectable objects somewhere so we don't see
279 # them again
280 found_garbage.extend(gc.garbage)
281 del gc.garbage[:]
282 # Unload the newly imported modules (best effort finalization)
283 for module in sys.modules.keys():
284 if module not in save_modules and module.startswith("test."):
285 test_support.unload(module)
287 # The lists won't be sorted if running with -r
288 good.sort()
289 bad.sort()
290 skipped.sort()
292 if good and not quiet:
293 if not bad and not skipped and len(good) > 1:
294 print "All",
295 print count(len(good), "test"), "OK."
296 if verbose:
297 print "CAUTION: stdout isn't compared in verbose mode:"
298 print "a test that passes in verbose mode may fail without it."
299 if bad:
300 print count(len(bad), "test"), "failed:"
301 printlist(bad)
302 if skipped and not quiet:
303 print count(len(skipped), "test"), "skipped:"
304 printlist(skipped)
306 e = _ExpectedSkips()
307 plat = sys.platform
308 if e.isvalid():
309 surprise = Set(skipped) - e.getexpected() - Set(resource_denieds)
310 if surprise:
311 print count(len(surprise), "skip"), \
312 "unexpected on", plat + ":"
313 printlist(surprise)
314 else:
315 print "Those skips are all expected on", plat + "."
316 else:
317 print "Ask someone to teach regrtest.py about which tests are"
318 print "expected to get skipped on", plat + "."
320 if single:
321 alltests = findtests(testdir, stdtests, nottests)
322 for i in range(len(alltests)):
323 if tests[0] == alltests[i]:
324 if i == len(alltests) - 1:
325 os.unlink(filename)
326 else:
327 fp = open(filename, 'w')
328 fp.write(alltests[i+1] + '\n')
329 fp.close()
330 break
331 else:
332 os.unlink(filename)
334 sys.exit(len(bad) > 0)
337 STDTESTS = [
338 'test_grammar',
339 'test_opcodes',
340 'test_operations',
341 'test_builtin',
342 'test_exceptions',
343 'test_types',
346 NOTTESTS = [
347 'test_support',
348 'test_future1',
349 'test_future2',
350 'test_future3',
353 def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
354 """Return a list of all applicable test modules."""
355 if not testdir: testdir = findtestdir()
356 names = os.listdir(testdir)
357 tests = []
358 for name in names:
359 if name[:5] == "test_" and name[-3:] == os.extsep+"py":
360 modname = name[:-3]
361 if modname not in stdtests and modname not in nottests:
362 tests.append(modname)
363 tests.sort()
364 return stdtests + tests
366 def runtest(test, generate, verbose, quiet, testdir = None):
367 """Run a single test.
368 test -- the name of the test
369 generate -- if true, generate output, instead of running the test
370 and comparing it to a previously created output file
371 verbose -- if true, print more messages
372 quiet -- if true, don't print 'skipped' messages (probably redundant)
373 testdir -- test directory
375 test_support.unload(test)
376 if not testdir: testdir = findtestdir()
377 outputdir = os.path.join(testdir, "output")
378 outputfile = os.path.join(outputdir, test)
379 if verbose:
380 cfp = None
381 else:
382 cfp = cStringIO.StringIO()
383 try:
384 save_stdout = sys.stdout
385 try:
386 if cfp:
387 sys.stdout = cfp
388 print test # Output file starts with test name
389 if test.startswith('test.'):
390 abstest = test
391 else:
392 # Always import it from the test package
393 abstest = 'test.' + test
394 the_package = __import__(abstest, globals(), locals(), [])
395 the_module = getattr(the_package, test)
396 # Most tests run to completion simply as a side-effect of
397 # being imported. For the benefit of tests that can't run
398 # that way (like test_threaded_import), explicitly invoke
399 # their test_main() function (if it exists).
400 indirect_test = getattr(the_module, "test_main", None)
401 if indirect_test is not None:
402 indirect_test()
403 finally:
404 sys.stdout = save_stdout
405 except test_support.ResourceDenied, msg:
406 if not quiet:
407 print test, "skipped --", msg
408 sys.stdout.flush()
409 return -2
410 except (ImportError, test_support.TestSkipped), msg:
411 if not quiet:
412 print test, "skipped --", msg
413 sys.stdout.flush()
414 return -1
415 except KeyboardInterrupt:
416 raise
417 except test_support.TestFailed, msg:
418 print "test", test, "failed --", msg
419 sys.stdout.flush()
420 return 0
421 except:
422 type, value = sys.exc_info()[:2]
423 print "test", test, "crashed --", str(type) + ":", value
424 sys.stdout.flush()
425 if verbose:
426 traceback.print_exc(file=sys.stdout)
427 sys.stdout.flush()
428 return 0
429 else:
430 if not cfp:
431 return 1
432 output = cfp.getvalue()
433 if generate:
434 if output == test + "\n":
435 if os.path.exists(outputfile):
436 # Write it since it already exists (and the contents
437 # may have changed), but let the user know it isn't
438 # needed:
439 print "output file", outputfile, \
440 "is no longer needed; consider removing it"
441 else:
442 # We don't need it, so don't create it.
443 return 1
444 fp = open(outputfile, "w")
445 fp.write(output)
446 fp.close()
447 return 1
448 if os.path.exists(outputfile):
449 fp = open(outputfile, "r")
450 expected = fp.read()
451 fp.close()
452 else:
453 expected = test + "\n"
454 if output == expected:
455 return 1
456 print "test", test, "produced unexpected output:"
457 sys.stdout.flush()
458 reportdiff(expected, output)
459 sys.stdout.flush()
460 return 0
462 def reportdiff(expected, output):
463 import difflib
464 print "*" * 70
465 a = expected.splitlines(1)
466 b = output.splitlines(1)
467 sm = difflib.SequenceMatcher(a=a, b=b)
468 tuples = sm.get_opcodes()
470 def pair(x0, x1):
471 # x0:x1 are 0-based slice indices; convert to 1-based line indices.
472 x0 += 1
473 if x0 >= x1:
474 return "line " + str(x0)
475 else:
476 return "lines %d-%d" % (x0, x1)
478 for op, a0, a1, b0, b1 in tuples:
479 if op == 'equal':
480 pass
482 elif op == 'delete':
483 print "***", pair(a0, a1), "of expected output missing:"
484 for line in a[a0:a1]:
485 print "-", line,
487 elif op == 'replace':
488 print "*** mismatch between", pair(a0, a1), "of expected", \
489 "output and", pair(b0, b1), "of actual output:"
490 for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
491 print line,
493 elif op == 'insert':
494 print "***", pair(b0, b1), "of actual output doesn't appear", \
495 "in expected output after line", str(a1)+":"
496 for line in b[b0:b1]:
497 print "+", line,
499 else:
500 print "get_opcodes() returned bad tuple?!?!", (op, a0, a1, b0, b1)
502 print "*" * 70
504 def findtestdir():
505 if __name__ == '__main__':
506 file = sys.argv[0]
507 else:
508 file = __file__
509 testdir = os.path.dirname(file) or os.curdir
510 return testdir
512 def removepy(name):
513 if name.endswith(os.extsep + "py"):
514 name = name[:-3]
515 return name
517 def count(n, word):
518 if n == 1:
519 return "%d %s" % (n, word)
520 else:
521 return "%d %ss" % (n, word)
523 def printlist(x, width=70, indent=4):
524 """Print the elements of iterable x to stdout.
526 Optional arg width (default 70) is the maximum line length.
527 Optional arg indent (default 4) is the number of blanks with which to
528 begin each line.
531 from textwrap import fill
532 blanks = ' ' * indent
533 print fill(' '.join(map(str, x)), width,
534 initial_indent=blanks, subsequent_indent=blanks)
536 # Map sys.platform to a string containing the basenames of tests
537 # expected to be skipped on that platform.
539 # Special cases:
540 # test_pep277
541 # The _ExpectedSkips constructor adds this to the set of expected
542 # skips if not os.path.supports_unicode_filenames.
543 # test_normalization
544 # Whether a skip is expected here depends on whether a large test
545 # input file has been downloaded. test_normalization.skip_expected
546 # controls that.
547 # test_socket_ssl
548 # Controlled by test_socket_ssl.skip_expected. Requires the network
549 # resource, and a socket module with ssl support.
550 # test_timeout
551 # Controlled by test_timeout.skip_expected. Requires the network
552 # resource and a socket module.
554 _expectations = {
555 'win32':
557 test_al
558 test_bsddb185
559 test_bsddb3
560 test_cd
561 test_cl
562 test_commands
563 test_crypt
564 test_curses
565 test_dbm
566 test_dl
567 test_email_codecs
568 test_fcntl
569 test_fork1
570 test_gdbm
571 test_gl
572 test_grp
573 test_imgfile
574 test_ioctl
575 test_largefile
576 test_linuxaudiodev
577 test_mhlib
578 test_mpz
579 test_nis
580 test_openpty
581 test_ossaudiodev
582 test_poll
583 test_posix
584 test_pty
585 test_pwd
586 test_resource
587 test_signal
588 test_sunaudiodev
589 test_timing
590 """,
591 'linux2':
593 test_al
594 test_bsddb185
595 test_cd
596 test_cl
597 test_curses
598 test_dl
599 test_email_codecs
600 test_gl
601 test_imgfile
602 test_largefile
603 test_linuxaudiodev
604 test_nis
605 test_ntpath
606 test_ossaudiodev
607 test_sunaudiodev
608 """,
609 'mac':
611 test_al
612 test_atexit
613 test_bsddb
614 test_bsddb185
615 test_bsddb3
616 test_bz2
617 test_cd
618 test_cl
619 test_commands
620 test_crypt
621 test_curses
622 test_dbm
623 test_dl
624 test_email_codecs
625 test_fcntl
626 test_fork1
627 test_gl
628 test_grp
629 test_ioctl
630 test_imgfile
631 test_largefile
632 test_linuxaudiodev
633 test_locale
634 test_mmap
635 test_mpz
636 test_nis
637 test_ntpath
638 test_openpty
639 test_ossaudiodev
640 test_poll
641 test_popen
642 test_popen2
643 test_posix
644 test_pty
645 test_pwd
646 test_resource
647 test_signal
648 test_sunaudiodev
649 test_sundry
650 test_tarfile
651 test_timing
652 """,
653 'unixware7':
655 test_al
656 test_bsddb
657 test_bsddb185
658 test_cd
659 test_cl
660 test_dl
661 test_gl
662 test_imgfile
663 test_largefile
664 test_linuxaudiodev
665 test_minidom
666 test_nis
667 test_ntpath
668 test_openpty
669 test_pyexpat
670 test_sax
671 test_sunaudiodev
672 test_sundry
673 """,
674 'openunix8':
676 test_al
677 test_bsddb
678 test_bsddb185
679 test_cd
680 test_cl
681 test_dl
682 test_gl
683 test_imgfile
684 test_largefile
685 test_linuxaudiodev
686 test_minidom
687 test_nis
688 test_ntpath
689 test_openpty
690 test_pyexpat
691 test_sax
692 test_sunaudiodev
693 test_sundry
694 """,
695 'sco_sv3':
697 test_al
698 test_asynchat
699 test_bsddb
700 test_bsddb185
701 test_cd
702 test_cl
703 test_dl
704 test_fork1
705 test_gettext
706 test_gl
707 test_imgfile
708 test_largefile
709 test_linuxaudiodev
710 test_locale
711 test_minidom
712 test_nis
713 test_ntpath
714 test_openpty
715 test_pyexpat
716 test_queue
717 test_sax
718 test_sunaudiodev
719 test_sundry
720 test_thread
721 test_threaded_import
722 test_threadedtempfile
723 test_threading
724 """,
725 'riscos':
727 test_al
728 test_asynchat
729 test_atexit
730 test_bsddb
731 test_bsddb185
732 test_bsddb3
733 test_cd
734 test_cl
735 test_commands
736 test_crypt
737 test_dbm
738 test_dl
739 test_fcntl
740 test_fork1
741 test_gdbm
742 test_gl
743 test_grp
744 test_imgfile
745 test_largefile
746 test_linuxaudiodev
747 test_locale
748 test_mmap
749 test_nis
750 test_ntpath
751 test_openpty
752 test_poll
753 test_popen2
754 test_pty
755 test_pwd
756 test_strop
757 test_sunaudiodev
758 test_sundry
759 test_thread
760 test_threaded_import
761 test_threadedtempfile
762 test_threading
763 test_timing
764 """,
765 'darwin':
767 test_al
768 test_bsddb
769 test_bsddb3
770 test_cd
771 test_cl
772 test_curses
773 test_dl
774 test_email_codecs
775 test_gdbm
776 test_gl
777 test_imgfile
778 test_largefile
779 test_linuxaudiodev
780 test_locale
781 test_minidom
782 test_mpz
783 test_nis
784 test_ntpath
785 test_ossaudiodev
786 test_poll
787 test_sunaudiodev
788 """,
789 'sunos5':
791 test_al
792 test_bsddb
793 test_bsddb185
794 test_cd
795 test_cl
796 test_curses
797 test_dbm
798 test_email_codecs
799 test_gdbm
800 test_gl
801 test_gzip
802 test_imgfile
803 test_linuxaudiodev
804 test_mpz
805 test_openpty
806 test_zipfile
807 test_zlib
808 """,
809 'hp-ux11':
811 test_al
812 test_bsddb
813 test_bsddb185
814 test_cd
815 test_cl
816 test_curses
817 test_dl
818 test_gdbm
819 test_gl
820 test_gzip
821 test_imgfile
822 test_largefile
823 test_linuxaudiodev
824 test_locale
825 test_minidom
826 test_nis
827 test_ntpath
828 test_openpty
829 test_pyexpat
830 test_sax
831 test_sunaudiodev
832 test_zipfile
833 test_zlib
834 """,
835 'atheos':
837 test_al
838 test_bsddb185
839 test_cd
840 test_cl
841 test_curses
842 test_dl
843 test_email_codecs
844 test_gdbm
845 test_gl
846 test_imgfile
847 test_largefile
848 test_linuxaudiodev
849 test_locale
850 test_mhlib
851 test_mmap
852 test_mpz
853 test_nis
854 test_poll
855 test_popen2
856 test_resource
857 test_sunaudiodev
858 """,
859 'cygwin':
861 test_al
862 test_bsddb185
863 test_bsddb3
864 test_cd
865 test_cl
866 test_curses
867 test_dbm
868 test_email_codecs
869 test_gl
870 test_imgfile
871 test_largefile
872 test_linuxaudiodev
873 test_locale
874 test_mpz
875 test_nis
876 test_ossaudiodev
877 test_socketserver
878 test_sunaudiodev
879 """,
880 'os2emx':
882 test_al
883 test_audioop
884 test_bsddb185
885 test_bsddb3
886 test_cd
887 test_cl
888 test_commands
889 test_curses
890 test_dl
891 test_email_codecs
892 test_gl
893 test_imgfile
894 test_largefile
895 test_linuxaudiodev
896 test_mhlib
897 test_mmap
898 test_nis
899 test_openpty
900 test_ossaudiodev
901 test_pty
902 test_resource
903 test_signal
904 test_sunaudiodev
905 """,
906 'freebsd4':
908 test_aepack
909 test_al
910 test_bsddb
911 test_bsddb3
912 test_cd
913 test_cl
914 test_email_codecs
915 test_gl
916 test_imgfile
917 test_linuxaudiodev
918 test_locale
919 test_macfs
920 test_macostools
921 test_nis
922 test_normalization
923 test_ossaudiodev
924 test_pep277
925 test_plistlib
926 test_scriptpackages
927 test_socket_ssl
928 test_socketserver
929 test_sunaudiodev
930 test_timeout
931 test_unicode_file
932 test_urllibnet
933 test_winreg
934 test_winsound
935 """,
938 class _ExpectedSkips:
939 def __init__(self):
940 import os.path
941 from test import test_normalization
942 from test import test_socket_ssl
943 from test import test_timeout
945 self.valid = False
946 if sys.platform in _expectations:
947 s = _expectations[sys.platform]
948 self.expected = Set(s.split())
950 if not os.path.supports_unicode_filenames:
951 self.expected.add('test_pep277')
953 if test_normalization.skip_expected:
954 self.expected.add('test_normalization')
956 if test_socket_ssl.skip_expected:
957 self.expected.add('test_socket_ssl')
959 if test_timeout.skip_expected:
960 self.expected.add('test_timeout')
962 if not sys.platform in ("mac", "darwin"):
963 MAC_ONLY = ["test_macostools", "test_macfs", "test_aepack",
964 "test_plistlib", "test_scriptpackages"]
965 for skip in MAC_ONLY:
966 self.expected.add(skip)
968 if sys.platform != "win32":
969 WIN_ONLY = ["test_unicode_file", "test_winreg",
970 "test_winsound"]
971 for skip in WIN_ONLY:
972 self.expected.add(skip)
974 self.valid = True
976 def isvalid(self):
977 "Return true iff _ExpectedSkips knows about the current platform."
978 return self.valid
980 def getexpected(self):
981 """Return set of test names we expect to skip on current platform.
983 self.isvalid() must be true.
986 assert self.isvalid()
987 return self.expected
989 if __name__ == '__main__':
990 # Remove regrtest.py's own directory from the module search path. This
991 # prevents relative imports from working, and relative imports will screw
992 # up the testing framework. E.g. if both test.test_support and
993 # test_support are imported, they will not contain the same globals, and
994 # much of the testing framework relies on the globals in the
995 # test.test_support module.
996 mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
997 i = pathlen = len(sys.path)
998 while i >= 0:
999 i -= 1
1000 if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
1001 del sys.path[i]
1002 if len(sys.path) == pathlen:
1003 print 'Could not find %r in sys.path to remove it' % mydir
1004 main()