10096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon"""Tests for 'site'. 20096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 30096e262ffe836b4c7511158678f9e257cc3a020Brett CannonTests assume the initial paths in sys.path once the interpreter has begun 40096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonexecuting have not been removed. 50096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 60096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon""" 70096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport unittest 84b965f6ab17370b06ee587c7b12ad3bcd96163e3Walter Dörwaldfrom test.test_support import run_unittest, TESTFN, EnvironmentVarGuard 95874ed6cee569a73cd0e947605210822b251df7fR. David Murrayfrom test.test_support import captured_output 100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport __builtin__ 110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport os 120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport sys 1382f58460b2f3ba36ae1b42738d486783865bdd68R. David Murrayimport re 140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport encodings 15af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesimport subprocess 165633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadéimport sysconfig 175633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadéfrom copy import copy 185633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé 190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon# Need to make sure to not import 'site' if someone specified ``-S`` at the 200096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon# command-line. Detect this by just making sure 'site' has not been imported 210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon# already. 220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonif "site" in sys.modules: 230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import site 240096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonelse: 25bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("importation of site.py suppressed") 260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 271aacd7bb027828471d8bcb88b0234ff8425695a5Ned Deilyif site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE): 28af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes # need to add user site directory for tests 29ec8d6c2d939cf4ec3ffbee231b6a170a3820e580Victor Stinner try: 30ec8d6c2d939cf4ec3ffbee231b6a170a3820e580Victor Stinner os.makedirs(site.USER_SITE) 31ec8d6c2d939cf4ec3ffbee231b6a170a3820e580Victor Stinner site.addsitedir(site.USER_SITE) 32ec8d6c2d939cf4ec3ffbee231b6a170a3820e580Victor Stinner except OSError as exc: 33ec8d6c2d939cf4ec3ffbee231b6a170a3820e580Victor Stinner raise unittest.SkipTest('unable to create user site directory (%r): %s' 34ec8d6c2d939cf4ec3ffbee231b6a170a3820e580Victor Stinner % (site.USER_SITE, exc)) 35ec8d6c2d939cf4ec3ffbee231b6a170a3820e580Victor Stinner 36af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 370096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonclass HelperFunctionsTests(unittest.TestCase): 380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Tests for helper functions. 39ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 400096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon The setting of the encoding (set using sys.setdefaultencoding) used by 410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon the Unicode implementation is not tested. 42ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """ 440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 450096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def setUp(self): 460096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Save a copy of sys.path""" 470096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.sys_path = sys.path[:] 48764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.old_base = site.USER_BASE 49764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.old_site = site.USER_SITE 50764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.old_prefixes = site.PREFIXES 515633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé self.old_vars = copy(sysconfig._CONFIG_VARS) 520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 5340388cc3308e405dfb0f971eb144c7741c89868bNeal Norwitz def tearDown(self): 540096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Restore sys.path""" 55a0e0f9eda4bf3b6ed9712a8bb992081d90249d41Nick Coghlan sys.path[:] = self.sys_path 56764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = self.old_base 57764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_SITE = self.old_site 58764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.PREFIXES = self.old_prefixes 595633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé sysconfig._CONFIG_VARS = self.old_vars 60ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_makepath(self): 620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Test makepath() have an absolute path for its first return value 630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # and a case-normalized version of the absolute path for its 640096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # second value. 650096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon path_parts = ("Beginning", "End") 660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon original_dir = os.path.join(*path_parts) 670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon abs_dir, norm_dir = site.makepath(*path_parts) 685c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertEqual(os.path.abspath(original_dir), abs_dir) 690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if original_dir == os.path.normcase(original_dir): 705c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertEqual(abs_dir, norm_dir) 710096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 725c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertEqual(os.path.normcase(abs_dir), norm_dir) 730096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 740096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_init_pathinfo(self): 750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon dir_set = site._init_pathinfo() 760096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for entry in [site.makepath(path)[1] for path in sys.path 770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if path and os.path.isdir(path)]: 78aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(entry, dir_set, 79aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti "%s from sys.path not found in set returned " 80aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti "by _init_pathinfo(): %s" % (entry, dir_set)) 81ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 82ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon def pth_file_tests(self, pth_file): 83ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon """Contain common code for testing results of reading a .pth file""" 84aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(pth_file.imported, sys.modules, 85aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti "%s not in sys.modules" % pth_file.imported) 86d8b16ab288e8695be25d5335a31338d12f4497adAntoine Pitrou self.assertIn(site.makepath(pth_file.good_dir_path)[0], sys.path) 87d8b16ab288e8695be25d5335a31338d12f4497adAntoine Pitrou self.assertFalse(os.path.exists(pth_file.bad_dir_path)) 88ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon 890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_addpackage(self): 900096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure addpackage() imports if the line starts with 'import', 9164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # adds directories to sys.path for any line in the file that is not a 9264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # comment or import that is a valid directory name for where the .pth 9364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # file resides; invalid directories are not added 9464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file = PthFile() 95ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon pth_file.cleanup(prep=True) # to make sure that nothing is 96ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon # pre-existing that shouldn't be 970096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 9864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file.create() 9964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon site.addpackage(pth_file.base_dir, pth_file.filename, set()) 100ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.pth_file_tests(pth_file) 1010096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon finally: 10264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file.cleanup() 103ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 1045874ed6cee569a73cd0e947605210822b251df7fR. David Murray def make_pth(self, contents, pth_dir='.', pth_name=TESTFN): 1055874ed6cee569a73cd0e947605210822b251df7fR. David Murray # Create a .pth file and return its (abspath, basename). 1065874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_dir = os.path.abspath(pth_dir) 1075874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_basename = pth_name + '.pth' 1085874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_fn = os.path.join(pth_dir, pth_basename) 1095874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_file = open(pth_fn, 'w') 1105874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.addCleanup(lambda: os.remove(pth_fn)) 1115874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_file.write(contents) 1125874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_file.close() 1135874ed6cee569a73cd0e947605210822b251df7fR. David Murray return pth_dir, pth_basename 1145874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1155874ed6cee569a73cd0e947605210822b251df7fR. David Murray def test_addpackage_import_bad_syntax(self): 1165874ed6cee569a73cd0e947605210822b251df7fR. David Murray # Issue 10642 1175874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_dir, pth_fn = self.make_pth("import bad)syntax\n") 1185874ed6cee569a73cd0e947605210822b251df7fR. David Murray with captured_output("stderr") as err_out: 1195874ed6cee569a73cd0e947605210822b251df7fR. David Murray site.addpackage(pth_dir, pth_fn, set()) 1205874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), "line 1") 12182f58460b2f3ba36ae1b42738d486783865bdd68R. David Murray self.assertRegexpMatches(err_out.getvalue(), 12282f58460b2f3ba36ae1b42738d486783865bdd68R. David Murray re.escape(os.path.join(pth_dir, pth_fn))) 1235874ed6cee569a73cd0e947605210822b251df7fR. David Murray # XXX: the previous two should be independent checks so that the 1245874ed6cee569a73cd0e947605210822b251df7fR. David Murray # order doesn't matter. The next three could be a single check 1255874ed6cee569a73cd0e947605210822b251df7fR. David Murray # but my regex foo isn't good enough to write it. 1265874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), 'Traceback') 1275874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), r'import bad\)syntax') 1285874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), 'SyntaxError') 1295874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1305874ed6cee569a73cd0e947605210822b251df7fR. David Murray def test_addpackage_import_bad_exec(self): 1315874ed6cee569a73cd0e947605210822b251df7fR. David Murray # Issue 10642 1325874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_dir, pth_fn = self.make_pth("randompath\nimport nosuchmodule\n") 1335874ed6cee569a73cd0e947605210822b251df7fR. David Murray with captured_output("stderr") as err_out: 1345874ed6cee569a73cd0e947605210822b251df7fR. David Murray site.addpackage(pth_dir, pth_fn, set()) 1355874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), "line 2") 13682f58460b2f3ba36ae1b42738d486783865bdd68R. David Murray self.assertRegexpMatches(err_out.getvalue(), 13782f58460b2f3ba36ae1b42738d486783865bdd68R. David Murray re.escape(os.path.join(pth_dir, pth_fn))) 1385874ed6cee569a73cd0e947605210822b251df7fR. David Murray # XXX: ditto previous XXX comment. 1395874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), 'Traceback') 1405874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), 'ImportError') 1415874ed6cee569a73cd0e947605210822b251df7fR. David Murray 14249ee82c4eb18003a198a6fc02f2bbbcb5d931180R. David Murray @unittest.skipIf(sys.platform == "win32", "Windows does not raise an " 14349ee82c4eb18003a198a6fc02f2bbbcb5d931180R. David Murray "error for file paths containing null characters") 1445874ed6cee569a73cd0e947605210822b251df7fR. David Murray def test_addpackage_import_bad_pth_file(self): 1455874ed6cee569a73cd0e947605210822b251df7fR. David Murray # Issue 5258 1465874ed6cee569a73cd0e947605210822b251df7fR. David Murray pth_dir, pth_fn = self.make_pth("abc\x00def\n") 1475874ed6cee569a73cd0e947605210822b251df7fR. David Murray with captured_output("stderr") as err_out: 1485874ed6cee569a73cd0e947605210822b251df7fR. David Murray site.addpackage(pth_dir, pth_fn, set()) 1495874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), "line 1") 15082f58460b2f3ba36ae1b42738d486783865bdd68R. David Murray self.assertRegexpMatches(err_out.getvalue(), 15182f58460b2f3ba36ae1b42738d486783865bdd68R. David Murray re.escape(os.path.join(pth_dir, pth_fn))) 1525874ed6cee569a73cd0e947605210822b251df7fR. David Murray # XXX: ditto previous XXX comment. 1535874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), 'Traceback') 1545874ed6cee569a73cd0e947605210822b251df7fR. David Murray self.assertRegexpMatches(err_out.getvalue(), 'TypeError') 1555874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1560096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_addsitedir(self): 15764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # Same tests for test_addpackage since addsitedir() essentially just 15864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # calls addpackage() for every .pth file in the directory 15964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file = PthFile() 160ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon pth_file.cleanup(prep=True) # Make sure that nothing is pre-existing 161ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon # that is tested for 1620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 163ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon pth_file.create() 16464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon site.addsitedir(pth_file.base_dir, set()) 165ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.pth_file_tests(pth_file) 1660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon finally: 16764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file.cleanup() 16864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 1691aacd7bb027828471d8bcb88b0234ff8425695a5Ned Deily @unittest.skipUnless(site.ENABLE_USER_SITE, "requires access to PEP 370 " 1701aacd7bb027828471d8bcb88b0234ff8425695a5Ned Deily "user-site (site.ENABLE_USER_SITE)") 171af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes def test_s_option(self): 172af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes usersite = site.USER_SITE 173d8b16ab288e8695be25d5335a31338d12f4497adAntoine Pitrou self.assertIn(usersite, sys.path) 174af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 175513c4f8fdd663fc4e85b6da4fdbaf466c137d0ddÉric Araujo env = os.environ.copy() 176af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-c', 177513c4f8fdd663fc4e85b6da4fdbaf466c137d0ddÉric Araujo 'import sys; sys.exit(%r in sys.path)' % usersite], 178513c4f8fdd663fc4e85b6da4fdbaf466c137d0ddÉric Araujo env=env) 179b7019d8e9e6cb08a3b428351823382f3fc37899bBrett Cannon self.assertEqual(rc, 1, "%r is not in sys.path (sys.exit returned %r)" 180b7019d8e9e6cb08a3b428351823382f3fc37899bBrett Cannon % (usersite, rc)) 181af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 182513c4f8fdd663fc4e85b6da4fdbaf466c137d0ddÉric Araujo env = os.environ.copy() 183af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-s', '-c', 184513c4f8fdd663fc4e85b6da4fdbaf466c137d0ddÉric Araujo 'import sys; sys.exit(%r in sys.path)' % usersite], 185513c4f8fdd663fc4e85b6da4fdbaf466c137d0ddÉric Araujo env=env) 186af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes self.assertEqual(rc, 0) 187af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 188af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env = os.environ.copy() 189af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env["PYTHONNOUSERSITE"] = "1" 190af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-c', 1919b69ed9d6733aacca64d043f555af263f98b7df6Amaury Forgeot d'Arc 'import sys; sys.exit(%r in sys.path)' % usersite], 192af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env=env) 193af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes self.assertEqual(rc, 0) 194af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 195af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env = os.environ.copy() 196af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env["PYTHONUSERBASE"] = "/tmp" 197af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-c', 198af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 'import sys, site; sys.exit(site.USER_BASE.startswith("/tmp"))'], 199af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env=env) 200af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes self.assertEqual(rc, 1) 201af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 202764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé def test_getuserbase(self): 203764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = None 204764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé user_base = site.getuserbase() 205764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 206764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé # the call sets site.USER_BASE 2072623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(site.USER_BASE, user_base) 208764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 209764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé # let's set PYTHONUSERBASE and see if it uses it 210764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = None 2115633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé import sysconfig 2125633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé sysconfig._CONFIG_VARS = None 2135633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé 214764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé with EnvironmentVarGuard() as environ: 215764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé environ['PYTHONUSERBASE'] = 'xoxo' 216d8b16ab288e8695be25d5335a31338d12f4497adAntoine Pitrou self.assertTrue(site.getuserbase().startswith('xoxo'), 217d8b16ab288e8695be25d5335a31338d12f4497adAntoine Pitrou site.getuserbase()) 218764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 219764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé def test_getusersitepackages(self): 220764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_SITE = None 221764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = None 222764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé user_site = site.getusersitepackages() 223764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 224764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé # the call sets USER_BASE *and* USER_SITE 2252623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(site.USER_SITE, user_site) 226d8b16ab288e8695be25d5335a31338d12f4497adAntoine Pitrou self.assertTrue(user_site.startswith(site.USER_BASE), user_site) 227764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 228764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé def test_getsitepackages(self): 229764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.PREFIXES = ['xoxo'] 230764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé dirs = site.getsitepackages() 231764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 232764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if sys.platform in ('os2emx', 'riscos'): 233d8b16ab288e8695be25d5335a31338d12f4497adAntoine Pitrou self.assertEqual(len(dirs), 1) 234764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('xoxo', 'Lib', 'site-packages') 2352623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(dirs[0], wanted) 236764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé elif os.sep == '/': 23732b37348661b73b1dd6e061ef56679039222f31bNed Deily # OS X, Linux, FreeBSD, etc 238d9ed62cde30fea0c25d3e6790d2506e7367ccdf7Ezio Melotti self.assertEqual(len(dirs), 2) 239764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3], 240764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 'site-packages') 2412623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(dirs[0], wanted) 242764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('xoxo', 'lib', 'site-python') 2432623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(dirs[1], wanted) 244764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé else: 2452c8bf04308a078cc8c24dfe16afa816efebeb2daNed Deily # other platforms 246d9ed62cde30fea0c25d3e6790d2506e7367ccdf7Ezio Melotti self.assertEqual(len(dirs), 2) 2472623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(dirs[0], 'xoxo') 248d24cab8c7454921c9279cc73a75d0b1fcf347a6dTarek Ziadé wanted = os.path.join('xoxo', 'lib', 'site-packages') 2492623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(dirs[1], wanted) 250764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 25164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannonclass PthFile(object): 25264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Helper class for handling testing of .pth files""" 25364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 25464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon def __init__(self, filename_base=TESTFN, imported="time", 25564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon good_dirname="__testdir__", bad_dirname="__bad"): 25664a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Initialize instance variables""" 25764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.filename = filename_base + ".pth" 25864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.base_dir = os.path.abspath('') 25964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.file_path = os.path.join(self.base_dir, self.filename) 260ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.imported = imported 26164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.good_dirname = good_dirname 26264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.bad_dirname = bad_dirname 26364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.good_dir_path = os.path.join(self.base_dir, self.good_dirname) 26464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.bad_dir_path = os.path.join(self.base_dir, self.bad_dirname) 26564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 26664a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon def create(self): 26764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Create a .pth file with a comment, blank lines, an ``import 26864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon <self.imported>``, a line with self.good_dirname, and a line with 26964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.bad_dirname. 270182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 27164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon Creation of the directory for self.good_dir_path (based off of 27264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.good_dirname) is also performed. 27364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 27464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon Make sure to call self.cleanup() to undo anything done by this method. 275182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 27664a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """ 277ff52286d4a43d2a525ace6b68775f8fc60ed7a88Michael W. Hudson FILE = open(self.file_path, 'w') 27864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon try: 27964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, "#import @bad module name" 28064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, "\n" 28164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, "import %s" % self.imported 28264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, self.good_dirname 28364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, self.bad_dirname 28464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon finally: 28564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon FILE.close() 28664a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.mkdir(self.good_dir_path) 2870096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 288ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon def cleanup(self, prep=False): 28964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Make sure that the .pth file is deleted, self.imported is not in 29064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon sys.modules, and that both self.good_dirname and self.bad_dirname are 29164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon not existing directories.""" 292ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if os.path.exists(self.file_path): 29364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.remove(self.file_path) 294ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if prep: 295ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.imported_module = sys.modules.get(self.imported) 296ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if self.imported_module: 297ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon del sys.modules[self.imported] 298ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon else: 299ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if self.imported_module: 300ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon sys.modules[self.imported] = self.imported_module 301ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if os.path.exists(self.good_dir_path): 30264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.rmdir(self.good_dir_path) 303ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if os.path.exists(self.bad_dir_path): 30464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.rmdir(self.bad_dir_path) 3050096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3060096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonclass ImportSideEffectTests(unittest.TestCase): 3070096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Test side-effects from importing 'site'.""" 3080096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3090096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def setUp(self): 3100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Make a copy of sys.path""" 3110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.sys_path = sys.path[:] 3120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def tearDown(self): 3140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Restore sys.path""" 315a0e0f9eda4bf3b6ed9712a8bb992081d90249d41Nick Coghlan sys.path[:] = self.sys_path 3160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3170096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_abs__file__(self): 3180096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure all imported modules have their __file__ attribute 3190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # as an absolute path. 3200096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Handled by abs__file__() 3210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.abs__file__() 322ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger for module in (sys, os, __builtin__): 3230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 324dde5b94875460e704099593766f4a5bc3279483dEzio Melotti self.assertTrue(os.path.isabs(module.__file__), repr(module)) 3250096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon except AttributeError: 3260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon continue 327ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # We could try everything in sys.modules; however, when regrtest.py 328ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # runs something like test_frozen before test_site, then we will 329ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # be testing things loaded *after* test_site did path normalization 3300096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_no_duplicate_paths(self): 3320096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # No duplicate paths should exist in sys.path 3330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Handled by removeduppaths() 3340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.removeduppaths() 3350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon seen_paths = set() 3360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for path in sys.path: 337aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(path, seen_paths) 3380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon seen_paths.add(path) 3390096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3401f70221b861a3714735251d57695b2f472d0599bZachary Ware @unittest.skip('test not implemented') 3410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_add_build_dir(self): 3420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Test that the build directory's Modules directory is used when it 3430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # should be. 3440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # XXX: implement 3450096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon pass 3460096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3470096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_quit(self): 3480096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'quit' and 'exit' should be injected into __builtin__ 3495c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "quit")) 3505c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "exit")) 3510096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_copyright(self): 3530096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'copyright' and 'credits' should be in __builtin__ 3545c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "copyright")) 3555c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "credits")) 3560096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3570096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_help(self): 3580096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'help' should be set in __builtin__ 3595c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "help")) 3600096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_aliasing_mbcs(self): 3620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if sys.platform == "win32": 3630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import locale 3640096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if locale.getdefaultlocale()[1].startswith('cp'): 3650096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for value in encodings.aliases.aliases.itervalues(): 3660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if value == "mbcs": 3670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon break 3680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 3690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.fail("did not alias mbcs") 3700096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3710096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setdefaultencoding_removed(self): 3720096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure sys.setdefaultencoding is gone 3735c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(not hasattr(sys, "setdefaultencoding")) 3740096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_sitecustomize_executed(self): 3760096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # If sitecustomize is available, it should have been imported. 377dde5b94875460e704099593766f4a5bc3279483dEzio Melotti if "sitecustomize" not in sys.modules: 3780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 3790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import sitecustomize 3800096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon except ImportError: 3810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon pass 3820096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 3830096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.fail("sitecustomize not imported automatically") 3840096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3850096e262ffe836b4c7511158678f9e257cc3a020Brett Cannondef test_main(): 3860096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon run_unittest(HelperFunctionsTests, ImportSideEffectTests) 3870096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonif __name__ == "__main__": 3890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon test_main() 390