1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# -*- coding: iso-8859-1 -*- 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest, test.test_support 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys, os, cStringIO 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport struct 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport operator 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass SysModuleTest(unittest.TestCase): 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test.test_support.reap_children() 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_original_displayhook(self): 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import __builtin__ 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh savestdout = sys.stdout 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh out = cStringIO.StringIO() 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stdout = out 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh dh = sys.__displayhook__ 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, dh) 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if hasattr(__builtin__, "_"): 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del __builtin__._ 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh dh(None) 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(out.getvalue(), "") 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(not hasattr(__builtin__, "_")) 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh dh(42) 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(out.getvalue(), "42\n") 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(__builtin__._, 42) 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del sys.stdout 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, dh, 42) 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stdout = savestdout 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_lost_displayhook(self): 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh olddisplayhook = sys.displayhook 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del sys.displayhook 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh code = compile("42", "<string>", "single") 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, eval, code) 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.displayhook = olddisplayhook 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_custom_displayhook(self): 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh olddisplayhook = sys.displayhook 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def baddisplayhook(obj): 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise ValueError 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.displayhook = baddisplayhook 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh code = compile("42", "<string>", "single") 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, eval, code) 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.displayhook = olddisplayhook 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_original_excepthook(self): 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh savestderr = sys.stderr 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh err = cStringIO.StringIO() 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stderr = err 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh eh = sys.__excepthook__ 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, eh) 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise ValueError(42) 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, exc: 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh eh(*sys.exc_info()) 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stderr = savestderr 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(err.getvalue().endswith("ValueError: 42\n")) 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # FIXME: testing the code for a lost or replaced excepthook in 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Python/pythonrun.c::PyErr_PrintEx() is tricky. 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_exc_clear(self): 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.exc_clear, 42) 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Verify that exc_info is present and matches exc, then clear it, and 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check that it worked. 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def clear_check(exc): 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh typ, value, traceback = sys.exc_info() 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(typ is not None) 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(value is exc) 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(traceback is not None) 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with test.test_support.check_py3k_warnings(): 83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.exc_clear() 84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh typ, value, traceback = sys.exc_info() 86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(typ is None) 87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(value is None) 88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(traceback is None) 89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def clear(): 91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise ValueError, 42 93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, exc: 94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh clear_check(exc) 95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Raise an exception and check that it can be cleared 97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh clear() 98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Verify that a frame currently handling an exception is 100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # unaffected by calling exc_clear in a nested frame. 101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise ValueError, 13 103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, exc: 104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh typ1, value1, traceback1 = sys.exc_info() 105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh clear() 106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh typ2, value2, traceback2 = sys.exc_info() 107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(typ1 is typ2) 109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(value1 is exc) 110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(value1 is value2) 111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(traceback1 is traceback2) 112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that an exception can be cleared outside of an except block 114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh clear_check(exc) 115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_exit(self): 117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.exit, 42, 42) 118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # call without argument 120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.exit(0) 122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except SystemExit, exc: 123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(exc.code, 0) 124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except: 125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("wrong exception") 126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("no exception") 128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # call with tuple argument with one entry 130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # entry will be unpacked 131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.exit(42) 133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except SystemExit, exc: 134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(exc.code, 42) 135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except: 136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("wrong exception") 137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("no exception") 139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # call with integer argument 141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.exit((42,)) 143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except SystemExit, exc: 144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(exc.code, 42) 145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except: 146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("wrong exception") 147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("no exception") 149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # call with string argument 151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.exit("exit") 153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except SystemExit, exc: 154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(exc.code, "exit") 155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except: 156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("wrong exception") 157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("no exception") 159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # call with tuple argument with two entries 161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.exit((17, 23)) 163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except SystemExit, exc: 164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(exc.code, (17, 23)) 165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except: 166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("wrong exception") 167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("no exception") 169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test that the exit machinery handles SystemExits properly 171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import subprocess 172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # both unnormalized... 173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rc = subprocess.call([sys.executable, "-c", 174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "raise SystemExit, 46"]) 175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(rc, 46) 176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ... and normalized 177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rc = subprocess.call([sys.executable, "-c", 178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "raise SystemExit(47)"]) 179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(rc, 47) 180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def check_exit_message(code, expected, env=None): 182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh process = subprocess.Popen([sys.executable, "-c", code], 183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stderr=subprocess.PIPE, env=env) 184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stdout, stderr = process.communicate() 185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(process.returncode, 1) 186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(stderr.startswith(expected), 187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "%s doesn't start with %s" % (repr(stderr), repr(expected))) 188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test that stderr buffer if flushed before the exit message is written 190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # into stderr 191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check_exit_message( 192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh r'import sys; sys.stderr.write("unflushed,"); sys.exit("message")', 193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b"unflushed,message") 194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test that the unicode message is encoded to the stderr encoding 196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh env = os.environ.copy() 197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh env['PYTHONIOENCODING'] = 'latin-1' 198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check_exit_message( 199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh r'import sys; sys.exit(u"h\xe9")', 200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b"h\xe9", env=env) 201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_getdefaultencoding(self): 203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if test.test_support.have_unicode: 204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.getdefaultencoding, 42) 205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # can't check more than the type, as the user might have changed it 206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.getdefaultencoding(), str) 207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # testing sys.settrace() is done in test_sys_settrace.py 209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # testing sys.setprofile() is done in test_sys_setprofile.py 210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_setcheckinterval(self): 212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.setcheckinterval) 213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh orig = sys.getcheckinterval() 214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for n in 0, 100, 120, orig: # orig last to restore starting state 215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.setcheckinterval(n) 216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getcheckinterval(), n) 217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_recursionlimit(self): 219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.getrecursionlimit, 42) 220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh oldlimit = sys.getrecursionlimit() 221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.setrecursionlimit) 222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, sys.setrecursionlimit, -42) 223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.setrecursionlimit(10000) 224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getrecursionlimit(), 10000) 225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.setrecursionlimit(oldlimit) 226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, sys.setrecursionlimit, 1 << 31) 228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.setrecursionlimit((1 << 31) - 5) 230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # issue13546: isinstance(e, ValueError) used to fail 232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # when the recursion limit is close to 1<<31 233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise ValueError() 234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, e: 235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.setrecursionlimit(oldlimit) 238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_getwindowsversion(self): 240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Raise SkipTest if sys doesn't have getwindowsversion attribute 241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test.test_support.get_attribute(sys, "getwindowsversion") 242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh v = sys.getwindowsversion() 243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(v), 5) 244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v[0], int) 245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v[1], int) 246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v[2], int) 247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v[3], int) 248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v[4], str) 249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(IndexError, operator.getitem, v, 5) 250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.major, int) 251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.minor, int) 252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.build, int) 253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.platform, int) 254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.service_pack, str) 255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.service_pack_minor, int) 256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.service_pack_major, int) 257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.suite_mask, int) 258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(v.product_type, int) 259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(v[0], v.major) 260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(v[1], v.minor) 261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(v[2], v.build) 262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(v[3], v.platform) 263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(v[4], v.service_pack) 264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # This is how platform.py calls it. Make sure tuple 266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # still has 5 elements 267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh maj, min, buildno, plat, csd = sys.getwindowsversion() 268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_dlopenflags(self): 270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if hasattr(sys, "setdlopenflags"): 271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(hasattr(sys, "getdlopenflags")) 272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.getdlopenflags, 42) 273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh oldflags = sys.getdlopenflags() 274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.setdlopenflags) 275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.setdlopenflags(oldflags+1) 276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getdlopenflags(), oldflags+1) 277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.setdlopenflags(oldflags) 278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_refcount(self): 280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # n here must be a global in order for this test to pass while 281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # tracing with a python function. Tracing calls PyFrame_FastToLocals 282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # which will add a copy of any locals to the frame object, causing 283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the reference count to increase by 2 instead of 1. 284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh global n 285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.getrefcount) 286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh c = sys.getrefcount(None) 287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh n = None 288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getrefcount(None), c+1) 289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del n 290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getrefcount(None), c) 291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if hasattr(sys, "gettotalrefcount"): 292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.gettotalrefcount(), int) 293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_getframe(self): 295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys._getframe, 42, 42) 296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, sys._getframe, 2000000000) 297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue( 298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh SysModuleTest.test_getframe.im_func.func_code \ 299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh is sys._getframe().f_code 300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # sys._current_frames() is a CPython-only gimmick. 303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_current_frames(self): 304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh have_threads = True 305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import thread 307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ImportError: 308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh have_threads = False 309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if have_threads: 311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.current_frames_with_threads() 312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.current_frames_without_threads() 314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Test sys._current_frames() in a WITH_THREADS build. 316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @test.test_support.reap_threads 317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def current_frames_with_threads(self): 318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import threading, thread 319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import traceback 320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Spawn a thread that blocks at a known place. Then the main 322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # thread does sys._current_frames(), and verifies that the frames 323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # returned make sense. 324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh entered_g = threading.Event() 325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh leave_g = threading.Event() 326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh thread_info = [] # the thread's id 327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def f123(): 329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh g456() 330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def g456(): 332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh thread_info.append(thread.get_ident()) 333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh entered_g.set() 334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh leave_g.wait() 335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t = threading.Thread(target=f123) 337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t.start() 338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh entered_g.wait() 339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # At this point, t has finished its entered_g.set(), although it's 341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # impossible to guess whether it's still on that line or has moved on 342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # to its leave_g.wait(). 343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(thread_info), 1) 344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh thread_id = thread_info[0] 345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d = sys._current_frames() 347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh main_id = thread.get_ident() 349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(main_id, d) 350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(thread_id, d) 351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Verify that the captured main-thread frame is _this_ frame. 353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh frame = d.pop(main_id) 354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(frame is sys._getframe()) 355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Verify that the captured thread frame is blocked in g456, called 357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # from f123. This is a litte tricky, since various bits of 358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # threading.py are also in the thread's call stack. 359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh frame = d.pop(thread_id) 360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stack = traceback.extract_stack(frame) 361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i, (filename, lineno, funcname, sourceline) in enumerate(stack): 362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if funcname == "f123": 363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("didn't find f123() on thread's call stack") 366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sourceline, "g456()") 368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # And the next record must be for g456(). 370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh filename, lineno, funcname, sourceline = stack[i+1] 371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(funcname, "g456") 372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(sourceline, ["leave_g.wait()", "entered_g.set()"]) 373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Reap the spawned thread. 375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh leave_g.set() 376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t.join() 377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Test sys._current_frames() when thread support doesn't exist. 379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def current_frames_without_threads(self): 380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Not much happens here: there is only one thread, with artificial 381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # "thread id" 0. 382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d = sys._current_frames() 383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(d), 1) 384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(0, d) 385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(d[0] is sys._getframe()) 386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_attributes(self): 388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.api_version, int) 389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.argv, list) 390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(sys.byteorder, ("little", "big")) 391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.builtin_module_names, tuple) 392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.copyright, basestring) 393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.exec_prefix, basestring) 394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.executable, basestring) 395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(sys.float_info), 11) 396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.float_info.radix, 2) 397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(sys.long_info), 2) 398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(sys.long_info.bits_per_digit % 5 == 0) 399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(sys.long_info.sizeof_digit >= 1) 400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(sys.long_info.bits_per_digit), int) 401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(sys.long_info.sizeof_digit), int) 402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.hexversion, int) 403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.maxint, int) 404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if test.test_support.have_unicode: 405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.maxunicode, int) 406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.platform, basestring) 407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.prefix, basestring) 408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.version, basestring) 409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh vi = sys.version_info 410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi[:], tuple) 411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(vi), 5) 412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi[0], int) 413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi[1], int) 414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi[2], int) 415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(vi[3], ("alpha", "beta", "candidate", "final")) 416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi[4], int) 417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi.major, int) 418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi.minor, int) 419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi.micro, int) 420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(vi.releaselevel, ("alpha", "beta", "candidate", "final")) 421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(vi.serial, int) 422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(vi[0], vi.major) 423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(vi[1], vi.minor) 424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(vi[2], vi.micro) 425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(vi[3], vi.releaselevel) 426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(vi[4], vi.serial) 427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(vi > (1,0,0)) 428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(sys.float_repr_style, str) 429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(sys.float_repr_style, ('short', 'legacy')) 430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_43581(self): 432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Can't use sys.stdout, as this is a cStringIO object when 433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the test runs under regrtest. 434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(sys.__stdout__.encoding == sys.__stderr__.encoding) 435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_sys_flags(self): 437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(sys.flags) 438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh attrs = ("debug", "py3k_warning", "division_warning", "division_new", 439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "inspect", "interactive", "optimize", "dont_write_bytecode", 440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "no_site", "ignore_environment", "tabcheck", "verbose", 441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "unicode", "bytes_warning", "hash_randomization") 442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for attr in attrs: 443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(hasattr(sys.flags, attr), attr) 444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(getattr(sys.flags, attr)), int, attr) 445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(repr(sys.flags)) 446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_clear_type_cache(self): 448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys._clear_type_cache() 449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_ioencoding(self): 451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import subprocess 452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh env = dict(os.environ) 453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Test character: cent sign, encoded as 0x4A (ASCII J) in CP424, 455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # not representable in ASCII. 456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh env["PYTHONIOENCODING"] = "cp424" 458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'], 459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stdout = subprocess.PIPE, env=env) 460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh out = p.communicate()[0].strip() 461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(out, unichr(0xa2).encode("cp424")) 462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh env["PYTHONIOENCODING"] = "ascii:replace" 464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'], 465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stdout = subprocess.PIPE, env=env) 466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh out = p.communicate()[0].strip() 467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(out, '?') 468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_call_tracing(self): 470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.call_tracing(str, (2,)), "2") 471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, sys.call_tracing, str, 2) 472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_executable(self): 474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # sys.executable should be absolute 475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(os.path.abspath(sys.executable), sys.executable) 476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue #7774: Ensure that sys.executable is an empty string if argv[0] 478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # has been set to an non existent program name and Python is unable to 479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # retrieve the real program name 480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import subprocess 481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # For a normal installation, it should work without 'cwd' 482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # argument. For test runs in the build directory, see #7774. 483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh python_dir = os.path.dirname(os.path.realpath(sys.executable)) 484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = subprocess.Popen( 485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ["nonexistent", "-c", 'import sys; print repr(sys.executable)'], 486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh executable=sys.executable, stdout=subprocess.PIPE, cwd=python_dir) 487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh executable = p.communicate()[0].strip() 488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.wait() 489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(executable, ["''", repr(sys.executable)]) 490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass SizeofTest(unittest.TestCase): 492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.P = struct.calcsize('P') 495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.longdigit = sys.long_info.sizeof_digit 496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import _testcapi 497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.gc_headsize = _testcapi.SIZEOF_PYGC_HEAD 498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.file = open(test.test_support.TESTFN, 'wb') 499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.file.close() 502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test.test_support.unlink(test.test_support.TESTFN) 503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check_sizeof = test.test_support.check_sizeof 505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_gc_head_size(self): 507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that the gc header size is added to objects tracked by the gc. 508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size = test.test_support.calcobjsize 509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh gc_header_size = self.gc_headsize 510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # bool objects are not gc tracked 511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getsizeof(True), size('l')) 512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # but lists are 513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getsizeof([]), size('P PP') + gc_header_size) 514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_default(self): 516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size = test.test_support.calcobjsize 517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sys.getsizeof(True, -1), size('l')) 518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_objecttypes(self): 520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check all types defined in Objects/ 521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size = test.test_support.calcobjsize 522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh vsize = test.test_support.calcvobjsize 523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check = self.check_sizeof 524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # bool 525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(True, size('l')) 526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # buffer 527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with test.test_support.check_py3k_warnings(): 528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(buffer(''), size('2P2Pil')) 529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # builtin_function_or_method 530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(len, size('3P')) 531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # bytearray 532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh samples = ['', 'u'*100000] 533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sample in samples: 534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = bytearray(sample) 535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(x, vsize('iPP') + x.__alloc__()) 536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # bytearray_iterator 537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(iter(bytearray()), size('PP')) 538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # cell 539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def get_cell(): 540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = 42 541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def inner(): 542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return x 543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return inner 544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(get_cell().func_closure[0], size('P')) 545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # classobj (old-style class) 546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class class_oldstyle(): 547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def method(): 548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(class_oldstyle, size('7P')) 550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # instance (old-style class) 551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(class_oldstyle(), size('3P')) 552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # instancemethod (old-style class) 553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(class_oldstyle().method, size('4P')) 554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # complex 555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(complex(0,1), size('2d')) 556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # code 557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(get_cell().func_code, size('4i8Pi3P')) 558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # BaseException 559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(BaseException(), size('3P')) 560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # UnicodeEncodeError 561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(UnicodeEncodeError("", u"", 0, 0, ""), size('5P2PP')) 562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # UnicodeDecodeError 563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(UnicodeDecodeError("", "", 0, 0, ""), size('5P2PP')) 564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # UnicodeTranslateError 565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(UnicodeTranslateError(u"", 0, 1, ""), size('5P2PP')) 566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # method_descriptor (descriptor object) 567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(str.lower, size('2PP')) 568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # classmethod_descriptor (descriptor object) 569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX 570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # member_descriptor (descriptor object) 571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import datetime 572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(datetime.timedelta.days, size('2PP')) 573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # getset_descriptor (descriptor object) 574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import __builtin__ 575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(__builtin__.file.closed, size('2PP')) 576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wrapper_descriptor (descriptor object) 577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(int.__add__, size('2P2P')) 578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # dictproxy 579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class C(object): pass 580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(C.__dict__, size('P')) 581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # method-wrapper (descriptor object) 582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check({}.__iter__, size('2P')) 583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # dict 584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check({}, size('3P2P' + 8*'P2P')) 585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} 586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(x, size('3P2P' + 8*'P2P') + 16*struct.calcsize('P2P')) 587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # dictionary-keyiterator 588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check({}.iterkeys(), size('P2PPP')) 589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # dictionary-valueiterator 590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check({}.itervalues(), size('P2PPP')) 591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # dictionary-itemiterator 592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check({}.iteritems(), size('P2PPP')) 593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ellipses 594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(Ellipsis, size('')) 595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # EncodingMap 596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import codecs, encodings.iso8859_3 597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = codecs.charmap_build(encodings.iso8859_3.decoding_table) 598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(x, size('32B2iB')) 599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # enumerate 600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(enumerate([]), size('l3P')) 601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # file 602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(self.file, size('4P2i4P3i3P3i')) 603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # float 604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(float(0), size('d')) 605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # sys.floatinfo 606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(sys.float_info, vsize('') + self.P * len(sys.float_info)) 607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # frame 608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import inspect 609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh CO_MAXBLOCKS = 20 610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = inspect.currentframe() 611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ncells = len(x.f_code.co_cellvars) 612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh nfrees = len(x.f_code.co_freevars) 613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh extras = x.f_code.co_stacksize + x.f_code.co_nlocals +\ 614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ncells + nfrees - 1 615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(x, vsize('12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P')) 616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # function 617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def func(): pass 618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(func, size('9P')) 619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class c(): 620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @staticmethod 621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def foo(): 622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def bar(cls): 625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # staticmethod 627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(foo, size('P')) 628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # classmethod 629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(bar, size('P')) 630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # generator 631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def get_gen(): yield 1 632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(get_gen(), size('Pi2P')) 633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # integer 634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(1, size('l')) 635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(100, size('l')) 636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # iterator 637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(iter('abc'), size('lP')) 638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # callable-iterator 639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import re 640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(re.finditer('',''), size('2P')) 641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # list 642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh samples = [[], [1,2,3], ['1', '2', '3']] 643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sample in samples: 644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(sample, vsize('PP') + len(sample)*self.P) 645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # sortwrapper (list) 646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX 647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # cmpwrapper (list) 648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX 649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # listiterator (list) 650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(iter([]), size('lP')) 651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # listreverseiterator (list) 652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(reversed([]), size('lP')) 653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # long 654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(0L, vsize('')) 655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(1L, vsize('') + self.longdigit) 656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(-1L, vsize('') + self.longdigit) 657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyLong_BASE = 2**sys.long_info.bits_per_digit 658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(long(PyLong_BASE), vsize('') + 2*self.longdigit) 659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(long(PyLong_BASE**2-1), vsize('') + 2*self.longdigit) 660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(long(PyLong_BASE**2), vsize('') + 3*self.longdigit) 661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # module 662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(unittest, size('P')) 663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # None 664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(None, size('')) 665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # object 666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(object(), size('')) 667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # property (descriptor object) 668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class C(object): 669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def getx(self): return self.__x 670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setx(self, value): self.__x = value 671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def delx(self): del self.__x 672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = property(getx, setx, delx, "") 673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(x, size('4Pi')) 674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # PyCObject 675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # PyCapsule 676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX 677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # rangeiterator 678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(iter(xrange(1)), size('4l')) 679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # reverse 680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(reversed(''), size('PP')) 681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # set 682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # frozenset 683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PySet_MINSIZE = 8 684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh samples = [[], range(10), range(50)] 685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh s = size('3P2P' + PySet_MINSIZE*'lP' + 'lP') 686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sample in samples: 687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh minused = len(sample) 688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if minused == 0: tmp = 1 689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the computation of minused is actually a bit more complicated 690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # but this suffices for the sizeof test 691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh minused = minused*2 692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh newsize = PySet_MINSIZE 693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while newsize <= minused: 694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh newsize = newsize << 1 695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if newsize <= 8: 696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(set(sample), s) 697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(frozenset(sample), s) 698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(set(sample), s + newsize*struct.calcsize('lP')) 700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(frozenset(sample), s + newsize*struct.calcsize('lP')) 701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # setiterator 702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(iter(set()), size('P3P')) 703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # slice 704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(slice(1), size('3P')) 705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # str 706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh vh = test.test_support._vheader 707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check('', struct.calcsize(vh + 'lic')) 708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check('abc', struct.calcsize(vh + 'lic') + 3) 709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # super 710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(super(int), size('3P')) 711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # tuple 712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check((), vsize('')) 713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check((1,2,3), vsize('') + 3*self.P) 714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # tupleiterator 715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(iter(()), size('lP')) 716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # type 717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (PyTypeObject + PyNumberMethods + PyMappingMethods + 718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # PySequenceMethods + PyBufferProcs) 719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh s = vsize('P2P15Pl4PP9PP11PI') + struct.calcsize('41P 10P 3P 6P') 720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class newstyleclass(object): 721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(newstyleclass, s) 723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # builtin type 724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(int, s) 725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # NotImplementedType 726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import types 727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(types.NotImplementedType, s) 728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # unicode 729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh usize = len(u'\0'.encode('unicode-internal')) 730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh samples = [u'', u'1'*100] 731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # we need to test for both sizes, because we don't know if the string 732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # has been cached 733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for s in samples: 734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(s, size('PPlP') + usize * (len(s) + 1)) 735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # weakref 736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import weakref 737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(weakref.ref(int), size('2Pl2P')) 738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # weakproxy 739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX 740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # weakcallableproxy 741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(weakref.proxy(int), size('2Pl2P')) 742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # xrange 743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(xrange(1), size('3l')) 744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(xrange(66000), size('3l')) 745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_pythontypes(self): 747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check all types defined in Python/ 748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size = test.test_support.calcobjsize 749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh vsize = test.test_support.calcvobjsize 750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check = self.check_sizeof 751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # _ast.AST 752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import _ast 753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(_ast.AST(), size('')) 754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # imp.NullImporter 755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import imp 756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(imp.NullImporter(self.file.name), size('')) 757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise TypeError 759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except TypeError: 760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh tb = sys.exc_info()[2] 761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # traceback 762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if tb != None: 763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(tb, size('2P2i')) 764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # symtable entry 765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX 766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # sys.flags 767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check(sys.flags, vsize('') + self.P * len(sys.flags)) 768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main(): 771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_classes = (SysModuleTest, SizeofTest) 772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test.test_support.run_unittest(*test_classes) 774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__": 776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_main() 777