test_sys.py revision f0db38dbf89c642bb43acb193c41e0329461be33
1# -*- coding: iso-8859-1 -*- 2import unittest, test.test_support 3import sys, cStringIO 4 5class SysModuleTest(unittest.TestCase): 6 7 def test_original_displayhook(self): 8 import __builtin__ 9 savestdout = sys.stdout 10 out = cStringIO.StringIO() 11 sys.stdout = out 12 13 dh = sys.__displayhook__ 14 15 self.assertRaises(TypeError, dh) 16 if hasattr(__builtin__, "_"): 17 del __builtin__._ 18 19 dh(None) 20 self.assertEqual(out.getvalue(), "") 21 self.assert_(not hasattr(__builtin__, "_")) 22 dh(42) 23 self.assertEqual(out.getvalue(), "42\n") 24 self.assertEqual(__builtin__._, 42) 25 26 del sys.stdout 27 self.assertRaises(RuntimeError, dh, 42) 28 29 sys.stdout = savestdout 30 31 def test_lost_displayhook(self): 32 olddisplayhook = sys.displayhook 33 del sys.displayhook 34 code = compile("42", "<string>", "single") 35 self.assertRaises(RuntimeError, eval, code) 36 sys.displayhook = olddisplayhook 37 38 def test_custom_displayhook(self): 39 olddisplayhook = sys.displayhook 40 def baddisplayhook(obj): 41 raise ValueError 42 sys.displayhook = baddisplayhook 43 code = compile("42", "<string>", "single") 44 self.assertRaises(ValueError, eval, code) 45 sys.displayhook = olddisplayhook 46 47 def test_original_excepthook(self): 48 savestderr = sys.stderr 49 err = cStringIO.StringIO() 50 sys.stderr = err 51 52 eh = sys.__excepthook__ 53 54 self.assertRaises(TypeError, eh) 55 try: 56 raise ValueError(42) 57 except ValueError, exc: 58 eh(*sys.exc_info()) 59 60 sys.stderr = savestderr 61 self.assert_(err.getvalue().endswith("ValueError: 42\n")) 62 63 # FIXME: testing the code for a lost or replaced excepthook in 64 # Python/pythonrun.c::PyErr_PrintEx() is tricky. 65 66 def test_exc_clear(self): 67 self.assertRaises(TypeError, sys.exc_clear, 42) 68 69 # Verify that exc_info is present and matches exc, then clear it, and 70 # check that it worked. 71 def clear_check(exc): 72 typ, value, traceback = sys.exc_info() 73 self.assert_(typ is not None) 74 self.assert_(value is exc) 75 self.assert_(traceback is not None) 76 77 sys.exc_clear() 78 79 typ, value, traceback = sys.exc_info() 80 self.assert_(typ is None) 81 self.assert_(value is None) 82 self.assert_(traceback is None) 83 84 def clear(): 85 try: 86 raise ValueError, 42 87 except ValueError, exc: 88 clear_check(exc) 89 90 # Raise an exception and check that it can be cleared 91 clear() 92 93 # Verify that a frame currently handling an exception is 94 # unaffected by calling exc_clear in a nested frame. 95 try: 96 raise ValueError, 13 97 except ValueError, exc: 98 typ1, value1, traceback1 = sys.exc_info() 99 clear() 100 typ2, value2, traceback2 = sys.exc_info() 101 102 self.assert_(typ1 is typ2) 103 self.assert_(value1 is exc) 104 self.assert_(value1 is value2) 105 self.assert_(traceback1 is traceback2) 106 107 # Check that an exception can be cleared outside of an except block 108 clear_check(exc) 109 110 def test_exit(self): 111 self.assertRaises(TypeError, sys.exit, 42, 42) 112 113 # call without argument 114 try: 115 sys.exit(0) 116 except SystemExit, exc: 117 self.assertEquals(exc.code, 0) 118 except: 119 self.fail("wrong exception") 120 else: 121 self.fail("no exception") 122 123 # call with tuple argument with one entry 124 # entry will be unpacked 125 try: 126 sys.exit(42) 127 except SystemExit, exc: 128 self.assertEquals(exc.code, 42) 129 except: 130 self.fail("wrong exception") 131 else: 132 self.fail("no exception") 133 134 # call with integer argument 135 try: 136 sys.exit((42,)) 137 except SystemExit, exc: 138 self.assertEquals(exc.code, 42) 139 except: 140 self.fail("wrong exception") 141 else: 142 self.fail("no exception") 143 144 # call with string argument 145 try: 146 sys.exit("exit") 147 except SystemExit, exc: 148 self.assertEquals(exc.code, "exit") 149 except: 150 self.fail("wrong exception") 151 else: 152 self.fail("no exception") 153 154 # call with tuple argument with two entries 155 try: 156 sys.exit((17, 23)) 157 except SystemExit, exc: 158 self.assertEquals(exc.code, (17, 23)) 159 except: 160 self.fail("wrong exception") 161 else: 162 self.fail("no exception") 163 164 # test that the exit machinery handles SystemExits properly 165 import subprocess 166 # both unnormalized... 167 rc = subprocess.call([sys.executable, "-c", 168 "raise SystemExit, 46"]) 169 self.assertEqual(rc, 46) 170 # ... and normalized 171 rc = subprocess.call([sys.executable, "-c", 172 "raise SystemExit(47)"]) 173 self.assertEqual(rc, 47) 174 175 176 def test_getdefaultencoding(self): 177 if test.test_support.have_unicode: 178 self.assertRaises(TypeError, sys.getdefaultencoding, 42) 179 # can't check more than the type, as the user might have changed it 180 self.assert_(isinstance(sys.getdefaultencoding(), str)) 181 182 # testing sys.settrace() is done in test_trace.py 183 # testing sys.setprofile() is done in test_profile.py 184 185 def test_setcheckinterval(self): 186 self.assertRaises(TypeError, sys.setcheckinterval) 187 orig = sys.getcheckinterval() 188 for n in 0, 100, 120, orig: # orig last to restore starting state 189 sys.setcheckinterval(n) 190 self.assertEquals(sys.getcheckinterval(), n) 191 192 def test_recursionlimit(self): 193 self.assertRaises(TypeError, sys.getrecursionlimit, 42) 194 oldlimit = sys.getrecursionlimit() 195 self.assertRaises(TypeError, sys.setrecursionlimit) 196 self.assertRaises(ValueError, sys.setrecursionlimit, -42) 197 sys.setrecursionlimit(10000) 198 self.assertEqual(sys.getrecursionlimit(), 10000) 199 sys.setrecursionlimit(oldlimit) 200 201 def test_getwindowsversion(self): 202 if hasattr(sys, "getwindowsversion"): 203 v = sys.getwindowsversion() 204 self.assert_(isinstance(v, tuple)) 205 self.assertEqual(len(v), 5) 206 self.assert_(isinstance(v[0], int)) 207 self.assert_(isinstance(v[1], int)) 208 self.assert_(isinstance(v[2], int)) 209 self.assert_(isinstance(v[3], int)) 210 self.assert_(isinstance(v[4], str)) 211 212 def test_dlopenflags(self): 213 if hasattr(sys, "setdlopenflags"): 214 self.assert_(hasattr(sys, "getdlopenflags")) 215 self.assertRaises(TypeError, sys.getdlopenflags, 42) 216 oldflags = sys.getdlopenflags() 217 self.assertRaises(TypeError, sys.setdlopenflags) 218 sys.setdlopenflags(oldflags+1) 219 self.assertEqual(sys.getdlopenflags(), oldflags+1) 220 sys.setdlopenflags(oldflags) 221 222 def test_refcount(self): 223 self.assertRaises(TypeError, sys.getrefcount) 224 c = sys.getrefcount(None) 225 n = None 226 self.assertEqual(sys.getrefcount(None), c+1) 227 del n 228 self.assertEqual(sys.getrefcount(None), c) 229 if hasattr(sys, "gettotalrefcount"): 230 self.assert_(isinstance(sys.gettotalrefcount(), int)) 231 232 def test_getframe(self): 233 self.assertRaises(TypeError, sys._getframe, 42, 42) 234 self.assertRaises(ValueError, sys._getframe, 2000000000) 235 self.assert_( 236 SysModuleTest.test_getframe.im_func.func_code \ 237 is sys._getframe().f_code 238 ) 239 240 def test_attributes(self): 241 self.assert_(isinstance(sys.api_version, int)) 242 self.assert_(isinstance(sys.argv, list)) 243 self.assert_(sys.byteorder in ("little", "big")) 244 self.assert_(isinstance(sys.builtin_module_names, tuple)) 245 self.assert_(isinstance(sys.copyright, basestring)) 246 self.assert_(isinstance(sys.exec_prefix, basestring)) 247 self.assert_(isinstance(sys.executable, basestring)) 248 self.assert_(isinstance(sys.hexversion, int)) 249 self.assert_(isinstance(sys.maxint, int)) 250 self.assert_(isinstance(sys.maxunicode, int)) 251 self.assert_(isinstance(sys.platform, basestring)) 252 self.assert_(isinstance(sys.prefix, basestring)) 253 self.assert_(isinstance(sys.version, basestring)) 254 vi = sys.version_info 255 self.assert_(isinstance(vi, tuple)) 256 self.assertEqual(len(vi), 5) 257 self.assert_(isinstance(vi[0], int)) 258 self.assert_(isinstance(vi[1], int)) 259 self.assert_(isinstance(vi[2], int)) 260 self.assert_(vi[3] in ("alpha", "beta", "candidate", "final")) 261 self.assert_(isinstance(vi[4], int)) 262 263def test_main(): 264 test.test_support.run_unittest(SysModuleTest) 265 266if __name__ == "__main__": 267 test_main() 268