| 
									
										
										
										
											2001-02-04 03:09:53 +00:00
										 |  |  | # Run the _testcapi module tests (tests for the Python/C API):  by defn, | 
					
						
							| 
									
										
										
										
											2001-04-13 17:03:04 +00:00
										 |  |  | # these are all functions _testcapi exports whose name begins with 'test_'. | 
					
						
							| 
									
										
										
										
											2001-02-02 05:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-28 08:11:51 +10:00
										 |  |  | from collections import OrderedDict | 
					
						
							| 
									
										
										
										
											2011-04-25 21:21:07 +02:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2012-01-18 00:21:11 +01:00
										 |  |  | import pickle | 
					
						
							| 
									
										
										
										
											2010-05-13 18:31:05 +00:00
										 |  |  | import random | 
					
						
							| 
									
										
										
										
											2016-03-14 17:40:09 +01:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2010-05-13 18:31:05 +00:00
										 |  |  | import subprocess | 
					
						
							| 
									
										
										
										
											2005-03-03 12:26:35 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | import sysconfig | 
					
						
							| 
									
										
										
										
											2015-03-21 15:04:43 +01:00
										 |  |  | import textwrap | 
					
						
							| 
									
										
										
										
											2017-09-07 18:56:24 +02:00
										 |  |  | import threading | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2008-10-16 23:56:29 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2013-11-23 17:35:48 -08:00
										 |  |  | from test.support import MISSING_C_DOCSTRINGS | 
					
						
							| 
									
										
										
										
											2017-07-01 14:14:45 +02:00
										 |  |  | from test.support.script_helper import assert_python_failure, assert_python_ok | 
					
						
							| 
									
										
										
										
											2012-08-20 11:04:24 +02:00
										 |  |  | try: | 
					
						
							|  |  |  |     import _posixsubprocess | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     _posixsubprocess = None | 
					
						
							| 
									
										
										
										
											2017-09-07 18:56:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-07 10:06:39 +02:00
										 |  |  | # Skip this test if the _testcapi module isn't available. | 
					
						
							|  |  |  | _testcapi = support.import_module('_testcapi') | 
					
						
							| 
									
										
										
										
											2001-02-02 05:57:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-21 15:04:43 +01:00
										 |  |  | # Were we compiled --with-pydebug or with #define Py_DEBUG? | 
					
						
							|  |  |  | Py_DEBUG = hasattr(sys, 'gettotalrefcount') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-16 23:56:29 +00:00
										 |  |  | def testfunction(self): | 
					
						
							|  |  |  |     """some doc""" | 
					
						
							|  |  |  |     return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class InstanceMethod: | 
					
						
							|  |  |  |     id = _testcapi.instancemethod(id) | 
					
						
							|  |  |  |     testfunction = _testcapi.instancemethod(testfunction) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CAPITest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_instancemethod(self): | 
					
						
							|  |  |  |         inst = InstanceMethod() | 
					
						
							|  |  |  |         self.assertEqual(id(inst), inst.id()) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(inst.testfunction() is inst) | 
					
						
							| 
									
										
										
										
											2008-10-16 23:56:29 +00:00
										 |  |  |         self.assertEqual(inst.testfunction.__doc__, testfunction.__doc__) | 
					
						
							|  |  |  |         self.assertEqual(InstanceMethod.testfunction.__doc__, testfunction.__doc__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         InstanceMethod.testfunction.attribute = "test" | 
					
						
							|  |  |  |         self.assertEqual(testfunction.attribute, "test") | 
					
						
							|  |  |  |         self.assertRaises(AttributeError, setattr, inst.testfunction, "attribute", "test") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-13 18:31:05 +00:00
										 |  |  |     def test_no_FatalError_infinite_loop(self): | 
					
						
							| 
									
										
										
										
											2013-10-08 23:04:32 +02:00
										 |  |  |         with support.SuppressCrashReport(): | 
					
						
							| 
									
										
										
										
											2013-03-05 20:26:17 +02:00
										 |  |  |             p = subprocess.Popen([sys.executable, "-c", | 
					
						
							| 
									
										
										
										
											2013-03-05 20:31:34 +02:00
										 |  |  |                                   'import _testcapi;' | 
					
						
							|  |  |  |                                   '_testcapi.crash_no_current_thread()'], | 
					
						
							|  |  |  |                                  stdout=subprocess.PIPE, | 
					
						
							|  |  |  |                                  stderr=subprocess.PIPE) | 
					
						
							| 
									
										
										
										
											2010-05-13 18:31:05 +00:00
										 |  |  |         (out, err) = p.communicate() | 
					
						
							|  |  |  |         self.assertEqual(out, b'') | 
					
						
							|  |  |  |         # This used to cause an infinite loop. | 
					
						
							| 
									
										
										
										
											2012-05-06 11:34:50 +01:00
										 |  |  |         self.assertTrue(err.rstrip().startswith( | 
					
						
							| 
									
										
										
										
											2010-05-13 18:31:05 +00:00
										 |  |  |                          b'Fatal Python error:' | 
					
						
							| 
									
										
										
										
											2012-05-06 11:34:50 +01:00
										 |  |  |                          b' PyThreadState_Get: no current thread')) | 
					
						
							| 
									
										
										
										
											2010-05-13 18:31:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 20:53:48 +00:00
										 |  |  |     def test_memoryview_from_NULL_pointer(self): | 
					
						
							|  |  |  |         self.assertRaises(ValueError, _testcapi.make_memoryview_from_NULL_pointer) | 
					
						
							| 
									
										
										
										
											2008-10-16 23:56:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-19 14:33:43 +02:00
										 |  |  |     def test_exc_info(self): | 
					
						
							|  |  |  |         raised_exception = ValueError("5") | 
					
						
							|  |  |  |         new_exc = TypeError("TEST") | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             raise raised_exception | 
					
						
							|  |  |  |         except ValueError as e: | 
					
						
							|  |  |  |             tb = e.__traceback__ | 
					
						
							|  |  |  |             orig_sys_exc_info = sys.exc_info() | 
					
						
							|  |  |  |             orig_exc_info = _testcapi.set_exc_info(new_exc.__class__, new_exc, None) | 
					
						
							|  |  |  |             new_sys_exc_info = sys.exc_info() | 
					
						
							|  |  |  |             new_exc_info = _testcapi.set_exc_info(*orig_exc_info) | 
					
						
							|  |  |  |             reset_sys_exc_info = sys.exc_info() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertEqual(orig_exc_info[1], e) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertSequenceEqual(orig_exc_info, (raised_exception.__class__, raised_exception, tb)) | 
					
						
							|  |  |  |             self.assertSequenceEqual(orig_sys_exc_info, orig_exc_info) | 
					
						
							|  |  |  |             self.assertSequenceEqual(reset_sys_exc_info, orig_exc_info) | 
					
						
							|  |  |  |             self.assertSequenceEqual(new_exc_info, (new_exc.__class__, new_exc, None)) | 
					
						
							|  |  |  |             self.assertSequenceEqual(new_sys_exc_info, new_exc_info) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.assertTrue(False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-20 11:04:24 +02:00
										 |  |  |     @unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.') | 
					
						
							|  |  |  |     def test_seq_bytes_to_charp_array(self): | 
					
						
							|  |  |  |         # Issue #15732: crash in _PySequence_BytesToCharpArray() | 
					
						
							|  |  |  |         class Z(object): | 
					
						
							|  |  |  |             def __len__(self): | 
					
						
							|  |  |  |                 return 1 | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _posixsubprocess.fork_exec, | 
					
						
							| 
									
										
										
										
											2017-04-19 21:12:46 +03:00
										 |  |  |                           1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) | 
					
						
							| 
									
										
										
										
											2012-08-21 08:16:09 +02:00
										 |  |  |         # Issue #15736: overflow in _PySequence_BytesToCharpArray() | 
					
						
							|  |  |  |         class Z(object): | 
					
						
							|  |  |  |             def __len__(self): | 
					
						
							|  |  |  |                 return sys.maxsize | 
					
						
							|  |  |  |             def __getitem__(self, i): | 
					
						
							|  |  |  |                 return b'x' | 
					
						
							|  |  |  |         self.assertRaises(MemoryError, _posixsubprocess.fork_exec, | 
					
						
							| 
									
										
										
										
											2017-04-19 21:12:46 +03:00
										 |  |  |                           1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) | 
					
						
							| 
									
										
										
										
											2012-08-20 11:04:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-20 14:36:47 +02:00
										 |  |  |     @unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.') | 
					
						
							|  |  |  |     def test_subprocess_fork_exec(self): | 
					
						
							|  |  |  |         class Z(object): | 
					
						
							|  |  |  |             def __len__(self): | 
					
						
							|  |  |  |                 return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Issue #15738: crash in subprocess_fork_exec() | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _posixsubprocess.fork_exec, | 
					
						
							| 
									
										
										
										
											2017-04-19 21:12:46 +03:00
										 |  |  |                           Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) | 
					
						
							| 
									
										
										
										
											2012-08-20 11:04:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 17:35:48 -08:00
										 |  |  |     @unittest.skipIf(MISSING_C_DOCSTRINGS, | 
					
						
							|  |  |  |                      "Signature information for builtins requires docstrings") | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  |     def test_docstring_signature_parsing(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.no_docstring.__doc__, None) | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.no_docstring.__text_signature__, None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-13 18:22:35 -05:00
										 |  |  |         self.assertEqual(_testcapi.docstring_empty.__doc__, None) | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  |         self.assertEqual(_testcapi.docstring_empty.__text_signature__, None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.docstring_no_signature.__doc__, | 
					
						
							|  |  |  |             "This docstring has no signature.") | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.docstring_no_signature.__text_signature__, None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.docstring_with_invalid_signature.__doc__, | 
					
						
							| 
									
										
										
										
											2014-02-08 22:15:29 -08:00
										 |  |  |             "docstring_with_invalid_signature($module, /, boo)\n" | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  |             "\n" | 
					
						
							|  |  |  |             "This docstring has an invalid signature." | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.docstring_with_invalid_signature.__text_signature__, None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-08 22:15:29 -08:00
										 |  |  |         self.assertEqual(_testcapi.docstring_with_invalid_signature2.__doc__, | 
					
						
							|  |  |  |             "docstring_with_invalid_signature2($module, /, boo)\n" | 
					
						
							|  |  |  |             "\n" | 
					
						
							|  |  |  |             "--\n" | 
					
						
							|  |  |  |             "\n" | 
					
						
							|  |  |  |             "This docstring also has an invalid signature." | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.docstring_with_invalid_signature2.__text_signature__, None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  |         self.assertEqual(_testcapi.docstring_with_signature.__doc__, | 
					
						
							|  |  |  |             "This docstring has a valid signature.") | 
					
						
							| 
									
										
										
										
											2014-02-08 22:15:29 -08:00
										 |  |  |         self.assertEqual(_testcapi.docstring_with_signature.__text_signature__, "($module, /, sig)") | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-13 18:22:35 -05:00
										 |  |  |         self.assertEqual(_testcapi.docstring_with_signature_but_no_doc.__doc__, None) | 
					
						
							|  |  |  |         self.assertEqual(_testcapi.docstring_with_signature_but_no_doc.__text_signature__, | 
					
						
							|  |  |  |             "($module, /, sig)") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  |         self.assertEqual(_testcapi.docstring_with_signature_and_extra_newlines.__doc__, | 
					
						
							| 
									
										
										
										
											2014-02-08 22:15:29 -08:00
										 |  |  |             "\nThis docstring has a valid signature and some extra newlines.") | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  |         self.assertEqual(_testcapi.docstring_with_signature_and_extra_newlines.__text_signature__, | 
					
						
							| 
									
										
										
										
											2014-02-08 22:15:29 -08:00
										 |  |  |             "($module, /, parameter)") | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-09 23:55:56 -04:00
										 |  |  |     def test_c_type_with_matrix_multiplication(self): | 
					
						
							|  |  |  |         M = _testcapi.matmulType | 
					
						
							|  |  |  |         m1 = M() | 
					
						
							|  |  |  |         m2 = M() | 
					
						
							|  |  |  |         self.assertEqual(m1 @ m2, ("matmul", m1, m2)) | 
					
						
							|  |  |  |         self.assertEqual(m1 @ 42, ("matmul", m1, 42)) | 
					
						
							|  |  |  |         self.assertEqual(42 @ m1, ("matmul", 42, m1)) | 
					
						
							|  |  |  |         o = m1 | 
					
						
							|  |  |  |         o @= m2 | 
					
						
							|  |  |  |         self.assertEqual(o, ("imatmul", m1, m2)) | 
					
						
							|  |  |  |         o = m1 | 
					
						
							|  |  |  |         o @= 42 | 
					
						
							|  |  |  |         self.assertEqual(o, ("imatmul", m1, 42)) | 
					
						
							|  |  |  |         o = 42 | 
					
						
							|  |  |  |         o @= m1 | 
					
						
							|  |  |  |         self.assertEqual(o, ("matmul", 42, m1)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-21 15:04:43 +01:00
										 |  |  |     def test_return_null_without_error(self): | 
					
						
							|  |  |  |         # Issue #23571: A function must not return NULL without setting an | 
					
						
							|  |  |  |         # error | 
					
						
							|  |  |  |         if Py_DEBUG: | 
					
						
							|  |  |  |             code = textwrap.dedent("""
 | 
					
						
							|  |  |  |                 import _testcapi | 
					
						
							|  |  |  |                 from test import support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 with support.SuppressCrashReport(): | 
					
						
							|  |  |  |                     _testcapi.return_null_without_error() | 
					
						
							|  |  |  |             """)
 | 
					
						
							|  |  |  |             rc, out, err = assert_python_failure('-c', code) | 
					
						
							| 
									
										
										
										
											2015-03-24 14:01:32 +01:00
										 |  |  |             self.assertRegex(err.replace(b'\r', b''), | 
					
						
							| 
									
										
										
										
											2015-03-24 16:28:52 +01:00
										 |  |  |                              br'Fatal Python error: a function returned NULL ' | 
					
						
							|  |  |  |                                 br'without setting an error\n' | 
					
						
							| 
									
										
										
										
											2015-03-24 14:01:32 +01:00
										 |  |  |                              br'SystemError: <built-in function ' | 
					
						
							|  |  |  |                                  br'return_null_without_error> returned NULL ' | 
					
						
							|  |  |  |                                  br'without setting an error\n' | 
					
						
							|  |  |  |                              br'\n' | 
					
						
							|  |  |  |                              br'Current thread.*:\n' | 
					
						
							|  |  |  |                              br'  File .*", line 6 in <module>') | 
					
						
							| 
									
										
										
										
											2015-03-21 15:04:43 +01:00
										 |  |  |         else: | 
					
						
							|  |  |  |             with self.assertRaises(SystemError) as cm: | 
					
						
							|  |  |  |                 _testcapi.return_null_without_error() | 
					
						
							|  |  |  |             self.assertRegex(str(cm.exception), | 
					
						
							|  |  |  |                              'return_null_without_error.* ' | 
					
						
							|  |  |  |                              'returned NULL without setting an error') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_return_result_with_error(self): | 
					
						
							|  |  |  |         # Issue #23571: A function must not return a result with an error set | 
					
						
							|  |  |  |         if Py_DEBUG: | 
					
						
							|  |  |  |             code = textwrap.dedent("""
 | 
					
						
							|  |  |  |                 import _testcapi | 
					
						
							|  |  |  |                 from test import support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 with support.SuppressCrashReport(): | 
					
						
							|  |  |  |                     _testcapi.return_result_with_error() | 
					
						
							|  |  |  |             """)
 | 
					
						
							|  |  |  |             rc, out, err = assert_python_failure('-c', code) | 
					
						
							| 
									
										
										
										
											2015-03-24 14:01:32 +01:00
										 |  |  |             self.assertRegex(err.replace(b'\r', b''), | 
					
						
							| 
									
										
										
										
											2015-03-24 16:28:52 +01:00
										 |  |  |                              br'Fatal Python error: a function returned a ' | 
					
						
							|  |  |  |                                 br'result with an error set\n' | 
					
						
							| 
									
										
										
										
											2015-03-24 14:01:32 +01:00
										 |  |  |                              br'ValueError\n' | 
					
						
							|  |  |  |                              br'\n' | 
					
						
							| 
									
										
										
										
											2016-10-21 17:09:17 +03:00
										 |  |  |                              br'The above exception was the direct cause ' | 
					
						
							|  |  |  |                                 br'of the following exception:\n' | 
					
						
							| 
									
										
										
										
											2015-03-24 14:01:32 +01:00
										 |  |  |                              br'\n' | 
					
						
							|  |  |  |                              br'SystemError: <built-in ' | 
					
						
							|  |  |  |                                 br'function return_result_with_error> ' | 
					
						
							|  |  |  |                                 br'returned a result with an error set\n' | 
					
						
							|  |  |  |                              br'\n' | 
					
						
							|  |  |  |                              br'Current thread.*:\n' | 
					
						
							|  |  |  |                              br'  File .*, line 6 in <module>') | 
					
						
							| 
									
										
										
										
											2015-03-21 15:04:43 +01:00
										 |  |  |         else: | 
					
						
							|  |  |  |             with self.assertRaises(SystemError) as cm: | 
					
						
							|  |  |  |                 _testcapi.return_result_with_error() | 
					
						
							|  |  |  |             self.assertRegex(str(cm.exception), | 
					
						
							|  |  |  |                              'return_result_with_error.* ' | 
					
						
							|  |  |  |                              'returned a result with an error set') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     def test_buildvalue_N(self): | 
					
						
							|  |  |  |         _testcapi.test_buildvalue_N() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-01 14:14:45 +02:00
										 |  |  |     def test_set_nomemory(self): | 
					
						
							|  |  |  |         code = """if 1:
 | 
					
						
							|  |  |  |             import _testcapi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             class C(): pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # The first loop tests both functions and that remove_mem_hooks() | 
					
						
							|  |  |  |             # can be called twice in a row. The second loop checks a call to | 
					
						
							|  |  |  |             # set_nomemory() after a call to remove_mem_hooks(). The third | 
					
						
							|  |  |  |             # loop checks the start and stop arguments of set_nomemory(). | 
					
						
							|  |  |  |             for outer_cnt in range(1, 4): | 
					
						
							|  |  |  |                 start = 10 * outer_cnt | 
					
						
							|  |  |  |                 for j in range(100): | 
					
						
							|  |  |  |                     if j == 0: | 
					
						
							|  |  |  |                         if outer_cnt != 3: | 
					
						
							|  |  |  |                             _testcapi.set_nomemory(start) | 
					
						
							|  |  |  |                         else: | 
					
						
							|  |  |  |                             _testcapi.set_nomemory(start, start + 1) | 
					
						
							|  |  |  |                     try: | 
					
						
							|  |  |  |                         C() | 
					
						
							|  |  |  |                     except MemoryError as e: | 
					
						
							|  |  |  |                         if outer_cnt != 3: | 
					
						
							|  |  |  |                             _testcapi.remove_mem_hooks() | 
					
						
							|  |  |  |                         print('MemoryError', outer_cnt, j) | 
					
						
							|  |  |  |                         _testcapi.remove_mem_hooks() | 
					
						
							|  |  |  |                         break | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         rc, out, err = assert_python_ok('-c', code) | 
					
						
							|  |  |  |         self.assertIn(b'MemoryError 1 10', out) | 
					
						
							|  |  |  |         self.assertIn(b'MemoryError 2 20', out) | 
					
						
							|  |  |  |         self.assertIn(b'MemoryError 3 30', out) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-08 11:17:46 +03:00
										 |  |  |     def test_mapping_keys_values_items(self): | 
					
						
							|  |  |  |         class Mapping1(dict): | 
					
						
							|  |  |  |             def keys(self): | 
					
						
							|  |  |  |                 return list(super().keys()) | 
					
						
							|  |  |  |             def values(self): | 
					
						
							|  |  |  |                 return list(super().values()) | 
					
						
							|  |  |  |             def items(self): | 
					
						
							|  |  |  |                 return list(super().items()) | 
					
						
							|  |  |  |         class Mapping2(dict): | 
					
						
							|  |  |  |             def keys(self): | 
					
						
							|  |  |  |                 return tuple(super().keys()) | 
					
						
							|  |  |  |             def values(self): | 
					
						
							|  |  |  |                 return tuple(super().values()) | 
					
						
							|  |  |  |             def items(self): | 
					
						
							|  |  |  |                 return tuple(super().items()) | 
					
						
							|  |  |  |         dict_obj = {'foo': 1, 'bar': 2, 'spam': 3} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for mapping in [{}, OrderedDict(), Mapping1(), Mapping2(), | 
					
						
							|  |  |  |                         dict_obj, OrderedDict(dict_obj), | 
					
						
							|  |  |  |                         Mapping1(dict_obj), Mapping2(dict_obj)]: | 
					
						
							|  |  |  |             self.assertListEqual(_testcapi.get_mapping_keys(mapping), | 
					
						
							|  |  |  |                                  list(mapping.keys())) | 
					
						
							|  |  |  |             self.assertListEqual(_testcapi.get_mapping_values(mapping), | 
					
						
							|  |  |  |                                  list(mapping.values())) | 
					
						
							|  |  |  |             self.assertListEqual(_testcapi.get_mapping_items(mapping), | 
					
						
							|  |  |  |                                  list(mapping.items())) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_mapping_keys_values_items_bad_arg(self): | 
					
						
							|  |  |  |         self.assertRaises(AttributeError, _testcapi.get_mapping_keys, None) | 
					
						
							|  |  |  |         self.assertRaises(AttributeError, _testcapi.get_mapping_values, None) | 
					
						
							|  |  |  |         self.assertRaises(AttributeError, _testcapi.get_mapping_items, None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class BadMapping: | 
					
						
							|  |  |  |             def keys(self): | 
					
						
							|  |  |  |                 return None | 
					
						
							|  |  |  |             def values(self): | 
					
						
							|  |  |  |                 return None | 
					
						
							|  |  |  |             def items(self): | 
					
						
							|  |  |  |                 return None | 
					
						
							|  |  |  |         bad_mapping = BadMapping() | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _testcapi.get_mapping_keys, bad_mapping) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _testcapi.get_mapping_values, bad_mapping) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _testcapi.get_mapping_items, bad_mapping) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 17:28:11 +02:00
										 |  |  |     @unittest.skipUnless(hasattr(_testcapi, 'negative_refcount'), | 
					
						
							|  |  |  |                          'need _testcapi.negative_refcount') | 
					
						
							|  |  |  |     def test_negative_refcount(self): | 
					
						
							|  |  |  |         # bpo-35059: Check that Py_DECREF() reports the correct filename | 
					
						
							|  |  |  |         # when calling _Py_NegativeRefcount() to abort Python. | 
					
						
							|  |  |  |         code = textwrap.dedent("""
 | 
					
						
							|  |  |  |             import _testcapi | 
					
						
							|  |  |  |             from test import support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             with support.SuppressCrashReport(): | 
					
						
							|  |  |  |                 _testcapi.negative_refcount() | 
					
						
							|  |  |  |         """)
 | 
					
						
							|  |  |  |         rc, out, err = assert_python_failure('-c', code) | 
					
						
							|  |  |  |         self.assertRegex(err, | 
					
						
							| 
									
										
										
										
											2018-10-26 02:12:34 +02:00
										 |  |  |                          br'_testcapimodule\.c:[0-9]+: ' | 
					
						
							| 
									
										
										
										
											2018-11-21 23:53:44 +01:00
										 |  |  |                          br'_Py_NegativeRefcount: Assertion failed: ' | 
					
						
							| 
									
										
										
										
											2018-10-26 02:12:34 +02:00
										 |  |  |                          br'object has negative ref count') | 
					
						
							| 
									
										
										
										
											2018-10-25 17:28:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 15:37:55 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  | class TestPendingCalls(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def pendingcalls_submit(self, l, n): | 
					
						
							|  |  |  |         def callback(): | 
					
						
							|  |  |  |             #this function can be interrupted by thread switching so let's | 
					
						
							|  |  |  |             #use an atomic operation | 
					
						
							|  |  |  |             l.append(None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for i in range(n): | 
					
						
							|  |  |  |             time.sleep(random.random()*0.02) #0.01 secs on average | 
					
						
							|  |  |  |             #try submitting callback until successful. | 
					
						
							|  |  |  |             #rely on regular interrupt to flush queue if we are | 
					
						
							|  |  |  |             #unsuccessful. | 
					
						
							|  |  |  |             while True: | 
					
						
							|  |  |  |                 if _testcapi._pending_threadfunc(callback): | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 68547,68607,68610,68618,68621-68622,68649,68722 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68547 | kristjan.jonsson | 2009-01-12 12:09:27 -0600 (Mon, 12 Jan 2009) | 1 line
  Add tests for invalid format specifiers in strftime, and for handling of invalid file descriptors in the os module.
........
  r68607 | kristjan.jonsson | 2009-01-14 04:50:57 -0600 (Wed, 14 Jan 2009) | 2 lines
  Re-enable all tests for windows platforms.
  Also, explicitly connect to the IPV4 address.  On windows platforms supporting AF_INET6, the SocketProxy would connect using socket.create_connection('localhost', port) which would cycle through all address families and try to connect.  It would try connecting using AF_INET6 first and this would cause a delay of up to a second.
........
  r68610 | kristjan.jonsson | 2009-01-15 03:09:13 -0600 (Thu, 15 Jan 2009) | 3 lines
  Fix recently introduced test cases.
  For datetime, gentoo didn't seem to mind the %e format for strftime.  So, we just excercise those instead making sure that we don't crash.
  For test_os, two cases were incorrect.
........
  r68618 | kristjan.jonsson | 2009-01-15 11:20:21 -0600 (Thu, 15 Jan 2009) | 1 line
  Issue 4929:  Handle socket errors when receiving
........
  r68621 | kristjan.jonsson | 2009-01-15 16:40:03 -0600 (Thu, 15 Jan 2009) | 1 line
  Fix two test cases in test_os.  ftruncate raises IOError unlike all the others which raise OSError.  And close() on some platforms doesn't complain when given an invalid file descriptor.
........
  r68622 | kristjan.jonsson | 2009-01-15 16:46:26 -0600 (Thu, 15 Jan 2009) | 1 line
  Make all the invalid fd tests for os subject to the function being available.
........
  r68649 | benjamin.peterson | 2009-01-16 22:39:05 -0600 (Fri, 16 Jan 2009) | 1 line
  trying to find some fpathconf() settings that all unixs support...
........
  r68722 | kristjan.jonsson | 2009-01-18 04:58:44 -0600 (Sun, 18 Jan 2009) | 1 line
  issue 4293:  make test_capi.py more robutst, it times out on some platforms, presumably waiting for threads.  Lower the thread count to 16.
........
											
										 
											2009-01-18 21:02:37 +00:00
										 |  |  |     def pendingcalls_wait(self, l, n, context = None): | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |         #now, stick around until l[0] has grown to 10 | 
					
						
							|  |  |  |         count = 0; | 
					
						
							|  |  |  |         while len(l) != n: | 
					
						
							|  |  |  |             #this busy loop is where we expect to be interrupted to | 
					
						
							|  |  |  |             #run our callbacks.  Note that callbacks are only run on the | 
					
						
							|  |  |  |             #main thread | 
					
						
							| 
									
										
											  
											
												Merged revisions 68547,68607,68610,68618,68621-68622,68649,68722 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68547 | kristjan.jonsson | 2009-01-12 12:09:27 -0600 (Mon, 12 Jan 2009) | 1 line
  Add tests for invalid format specifiers in strftime, and for handling of invalid file descriptors in the os module.
........
  r68607 | kristjan.jonsson | 2009-01-14 04:50:57 -0600 (Wed, 14 Jan 2009) | 2 lines
  Re-enable all tests for windows platforms.
  Also, explicitly connect to the IPV4 address.  On windows platforms supporting AF_INET6, the SocketProxy would connect using socket.create_connection('localhost', port) which would cycle through all address families and try to connect.  It would try connecting using AF_INET6 first and this would cause a delay of up to a second.
........
  r68610 | kristjan.jonsson | 2009-01-15 03:09:13 -0600 (Thu, 15 Jan 2009) | 3 lines
  Fix recently introduced test cases.
  For datetime, gentoo didn't seem to mind the %e format for strftime.  So, we just excercise those instead making sure that we don't crash.
  For test_os, two cases were incorrect.
........
  r68618 | kristjan.jonsson | 2009-01-15 11:20:21 -0600 (Thu, 15 Jan 2009) | 1 line
  Issue 4929:  Handle socket errors when receiving
........
  r68621 | kristjan.jonsson | 2009-01-15 16:40:03 -0600 (Thu, 15 Jan 2009) | 1 line
  Fix two test cases in test_os.  ftruncate raises IOError unlike all the others which raise OSError.  And close() on some platforms doesn't complain when given an invalid file descriptor.
........
  r68622 | kristjan.jonsson | 2009-01-15 16:46:26 -0600 (Thu, 15 Jan 2009) | 1 line
  Make all the invalid fd tests for os subject to the function being available.
........
  r68649 | benjamin.peterson | 2009-01-16 22:39:05 -0600 (Fri, 16 Jan 2009) | 1 line
  trying to find some fpathconf() settings that all unixs support...
........
  r68722 | kristjan.jonsson | 2009-01-18 04:58:44 -0600 (Sun, 18 Jan 2009) | 1 line
  issue 4293:  make test_capi.py more robutst, it times out on some platforms, presumably waiting for threads.  Lower the thread count to 16.
........
											
										 
											2009-01-18 21:02:37 +00:00
										 |  |  |             if False and support.verbose: | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |                 print("(%i)"%(len(l),),) | 
					
						
							|  |  |  |             for i in range(1000): | 
					
						
							|  |  |  |                 a = i*i | 
					
						
							| 
									
										
											  
											
												Merged revisions 68547,68607,68610,68618,68621-68622,68649,68722 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68547 | kristjan.jonsson | 2009-01-12 12:09:27 -0600 (Mon, 12 Jan 2009) | 1 line
  Add tests for invalid format specifiers in strftime, and for handling of invalid file descriptors in the os module.
........
  r68607 | kristjan.jonsson | 2009-01-14 04:50:57 -0600 (Wed, 14 Jan 2009) | 2 lines
  Re-enable all tests for windows platforms.
  Also, explicitly connect to the IPV4 address.  On windows platforms supporting AF_INET6, the SocketProxy would connect using socket.create_connection('localhost', port) which would cycle through all address families and try to connect.  It would try connecting using AF_INET6 first and this would cause a delay of up to a second.
........
  r68610 | kristjan.jonsson | 2009-01-15 03:09:13 -0600 (Thu, 15 Jan 2009) | 3 lines
  Fix recently introduced test cases.
  For datetime, gentoo didn't seem to mind the %e format for strftime.  So, we just excercise those instead making sure that we don't crash.
  For test_os, two cases were incorrect.
........
  r68618 | kristjan.jonsson | 2009-01-15 11:20:21 -0600 (Thu, 15 Jan 2009) | 1 line
  Issue 4929:  Handle socket errors when receiving
........
  r68621 | kristjan.jonsson | 2009-01-15 16:40:03 -0600 (Thu, 15 Jan 2009) | 1 line
  Fix two test cases in test_os.  ftruncate raises IOError unlike all the others which raise OSError.  And close() on some platforms doesn't complain when given an invalid file descriptor.
........
  r68622 | kristjan.jonsson | 2009-01-15 16:46:26 -0600 (Thu, 15 Jan 2009) | 1 line
  Make all the invalid fd tests for os subject to the function being available.
........
  r68649 | benjamin.peterson | 2009-01-16 22:39:05 -0600 (Fri, 16 Jan 2009) | 1 line
  trying to find some fpathconf() settings that all unixs support...
........
  r68722 | kristjan.jonsson | 2009-01-18 04:58:44 -0600 (Sun, 18 Jan 2009) | 1 line
  issue 4293:  make test_capi.py more robutst, it times out on some platforms, presumably waiting for threads.  Lower the thread count to 16.
........
											
										 
											2009-01-18 21:02:37 +00:00
										 |  |  |             if context and not context.event.is_set(): | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |             count += 1 | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |             self.assertTrue(count < 10000, | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |                 "timeout waiting for %i callbacks, got %i"%(n, len(l))) | 
					
						
							| 
									
										
											  
											
												Merged revisions 68547,68607,68610,68618,68621-68622,68649,68722 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68547 | kristjan.jonsson | 2009-01-12 12:09:27 -0600 (Mon, 12 Jan 2009) | 1 line
  Add tests for invalid format specifiers in strftime, and for handling of invalid file descriptors in the os module.
........
  r68607 | kristjan.jonsson | 2009-01-14 04:50:57 -0600 (Wed, 14 Jan 2009) | 2 lines
  Re-enable all tests for windows platforms.
  Also, explicitly connect to the IPV4 address.  On windows platforms supporting AF_INET6, the SocketProxy would connect using socket.create_connection('localhost', port) which would cycle through all address families and try to connect.  It would try connecting using AF_INET6 first and this would cause a delay of up to a second.
........
  r68610 | kristjan.jonsson | 2009-01-15 03:09:13 -0600 (Thu, 15 Jan 2009) | 3 lines
  Fix recently introduced test cases.
  For datetime, gentoo didn't seem to mind the %e format for strftime.  So, we just excercise those instead making sure that we don't crash.
  For test_os, two cases were incorrect.
........
  r68618 | kristjan.jonsson | 2009-01-15 11:20:21 -0600 (Thu, 15 Jan 2009) | 1 line
  Issue 4929:  Handle socket errors when receiving
........
  r68621 | kristjan.jonsson | 2009-01-15 16:40:03 -0600 (Thu, 15 Jan 2009) | 1 line
  Fix two test cases in test_os.  ftruncate raises IOError unlike all the others which raise OSError.  And close() on some platforms doesn't complain when given an invalid file descriptor.
........
  r68622 | kristjan.jonsson | 2009-01-15 16:46:26 -0600 (Thu, 15 Jan 2009) | 1 line
  Make all the invalid fd tests for os subject to the function being available.
........
  r68649 | benjamin.peterson | 2009-01-16 22:39:05 -0600 (Fri, 16 Jan 2009) | 1 line
  trying to find some fpathconf() settings that all unixs support...
........
  r68722 | kristjan.jonsson | 2009-01-18 04:58:44 -0600 (Sun, 18 Jan 2009) | 1 line
  issue 4293:  make test_capi.py more robutst, it times out on some platforms, presumably waiting for threads.  Lower the thread count to 16.
........
											
										 
											2009-01-18 21:02:37 +00:00
										 |  |  |         if False and support.verbose: | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |             print("(%i)"%(len(l),)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pendingcalls_threaded(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #do every callback on a separate thread | 
					
						
							| 
									
										
											  
											
												Merged revisions 68547,68607,68610,68618,68621-68622,68649,68722 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68547 | kristjan.jonsson | 2009-01-12 12:09:27 -0600 (Mon, 12 Jan 2009) | 1 line
  Add tests for invalid format specifiers in strftime, and for handling of invalid file descriptors in the os module.
........
  r68607 | kristjan.jonsson | 2009-01-14 04:50:57 -0600 (Wed, 14 Jan 2009) | 2 lines
  Re-enable all tests for windows platforms.
  Also, explicitly connect to the IPV4 address.  On windows platforms supporting AF_INET6, the SocketProxy would connect using socket.create_connection('localhost', port) which would cycle through all address families and try to connect.  It would try connecting using AF_INET6 first and this would cause a delay of up to a second.
........
  r68610 | kristjan.jonsson | 2009-01-15 03:09:13 -0600 (Thu, 15 Jan 2009) | 3 lines
  Fix recently introduced test cases.
  For datetime, gentoo didn't seem to mind the %e format for strftime.  So, we just excercise those instead making sure that we don't crash.
  For test_os, two cases were incorrect.
........
  r68618 | kristjan.jonsson | 2009-01-15 11:20:21 -0600 (Thu, 15 Jan 2009) | 1 line
  Issue 4929:  Handle socket errors when receiving
........
  r68621 | kristjan.jonsson | 2009-01-15 16:40:03 -0600 (Thu, 15 Jan 2009) | 1 line
  Fix two test cases in test_os.  ftruncate raises IOError unlike all the others which raise OSError.  And close() on some platforms doesn't complain when given an invalid file descriptor.
........
  r68622 | kristjan.jonsson | 2009-01-15 16:46:26 -0600 (Thu, 15 Jan 2009) | 1 line
  Make all the invalid fd tests for os subject to the function being available.
........
  r68649 | benjamin.peterson | 2009-01-16 22:39:05 -0600 (Fri, 16 Jan 2009) | 1 line
  trying to find some fpathconf() settings that all unixs support...
........
  r68722 | kristjan.jonsson | 2009-01-18 04:58:44 -0600 (Sun, 18 Jan 2009) | 1 line
  issue 4293:  make test_capi.py more robutst, it times out on some platforms, presumably waiting for threads.  Lower the thread count to 16.
........
											
										 
											2009-01-18 21:02:37 +00:00
										 |  |  |         n = 32 #total callbacks | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |         threads = [] | 
					
						
							| 
									
										
											  
											
												Merged revisions 68547,68607,68610,68618,68621-68622,68649,68722 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68547 | kristjan.jonsson | 2009-01-12 12:09:27 -0600 (Mon, 12 Jan 2009) | 1 line
  Add tests for invalid format specifiers in strftime, and for handling of invalid file descriptors in the os module.
........
  r68607 | kristjan.jonsson | 2009-01-14 04:50:57 -0600 (Wed, 14 Jan 2009) | 2 lines
  Re-enable all tests for windows platforms.
  Also, explicitly connect to the IPV4 address.  On windows platforms supporting AF_INET6, the SocketProxy would connect using socket.create_connection('localhost', port) which would cycle through all address families and try to connect.  It would try connecting using AF_INET6 first and this would cause a delay of up to a second.
........
  r68610 | kristjan.jonsson | 2009-01-15 03:09:13 -0600 (Thu, 15 Jan 2009) | 3 lines
  Fix recently introduced test cases.
  For datetime, gentoo didn't seem to mind the %e format for strftime.  So, we just excercise those instead making sure that we don't crash.
  For test_os, two cases were incorrect.
........
  r68618 | kristjan.jonsson | 2009-01-15 11:20:21 -0600 (Thu, 15 Jan 2009) | 1 line
  Issue 4929:  Handle socket errors when receiving
........
  r68621 | kristjan.jonsson | 2009-01-15 16:40:03 -0600 (Thu, 15 Jan 2009) | 1 line
  Fix two test cases in test_os.  ftruncate raises IOError unlike all the others which raise OSError.  And close() on some platforms doesn't complain when given an invalid file descriptor.
........
  r68622 | kristjan.jonsson | 2009-01-15 16:46:26 -0600 (Thu, 15 Jan 2009) | 1 line
  Make all the invalid fd tests for os subject to the function being available.
........
  r68649 | benjamin.peterson | 2009-01-16 22:39:05 -0600 (Fri, 16 Jan 2009) | 1 line
  trying to find some fpathconf() settings that all unixs support...
........
  r68722 | kristjan.jonsson | 2009-01-18 04:58:44 -0600 (Sun, 18 Jan 2009) | 1 line
  issue 4293:  make test_capi.py more robutst, it times out on some platforms, presumably waiting for threads.  Lower the thread count to 16.
........
											
										 
											2009-01-18 21:02:37 +00:00
										 |  |  |         class foo(object):pass | 
					
						
							|  |  |  |         context = foo() | 
					
						
							|  |  |  |         context.l = [] | 
					
						
							|  |  |  |         context.n = 2 #submits per thread | 
					
						
							|  |  |  |         context.nThreads = n // context.n | 
					
						
							|  |  |  |         context.nFinished = 0 | 
					
						
							|  |  |  |         context.lock = threading.Lock() | 
					
						
							|  |  |  |         context.event = threading.Event() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-01 13:01:14 +03:00
										 |  |  |         threads = [threading.Thread(target=self.pendingcalls_thread, | 
					
						
							|  |  |  |                                     args=(context,)) | 
					
						
							|  |  |  |                    for i in range(context.nThreads)] | 
					
						
							|  |  |  |         with support.start_threads(threads): | 
					
						
							|  |  |  |             self.pendingcalls_wait(context.l, n, context) | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 68547,68607,68610,68618,68621-68622,68649,68722 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68547 | kristjan.jonsson | 2009-01-12 12:09:27 -0600 (Mon, 12 Jan 2009) | 1 line
  Add tests for invalid format specifiers in strftime, and for handling of invalid file descriptors in the os module.
........
  r68607 | kristjan.jonsson | 2009-01-14 04:50:57 -0600 (Wed, 14 Jan 2009) | 2 lines
  Re-enable all tests for windows platforms.
  Also, explicitly connect to the IPV4 address.  On windows platforms supporting AF_INET6, the SocketProxy would connect using socket.create_connection('localhost', port) which would cycle through all address families and try to connect.  It would try connecting using AF_INET6 first and this would cause a delay of up to a second.
........
  r68610 | kristjan.jonsson | 2009-01-15 03:09:13 -0600 (Thu, 15 Jan 2009) | 3 lines
  Fix recently introduced test cases.
  For datetime, gentoo didn't seem to mind the %e format for strftime.  So, we just excercise those instead making sure that we don't crash.
  For test_os, two cases were incorrect.
........
  r68618 | kristjan.jonsson | 2009-01-15 11:20:21 -0600 (Thu, 15 Jan 2009) | 1 line
  Issue 4929:  Handle socket errors when receiving
........
  r68621 | kristjan.jonsson | 2009-01-15 16:40:03 -0600 (Thu, 15 Jan 2009) | 1 line
  Fix two test cases in test_os.  ftruncate raises IOError unlike all the others which raise OSError.  And close() on some platforms doesn't complain when given an invalid file descriptor.
........
  r68622 | kristjan.jonsson | 2009-01-15 16:46:26 -0600 (Thu, 15 Jan 2009) | 1 line
  Make all the invalid fd tests for os subject to the function being available.
........
  r68649 | benjamin.peterson | 2009-01-16 22:39:05 -0600 (Fri, 16 Jan 2009) | 1 line
  trying to find some fpathconf() settings that all unixs support...
........
  r68722 | kristjan.jonsson | 2009-01-18 04:58:44 -0600 (Sun, 18 Jan 2009) | 1 line
  issue 4293:  make test_capi.py more robutst, it times out on some platforms, presumably waiting for threads.  Lower the thread count to 16.
........
											
										 
											2009-01-18 21:02:37 +00:00
										 |  |  |     def pendingcalls_thread(self, context): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             self.pendingcalls_submit(context.l, context.n) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             with context.lock: | 
					
						
							|  |  |  |                 context.nFinished += 1 | 
					
						
							|  |  |  |                 nFinished = context.nFinished | 
					
						
							|  |  |  |                 if False and support.verbose: | 
					
						
							|  |  |  |                     print("finished threads: ", nFinished) | 
					
						
							|  |  |  |             if nFinished == context.nThreads: | 
					
						
							|  |  |  |                 context.event.set() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |     def test_pendingcalls_non_threaded(self): | 
					
						
							| 
									
										
										
										
											2011-03-16 11:05:33 +02:00
										 |  |  |         #again, just using the main thread, likely they will all be dispatched at | 
					
						
							| 
									
										
										
										
											2009-01-13 02:11:23 +00:00
										 |  |  |         #once.  It is ok to ask for too many, because we loop until we find a slot. | 
					
						
							|  |  |  |         #the loop can be interrupted to dispatch. | 
					
						
							|  |  |  |         #there are only 32 dispatch slots, so we go for twice that! | 
					
						
							|  |  |  |         l = [] | 
					
						
							|  |  |  |         n = 64 | 
					
						
							|  |  |  |         self.pendingcalls_submit(l, n) | 
					
						
							|  |  |  |         self.pendingcalls_wait(l, n) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 20:43:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class SubinterpreterTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-18 00:21:11 +01:00
										 |  |  |     def test_subinterps(self): | 
					
						
							|  |  |  |         import builtins | 
					
						
							|  |  |  |         r, w = os.pipe() | 
					
						
							|  |  |  |         code = """if 1:
 | 
					
						
							|  |  |  |             import sys, builtins, pickle | 
					
						
							|  |  |  |             with open({:d}, "wb") as f: | 
					
						
							|  |  |  |                 pickle.dump(id(sys.modules), f) | 
					
						
							|  |  |  |                 pickle.dump(id(builtins), f) | 
					
						
							|  |  |  |             """.format(w)
 | 
					
						
							|  |  |  |         with open(r, "rb") as f: | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |             ret = support.run_in_subinterp(code) | 
					
						
							| 
									
										
										
										
											2012-01-18 00:21:11 +01:00
										 |  |  |             self.assertEqual(ret, 0) | 
					
						
							|  |  |  |             self.assertNotEqual(pickle.load(f), id(sys.modules)) | 
					
						
							|  |  |  |             self.assertNotEqual(pickle.load(f), id(builtins)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 20:43:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-23 05:52:46 +02:00
										 |  |  | class TestThreadState(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @support.reap_threads | 
					
						
							|  |  |  |     def test_thread_state(self): | 
					
						
							|  |  |  |         # some extra thread-state tests driven via _testcapi | 
					
						
							|  |  |  |         def target(): | 
					
						
							|  |  |  |             idents = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def callback(): | 
					
						
							| 
									
										
										
										
											2013-02-23 05:58:38 +02:00
										 |  |  |                 idents.append(threading.get_ident()) | 
					
						
							| 
									
										
										
										
											2013-02-23 05:52:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             _testcapi._test_thread_state(callback) | 
					
						
							|  |  |  |             a = b = callback | 
					
						
							|  |  |  |             time.sleep(1) | 
					
						
							|  |  |  |             # Check our main thread is in the list exactly 3 times. | 
					
						
							| 
									
										
										
										
											2013-02-23 05:58:38 +02:00
										 |  |  |             self.assertEqual(idents.count(threading.get_ident()), 3, | 
					
						
							| 
									
										
										
										
											2013-02-23 05:52:46 +02:00
										 |  |  |                              "Couldn't find main thread correctly in the list") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         target() | 
					
						
							|  |  |  |         t = threading.Thread(target=target) | 
					
						
							|  |  |  |         t.start() | 
					
						
							|  |  |  |         t.join() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-11 22:47:04 -06:00
										 |  |  | class Test_testcapi(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2018-08-06 16:50:19 +03:00
										 |  |  |     locals().update((name, getattr(_testcapi, name)) | 
					
						
							|  |  |  |                     for name in dir(_testcapi) | 
					
						
							|  |  |  |                     if name.startswith('test_') and not name.endswith('_code')) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 22:26:53 +01:00
										 |  |  | class PyMemDebugTests(unittest.TestCase): | 
					
						
							|  |  |  |     PYTHONMALLOC = 'debug' | 
					
						
							| 
									
										
										
										
											2016-03-14 17:10:36 +01:00
										 |  |  |     # '0x04c06e0' or '04C06E0' | 
					
						
							| 
									
										
										
										
											2016-03-14 21:55:43 +01:00
										 |  |  |     PTR_REGEX = r'(?:0x)?[0-9a-fA-F]+' | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def check(self, code): | 
					
						
							|  |  |  |         with support.SuppressCrashReport(): | 
					
						
							| 
									
										
										
										
											2016-03-14 22:26:53 +01:00
										 |  |  |             out = assert_python_failure('-c', code, | 
					
						
							|  |  |  |                                         PYTHONMALLOC=self.PYTHONMALLOC) | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |         stderr = out.err | 
					
						
							|  |  |  |         return stderr.decode('ascii', 'replace') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_buffer_overflow(self): | 
					
						
							|  |  |  |         out = self.check('import _testcapi; _testcapi.pymem_buffer_overflow()') | 
					
						
							| 
									
										
										
										
											2016-03-14 17:10:36 +01:00
										 |  |  |         regex = (r"Debug memory block at address p={ptr}: API 'm'\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |                  r"    16 bytes originally requested\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 17:40:09 +01:00
										 |  |  |                  r"    The [0-9] pad bytes at p-[0-9] are FORBIDDENBYTE, as expected.\n" | 
					
						
							|  |  |  |                  r"    The [0-9] pad bytes at tail={ptr} are not all FORBIDDENBYTE \(0x[0-9a-f]{{2}}\):\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |                  r"        at tail\+0: 0x78 \*\*\* OUCH\n" | 
					
						
							|  |  |  |                  r"        at tail\+1: 0xfb\n" | 
					
						
							|  |  |  |                  r"        at tail\+2: 0xfb\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 17:40:09 +01:00
										 |  |  |                  r"        .*\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |                  r"    The block was made by call #[0-9]+ to debug malloc/realloc.\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 17:40:09 +01:00
										 |  |  |                  r"    Data at p: cb cb cb .*\n" | 
					
						
							| 
									
										
										
										
											2016-03-15 23:36:28 +01:00
										 |  |  |                  r"\n" | 
					
						
							| 
									
										
										
										
											2018-11-13 15:14:58 +01:00
										 |  |  |                  r"Enable tracemalloc to get the memory block allocation traceback\n" | 
					
						
							|  |  |  |                  r"\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |                  r"Fatal Python error: bad trailing pad byte") | 
					
						
							| 
									
										
										
										
											2016-03-14 17:10:36 +01:00
										 |  |  |         regex = regex.format(ptr=self.PTR_REGEX) | 
					
						
							| 
									
										
										
										
											2016-03-14 17:40:09 +01:00
										 |  |  |         regex = re.compile(regex, flags=re.DOTALL) | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |         self.assertRegex(out, regex) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_api_misuse(self): | 
					
						
							|  |  |  |         out = self.check('import _testcapi; _testcapi.pymem_api_misuse()') | 
					
						
							| 
									
										
										
										
											2016-03-14 17:10:36 +01:00
										 |  |  |         regex = (r"Debug memory block at address p={ptr}: API 'm'\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |                  r"    16 bytes originally requested\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 17:40:09 +01:00
										 |  |  |                  r"    The [0-9] pad bytes at p-[0-9] are FORBIDDENBYTE, as expected.\n" | 
					
						
							|  |  |  |                  r"    The [0-9] pad bytes at tail={ptr} are FORBIDDENBYTE, as expected.\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |                  r"    The block was made by call #[0-9]+ to debug malloc/realloc.\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 17:40:09 +01:00
										 |  |  |                  r"    Data at p: cb cb cb .*\n" | 
					
						
							| 
									
										
										
										
											2016-03-15 23:36:28 +01:00
										 |  |  |                  r"\n" | 
					
						
							| 
									
										
										
										
											2018-11-13 15:14:58 +01:00
										 |  |  |                  r"Enable tracemalloc to get the memory block allocation traceback\n" | 
					
						
							|  |  |  |                  r"\n" | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |                  r"Fatal Python error: bad ID: Allocated using API 'm', verified using API 'r'\n") | 
					
						
							| 
									
										
										
										
											2016-03-14 17:10:36 +01:00
										 |  |  |         regex = regex.format(ptr=self.PTR_REGEX) | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  |         self.assertRegex(out, regex) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-16 12:12:53 +01:00
										 |  |  |     def check_malloc_without_gil(self, code): | 
					
						
							| 
									
										
										
										
											2016-03-14 22:26:53 +01:00
										 |  |  |         out = self.check(code) | 
					
						
							|  |  |  |         expected = ('Fatal Python error: Python memory allocator called ' | 
					
						
							|  |  |  |                     'without holding the GIL') | 
					
						
							|  |  |  |         self.assertIn(expected, out) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-16 12:12:53 +01:00
										 |  |  |     def test_pymem_malloc_without_gil(self): | 
					
						
							|  |  |  |         # Debug hooks must raise an error if PyMem_Malloc() is called | 
					
						
							|  |  |  |         # without holding the GIL | 
					
						
							|  |  |  |         code = 'import _testcapi; _testcapi.pymem_malloc_without_gil()' | 
					
						
							|  |  |  |         self.check_malloc_without_gil(code) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pyobject_malloc_without_gil(self): | 
					
						
							|  |  |  |         # Debug hooks must raise an error if PyObject_Malloc() is called | 
					
						
							|  |  |  |         # without holding the GIL | 
					
						
							|  |  |  |         code = 'import _testcapi; _testcapi.pyobject_malloc_without_gil()' | 
					
						
							|  |  |  |         self.check_malloc_without_gil(code) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 22:26:53 +01:00
										 |  |  | class PyMemMallocDebugTests(PyMemDebugTests): | 
					
						
							|  |  |  |     PYTHONMALLOC = 'malloc_debug' | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-29 17:20:38 +01:00
										 |  |  | @unittest.skipUnless(support.with_pymalloc(), 'need pymalloc') | 
					
						
							| 
									
										
										
										
											2016-03-14 22:26:53 +01:00
										 |  |  | class PyMemPymallocDebugTests(PyMemDebugTests): | 
					
						
							|  |  |  |     PYTHONMALLOC = 'pymalloc_debug' | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @unittest.skipUnless(Py_DEBUG, 'need Py_DEBUG') | 
					
						
							| 
									
										
										
										
											2016-03-14 22:26:53 +01:00
										 |  |  | class PyMemDefaultTests(PyMemDebugTests): | 
					
						
							|  |  |  |     # test default allocator of Python compiled in debug mode | 
					
						
							|  |  |  |     PYTHONMALLOC = '' | 
					
						
							| 
									
										
										
										
											2016-03-14 12:04:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2013-11-11 22:47:04 -06:00
										 |  |  |     unittest.main() |