Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r70554 | benjamin.peterson | 2009-03-23 16:25:15 -0500 (Mon, 23 Mar 2009) | 1 line

  complain when there's no last exception
........
  r70588 | benjamin.peterson | 2009-03-24 17:56:32 -0500 (Tue, 24 Mar 2009) | 1 line

  fix newline issue in test summary
........
  r70589 | benjamin.peterson | 2009-03-24 18:07:07 -0500 (Tue, 24 Mar 2009) | 1 line

  another style nit
........
  r70598 | benjamin.peterson | 2009-03-25 16:24:04 -0500 (Wed, 25 Mar 2009) | 1 line

  add shorthands for expected failures and unexpected success
........
  r70605 | benjamin.peterson | 2009-03-26 11:32:23 -0500 (Thu, 26 Mar 2009) | 1 line

  remove uneeded function
........
  r70611 | benjamin.peterson | 2009-03-26 13:35:37 -0500 (Thu, 26 Mar 2009) | 1 line

  add much better tests for python version information parsing
........
  r70612 | benjamin.peterson | 2009-03-26 13:55:48 -0500 (Thu, 26 Mar 2009) | 1 line

  more and more implementations now support sys.subversion
........
  r70613 | benjamin.peterson | 2009-03-26 13:58:30 -0500 (Thu, 26 Mar 2009) | 1 line

  roll old test in with new one
........
  r70614 | benjamin.peterson | 2009-03-26 14:09:21 -0500 (Thu, 26 Mar 2009) | 1 line

  add support for PyPy
........
  r70615 | benjamin.peterson | 2009-03-26 14:58:18 -0500 (Thu, 26 Mar 2009) | 5 lines

  add some useful utilities for skipping tests with unittest's new skipping ability

  most significantly apply a modified portion of the patch from #4242 with
  patches for skipping implementation details
........
  r70616 | benjamin.peterson | 2009-03-26 15:05:50 -0500 (Thu, 26 Mar 2009) | 1 line

  rename TestCase.skip() to skipTest() because it causes annoying problems with trial #5571
........
  r70617 | benjamin.peterson | 2009-03-26 15:17:27 -0500 (Thu, 26 Mar 2009) | 1 line

  apply the second part of #4242's patch; classify all the implementation details in test_descr
........
  r70618 | benjamin.peterson | 2009-03-26 15:48:25 -0500 (Thu, 26 Mar 2009) | 1 line

  remove test_support.TestSkipped and just use unittest.SkipTest
........
  r70619 | benjamin.peterson | 2009-03-26 15:49:40 -0500 (Thu, 26 Mar 2009) | 1 line

  fix naming
........
  r70620 | benjamin.peterson | 2009-03-26 16:10:30 -0500 (Thu, 26 Mar 2009) | 1 line

  fix incorrect auto-translation of TestSkipped -> unittest.SkipTest
........
  r70621 | benjamin.peterson | 2009-03-26 16:11:16 -0500 (Thu, 26 Mar 2009) | 1 line

  must pass argument to get expected behavior ;)
........
  r70623 | benjamin.peterson | 2009-03-26 16:30:10 -0500 (Thu, 26 Mar 2009) | 1 line

  add missing import
........
  r70624 | benjamin.peterson | 2009-03-26 16:30:54 -0500 (Thu, 26 Mar 2009) | 1 line

  ** is required here
........
  r70626 | benjamin.peterson | 2009-03-26 16:40:29 -0500 (Thu, 26 Mar 2009) | 1 line

  update email tests to use SkipTest
........
  r70627 | benjamin.peterson | 2009-03-26 16:44:43 -0500 (Thu, 26 Mar 2009) | 1 line

  fix another name
........
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 203bd95..66c39d6 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -139,6 +139,7 @@
 import time
 import traceback
 import warnings
+import unittest
 from inspect import isabstract
 
 # I see no other way to suppress these warnings;
@@ -614,7 +615,7 @@
             print(test, "skipped --", msg)
             sys.stdout.flush()
         return -2
-    except (ImportError, support.TestSkipped) as msg:
+    except (ImportError, unittest.SkipTest) as msg:
         if not quiet:
             print(test, "skipped --", msg)
             sys.stdout.flush()
diff --git a/Lib/test/support.py b/Lib/test/support.py
index 0fa9d6b..e209170 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -8,12 +8,12 @@
 import socket
 import sys
 import os
-import os.path
+import platform
 import shutil
 import warnings
 import unittest
 
-__all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module",
+__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module",
            "verbose", "use_resources", "max_memuse", "record_original_stdout",
            "get_original_stdout", "unload", "unlink", "rmtree", "forget",
            "is_resource_enabled", "requires", "find_unused_port", "bind_port",
@@ -24,7 +24,7 @@
            "TransientResource", "transient_internet", "run_with_locale",
            "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
            "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
-           "reap_children"]
+           "reap_children", "cpython_only", "check_impl_detail"]
 
 class Error(Exception):
     """Base class for regression test exceptions."""
@@ -32,17 +32,7 @@
 class TestFailed(Error):
     """Test failed."""
 
-class TestSkipped(Error):
-    """Test skipped.
-
-    This can be raised to indicate that a test was deliberatly
-    skipped, but not because a feature wasn't available.  For
-    example, if some resource can't be used, such as the network
-    appears to be unavailable, this should be raised instead of
-    TestFailed.
-    """
-
-class ResourceDenied(TestSkipped):
+class ResourceDenied(unittest.SkipTest):
     """Test skipped because it requested a disallowed resource.
 
     This is raised when a test calls requires() for a resource that
@@ -51,7 +41,7 @@
     """
 
 def import_module(name, deprecated=False):
-    """Import the module to be tested, raising TestSkipped if it is not
+    """Import the module to be tested, raising SkipTest if it is not
     available."""
     with warnings.catch_warnings():
         if deprecated:
@@ -60,7 +50,7 @@
         try:
             module = __import__(name, level=0)
         except ImportError:
-            raise TestSkipped("No module named " + name)
+            raise unittest.SkipTest("No module named " + name)
         else:
             return module
 
@@ -124,7 +114,7 @@
     possibility of False being returned occurs when regrtest.py is executing."""
     # see if the caller's module is __main__ - if so, treat as if
     # the resource was set
-    if sys._getframe().f_back.f_globals.get("__name__") == "__main__":
+    if sys._getframe(1).f_globals.get("__name__") == "__main__":
         return
     if not is_resource_enabled(resource):
         if msg is None:
@@ -357,12 +347,8 @@
         unlink(TESTFN)
 
 def check_syntax_error(testcase, statement):
