Make test.test_support.catch_warnings more robust as discussed on python-dev. Also add explicit tests for it to test_warnings. (forward port of r64910 from trunk)
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index bce8fdc..6dc0e8d 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -35,12 +35,9 @@
     @wraps(func)
     def decorator(*args, **kw):
         with catch_warning():
-            # Grrr, we need this function to warn every time.  Without removing
-            # the warningregistry, running test_tarfile then test_struct would fail
-            # on 64-bit platforms.
-            globals = func.__globals__
-            if '__warningregistry__' in globals:
-                del globals['__warningregistry__']
+            # We need this function to warn every time, so stick an
+            # unqualifed 'always' at the head of the filter list
+            warnings.simplefilter("always")
             warnings.filterwarnings("error", category=DeprecationWarning)
             return func(*args, **kw)
     return decorator
@@ -53,7 +50,7 @@
         pass
     except DeprecationWarning:
         if not PY_STRUCT_OVERFLOW_MASKING:
-            raise TestFailed("%s%s expected to raise struct.error" % (
+            raise TestFailed("%s%s expected to raise DeprecationWarning" % (
                 func.__name__, args))
     else:
         raise TestFailed("%s%s did not raise error" % (