| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 1 | from contextlib import contextmanager | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 2 | import linecache | 
| Raymond Hettinger | dc9dcf1 | 2003-07-13 06:15:11 +0000 | [diff] [blame] | 3 | import os | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 4 | from io import StringIO | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 5 | import sys | 
| Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 6 | import unittest | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 7 | import subprocess | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 8 | from test import support | 
| Antoine Pitrou | cf9f980 | 2010-11-10 13:55:25 +0000 | [diff] [blame] | 9 | from test.script_helper import assert_python_ok | 
| Jeremy Hylton | 8501466 | 2003-07-11 15:37:59 +0000 | [diff] [blame] | 10 |  | 
| Guido van Rossum | 805365e | 2007-05-07 22:24:25 +0000 | [diff] [blame] | 11 | from test import warning_tests | 
| Jeremy Hylton | 8501466 | 2003-07-11 15:37:59 +0000 | [diff] [blame] | 12 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 13 | import warnings as original_warnings | 
| Jeremy Hylton | 8501466 | 2003-07-11 15:37:59 +0000 | [diff] [blame] | 14 |  | 
| Nick Coghlan | 4738470 | 2009-04-22 16:13:36 +0000 | [diff] [blame] | 15 | py_warnings = support.import_fresh_module('warnings', blocked=['_warnings']) | 
 | 16 | c_warnings = support.import_fresh_module('warnings', fresh=['_warnings']) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 17 |  | 
 | 18 | @contextmanager | 
 | 19 | def warnings_state(module): | 
 | 20 |     """Use a specific warnings implementation in warning_tests.""" | 
 | 21 |     global __warningregistry__ | 
 | 22 |     for to_clear in (sys, warning_tests): | 
 | 23 |         try: | 
 | 24 |             to_clear.__warningregistry__.clear() | 
 | 25 |         except AttributeError: | 
 | 26 |             pass | 
 | 27 |     try: | 
 | 28 |         __warningregistry__.clear() | 
 | 29 |     except NameError: | 
 | 30 |         pass | 
 | 31 |     original_warnings = warning_tests.warnings | 
| Florent Xicluna | fd1b093 | 2010-03-28 00:25:02 +0000 | [diff] [blame] | 32 |     original_filters = module.filters | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 33 |     try: | 
| Florent Xicluna | fd1b093 | 2010-03-28 00:25:02 +0000 | [diff] [blame] | 34 |         module.filters = original_filters[:] | 
 | 35 |         module.simplefilter("once") | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 36 |         warning_tests.warnings = module | 
 | 37 |         yield | 
 | 38 |     finally: | 
 | 39 |         warning_tests.warnings = original_warnings | 