-    try:
-        compile(statement, '<test string>', 'exec')
-    except SyntaxError:
-        pass
-    else:
-        testcase.fail('Missing SyntaxError: "%s"' % statement)
+    testcase.assertRaises(SyntaxError, compile, statement,
+                          '<test string>', 'exec')
 
 def open_urlresource(url, *args, **kw):
     import urllib.request, urllib.parse
@@ -522,6 +508,21 @@
 def captured_stdout():
     return captured_output("stdout")
 
+def gc_collect():
+    """Force as many objects as possible to be collected.
+
+    In non-CPython implementations of Python, this is needed because timely
+    deallocation is not guaranteed by the garbage collector.  (Even in CPython
+    this can be the case in case of reference cycles.)  This means that __del__
+    methods may be called later than expected and weakrefs may remain alive for
+    longer than expected.  This function tries its best to force all garbage
+    objects to disappear.
+    """
+    import gc
+    gc.collect()
+    gc.collect()
+    gc.collect()
+
 
 #=======================================================================
 # Decorator for running a function in a different locale, correctly resetting
@@ -681,6 +682,55 @@
         test(result)
         return result
 
+def _id(obj):
+    return obj
+
+def requires_resource(resource):
+    if resource_is_enabled(resource):
+        return _id
+    else:
+        return unittest.skip("resource {0!r} is not enabled".format(resource))
+
+def cpython_only(test):
+    """
+    Decorator for tests only applicable on CPython.
+    """
+    return impl_detail(cpython=True)(test)
+
+def impl_detail(msg=None, **guards):
+    if check_impl_detail(**guards):
+        return _id
+    if msg is None:
+        guardnames, default = _parse_guards(guards)
+        if default:
+            msg = "implementation detail not available on {0}"
+        else:
+            msg = "implementation detail specific to {0}"
+        guardnames = sorted(guardnames.keys())
+        msg = msg.format(' or '.join(guardnames))
+    return unittest.skip(msg)
+
+def _parse_guards(guards):
+    # Returns a tuple ({platform_name: run_me}, default_value)
+    if not guards:
+        return ({'cpython': True}, False)
+    is_true = guards.values()[0]
+    assert guards.values() == [is_true] * len(guards)   # all True or all False
+    return (guards, not is_true)
+
+# Use the following check to guard CPython's implementation-specific tests --
+# or to run them only on the implementation(s) guarded by the arguments.
+def check_impl_detail(**guards):
+    """This function returns True or False depending on the host platform.
+       Examples:
+          if check_impl_detail():               # only on CPython (default)
+          if check_impl_detail(jython=True):    # only on Jython
+          if check_impl_detail(cpython=False):  # everywhere except on CPython
+    """
+    guards, default = _parse_guards(guards)
+    return guards.get(platform.python_implementation().lower(), default)
+
+
 
 def _run_suite(suite):
     """Run tests from a unittest.TestSuite-derived class."""
diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py
index 9dec027..918be89 100644
--- a/Lib/test/test__locale.py
+++ b/Lib/test/test__locale.py
@@ -1,4 +1,4 @@
-from test.support import verbose, TestSkipped, run_unittest
+from test.support import verbose, run_unittest
 from _locale import (setlocale, LC_ALL, LC_CTYPE, LC_NUMERIC, RADIXCHAR, THOUSEP, nl_langinfo,
                     localeconv, Error)
 import unittest
@@ -7,7 +7,7 @@
 if uname()[0] == "Darwin":
     maj, min, mic = [int(part) for part in uname()[2].split(".")]
     if (maj, min, mic) < (8, 0, 0):
