»Core Development>Code coverage>Lib/test/test_warnings.py

Python code coverage for Lib/test/test_warnings.py

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