#7772: Fix test_py3kwarn. Now the test suite could pass with "-3" flag.
diff --git a/Lib/test/test_py3kwarn.py b/Lib/test/test_py3kwarn.py
index c35e4b4..8bb21ba 100644
--- a/Lib/test/test_py3kwarn.py
+++ b/Lib/test/test_py3kwarn.py
@@ -3,11 +3,26 @@
 from test.test_support import check_warnings, CleanImport, run_unittest
 import warnings
 
-from contextlib import nested
-
 if not sys.py3kwarning:
     raise unittest.SkipTest('%s must be run with the -3 flag' % __name__)
 
+try:
+    from test.test_support import __warningregistry__ as _registry
+except ImportError:
+    def check_deprecated_module(module_name):
+        return False
+else:
+    past_warnings = _registry.keys()
+    del _registry
+    def check_deprecated_module(module_name):
+        """Lookup the past warnings for module already loaded using
+        test_support.import_module(..., deprecated=True)
+        """
+        return any(module_name in msg and ' removed' in msg
+                   and issubclass(cls, DeprecationWarning)
+                   and (' module' in msg or ' package' in msg)
+                   for (msg, cls, line) in past_warnings)
+
 def reset_module_registry(module):
     try:
         registry = module.__warningregistry__
@@ -341,11 +356,10 @@
     def check_removal(self, module_name, optional=False):
         """Make sure the specified module, when imported, raises a
         DeprecationWarning and specifies itself in the message."""
-        with nested(CleanImport(module_name), warnings.catch_warnings()):
-            # XXX: This is not quite enough for extension modules - those
-            # won't rerun their init code even with CleanImport.
-            # You can see this easily by running the whole test suite with -3
-            warnings.filterwarnings("error", ".+ removed",
+        with CleanImport(module_name), warnings.catch_warnings():
+            warnings.filterwarnings("error", ".+ (module|package) .+ removed",
+                                    DeprecationWarning, __name__)
+            warnings.filterwarnings("error", ".+ removed .+ (module|package)",
                                     DeprecationWarning, __name__)
             try:
                 __import__(module_name, level=0)
@@ -358,8 +372,11 @@
                     self.fail("Non-optional module {0} raised an "
                               "ImportError.".format(module_name))
             else:
-                self.fail("DeprecationWarning not raised for {0}"
-                            .format(module_name))
+                # For extension modules, check the __warningregistry__.
+                # They won't rerun their init code even with CleanImport.
+                if not check_deprecated_module(module_name):
+                    self.fail("DeprecationWarning not raised for {0}"
+                              .format(module_name))
 
     def test_platform_independent_removals(self):
         # Make sure that the modules that are available on all platforms raise
@@ -390,7 +407,7 @@
     def test_reduce_move(self):
         from operator import add
         # reduce tests may have already triggered this warning
-        reset_module_registry(unittest)
+        reset_module_registry(unittest.case)
         with warnings.catch_warnings():
             warnings.filterwarnings("error", "reduce")
             self.assertRaises(DeprecationWarning, reduce, add, range(10))
@@ -407,10 +424,8 @@
 
 
 def test_main():
-    with check_warnings():
-        warnings.simplefilter("always")
-        run_unittest(TestPy3KWarnings,
-                     TestStdlibRemovals)
+    run_unittest(TestPy3KWarnings,
+                 TestStdlibRemovals)
 
 if __name__ == '__main__':
     test_main()