-        raise TestSkipped("locale support broken for OS X < 10.4")
+        raise unittest.SkipTest("locale support broken for OS X < 10.4")
 
 candidate_locales = ['es_UY', 'fr_FR', 'fi_FI', 'es_CO', 'pt_PT', 'it_IT',
     'et_EE', 'es_PY', 'no_NO', 'nl_NL', 'lv_LV', 'el_GR', 'be_BY', 'fr_BE',
diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py
index ebeb926..ed93946 100644
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -16,16 +16,16 @@
 # 'curses' resource be given on the regrtest command line using the -u
 # option.  If not available, nothing after this line will be executed.
 
-from test.support import requires, TestSkipped
+from test.support import requires
 requires('curses')
 
 # XXX: if newterm was supported we could use it instead of initscr and not exit
 term = os.environ.get('TERM')
 if not term or term == 'unknown':
-    raise TestSkipped("$TERM=%r, calling initscr() may cause exit" % term)
+    raise unittest.SkipTest("$TERM=%r, calling initscr() may cause exit" % term)
 
 if sys.platform == "cygwin":
-    raise TestSkipped("cygwin's curses mostly just hangs")
+    raise unittest.SkipTest("cygwin's curses mostly just hangs")
 
 def window_funcs(stdscr):
     "Test the methods of windows"
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index 219348c..ceca186 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -31,8 +31,7 @@
 import unittest
 from decimal import *
 import numbers
-from test.support import (TestSkipped, run_unittest, run_doctest,
-                               is_resource_enabled)
+from test.support import run_unittest, run_doctest, is_resource_enabled
 import random
 try:
     import threading
@@ -194,7 +193,7 @@
     def eval_file(self, file):
         global skip_expected
         if skip_expected:
-            raise TestSkipped
+            raise unittest.SkipTest
             return
         for line in open(file):
             line = line.replace('\r\n', '').replace('\n', '')
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 0554fc2..6dba040 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -65,8 +65,9 @@
         # Find method in parent class
         while meth not in t.__dict__:
             t = t.__bases__[0]
-
-        self.assertEqual(m, t.__dict__[meth])
+        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
+        # method object; the getattr() below obtains its underlying function.
+        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
         self.assertEqual(m(a), res)
         bm = getattr(a, meth)
         self.assertEqual(bm(), res)
@@ -85,7 +86,9 @@
         m = getattr(t, meth)
         while meth not in t.__dict__:
             t = t.__bases__[0]
-        self.assertEqual(m, t.__dict__[meth])
+        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
+        # method object; the getattr() below obtains its underlying function.
+        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
         self.assertEqual(m(a, b), res)
         bm = getattr(a, meth)
         self.assertEqual(bm(b), res)
@@ -97,7 +100,9 @@
         m = getattr(t, meth)
         while meth not in t.__dict__:
             t = t.__bases__[0]
-        self.assertEqual(m, t.__dict__[meth])
+        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
+        # method object; the getattr() below obtains its underlying function.
+        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
         self.assertEqual(m(a, slice(b, c)), res)
         bm = getattr(a, meth)
         self.assertEqual(bm(slice(b, c)), res)
@@ -110,7 +115,9 @@
         m = getattr(t, meth)
         while meth not in t.__dict__:
             t = t.__bases__[0]
-        self.assertEqual(m, t.__dict__[meth])
+        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
+        # method object; the getattr() below obtains its underlying function.
+        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
         d['a'] = deepcopy(a)
         m(d['a'], b)
         self.assertEqual(d['a'], res)
@@ -127,7 +134,9 @@
         m = getattr(t, meth)
         while meth not in t.__dict__:
             t = t.__bases__[0]
-        self.assertEqual(m, t.__dict__[meth])
+        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
+        # method object; the getattr() below obtains its underlying function.
+        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
         d['a'] = deepcopy(a)
         m(d['a'], b, c)
         self.assertEqual(d['a'], res)
@@ -144,7 +153,9 @@
         while meth not in t.__dict__:
             t = t.__bases__[0]
         m = getattr(t, meth)
-        self.assertEqual(m, t.__dict__[meth])
+        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
+        # method object; the getattr() below obtains its underlying function.
+        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
         dictionary['a'] = deepcopy(a)
         m(dictionary['a'], slice(b, c), d)
         self.assertEqual(dictionary['a'], res)
@@ -276,6 +287,7 @@
         self.assertEqual(repr(a), "234.5")
         self.assertEqual(a.prec, 12)
 
+    @support.impl_detail("the module 'xxsubtype' is internal")
     def test_spam_lists(self):
         # Testing spamlist operations...
         import copy, xxsubtype as spam
@@ -319,6 +331,7 @@
         a.setstate(42)
         self.assertEqual(a.getstate(), 42)
 
+    @support.impl_detail("the module 'xxsubtype' is internal")
     def test_spam_dicts(self):
         # Testing spamdict operations...
         import copy, xxsubtype as spam
@@ -778,8 +791,11 @@
             try:
                 callable(*args)
             except exc as msg:
-                if not str(msg).startswith(expected):
-                    self.fail("Message %r, expected %r" % (str(msg), expected))
+                # the exact msg is generally considered an impl detail
+                if support.check_impl_detail():
+                    if not str(msg).startswith(expected):
+                        self.fail("Message %r, expected %r" %
+                                  (str(msg), expected))
             else:
                 self.fail("Expected %s" % exc)
 
@@ -967,6 +983,7 @@
         x.c = Counted()
         self.assertEqual(Counted.counter, 3)
         del x
+        support.gc_collect()
         self.assertEqual(Counted.counter, 0)
         class D(C):
             pass
@@ -975,6 +992,7 @@
         x.z = Counted()
         self.assertEqual(Counted.counter, 2)
         del x
+        support.gc_collect()
         self.assertEqual(Counted.counter, 0)
         class E(D):
             __slots__ = ['e']
@@ -984,6 +1002,7 @@
         x.e = Counted()
         self.assertEqual(Counted.counter, 3)
         del x
+        support.gc_collect()
         self.assertEqual(Counted.counter, 0)
 
         # Test cyclical leaks [SF bug 519621]
@@ -994,21 +1013,22 @@
         s.a = [Counted(), s]
         self.assertEqual(Counted.counter, 1)
         s = None
-        import gc
-        gc.collect()
+        support.gc_collect()
         self.assertEqual(Counted.counter, 0)
 
         # Test lookup leaks [SF bug 572567]
         import sys,gc
-        class G(object):
-            def __eq__(self, other):
-                return 1
-        g = G()
-        orig_objects = len(gc.get_objects())
-        for i in range(10):
-            g==g
-        new_objects = len(gc.get_objects())
-        self.assertEqual(orig_objects, new_objects)
+        if hasattr(gc, 'get_objects'):
+            class G(object):
+                def __cmp__(self, other):
+                    return 0
+            g = G()
+            orig_objects = len(gc.get_objects())
+            for i in range(10):
+                g==g
+            new_objects = len(gc.get_objects())
+            self.assertEqual(orig_objects, new_objects)
+
         class H(object):
             __slots__ = ['a', 'b']
             def __init__(self):
@@ -1262,6 +1282,7 @@
         else:
             self.fail("classmethod shouldn't accept keyword args")
 
+    @support.impl_detail("the module 'xxsubtype' is internal")
     def test_classmethods_in_c(self):
         # Testing C-based class methods...
         import xxsubtype as spam
@@ -1293,6 +1314,7 @@
         self.assertEqual(d.foo(1), (d, 1))
         self.assertEqual(D.foo(d, 1), (d, 1))
 
+    @support.impl_detail("the module 'xxsubtype' is internal")
     def test_staticmethods_in_c(self):
         # Testing C-based static methods...
         import xxsubtype as spam
@@ -1410,6 +1432,14 @@
                     return [self, dict, object]
             class X(object, metaclass=_metaclass):
                 pass
+            # In CPython, the class creation above already raises
+            # TypeError, as a protection against the fact that
+            # instances of X would segfault it.  In other Python
+            # implementations it would be ok to let the class X
+            # be created, but instead get a clean TypeError on the
+            # __setitem__ below.
+            x = object.__new__(X)
+            x[5] = 6
         except TypeError:
             pass
         else:
@@ -1614,6 +1644,7 @@
         r = weakref.ref(c)
         self.assertEqual(r(), c)
         del c
+        support.gc_collect()
         self.assertEqual(r(), None)
         del r
         class NoWeak(object):
@@ -1631,6 +1662,7 @@
         r = weakref.ref(yes)
         self.assertEqual(r(), yes)
         del yes
+        support.gc_collect()
         self.assertEqual(r(), None)
         del r
 
@@ -1936,7 +1968,10 @@
 
         # Two essentially featureless objects, just inheriting stuff from
         # object.
-        self.assertEqual(dir(None), dir(Ellipsis))
+        self.assertEqual(dir(NotImplemented), dir(Ellipsis))
+        if support.check_impl_detail():
+            # None differs in PyPy: it has a __nonzero__
+            self.assertEqual(dir(None), dir(Ellipsis))
 
         # Nasty test case for proxied objects
         class Wrapper(object):
@@ -2652,7 +2687,7 @@
                 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
             try:
                 delattr(x, "__class__")
-            except TypeError:
+            except (TypeError, AttributeError):
                 pass
             else:
                 self.fail("shouldn't allow del %r.__class__" % x)
@@ -2780,6 +2815,16 @@
             mod.__dict__["spam"] = "eggs"
 
         # Exception's __dict__ can be replaced, but not deleted
+        # (at least not any more than regular exception's __dict__ can
+        # be deleted; on CPython it is not the case, whereas on PyPy they
+        # can, just like any other new-style instance's __dict__.)
+        def can_delete_dict(e):
+            try:
+                del e.__dict__
+            except (TypeError, AttributeError):
+                return False
+            else:
+                return True
         class Exception1(Exception, Base):
             pass
         class Exception2(Base, Exception):
@@ -2788,12 +2833,7 @@
             e = ExceptionType()
             e.__dict__ = {"a": 1}
             self.assertEqual(e.a, 1)
-            try:
-                del e.__dict__
-            except (TypeError, AttributeError):
-                pass
-            else:
-                self.fail("%r's __dict__ can be deleted" % e)
+            self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
 
     def test_pickles(self):
         # Testing pickling and copying new-style classes and objects...
@@ -3070,7 +3110,7 @@
         class B(A):
             pass
         del B
-        gc.collect()
+        support.gc_collect()
         A.__setitem__ = lambda *a: None # crash
 
     def test_buffer_inheritance(self):
@@ -3154,6 +3194,7 @@
         c = C()
         self.assertEqual(log, [])
         del c
+        support.gc_collect()
         self.assertEqual(log, [1])
 
         class D(object): pass
@@ -3249,7 +3290,7 @@
         self.assertEqual(hasattr(m, "__name__"), 0)
         self.assertEqual(hasattr(m, "__file__"), 0)
         self.assertEqual(hasattr(m, "foo"), 0)
-        self.assertEqual(m.__dict__, None)
+        self.assertFalse(m.__dict__)   # None or {} are both reasonable answers
         m.foo = 1
         self.assertEqual(m.__dict__, {"foo": 1})
 
@@ -3384,17 +3425,23 @@
         c = C()
         c.attr = 42
 
-        # The most interesting thing here is whether this blows up, due to flawed
-        # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
+        # The most interesting thing here is whether this blows up, due to
+        # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
+        # bug).
         del c
 
         # If that didn't blow up, it's also interesting to see whether clearing
-        # the last container slot works:  that will attempt to delete c again,
-        # which will cause c to get appended back to the container again "during"
-        # the del.
-        del C.container[-1]
+        # the last container slot works: that will attempt to delete c again,
+        # which will cause c to get appended back to the container again
+        # "during" the del.  (On non-CPython implementations, however, __del__
+        # is typically not called again.)
+        support.gc_collect()
         self.assertEqual(len(C.container), 1)
-        self.assertEqual(C.container[-1].attr, 42)
+        del C.container[-1]
+        if support.check_impl_detail():
+            support.gc_collect()
+            self.assertEqual(len(C.container), 1)
+            self.assertEqual(C.container[-1].attr, 42)
 
         # Make c mortal again, so that the test framework with -l doesn't report
         # it as a leak.
@@ -3420,7 +3467,8 @@
             pass
         class C(A,B) :
             __slots__=()
-        self.assertEqual(C.__basicsize__, B.__basicsize__)
+        if support.check_impl_detail():
+            self.assertEqual(C.__basicsize__, B.__basicsize__)
         self.assert_(hasattr(C, '__dict__'))
         self.assert_(hasattr(C, '__weakref__'))
         C().x = 2
@@ -3503,7 +3551,7 @@
 
         try:
             del D.__bases__
-        except TypeError:
+        except (TypeError, AttributeError):
             pass
         else:
             self.fail("shouldn't be able to delete .__bases__")
@@ -3681,6 +3729,7 @@
         self.assertEqual(E() // C(), "C.__floordiv__")
         self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
 
+    @support.impl_detail("testing an internal kind of method object")
     def test_meth_class_get(self):
         # Testing __get__ method of METH_CLASS C methods...
         # Full coverage of descrobject.c::classmethod_get()
@@ -3866,7 +3915,7 @@
 
         self.assertEqual(c.attr, 1)
         # this makes a crash more likely:
-        import gc; gc.collect()
+        support.gc_collect()
         self.assertEqual(hasattr(c, 'attr'), False)
 
     def test_init(self):
@@ -3893,8 +3942,14 @@
         self.assert_(l.__add__ != [5].__add__)
         self.assert_(l.__add__ != l.__mul__)
         self.assert_(l.__add__.__name__ == '__add__')
-        self.assert_(l.__add__.__self__ is l)
-        self.assert_(l.__add__.__objclass__ is list)
+        if hasattr(l.__add__, '__self__'):
+            # CPython
+            self.assert_(l.__add__.__self__ is l)
+            self.assert_(l.__add__.__objclass__ is list)
+        else:
+            # Python implementations where [].__add__ is a normal bound method
+            self.assert_(l.__add__.im_self is l)
+            self.assert_(l.__add__.im_class is list)
         self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
         try:
             hash(l.__add__)
diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py
index b1ca322..b596052 100644
--- a/Lib/test/test_epoll.py
+++ b/Lib/test/test_epoll.py
@@ -31,13 +31,13 @@
 
 from test import support
 if not hasattr(select, "epoll"):
-    raise support.TestSkipped("test works only on Linux 2.6")
+    raise unittest.SkipTest("test works only on Linux 2.6")
 
 try:
     select.epoll()
 except IOError as e:
     if e.errno == errno.ENOSYS:
-        raise support.TestSkipped("kernel doesn't support epoll()")
+        raise unittest.SkipTest("kernel doesn't support epoll()")
 
 class TestEPoll(unittest.TestCase):
 
diff --git a/Lib/test/test_fork1.py b/Lib/test/test_fork1.py
index e6d9eed..057c589 100644
--- a/Lib/test/test_fork1.py
+++ b/Lib/test/test_fork1.py
@@ -4,12 +4,12 @@
 import os
 import time
 from test.fork_wait import ForkWait
-from test.support import TestSkipped, run_unittest, reap_children
+from test.support import run_unittest, reap_children
 
 try:
     os.fork
 except AttributeError:
-    raise TestSkipped("os.fork not defined -- skipping test_fork1")
+    raise unittest.SkipTest("os.fork not defined -- skipping test_fork1")
 
 class ForkTest(ForkWait):
     def wait_impl(self, cpid):
diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py
index 537579a..f6508c2 100644
--- a/Lib/test/test_ioctl.py
+++ b/Lib/test/test_ioctl.py
@@ -1,18 +1,18 @@
 import unittest
-from test.support import TestSkipped, run_unittest
+from test.support import run_unittest
 import os, struct
 try:
     import fcntl, termios
 except ImportError:
-    raise TestSkipped("No fcntl or termios module")
+    raise unittest.SkipTest("No fcntl or termios module")
 if not hasattr(termios,'TIOCGPGRP'):
-    raise TestSkipped("termios module doesn't have TIOCGPGRP")
+    raise unittest.SkipTest("termios module doesn't have TIOCGPGRP")
 
 try:
     tty = open("/dev/tty", "r")
     tty.close()
 except IOError:
-    raise TestSkipped("Unable to open /dev/tty")
+    raise unittest.SkipTest("Unable to open /dev/tty")
 
 try:
     import pty
@@ -41,7 +41,7 @@
 
     def test_ioctl_signed_unsigned_code_param(self):
         if not pty:
-            raise TestSkipped('pty module required')
+            raise unittest.SkipTest('pty module required')
         mfd, sfd = pty.openpty()
         try:
             if termios.TIOCSWINSZ < 0:
diff --git a/Lib/test/test_kqueue.py b/Lib/test/test_kqueue.py
index eb4865a..42ef958 100644
--- a/Lib/test/test_kqueue.py
+++ b/Lib/test/test_kqueue.py
@@ -10,7 +10,7 @@
 
 from test import support
 if not hasattr(select, "kqueue"):
-    raise support.TestSkipped("test works only on BSD")
+    raise unittest.SkipTest("test works only on BSD")
 
 class TestKQueue(unittest.TestCase):
     def test_create_queue(self):
diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py
index d932659..1e868e0 100644
--- a/Lib/test/test_largefile.py
+++ b/Lib/test/test_largefile.py
@@ -6,7 +6,7 @@
 import sys
 import unittest
 from test.support import run_unittest, TESTFN, verbose, requires, \
-                              TestSkipped, unlink
+                              unlink
 import io  # C implementation of io
 import _pyio as pyio # Python implementation of io
 
@@ -106,7 +106,7 @@
             # this is already decided before start running the test suite
             # but we do it anyway for extra protection
             if not hasattr(f, 'truncate'):
-                raise TestSkipped("open().truncate() not available on this system")
+                raise unittest.SkipTest("open().truncate() not available on this system")
             f.seek(0, 2)
             # else we've lost track of the true size
             self.assertEqual(f.tell(), size+1)
@@ -165,7 +165,7 @@
         except (IOError, OverflowError):
             f.close()
             unlink(TESTFN)
-            raise TestSkipped("filesystem does not have largefile support")
+            raise unittest.SkipTest("filesystem does not have largefile support")
         else:
             f.close()
     suite = unittest.TestSuite()
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
index 7fc6372..c77dc55 100644
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -1,4 +1,4 @@
-from test.support import run_unittest, TestSkipped, verbose
+from test.support import run_unittest, verbose
 import unittest
 import locale
 import sys
@@ -9,7 +9,7 @@
 def get_enUS_locale():
     global enUS_locale
     if sys.platform == 'darwin':
-        raise TestSkipped("Locale support on MacOSX is minimal")
+        raise unittest.SkipTest("Locale support on MacOSX is minimal")
     if sys.platform.startswith("win"):
         tlocs = ("En", "English")
     else:
@@ -22,7 +22,7 @@
             continue
         break
     else:
-        raise TestSkipped(
+        raise unittest.SkipTest(
             "Test locale not supported (tried %s)" % (', '.join(tlocs)))
     enUS_locale = tloc
     locale.setlocale(locale.LC_NUMERIC, oldlocale)
@@ -318,10 +318,10 @@
         TestCNumberFormatting,
         TestFrFRNumberFormatting,
     ]
-    # TestSkipped can't be raised inside unittests, handle it manually instead
+    # SkipTest can't be raised inside unittests, handle it manually instead
     try:
         get_enUS_locale()
-    except TestSkipped as e:
+    except unittest.SkipTest as e:
         if verbose:
             print("Some tests will be disabled: %s" % e)
     else:
diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py
index c4c568f..59dca50 100644
--- a/Lib/test/test_minidom.py
+++ b/Lib/test/test_minidom.py
@@ -3,7 +3,7 @@
 import os
 import sys
 import pickle
-from test.support import verbose, run_unittest, TestSkipped
+from test.support import verbose, run_unittest
 import unittest
 
 import xml.dom
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
index 3681c60..0f91c97 100644
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/test_multiprocessing.py
@@ -23,8 +23,7 @@
 try:
     import multiprocessing.synchronize
 except ImportError as e:
-    from test.test_support import TestSkipped
-    raise TestSkipped(e)
+    raise unittest.SkipTest(e)
 
 import multiprocessing.dummy
 import multiprocessing.connection
@@ -1814,7 +1813,7 @@
             lock = multiprocessing.RLock()
         except OSError:
             from test.support import TestSkipped
-            raise TestSkipped("OSError raises on RLock creation, see issue 3111!")
+            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
 
     if run is None:
         from test.support import run_unittest as run
diff --git a/Lib/test/test_nis.py b/Lib/test/test_nis.py
index 1c17a4e..b4af95e 100644
--- a/Lib/test/test_nis.py
+++ b/Lib/test/test_nis.py
@@ -2,7 +2,7 @@
 import unittest
 import nis
 
-raise support.TestSkipped("test_nis hangs on Solaris")
+raise unittest.SkipTest("test_nis hangs on Solaris")
 
 class NisTests(unittest.TestCase):
     def test_maps(self):
@@ -12,7 +12,7 @@
             # NIS is probably not active, so this test isn't useful
             if support.verbose:
                 print("Test Skipped:", msg)
-            # Can't raise TestSkipped as regrtest only recognizes the exception
+            # Can't raise SkipTest as regrtest only recognizes the exception
             #   import time.
             return
         try:
diff --git a/Lib/test/test_openpty.py b/Lib/test/test_openpty.py
index 9272c85..e8175ff 100644
--- a/Lib/test/test_openpty.py
+++ b/Lib/test/test_openpty.py
@@ -1,10 +1,10 @@
 # Test to see if openpty works. (But don't worry if it isn't available.)
 
 import os, unittest
-from test.support import run_unittest, TestSkipped
+from test.support import run_unittest
 
 if not hasattr(os, "openpty"):
-    raise TestSkipped("No openpty() available.")
+    raise unittest.SkipTest("No openpty() available.")
 
 
 class OpenptyTest(unittest.TestCase):
diff --git a/Lib/test/test_ossaudiodev.py b/Lib/test/test_ossaudiodev.py
index 0e9ba45..e49cf2a 100644
--- a/Lib/test/test_ossaudiodev.py
+++ b/Lib/test/test_ossaudiodev.py
@@ -1,7 +1,7 @@
 from test import support
 support.requires('audio')
 
-from test.support import findfile, TestSkipped
+from test.support import findfile
 
 import errno
 import ossaudiodev
@@ -46,7 +46,7 @@
         except IOError as msg:
             if msg.args[0] in (errno.EACCES, errno.ENOENT,
                                errno.ENODEV, errno.EBUSY):
-                raise TestSkipped(msg)
+                raise unittest.SkipTest(msg)
             raise
 
         # at least check that these methods can be invoked
@@ -165,7 +165,7 @@
     except (ossaudiodev.error, IOError) as msg:
         if msg.args[0] in (errno.EACCES, errno.ENOENT,
                            errno.ENODEV, errno.EBUSY):
-            raise TestSkipped(msg)
+            raise unittest.SkipTest(msg)
         raise
     dsp.close()
     support.run_unittest(__name__)
diff --git a/Lib/test/test_pep277.py b/Lib/test/test_pep277.py
index eac5138..e18f602 100644
--- a/Lib/test/test_pep277.py
+++ b/Lib/test/test_pep277.py
@@ -3,7 +3,7 @@
 import sys, os, unittest
 from test import support
 if not os.path.supports_unicode_filenames:
-    raise support.TestSkipped("test works only on NT+")
+    raise unittest.SkipTest("test works only on NT+")
 
 filenames = [
     'abc',
diff --git a/Lib/test/test_pipes.py b/Lib/test/test_pipes.py
index d55f352..da6af5c 100644
--- a/Lib/test/test_pipes.py
+++ b/Lib/test/test_pipes.py
@@ -2,10 +2,10 @@
 import os
 import string
 import unittest
-from test.support import TESTFN, run_unittest, unlink, TestSkipped
+from test.support import TESTFN, run_unittest, unlink
 
 if os.name != 'posix':
-    raise TestSkipped('pipes module only works on posix')
+    raise unittest.SkipTest('pipes module only works on posix')
 
 TESTFN2 = TESTFN + "2"
 
diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
index a032df1..9bb5bdd 100644
--- a/Lib/test/test_platform.py
+++ b/Lib/test/test_platform.py
@@ -48,25 +48,73 @@
     def test_processor(self):
         res = platform.processor()
 
-    def test_python_implementation(self):
-        res = platform.python_implementation()
+    def setUp(self):
+        self.save_version = sys.version
+        self.save_subversion = sys.subversion
+        self.save_platform = sys.platform
 
-    def test_python_version(self):
-        res1 = platform.python_version()
-        res2 = platform.python_version_tuple()
-        self.assertEqual(res1, ".".join(res2))
+    def tearDown(self):
+        sys.version = self.save_version
+        sys.subversion = self.save_subversion
+        sys.platform = self.save_platform
 
-    def test_python_branch(self):
-        res = platform.python_branch()
+    def test_sys_version(self):
+        # Old test.
+        for input, output in (
+            ('2.4.3 (#1, Jun 21 2006, 13:54:21) \n[GCC 3.3.4 (pre 3.3.5 20040809)]',
+             ('CPython', '2.4.3', '', '', '1', 'Jun 21 2006 13:54:21', 'GCC 3.3.4 (pre 3.3.5 20040809)')),
+            ('IronPython 1.0.60816 on .NET 2.0.50727.42',
+             ('IronPython', '1.0.60816', '', '', '', '', '.NET 2.0.50727.42')),
+            ('IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42',
+             ('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')),
+            ):
+            # branch and revision are not "parsed", but fetched
+            # from sys.subversion.  Ignore them
+            (name, version, branch, revision, buildno, builddate, compiler) \
+                   = platform._sys_version(input)
+            self.assertEqual(
+                (name, version, '', '', buildno, builddate, compiler), output)
 
-    def test_python_revision(self):
-        res = platform.python_revision()
-
-    def test_python_build(self):
-        res = platform.python_build()
-
-    def test_python_compiler(self):
-        res = platform.python_compiler()
+        # Tests for python_implementation(), python_version(), python_branch(),
+        # python_revision(), python_build(), and python_compiler().
+        sys_versions = {
+            ("2.6.1 (r261:67515, Dec  6 2008, 15:26:00) \n[GCC 4.0.1 (Apple Computer, Inc. build 5370)]",
+             ('CPython', 'tags/r261', '67515'), self.save_platform)
+            :
+                ("CPython", "2.6.1", "tags/r261", "67515",
+                 ('r261:67515', 'Dec  6 2008 15:26:00'),
+                 'GCC 4.0.1 (Apple Computer, Inc. build 5370)'),
+            ("IronPython 2.0 (2.0.0.0) on .NET 2.0.50727.3053", None, "cli")
+            :
+                ("IronPython", "2.0.0", "", "", ("", ""),
+                 ".NET 2.0.50727.3053"),
+            ("2.5 (trunk:6107, Mar 26 2009, 13:02:18) \n[Java HotSpot(TM) Client VM (\"Apple Computer, Inc.\")]",
+            ('Jython', 'trunk', '6107'), "java1.5.0_16")
+            :
+                ("Jython", "2.5.0", "trunk", "6107",
+                 ('trunk:6107', 'Mar 26 2009'), "java1.5.0_16"),
+            ("2.5.2 (63378, Mar 26 2009, 18:03:29)\n[PyPy 1.0.0]",
+             ('PyPy', 'trunk', '63378'), self.save_platform)
+            :
+                ("PyPy", "2.5.2", "trunk", "63378", ('63378', 'Mar 26 2009'),
+                 "")
+            }
+        for (version_tag, subversion, sys_platform), info in \
+                sys_versions.items():
+            sys.version = version_tag
+            if subversion is None:
+                if hasattr(sys, "subversion"):
+                    del sys.subversion
+            else:
+                sys.subversion = subversion
+            if sys_platform is not None:
+                sys.platform = sys_platform
+            self.assertEqual(platform.python_implementation(), info[0])
+            self.assertEqual(platform.python_version(), info[1])
+            self.assertEqual(platform.python_branch(), info[2])
+            self.assertEqual(platform.python_revision(), info[3])
+            self.assertEqual(platform.python_build(), info[4])
+            self.assertEqual(platform.python_compiler(), info[5])
 
     def test_system_alias(self):
         res = platform.system_alias(
@@ -140,23 +188,6 @@
             ):
             self.assertEqual(platform._parse_release_file(input), output)
 
-    def test_sys_version(self):
-
-        platform._sys_version_cache.clear()
-        for input, output in (
-            ('2.4.3 (#1, Jun 21 2006, 13:54:21) \n[GCC 3.3.4 (pre 3.3.5 20040809)]',
-             ('CPython', '2.4.3', '', '', '1', 'Jun 21 2006 13:54:21', 'GCC 3.3.4 (pre 3.3.5 20040809)')),
-            ('IronPython 1.0.60816 on .NET 2.0.50727.42',
-             ('IronPython', '1.0.60816', '', '', '', '', '.NET 2.0.50727.42')),
-            ('IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42',
-             ('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')),
-            ):
-            # branch and revision are not "parsed", but fetched
-            # from sys.subversion.  Ignore them
-            (name, version, branch, revision, buildno, builddate, compiler) \
-                   = platform._sys_version(input)
-            self.assertEqual(
-                (name, version, '', '', buildno, builddate, compiler), output)
 
 def test_main():
     support.run_unittest(
diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py
index c346ba0..7ab3b84 100644
--- a/Lib/test/test_poll.py
+++ b/Lib/test/test_poll.py
@@ -1,12 +1,12 @@
 # Test case for the os.poll() function
 
 import os, select, random, unittest
-from test.support import TestSkipped, TESTFN, run_unittest
+from test.support import TESTFN, run_unittest
 
 try:
     select.poll
 except AttributeError:
-    raise TestSkipped("select.poll not defined -- skipping test_poll")
+    raise unittest.SkipTest("select.poll not defined -- skipping test_poll")
 
 
 def find_ready_matching(ready, flag):
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index 45decb7..2a0a876 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -5,7 +5,7 @@
 try:
     import posix
 except ImportError:
-    raise support.TestSkipped("posix is not available")
+    raise unittest.SkipTest("posix is not available")
 
 import time
 import os
@@ -225,17 +225,17 @@
                 os.mkdir(base_path)
                 os.chdir(base_path)
             except:
-#               Just returning nothing instead of the TestSkipped exception,
+#               Just returning nothing instead of the SkipTest exception,
 #               because the test results in Error in that case.
 #               Is that ok?
-#                raise support.TestSkipped, "cannot create directory for testing"
+#                raise unittest.SkipTest("cannot create directory for testing")
                 return
 
                 def _create_and_do_getcwd(dirname, current_path_length = 0):
                     try:
                         os.mkdir(dirname)
                     except:
-                        raise support.TestSkipped("mkdir cannot create directory sufficiently deep for getcwd test")
+                        raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
 
                     os.chdir(dirname)
                     try:
diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
index ec52f9f..3be7c97 100644
--- a/Lib/test/test_pty.py
+++ b/Lib/test/test_pty.py
@@ -4,7 +4,7 @@
 import os
 import sys
 import signal
-from test.support import verbose, TestSkipped, run_unittest
+from test.support import verbose, run_unittest
 import unittest
 
 TEST_STRING_1 = b"I wish to buy a fish license.\n"
@@ -69,7 +69,7 @@
             debug("Got slave_fd '%d'" % slave_fd)
         except OSError:
             # " An optional feature could not be imported " ... ?
-            raise TestSkipped("Pseudo-terminals (seemingly) not functional.")
+            raise unittest.SkipTest("Pseudo-terminals (seemingly) not functional.")
 
         self.assertTrue(os.isatty(slave_fd), 'slave_fd is not a tty')
 
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index b8ac2cc..570526c 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -10,7 +10,7 @@
 import sys, os, time, errno
 
 if sys.platform[:3] in ('win', 'os2') or sys.platform == 'riscos':
-    raise support.TestSkipped("Can't test signal on %s" % \
+    raise unittest.SkipTest("Can't test signal on %s" % \
                                    sys.platform)
 
 
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index 8a61e21..1bf143a 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -5,7 +5,7 @@
 
 """
 import unittest
-from test.support import TestSkipped, run_unittest, TESTFN
+from test.support import run_unittest, TESTFN
 import builtins
 import os
 import sys
@@ -17,7 +17,7 @@
 if "site" in sys.modules:
     import site
 else:
-    raise TestSkipped("importation of site.py suppressed")
+    raise unittest.SkipTest("importation of site.py suppressed")
 
 if not os.path.isdir(site.USER_SITE):
     # need to add user site directory for tests
diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py
index 4ffea57..43ce55c 100644
--- a/Lib/test/test_socketserver.py
+++ b/Lib/test/test_socketserver.py
@@ -16,7 +16,7 @@
 import socketserver
 
 import test.support
-from test.support import reap_children, verbose, TestSkipped
+from test.support import reap_children, verbose
 from test.support import TESTFN as TEST_FILE
 
 test.support.requires("network")
@@ -247,7 +247,7 @@
 def test_main():
     if imp.lock_held():
         # If the import lock is held, the threads will hang
-        raise TestSkipped("can't run when import lock is held")
+        raise unittest.SkipTest("can't run when import lock is held")
 
     test.support.run_unittest(SocketServerTest)
 
diff --git a/Lib/test/test_sqlite.py b/Lib/test/test_sqlite.py
index b8a9acf..611b30a 100644
--- a/Lib/test/test_sqlite.py
+++ b/Lib/test/test_sqlite.py
@@ -1,9 +1,10 @@
-from test.support import run_unittest, TestSkipped
+import unittest
+from test.support import run_unittest
 
 try:
     import _sqlite3
 except ImportError:
-    raise TestSkipped('no sqlite available')
+    raise unittest.SkipTest('no sqlite available')
 from sqlite3.test import (dbapi, types, userfunctions,
                                 factory, transactions, hooks, regression,
                                 dump)
diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
index 9d59a26..0be5652 100644
--- a/Lib/test/test_ssl.py
+++ b/Lib/test/test_ssl.py
@@ -1161,7 +1161,7 @@
 
 def test_main(verbose=False):
     if skip_expected:
-        raise support.TestSkipped("No SSL support")
+        raise unittest.SkipTest("No SSL support")
 
     global CERTFILE, SVN_PYTHON_ORG_ROOT_CERT
     CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir,
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index 0ef0925..27a2183 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -259,7 +259,7 @@
     def test_file_mode(self):
         # _mkstemp_inner creates files with the proper mode
         if not has_stat:
-            return            # ugh, can't use TestSkipped.
+            return            # ugh, can't use SkipTest.
 
         file = self.do_create()
         mode = stat.S_IMODE(os.stat(file.name).st_mode)
@@ -274,7 +274,7 @@
     def test_noinherit(self):
         # _mkstemp_inner file handles are not inherited by child processes
         if not has_spawnl:
-            return            # ugh, can't use TestSkipped.
+            return            # ugh, can't use SkipTest.
 
         if support.verbose:
             v="v"
@@ -312,7 +312,7 @@
     def test_textmode(self):
         # _mkstemp_inner can create files in text mode
         if not has_textmode:
-            return            # ugh, can't use TestSkipped.
+            return            # ugh, can't use SkipTest.
 
         self.do_create(bin=0).write(b"blat\n")
         # XXX should test that the file really is a text file
@@ -476,7 +476,7 @@
     def test_mode(self):
         # mkdtemp creates directories with the proper mode
         if not has_stat:
-            return            # ugh, can't use TestSkipped.
+            return            # ugh, can't use SkipTest.
 
         dir = self.do_create()
         try:
diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_threaded_import.py
index 67d1505..af9e89d 100644
--- a/Lib/test/test_threaded_import.py
+++ b/Lib/test/test_threaded_import.py
@@ -6,7 +6,7 @@
 # randrange, and then Python hangs.
 
 import _thread as thread
-from test.support import verbose, TestSkipped, TestFailed
+from test.support import verbose, TestFailed
 
 critical_section = thread.allocate_lock()
 done = thread.allocate_lock()
@@ -56,7 +56,7 @@
     import imp
     if imp.lock_held():
         # This triggers on, e.g., from test import autotest.
-        raise TestSkipped("can't run when import lock is held")
+        raise unittest.SkipTest("can't run when import lock is held")
 
     done.acquire()
     for N in (20, 50) * 3:
diff --git a/Lib/test/test_threadsignals.py b/Lib/test/test_threadsignals.py
index 14bd3b7..7959e91 100644
--- a/Lib/test/test_threadsignals.py
+++ b/Lib/test/test_threadsignals.py
@@ -5,10 +5,10 @@
 import signal
 import os
 import sys
-from test.support import run_unittest, TestSkipped
+from test.support import run_unittest
 
-if sys.platform[:3] in ('win', 'os2'):
-    raise TestSkipped("Can't test signal on %s" % sys.platform)
+if sys.platform[:3] in ('win', 'os2') or sys.platform=='riscos':
+    raise unittest.SkipTest("Can't test signal on %s" % sys.platform)
 
 process_pid = os.getpid()
 signalled_all=thread.allocate_lock()
diff --git a/Lib/test/test_tk.py b/Lib/test/test_tk.py
index 8b21a0f..20b3fb5 100644
--- a/Lib/test/test_tk.py
+++ b/Lib/test/test_tk.py
@@ -1,12 +1,13 @@
 import tkinter
 from tkinter.test import runtktests
 from test import support
+import unittest
 
 try:
     tkinter.Button()
 except tkinter.TclError as msg:
     # assuming tk is not available
-    raise support.TestSkipped("tk not available: %s" % msg)
+    raise unittest.SkipTest("tk not available: %s" % msg)
 
 def test_main(enable_gui=False):
     if enable_gui:
diff --git a/Lib/test/test_ttk_guionly.py b/Lib/test/test_ttk_guionly.py
index bff490a..4a9a30c 100644
--- a/Lib/test/test_ttk_guionly.py
+++ b/Lib/test/test_ttk_guionly.py
@@ -2,6 +2,7 @@
 import sys
 from tkinter import ttk
 from tkinter.test import runtktests
+import unittest
 from _tkinter import TclError
 from test import support
 
@@ -9,7 +10,7 @@
     ttk.Button()
 except TclError as msg:
     # assuming ttk is not available
-    raise support.TestSkipped("ttk not available: %s" % msg)
+    raise unittest.SkipTest("ttk not available: %s" % msg)
 
 def test_main(enable_gui=False):
     if enable_gui:
diff --git a/Lib/test/test_unicode_file.py b/Lib/test/test_unicode_file.py
index b9d9624..fd561f1 100644
--- a/Lib/test/test_unicode_file.py
+++ b/Lib/test/test_unicode_file.py
@@ -5,14 +5,14 @@
 import unicodedata
 
 import unittest
-from test.support import run_unittest, TestSkipped, TESTFN_UNICODE, rmtree
+from test.support import run_unittest, TESTFN_UNICODE, rmtree
 from test.support import TESTFN_ENCODING, TESTFN_UNICODE_UNENCODEABLE
 try:
     TESTFN_UNICODE.encode(TESTFN_ENCODING)
 except (UnicodeError, TypeError):
     # Either the file system encoding is None, or the file name
     # cannot be encoded in the file system encoding.
-    raise TestSkipped("No Unicode filesystem semantics on this platform")
+    raise unittest.SkipTest("No Unicode filesystem semantics on this platform.")
 
 def remove_if_exists(filename):
     if os.path.exists(filename):
diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py
index 9b8b00b..b7272f1 100644
--- a/Lib/test/test_unittest.py
+++ b/Lib/test/test_unittest.py
@@ -2304,7 +2304,7 @@
     def test_skipping(self):
         class Foo(unittest.TestCase):
             def test_skip_me(self):
-                self.skip("skip")
+                self.skipTest("skip")
         events = []
         result = LoggingResult(events)
         test = Foo("test_skip_me")
@@ -2315,7 +2315,7 @@
         # Try letting setUp skip the test now.
         class Foo(unittest.TestCase):
             def setUp(self):
-                self.skip("testing")
+                self.skipTest("testing")
             def test_nothing(self): pass
         events = []
         result = LoggingResult(events)
diff --git a/Lib/test/test_univnewlines.py b/Lib/test/test_univnewlines.py
index a6b9909..39f5519 100644
--- a/Lib/test/test_univnewlines.py
+++ b/Lib/test/test_univnewlines.py
@@ -7,8 +7,8 @@
 from test import support
 
 if not hasattr(sys.stdin, 'newlines'):
-    raise support.TestSkipped(
-                       "This Python does not have universal newline support")
+    raise unittest.SkipTest(
+        "This Python does not have universal newline support")
 
 FATX = 'x' * (2**14)
 
diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py
index 4cca441..786e60b 100644
--- a/Lib/test/test_wait3.py
+++ b/Lib/test/test_wait3.py
@@ -3,18 +3,19 @@
 
 import os
 import time
+import unittest
 from test.fork_wait import ForkWait
-from test.support import TestSkipped, run_unittest, reap_children
+from test.support import run_unittest, reap_children
 
 try:
     os.fork
 except AttributeError:
-    raise TestSkipped("os.fork not defined -- skipping test_wait3")
+    raise unittest.SkipTest("os.fork not defined -- skipping test_wait3")
 
 try:
     os.wait3
 except AttributeError:
-    raise TestSkipped("os.wait3 not defined -- skipping test_wait3")
+    raise unittest.SkipTest("os.wait3 not defined -- skipping test_wait3")
 
 class Wait3Test(ForkWait):
     def wait_impl(self, cpid):
diff --git a/Lib/test/test_wait4.py b/Lib/test/test_wait4.py
index 192fd94..8c6e4a3 100644
--- a/Lib/test/test_wait4.py
+++ b/Lib/test/test_wait4.py
@@ -4,17 +4,17 @@
 import os
 import time
 from test.fork_wait import ForkWait
-from test.support import TestSkipped, run_unittest, reap_children
+from test.support import run_unittest, reap_children
 
 try:
     os.fork
 except AttributeError:
-    raise TestSkipped("os.fork not defined -- skipping test_wait4")
+    raise unittest.SkipTest("os.fork not defined -- skipping test_wait4")
 
 try:
     os.wait4
 except AttributeError:
-    raise TestSkipped("os.wait4 not defined -- skipping test_wait4")
+    raise unittest.SkipTest("os.wait4 not defined -- skipping test_wait4")
 
 class Wait4Test(ForkWait):
     def wait_impl(self, cpid):