| Florent Xicluna | fd1b093 | 2010-03-28 00:25:02 +0000 | [diff] [blame] | 40 |         module.filters = original_filters | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 41 |  | 
 | 42 |  | 
 | 43 | class BaseTest(unittest.TestCase): | 
 | 44 |  | 
 | 45 |     """Basic bookkeeping required for testing.""" | 
 | 46 |  | 
 | 47 |     def setUp(self): | 
 | 48 |         # The __warningregistry__ needs to be in a pristine state for tests | 
 | 49 |         # to work properly. | 
 | 50 |         if '__warningregistry__' in globals(): | 
 | 51 |             del globals()['__warningregistry__'] | 
 | 52 |         if hasattr(warning_tests, '__warningregistry__'): | 
 | 53 |             del warning_tests.__warningregistry__ | 
 | 54 |         if hasattr(sys, '__warningregistry__'): | 
 | 55 |             del sys.__warningregistry__ | 
 | 56 |         # The 'warnings' module must be explicitly set so that the proper | 
 | 57 |         # interaction between _warnings and 'warnings' can be controlled. | 
 | 58 |         sys.modules['warnings'] = self.module | 
 | 59 |         super(BaseTest, self).setUp() | 
 | 60 |  | 
 | 61 |     def tearDown(self): | 
 | 62 |         sys.modules['warnings'] = original_warnings | 
 | 63 |         super(BaseTest, self).tearDown() | 
 | 64 |  | 
 | 65 |  | 
 | 66 | class FilterTests(object): | 
 | 67 |  | 
 | 68 |     """Testing the filtering functionality.""" | 
 | 69 |  | 
 | 70 |     def test_error(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 71 |         with original_warnings.catch_warnings(module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 72 |             self.module.resetwarnings() | 
 | 73 |             self.module.filterwarnings("error", category=UserWarning) | 
 | 74 |             self.assertRaises(UserWarning, self.module.warn, | 
 | 75 |                                 "FilterTests.test_error") | 
 | 76 |  | 
 | 77 |     def test_ignore(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 78 |         with original_warnings.catch_warnings(record=True, | 
 | 79 |                 module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 80 |             self.module.resetwarnings() | 
 | 81 |             self.module.filterwarnings("ignore", category=UserWarning) | 
 | 82 |             self.module.warn("FilterTests.test_ignore", UserWarning) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 83 |             self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 84 |  | 
 | 85 |     def test_always(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 86 |         with original_warnings.catch_warnings(record=True, | 
 | 87 |                 module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 88 |             self.module.resetwarnings() | 
 | 89 |             self.module.filterwarnings("always", category=UserWarning) | 
 | 90 |             message = "FilterTests.test_always" | 
 | 91 |             self.module.warn(message, UserWarning) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 92 |             self.assertTrue(message, w[-1].message) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 93 |             self.module.warn(message, UserWarning) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 94 |             self.assertTrue(w[-1].message, message) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 95 |  | 
 | 96 |     def test_default(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 97 |         with original_warnings.catch_warnings(record=True, | 
 | 98 |                 module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 99 |             self.module.resetwarnings() | 
 | 100 |             self.module.filterwarnings("default", category=UserWarning) | 
 | 101 |             message = UserWarning("FilterTests.test_default") | 
 | 102 |             for x in range(2): | 
 | 103 |                 self.module.warn(message, UserWarning) | 
 | 104 |                 if x == 0: | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 105 |                     self.assertEqual(w[-1].message, message) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 106 |                     del w[:] | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 107 |                 elif x == 1: | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 108 |                     self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 109 |                 else: | 
 | 110 |                     raise ValueError("loop variant unhandled") | 
 | 111 |  | 
 | 112 |     def test_module(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 113 |         with original_warnings.catch_warnings(record=True, | 
 | 114 |                 module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 115 |             self.module.resetwarnings() | 
 | 116 |             self.module.filterwarnings("module", category=UserWarning) | 
 | 117 |             message = UserWarning("FilterTests.test_module") | 
 | 118 |             self.module.warn(message, UserWarning) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 119 |             self.assertEqual(w[-1].message, message) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 120 |             del w[:] | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 121 |             self.module.warn(message, UserWarning) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 122 |             self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 123 |  | 
 | 124 |     def test_once(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 125 |         with original_warnings.catch_warnings(record=True, | 
 | 126 |                 module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 127 |             self.module.resetwarnings() | 
 | 128 |             self.module.filterwarnings("once", category=UserWarning) | 
 | 129 |             message = UserWarning("FilterTests.test_once") | 
 | 130 |             self.module.warn_explicit(message, UserWarning, "test_warnings.py", | 
 | 131 |                                     42) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 132 |             self.assertEqual(w[-1].message, message) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 133 |             del w[:] | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 134 |             self.module.warn_explicit(message, UserWarning, "test_warnings.py", | 
 | 135 |                                     13) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 136 |             self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 137 |             self.module.warn_explicit(message, UserWarning, "test_warnings2.py", | 
 | 138 |                                     42) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 139 |             self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 140 |  | 
 | 141 |     def test_inheritance(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 142 |         with original_warnings.catch_warnings(module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 143 |             self.module.resetwarnings() | 
 | 144 |             self.module.filterwarnings("error", category=Warning) | 
 | 145 |             self.assertRaises(UserWarning, self.module.warn, | 
 | 146 |                                 "FilterTests.test_inheritance", UserWarning) | 
 | 147 |  | 
 | 148 |     def test_ordering(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 149 |         with original_warnings.catch_warnings(record=True, | 
 | 150 |                 module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 151 |             self.module.resetwarnings() | 
 | 152 |             self.module.filterwarnings("ignore", category=UserWarning) | 
 | 153 |             self.module.filterwarnings("error", category=UserWarning, | 
 | 154 |                                         append=True) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 155 |             del w[:] | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 156 |             try: | 
 | 157 |                 self.module.warn("FilterTests.test_ordering", UserWarning) | 
 | 158 |             except UserWarning: | 
 | 159 |                 self.fail("order handling for actions failed") | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 160 |             self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 161 |  | 
 | 162 |     def test_filterwarnings(self): | 
 | 163 |         # Test filterwarnings(). | 
 | 164 |         # Implicitly also tests resetwarnings(). | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 165 |         with original_warnings.catch_warnings(record=True, | 
 | 166 |                 module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 167 |             self.module.filterwarnings("error", "", Warning, "", 0) | 
 | 168 |             self.assertRaises(UserWarning, self.module.warn, 'convert to error') | 
 | 169 |  | 
 | 170 |             self.module.resetwarnings() | 
 | 171 |             text = 'handle normally' | 
 | 172 |             self.module.warn(text) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 173 |             self.assertEqual(str(w[-1].message), text) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 174 |             self.assertTrue(w[-1].category is UserWarning) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 175 |  | 
 | 176 |             self.module.filterwarnings("ignore", "", Warning, "", 0) | 
 | 177 |             text = 'filtered out' | 
 | 178 |             self.module.warn(text) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 179 |             self.assertNotEqual(str(w[-1].message), text) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 180 |  | 
 | 181 |             self.module.resetwarnings() | 
 | 182 |             self.module.filterwarnings("error", "hex*", Warning, "", 0) | 
 | 183 |             self.assertRaises(UserWarning, self.module.warn, 'hex/oct') | 
 | 184 |             text = 'nonmatching text' | 
 | 185 |             self.module.warn(text) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 186 |             self.assertEqual(str(w[-1].message), text) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 187 |             self.assertTrue(w[-1].category is UserWarning) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 188 |  | 
 | 189 | class CFilterTests(BaseTest, FilterTests): | 
 | 190 |     module = c_warnings | 
 | 191 |  | 
 | 192 | class PyFilterTests(BaseTest, FilterTests): | 
 | 193 |     module = py_warnings | 
 | 194 |  | 
 | 195 |  | 
 | 196 | class WarnTests(unittest.TestCase): | 
 | 197 |  | 
 | 198 |     """Test warnings.warn() and warnings.warn_explicit().""" | 
 | 199 |  | 
 | 200 |     def test_message(self): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 201 |         with original_warnings.catch_warnings(record=True, | 
 | 202 |                 module=self.module) as w: | 
| Florent Xicluna | fd1b093 | 2010-03-28 00:25:02 +0000 | [diff] [blame] | 203 |             self.module.simplefilter("once") | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 204 |             for i in range(4): | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 205 |                 text = 'multi %d' %i  # Different text on each call. | 
 | 206 |                 self.module.warn(text) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 207 |                 self.assertEqual(str(w[-1].message), text) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 208 |                 self.assertTrue(w[-1].category is UserWarning) | 
| Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 209 |  | 
| Brett Cannon | 54bd41d | 2008-09-02 04:01:42 +0000 | [diff] [blame] | 210 |     # Issue 3639 | 
 | 211 |     def test_warn_nonstandard_types(self): | 
 | 212 |         # warn() should handle non-standard types without issue. | 
 | 213 |         for ob in (Warning, None, 42): | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 214 |             with original_warnings.catch_warnings(record=True, | 
 | 215 |                     module=self.module) as w: | 
| Florent Xicluna | fd1b093 | 2010-03-28 00:25:02 +0000 | [diff] [blame] | 216 |                 self.module.simplefilter("once") | 
| Brett Cannon | 54bd41d | 2008-09-02 04:01:42 +0000 | [diff] [blame] | 217 |                 self.module.warn(ob) | 
 | 218 |                 # Don't directly compare objects since | 
 | 219 |                 # ``Warning() != Warning()``. | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 220 |                 self.assertEqual(str(w[-1].message), str(UserWarning(ob))) | 
| Brett Cannon | 54bd41d | 2008-09-02 04:01:42 +0000 | [diff] [blame] | 221 |  | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 222 |     def test_filename(self): | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 223 |         with warnings_state(self.module): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 224 |             with original_warnings.catch_warnings(record=True, | 
 | 225 |                     module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 226 |                 warning_tests.inner("spam1") | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 227 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 228 |                                     "warning_tests.py") | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 229 |                 warning_tests.outer("spam2") | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 230 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 231 |                                     "warning_tests.py") | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 232 |  | 
 | 233 |     def test_stacklevel(self): | 
 | 234 |         # Test stacklevel argument | 
 | 235 |         # make sure all messages are different, so the warning won't be skipped | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 236 |         with warnings_state(self.module): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 237 |             with original_warnings.catch_warnings(record=True, | 
 | 238 |                     module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 239 |                 warning_tests.inner("spam3", stacklevel=1) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 240 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 241 |                                     "warning_tests.py") | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 242 |                 warning_tests.outer("spam4", stacklevel=1) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 243 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 244 |                                     "warning_tests.py") | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 245 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 246 |                 warning_tests.inner("spam5", stacklevel=2) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 247 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 248 |                                     "test_warnings.py") | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 249 |                 warning_tests.outer("spam6", stacklevel=2) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 250 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 251 |                                     "warning_tests.py") | 
| Christian Heimes | 5d8da20 | 2008-05-06 13:58:24 +0000 | [diff] [blame] | 252 |                 warning_tests.outer("spam6.5", stacklevel=3) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 253 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 254 |                                     "test_warnings.py") | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 255 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 256 |                 warning_tests.inner("spam7", stacklevel=9999) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 257 |                 self.assertEqual(os.path.basename(w[-1].filename), | 
 | 258 |                                     "sys") | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 259 |  | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 260 |     def test_missing_filename_not_main(self): | 
 | 261 |         # If __file__ is not specified and __main__ is not the module name, | 
 | 262 |         # then __file__ should be set to the module name. | 
 | 263 |         filename = warning_tests.__file__ | 
 | 264 |         try: | 
 | 265 |             del warning_tests.__file__ | 
 | 266 |             with warnings_state(self.module): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 267 |                 with original_warnings.catch_warnings(record=True, | 
 | 268 |                         module=self.module) as w: | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 269 |                     warning_tests.inner("spam8", stacklevel=1) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 270 |                     self.assertEqual(w[-1].filename, warning_tests.__name__) | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 271 |         finally: | 
 | 272 |             warning_tests.__file__ = filename | 
 | 273 |  | 
 | 274 |     def test_missing_filename_main_with_argv(self): | 
 | 275 |         # If __file__ is not specified and the caller is __main__ and sys.argv | 
 | 276 |         # exists, then use sys.argv[0] as the file. | 
 | 277 |         if not hasattr(sys, 'argv'): | 
 | 278 |             return | 
 | 279 |         filename = warning_tests.__file__ | 
 | 280 |         module_name = warning_tests.__name__ | 
 | 281 |         try: | 
 | 282 |             del warning_tests.__file__ | 
 | 283 |             warning_tests.__name__ = '__main__' | 
 | 284 |             with warnings_state(self.module): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 285 |                 with original_warnings.catch_warnings(record=True, | 
 | 286 |                         module=self.module) as w: | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 287 |                     warning_tests.inner('spam9', stacklevel=1) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 288 |                     self.assertEqual(w[-1].filename, sys.argv[0]) | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 289 |         finally: | 
 | 290 |             warning_tests.__file__ = filename | 
 | 291 |             warning_tests.__name__ = module_name | 
 | 292 |  | 
 | 293 |     def test_missing_filename_main_without_argv(self): | 
 | 294 |         # If __file__ is not specified, the caller is __main__, and sys.argv | 
 | 295 |         # is not set, then '__main__' is the file name. | 
 | 296 |         filename = warning_tests.__file__ | 
 | 297 |         module_name = warning_tests.__name__ | 
 | 298 |         argv = sys.argv | 
 | 299 |         try: | 
 | 300 |             del warning_tests.__file__ | 
 | 301 |             warning_tests.__name__ = '__main__' | 
 | 302 |             del sys.argv | 
 | 303 |             with warnings_state(self.module): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 304 |                 with original_warnings.catch_warnings(record=True, | 
 | 305 |                         module=self.module) as w: | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 306 |                     warning_tests.inner('spam10', stacklevel=1) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 307 |                     self.assertEqual(w[-1].filename, '__main__') | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 308 |         finally: | 
 | 309 |             warning_tests.__file__ = filename | 
 | 310 |             warning_tests.__name__ = module_name | 
 | 311 |             sys.argv = argv | 
 | 312 |  | 
| Christian Heimes | daaf8ee | 2008-05-04 23:58:41 +0000 | [diff] [blame] | 313 |     def test_missing_filename_main_with_argv_empty_string(self): | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 314 |         # If __file__ is not specified, the caller is __main__, and sys.argv[0] | 
 | 315 |         # is the empty string, then '__main__ is the file name. | 
 | 316 |         # Tests issue 2743. | 
 | 317 |         file_name = warning_tests.__file__ | 
 | 318 |         module_name = warning_tests.__name__ | 
 | 319 |         argv = sys.argv | 
 | 320 |         try: | 
 | 321 |             del warning_tests.__file__ | 
 | 322 |             warning_tests.__name__ = '__main__' | 
 | 323 |             sys.argv = [''] | 
 | 324 |             with warnings_state(self.module): | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 325 |                 with original_warnings.catch_warnings(record=True, | 
 | 326 |                         module=self.module) as w: | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 327 |                     warning_tests.inner('spam11', stacklevel=1) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 328 |                     self.assertEqual(w[-1].filename, '__main__') | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 329 |         finally: | 
 | 330 |             warning_tests.__file__ = file_name | 
 | 331 |             warning_tests.__name__ = module_name | 
 | 332 |             sys.argv = argv | 
 | 333 |  | 
| Brett Cannon | db73491 | 2008-06-27 00:52:15 +0000 | [diff] [blame] | 334 |     def test_warn_explicit_type_errors(self): | 
| Ezio Melotti | 1392500 | 2011-03-16 11:05:33 +0200 | [diff] [blame] | 335 |         # warn_explicit() should error out gracefully if it is given objects | 
| Brett Cannon | db73491 | 2008-06-27 00:52:15 +0000 | [diff] [blame] | 336 |         # of the wrong types. | 
 | 337 |         # lineno is expected to be an integer. | 
 | 338 |         self.assertRaises(TypeError, self.module.warn_explicit, | 
 | 339 |                             None, UserWarning, None, None) | 
 | 340 |         # Either 'message' needs to be an instance of Warning or 'category' | 
 | 341 |         # needs to be a subclass. | 
 | 342 |         self.assertRaises(TypeError, self.module.warn_explicit, | 
 | 343 |                             None, None, None, 1) | 
 | 344 |         # 'registry' must be a dict or None. | 
 | 345 |         self.assertRaises((TypeError, AttributeError), | 
 | 346 |                             self.module.warn_explicit, | 
 | 347 |                             None, Warning, None, 1, registry=42) | 
 | 348 |  | 
| Hirokazu Yamamoto | 1c0c003 | 2009-07-17 06:55:42 +0000 | [diff] [blame] | 349 |     def test_bad_str(self): | 
 | 350 |         # issue 6415 | 
 | 351 |         # Warnings instance with a bad format string for __str__ should not | 
 | 352 |         # trigger a bus error. | 
 | 353 |         class BadStrWarning(Warning): | 
 | 354 |             """Warning with a bad format string for __str__.""" | 
 | 355 |             def __str__(self): | 
 | 356 |                 return ("A bad formatted string %(err)" % | 
 | 357 |                         {"err" : "there is no %(err)s"}) | 
 | 358 |  | 
 | 359 |         with self.assertRaises(ValueError): | 
 | 360 |             self.module.warn(BadStrWarning()) | 
 | 361 |  | 
 | 362 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 363 | class CWarnTests(BaseTest, WarnTests): | 
 | 364 |     module = c_warnings | 
 | 365 |  | 
| Nick Coghlan | fce769e | 2009-04-11 14:30:59 +0000 | [diff] [blame] | 366 |     # As an early adopter, we sanity check the | 
 | 367 |     # test.support.import_fresh_module utility function | 
 | 368 |     def test_accelerated(self): | 
 | 369 |         self.assertFalse(original_warnings is self.module) | 
 | 370 |         self.assertFalse(hasattr(self.module.warn, '__code__')) | 
 | 371 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 372 | class PyWarnTests(BaseTest, WarnTests): | 
 | 373 |     module = py_warnings | 
 | 374 |  | 
| Nick Coghlan | fce769e | 2009-04-11 14:30:59 +0000 | [diff] [blame] | 375 |     # As an early adopter, we sanity check the | 
 | 376 |     # test.support.import_fresh_module utility function | 
 | 377 |     def test_pure_python(self): | 
 | 378 |         self.assertFalse(original_warnings is self.module) | 
 | 379 |         self.assertTrue(hasattr(self.module.warn, '__code__')) | 
 | 380 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 381 |  | 
 | 382 | class WCmdLineTests(unittest.TestCase): | 
 | 383 |  | 
 | 384 |     def test_improper_input(self): | 
 | 385 |         # Uses the private _setoption() function to test the parsing | 
 | 386 |         # of command-line warning arguments | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 387 |         with original_warnings.catch_warnings(module=self.module): | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 388 |             self.assertRaises(self.module._OptionError, | 
 | 389 |                               self.module._setoption, '1:2:3:4:5:6') | 
 | 390 |             self.assertRaises(self.module._OptionError, | 
 | 391 |                               self.module._setoption, 'bogus::Warning') | 
 | 392 |             self.assertRaises(self.module._OptionError, | 
 | 393 |                               self.module._setoption, 'ignore:2::4:-5') | 
 | 394 |             self.module._setoption('error::Warning::0') | 
 | 395 |             self.assertRaises(UserWarning, self.module.warn, 'convert to error') | 
 | 396 |  | 
| Antoine Pitrou | cf9f980 | 2010-11-10 13:55:25 +0000 | [diff] [blame] | 397 |     def test_improper_option(self): | 
 | 398 |         # Same as above, but check that the message is printed out when | 
 | 399 |         # the interpreter is executed. This also checks that options are | 
 | 400 |         # actually parsed at all. | 
 | 401 |         rc, out, err = assert_python_ok("-Wxxx", "-c", "pass") | 
 | 402 |         self.assertIn(b"Invalid -W option ignored: invalid action: 'xxx'", err) | 
 | 403 |  | 
 | 404 |     def test_warnings_bootstrap(self): | 
 | 405 |         # Check that the warnings module does get loaded when -W<some option> | 
 | 406 |         # is used (see issue #10372 for an example of silent bootstrap failure). | 
 | 407 |         rc, out, err = assert_python_ok("-Wi", "-c", | 
 | 408 |             "import sys; sys.modules['warnings'].warn('foo', RuntimeWarning)") | 
 | 409 |         # '-Wi' was observed | 
 | 410 |         self.assertFalse(out.strip()) | 
 | 411 |         self.assertNotIn(b'RuntimeWarning', err) | 
 | 412 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 413 | class CWCmdLineTests(BaseTest, WCmdLineTests): | 
 | 414 |     module = c_warnings | 
 | 415 |  | 
 | 416 | class PyWCmdLineTests(BaseTest, WCmdLineTests): | 
 | 417 |     module = py_warnings | 
 | 418 |  | 
 | 419 |  | 
 | 420 | class _WarningsTests(BaseTest): | 
 | 421 |  | 
 | 422 |     """Tests specific to the _warnings module.""" | 
 | 423 |  | 
 | 424 |     module = c_warnings | 
 | 425 |  | 
 | 426 |     def test_filter(self): | 
 | 427 |         # Everything should function even if 'filters' is not in warnings. | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 428 |         with original_warnings.catch_warnings(module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 429 |             self.module.filterwarnings("error", "", Warning, "", 0) | 
 | 430 |             self.assertRaises(UserWarning, self.module.warn, | 
 | 431 |                                 'convert to error') | 
 | 432 |             del self.module.filters | 
 | 433 |             self.assertRaises(UserWarning, self.module.warn, | 
 | 434 |                                 'convert to error') | 
 | 435 |  | 
 | 436 |     def test_onceregistry(self): | 
 | 437 |         # Replacing or removing the onceregistry should be okay. | 
 | 438 |         global __warningregistry__ | 
 | 439 |         message = UserWarning('onceregistry test') | 
 | 440 |         try: | 
 | 441 |             original_registry = self.module.onceregistry | 
 | 442 |             __warningregistry__ = {} | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 443 |             with original_warnings.catch_warnings(record=True, | 
 | 444 |                     module=self.module) as w: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 445 |                 self.module.resetwarnings() | 
 | 446 |                 self.module.filterwarnings("once", category=UserWarning) | 
 | 447 |                 self.module.warn_explicit(message, UserWarning, "file", 42) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 448 |                 self.assertEqual(w[-1].message, message) | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 449 |                 del w[:] | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 450 |                 self.module.warn_explicit(message, UserWarning, "file", 42) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 451 |                 self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 452 |                 # Test the resetting of onceregistry. | 
 | 453 |                 self.module.onceregistry = {} | 
 | 454 |                 __warningregistry__ = {} | 
 | 455 |                 self.module.warn('onceregistry test') | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 456 |                 self.assertEqual(w[-1].message.args, message.args) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 457 |                 # Removal of onceregistry is okay. | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 458 |                 del w[:] | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 459 |                 del self.module.onceregistry | 
 | 460 |                 __warningregistry__ = {} | 
 | 461 |                 self.module.warn_explicit(message, UserWarning, "file", 42) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 462 |                 self.assertEqual(len(w), 0) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 463 |         finally: | 
 | 464 |             self.module.onceregistry = original_registry | 
 | 465 |  | 
| Brett Cannon | 0759dd6 | 2009-04-01 18:13:07 +0000 | [diff] [blame] | 466 |     def test_default_action(self): | 
 | 467 |         # Replacing or removing defaultaction should be okay. | 
 | 468 |         message = UserWarning("defaultaction test") | 
 | 469 |         original = self.module.defaultaction | 
 | 470 |         try: | 
 | 471 |             with original_warnings.catch_warnings(record=True, | 
 | 472 |                     module=self.module) as w: | 
 | 473 |                 self.module.resetwarnings() | 
 | 474 |                 registry = {} | 
 | 475 |                 self.module.warn_explicit(message, UserWarning, "<test>", 42, | 
 | 476 |                                             registry=registry) | 
 | 477 |                 self.assertEqual(w[-1].message, message) | 
 | 478 |                 self.assertEqual(len(w), 1) | 
 | 479 |                 self.assertEqual(len(registry), 1) | 
 | 480 |                 del w[:] | 
 | 481 |                 # Test removal. | 
 | 482 |                 del self.module.defaultaction | 
 | 483 |                 __warningregistry__ = {} | 
 | 484 |                 registry = {} | 
 | 485 |                 self.module.warn_explicit(message, UserWarning, "<test>", 43, | 
 | 486 |                                             registry=registry) | 
 | 487 |                 self.assertEqual(w[-1].message, message) | 
 | 488 |                 self.assertEqual(len(w), 1) | 
 | 489 |                 self.assertEqual(len(registry), 1) | 
 | 490 |                 del w[:] | 
 | 491 |                 # Test setting. | 
 | 492 |                 self.module.defaultaction = "ignore" | 
 | 493 |                 __warningregistry__ = {} | 
 | 494 |                 registry = {} | 
 | 495 |                 self.module.warn_explicit(message, UserWarning, "<test>", 44, | 
 | 496 |                                             registry=registry) | 
 | 497 |                 self.assertEqual(len(w), 0) | 
 | 498 |         finally: | 
 | 499 |             self.module.defaultaction = original | 
 | 500 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 501 |     def test_showwarning_missing(self): | 
 | 502 |         # Test that showwarning() missing is okay. | 
 | 503 |         text = 'del showwarning test' | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 504 |         with original_warnings.catch_warnings(module=self.module): | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 505 |             self.module.filterwarnings("always", category=UserWarning) | 
 | 506 |             del self.module.showwarning | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 507 |             with support.captured_output('stderr') as stream: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 508 |                 self.module.warn(text) | 
 | 509 |                 result = stream.getvalue() | 
| Benjamin Peterson | 577473f | 2010-01-19 00:09:57 +0000 | [diff] [blame] | 510 |         self.assertIn(text, result) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 511 |  | 
| Christian Heimes | 8dc226f | 2008-05-06 23:45:46 +0000 | [diff] [blame] | 512 |     def test_showwarning_not_callable(self): | 
| Brett Cannon | fcc0527 | 2009-04-01 20:27:29 +0000 | [diff] [blame] | 513 |         with original_warnings.catch_warnings(module=self.module): | 
 | 514 |             self.module.filterwarnings("always", category=UserWarning) | 
| Brett Cannon | 52a7d98 | 2011-07-17 19:17:55 -0700 | [diff] [blame] | 515 |             self.module.showwarning = print | 
 | 516 |             with support.captured_output('stdout'): | 
 | 517 |                 self.module.warn('Warning!') | 
| Brett Cannon | fcc0527 | 2009-04-01 20:27:29 +0000 | [diff] [blame] | 518 |             self.module.showwarning = 23 | 
| Brett Cannon | 52a7d98 | 2011-07-17 19:17:55 -0700 | [diff] [blame] | 519 |             self.assertRaises(TypeError, self.module.warn, "Warning!") | 
| Christian Heimes | 8dc226f | 2008-05-06 23:45:46 +0000 | [diff] [blame] | 520 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 521 |     def test_show_warning_output(self): | 
 | 522 |         # With showarning() missing, make sure that output is okay. | 
 | 523 |         text = 'test show_warning' | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 524 |         with original_warnings.catch_warnings(module=self.module): | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 525 |             self.module.filterwarnings("always", category=UserWarning) | 
 | 526 |             del self.module.showwarning | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 527 |             with support.captured_output('stderr') as stream: | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 528 |                 warning_tests.inner(text) | 
 | 529 |                 result = stream.getvalue() | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 530 |         self.assertEqual(result.count('\n'), 2, | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 531 |                              "Too many newlines in %r" % result) | 
 | 532 |         first_line, second_line = result.split('\n', 1) | 
 | 533 |         expected_file = os.path.splitext(warning_tests.__file__)[0] + '.py' | 
| Neal Norwitz | 32dde22 | 2008-04-15 06:43:13 +0000 | [diff] [blame] | 534 |         first_line_parts = first_line.rsplit(':', 3) | 
 | 535 |         path, line, warning_class, message = first_line_parts | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 536 |         line = int(line) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 537 |         self.assertEqual(expected_file, path) | 
 | 538 |         self.assertEqual(warning_class, ' ' + UserWarning.__name__) | 
 | 539 |         self.assertEqual(message, ' ' + text) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 540 |         expected_line = '  ' + linecache.getline(path, line).strip() + '\n' | 
 | 541 |         assert expected_line | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 542 |         self.assertEqual(second_line, expected_line) | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 543 |  | 
| Victor Stinner | 8b0508e | 2011-07-04 02:43:09 +0200 | [diff] [blame] | 544 |     def test_filename_none(self): | 
 | 545 |         # issue #12467: race condition if a warning is emitted at shutdown | 
 | 546 |         globals_dict = globals() | 
 | 547 |         oldfile = globals_dict['__file__'] | 
 | 548 |         try: | 
| Brett Cannon | 52a7d98 | 2011-07-17 19:17:55 -0700 | [diff] [blame] | 549 |             catch = original_warnings.catch_warnings(record=True, | 
 | 550 |                                                      module=self.module) | 
 | 551 |             with catch as w: | 
| Victor Stinner | 8b0508e | 2011-07-04 02:43:09 +0200 | [diff] [blame] | 552 |                 self.module.filterwarnings("always", category=UserWarning) | 
 | 553 |                 globals_dict['__file__'] = None | 
 | 554 |                 original_warnings.warn('test', UserWarning) | 
| Brett Cannon | 52a7d98 | 2011-07-17 19:17:55 -0700 | [diff] [blame] | 555 |                 self.assertTrue(len(w)) | 
| Victor Stinner | 8b0508e | 2011-07-04 02:43:09 +0200 | [diff] [blame] | 556 |         finally: | 
 | 557 |             globals_dict['__file__'] = oldfile | 
 | 558 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 559 |  | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 560 | class WarningsDisplayTests(unittest.TestCase): | 
 | 561 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 562 |     """Test the displaying of warnings and the ability to overload functions | 
 | 563 |     related to displaying warnings.""" | 
 | 564 |  | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 565 |     def test_formatwarning(self): | 
 | 566 |         message = "msg" | 
 | 567 |         category = Warning | 
 | 568 |         file_name = os.path.splitext(warning_tests.__file__)[0] + '.py' | 
 | 569 |         line_num = 3 | 
 | 570 |         file_line = linecache.getline(file_name, line_num).strip() | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 571 |         format = "%s:%s: %s: %s\n  %s\n" | 
 | 572 |         expect = format % (file_name, line_num, category.__name__, message, | 
 | 573 |                             file_line) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 574 |         self.assertEqual(expect, self.module.formatwarning(message, | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 575 |                                                 category, file_name, line_num)) | 
 | 576 |         # Test the 'line' argument. | 
 | 577 |         file_line += " for the win!" | 
 | 578 |         expect = format % (file_name, line_num, category.__name__, message, | 
 | 579 |                             file_line) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 580 |         self.assertEqual(expect, self.module.formatwarning(message, | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 581 |                                     category, file_name, line_num, file_line)) | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 582 |  | 
 | 583 |     def test_showwarning(self): | 
 | 584 |         file_name = os.path.splitext(warning_tests.__file__)[0] + '.py' | 
 | 585 |         line_num = 3 | 
 | 586 |         expected_file_line = linecache.getline(file_name, line_num).strip() | 
 | 587 |         message = 'msg' | 
 | 588 |         category = Warning | 
 | 589 |         file_object = StringIO() | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 590 |         expect = self.module.formatwarning(message, category, file_name, | 
 | 591 |                                             line_num) | 
 | 592 |         self.module.showwarning(message, category, file_name, line_num, | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 593 |                                 file_object) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 594 |         self.assertEqual(file_object.getvalue(), expect) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 595 |         # Test 'line' argument. | 
 | 596 |         expected_file_line += "for the win!" | 
 | 597 |         expect = self.module.formatwarning(message, category, file_name, | 
 | 598 |                                             line_num, expected_file_line) | 
 | 599 |         file_object = StringIO() | 
 | 600 |         self.module.showwarning(message, category, file_name, line_num, | 
 | 601 |                                 file_object, expected_file_line) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 602 |         self.assertEqual(expect, file_object.getvalue()) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 603 |  | 
 | 604 | class CWarningsDisplayTests(BaseTest, WarningsDisplayTests): | 
 | 605 |     module = c_warnings | 
 | 606 |  | 
 | 607 | class PyWarningsDisplayTests(BaseTest, WarningsDisplayTests): | 
 | 608 |     module = py_warnings | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 609 |  | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 610 |  | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 611 | class CatchWarningTests(BaseTest): | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 612 |  | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 613 |     """Test catch_warnings().""" | 
 | 614 |  | 
 | 615 |     def test_catch_warnings_restore(self): | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 616 |         wmod = self.module | 
 | 617 |         orig_filters = wmod.filters | 
 | 618 |         orig_showwarning = wmod.showwarning | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 619 |         # Ensure both showwarning and filters are restored when recording | 
 | 620 |         with wmod.catch_warnings(module=wmod, record=True): | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 621 |             wmod.filters = wmod.showwarning = object() | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 622 |         self.assertTrue(wmod.filters is orig_filters) | 
 | 623 |         self.assertTrue(wmod.showwarning is orig_showwarning) | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 624 |         # Same test, but with recording disabled | 
 | 625 |         with wmod.catch_warnings(module=wmod, record=False): | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 626 |             wmod.filters = wmod.showwarning = object() | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 627 |         self.assertTrue(wmod.filters is orig_filters) | 
 | 628 |         self.assertTrue(wmod.showwarning is orig_showwarning) | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 629 |  | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 630 |     def test_catch_warnings_recording(self): | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 631 |         wmod = self.module | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 632 |         # Ensure warnings are recorded when requested | 
 | 633 |         with wmod.catch_warnings(module=wmod, record=True) as w: | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 634 |             self.assertEqual(w, []) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 635 |             self.assertTrue(type(w) is list) | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 636 |             wmod.simplefilter("always") | 
 | 637 |             wmod.warn("foo") | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 638 |             self.assertEqual(str(w[-1].message), "foo") | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 639 |             wmod.warn("bar") | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 640 |             self.assertEqual(str(w[-1].message), "bar") | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 641 |             self.assertEqual(str(w[0].message), "foo") | 
 | 642 |             self.assertEqual(str(w[1].message), "bar") | 
| Brett Cannon | 1cd0247 | 2008-09-09 01:52:27 +0000 | [diff] [blame] | 643 |             del w[:] | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 644 |             self.assertEqual(w, []) | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 645 |         # Ensure warnings are not recorded when not requested | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 646 |         orig_showwarning = wmod.showwarning | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 647 |         with wmod.catch_warnings(module=wmod, record=False) as w: | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 648 |             self.assertTrue(w is None) | 
 | 649 |             self.assertTrue(wmod.showwarning is orig_showwarning) | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 650 |  | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 651 |     def test_catch_warnings_reentry_guard(self): | 
 | 652 |         wmod = self.module | 
 | 653 |         # Ensure catch_warnings is protected against incorrect usage | 
 | 654 |         x = wmod.catch_warnings(module=wmod, record=True) | 
 | 655 |         self.assertRaises(RuntimeError, x.__exit__) | 
 | 656 |         with x: | 
 | 657 |             self.assertRaises(RuntimeError, x.__enter__) | 
 | 658 |         # Same test, but with recording disabled | 
 | 659 |         x = wmod.catch_warnings(module=wmod, record=False) | 
 | 660 |         self.assertRaises(RuntimeError, x.__exit__) | 
 | 661 |         with x: | 
 | 662 |             self.assertRaises(RuntimeError, x.__enter__) | 
 | 663 |  | 
 | 664 |     def test_catch_warnings_defaults(self): | 
 | 665 |         wmod = self.module | 
 | 666 |         orig_filters = wmod.filters | 
 | 667 |         orig_showwarning = wmod.showwarning | 
 | 668 |         # Ensure default behaviour is not to record warnings | 
 | 669 |         with wmod.catch_warnings(module=wmod) as w: | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 670 |             self.assertTrue(w is None) | 
 | 671 |             self.assertTrue(wmod.showwarning is orig_showwarning) | 
 | 672 |             self.assertTrue(wmod.filters is not orig_filters) | 
 | 673 |         self.assertTrue(wmod.filters is orig_filters) | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 674 |         if wmod is sys.modules['warnings']: | 
 | 675 |             # Ensure the default module is this one | 
 | 676 |             with wmod.catch_warnings() as w: | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 677 |                 self.assertTrue(w is None) | 
 | 678 |                 self.assertTrue(wmod.showwarning is orig_showwarning) | 
 | 679 |                 self.assertTrue(wmod.filters is not orig_filters) | 
 | 680 |             self.assertTrue(wmod.filters is orig_filters) | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 681 |  | 
 | 682 |     def test_check_warnings(self): | 
 | 683 |         # Explicit tests for the test.support convenience wrapper | 
 | 684 |         wmod = self.module | 
| Florent Xicluna | 53b506be | 2010-03-18 20:00:57 +0000 | [diff] [blame] | 685 |         if wmod is not sys.modules['warnings']: | 
 | 686 |             return | 
 | 687 |         with support.check_warnings(quiet=False) as w: | 
 | 688 |             self.assertEqual(w.warnings, []) | 
 | 689 |             wmod.simplefilter("always") | 
 | 690 |             wmod.warn("foo") | 
 | 691 |             self.assertEqual(str(w.message), "foo") | 
 | 692 |             wmod.warn("bar") | 
 | 693 |             self.assertEqual(str(w.message), "bar") | 
 | 694 |             self.assertEqual(str(w.warnings[0].message), "foo") | 
 | 695 |             self.assertEqual(str(w.warnings[1].message), "bar") | 
 | 696 |             w.reset() | 
 | 697 |             self.assertEqual(w.warnings, []) | 
 | 698 |  | 
 | 699 |         with support.check_warnings(): | 
 | 700 |             # defaults to quiet=True without argument | 
 | 701 |             pass | 
 | 702 |         with support.check_warnings(('foo', UserWarning)): | 
 | 703 |             wmod.warn("foo") | 
 | 704 |  | 
 | 705 |         with self.assertRaises(AssertionError): | 
 | 706 |             with support.check_warnings(('', RuntimeWarning)): | 
 | 707 |                 # defaults to quiet=False with argument | 
 | 708 |                 pass | 
 | 709 |         with self.assertRaises(AssertionError): | 
 | 710 |             with support.check_warnings(('foo', RuntimeWarning)): | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 711 |                 wmod.warn("foo") | 
| Benjamin Peterson | fcf5d63 | 2008-10-16 23:24:44 +0000 | [diff] [blame] | 712 |  | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 713 | class CCatchWarningTests(CatchWarningTests): | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 714 |     module = c_warnings | 
 | 715 |  | 
| Brett Cannon | ec92e18 | 2008-09-02 02:46:59 +0000 | [diff] [blame] | 716 | class PyCatchWarningTests(CatchWarningTests): | 
| Nick Coghlan | b130493 | 2008-07-13 12:25:08 +0000 | [diff] [blame] | 717 |     module = py_warnings | 
 | 718 |  | 
| Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 719 |  | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 720 | class EnvironmentVariableTests(BaseTest): | 
 | 721 |  | 
 | 722 |     def test_single_warning(self): | 
 | 723 |         newenv = os.environ.copy() | 
 | 724 |         newenv["PYTHONWARNINGS"] = "ignore::DeprecationWarning" | 
 | 725 |         p = subprocess.Popen([sys.executable, | 
 | 726 |                 "-c", "import sys; sys.stdout.write(str(sys.warnoptions))"], | 
 | 727 |                 stdout=subprocess.PIPE, env=newenv) | 
| Benjamin Peterson | ad6139a | 2010-04-11 21:16:33 +0000 | [diff] [blame] | 728 |         self.assertEqual(p.communicate()[0], b"['ignore::DeprecationWarning']") | 
 | 729 |         self.assertEqual(p.wait(), 0) | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 730 |  | 
 | 731 |     def test_comma_separated_warnings(self): | 
 | 732 |         newenv = os.environ.copy() | 
 | 733 |         newenv["PYTHONWARNINGS"] = ("ignore::DeprecationWarning," | 
 | 734 |                                     "ignore::UnicodeWarning") | 
 | 735 |         p = subprocess.Popen([sys.executable, | 
 | 736 |                 "-c", "import sys; sys.stdout.write(str(sys.warnoptions))"], | 
 | 737 |                 stdout=subprocess.PIPE, env=newenv) | 
| Benjamin Peterson | ad6139a | 2010-04-11 21:16:33 +0000 | [diff] [blame] | 738 |         self.assertEqual(p.communicate()[0], | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 739 |                 b"['ignore::DeprecationWarning', 'ignore::UnicodeWarning']") | 
| Benjamin Peterson | ad6139a | 2010-04-11 21:16:33 +0000 | [diff] [blame] | 740 |         self.assertEqual(p.wait(), 0) | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 741 |  | 
 | 742 |     def test_envvar_and_command_line(self): | 
 | 743 |         newenv = os.environ.copy() | 
 | 744 |         newenv["PYTHONWARNINGS"] = "ignore::DeprecationWarning" | 
 | 745 |         p = subprocess.Popen([sys.executable, "-W" "ignore::UnicodeWarning", | 
 | 746 |                 "-c", "import sys; sys.stdout.write(str(sys.warnoptions))"], | 
 | 747 |                 stdout=subprocess.PIPE, env=newenv) | 
| Benjamin Peterson | ad6139a | 2010-04-11 21:16:33 +0000 | [diff] [blame] | 748 |         self.assertEqual(p.communicate()[0], | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 749 |                 b"['ignore::UnicodeWarning', 'ignore::DeprecationWarning']") | 
| Benjamin Peterson | ad6139a | 2010-04-11 21:16:33 +0000 | [diff] [blame] | 750 |         self.assertEqual(p.wait(), 0) | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 751 |  | 
| Philip Jenvey | e53de3d | 2010-04-14 03:01:39 +0000 | [diff] [blame] | 752 |     @unittest.skipUnless(sys.getfilesystemencoding() != 'ascii', | 
 | 753 |                          'requires non-ascii filesystemencoding') | 
 | 754 |     def test_nonascii(self): | 
 | 755 |         newenv = os.environ.copy() | 
 | 756 |         newenv["PYTHONWARNINGS"] = "ignore:DeprecaciónWarning" | 
 | 757 |         newenv["PYTHONIOENCODING"] = "utf-8" | 
 | 758 |         p = subprocess.Popen([sys.executable, | 
 | 759 |                 "-c", "import sys; sys.stdout.write(str(sys.warnoptions))"], | 
 | 760 |                 stdout=subprocess.PIPE, env=newenv) | 
 | 761 |         self.assertEqual(p.communicate()[0], | 
 | 762 |                 "['ignore:DeprecaciónWarning']".encode('utf-8')) | 
 | 763 |         self.assertEqual(p.wait(), 0) | 
 | 764 |  | 
| Philip Jenvey | 0805ca3 | 2010-04-07 04:04:10 +0000 | [diff] [blame] | 765 | class CEnvironmentVariableTests(EnvironmentVariableTests): | 
 | 766 |     module = c_warnings | 
 | 767 |  | 
 | 768 | class PyEnvironmentVariableTests(EnvironmentVariableTests): | 
 | 769 |     module = py_warnings | 
 | 770 |  | 
 | 771 |  | 
| Victor Stinner | 7d79b8b | 2010-05-19 20:40:50 +0000 | [diff] [blame] | 772 | class BootstrapTest(unittest.TestCase): | 
 | 773 |     def test_issue_8766(self): | 
 | 774 |         # "import encodings" emits a warning whereas the warnings is not loaded | 
| Ezio Melotti | 42da663 | 2011-03-15 05:18:48 +0200 | [diff] [blame] | 775 |         # or not completely loaded (warnings imports indirectly encodings by | 
| Victor Stinner | 7d79b8b | 2010-05-19 20:40:50 +0000 | [diff] [blame] | 776 |         # importing linecache) yet | 
 | 777 |         with support.temp_cwd() as cwd, support.temp_cwd('encodings'): | 
 | 778 |             env = os.environ.copy() | 
 | 779 |             env['PYTHONPATH'] = cwd | 
 | 780 |  | 
 | 781 |             # encodings loaded by initfsencoding() | 
 | 782 |             retcode = subprocess.call([sys.executable, '-c', 'pass'], env=env) | 
 | 783 |             self.assertEqual(retcode, 0) | 
 | 784 |  | 
 | 785 |             # Use -W to load warnings module at startup | 
 | 786 |             retcode = subprocess.call( | 
 | 787 |                 [sys.executable, '-c', 'pass', '-W', 'always'], | 
 | 788 |                 env=env) | 
 | 789 |             self.assertEqual(retcode, 0) | 
 | 790 |  | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 791 | def test_main(): | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 792 |     py_warnings.onceregistry.clear() | 
 | 793 |     c_warnings.onceregistry.clear() | 
| Victor Stinner | 7d79b8b | 2010-05-19 20:40:50 +0000 | [diff] [blame] | 794 |     support.run_unittest( | 
 | 795 |         CFilterTests, PyFilterTests, | 
 | 796 |         CWarnTests, PyWarnTests, | 
 | 797 |         CWCmdLineTests, PyWCmdLineTests, | 
 | 798 |         _WarningsTests, | 
 | 799 |         CWarningsDisplayTests, PyWarningsDisplayTests, | 
 | 800 |         CCatchWarningTests, PyCatchWarningTests, | 
 | 801 |         CEnvironmentVariableTests, PyEnvironmentVariableTests, | 
 | 802 |         BootstrapTest, | 
 | 803 |     ) | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 804 |  | 
| Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 805 |  | 
 | 806 | if __name__ == "__main__": | 
| Christian Heimes | 33fe809 | 2008-04-13 13:53:33 +0000 | [diff] [blame] | 807 |     test_main() |