test_site.py revision d24cab8c7454921c9279cc73a75d0b1fcf347a6d
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 90096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport __builtin__ 100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport os 110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport sys 120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport encodings 13af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesimport subprocess 140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon# Need to make sure to not import 'site' if someone specified ``-S`` at the 150096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon# command-line. Detect this by just making sure 'site' has not been imported 160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon# already. 170096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonif "site" in sys.modules: 180096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import site 190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonelse: 20bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("importation of site.py suppressed") 210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 22af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesif not os.path.isdir(site.USER_SITE): 23af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes # need to add user site directory for tests 24af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes os.makedirs(site.USER_SITE) 25af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes site.addsitedir(site.USER_SITE) 26af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 270096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonclass HelperFunctionsTests(unittest.TestCase): 280096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Tests for helper functions. 29ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 300096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon The setting of the encoding (set using sys.setdefaultencoding) used by 310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon the Unicode implementation is not tested. 32ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """ 340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def setUp(self): 360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Save a copy of sys.path""" 370096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.sys_path = sys.path[:] 38764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.old_base = site.USER_BASE 39764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.old_site = site.USER_SITE 40764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.old_prefixes = site.PREFIXES 410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 4240388cc3308e405dfb0f971eb144c7741c89868bNeal Norwitz def tearDown(self): 430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Restore sys.path""" 44a0e0f9eda4bf3b6ed9712a8bb992081d90249d41Nick Coghlan sys.path[:] = self.sys_path 45764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = self.old_base 46764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_SITE = self.old_site 47764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.PREFIXES = self.old_prefixes 48ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 490096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_makepath(self): 500096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Test makepath() have an absolute path for its first return value 510096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # and a case-normalized version of the absolute path for its 520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # second value. 530096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon path_parts = ("Beginning", "End") 540096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon original_dir = os.path.join(*path_parts) 550096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon abs_dir, norm_dir = site.makepath(*path_parts) 565c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertEqual(os.path.abspath(original_dir), abs_dir) 570096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if original_dir == os.path.normcase(original_dir): 585c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertEqual(abs_dir, norm_dir) 590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 605c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertEqual(os.path.normcase(abs_dir), norm_dir) 610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_init_pathinfo(self): 630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon dir_set = site._init_pathinfo() 640096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for entry in [site.makepath(path)[1] for path in sys.path 650096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if path and os.path.isdir(path)]: 665c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(entry in dir_set, 670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon "%s from sys.path not found in set returned " 680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon "by _init_pathinfo(): %s" % (entry, dir_set)) 69ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 70ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon def pth_file_tests(self, pth_file): 71ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon """Contain common code for testing results of reading a .pth file""" 725c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(pth_file.imported in sys.modules, 73ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon "%s not in sys.path" % pth_file.imported) 745c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(site.makepath(pth_file.good_dir_path)[0] in sys.path) 755c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(not os.path.exists(pth_file.bad_dir_path)) 76ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon 770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_addpackage(self): 780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure addpackage() imports if the line starts with 'import', 7964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # adds directories to sys.path for any line in the file that is not a 8064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # comment or import that is a valid directory name for where the .pth 8164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # file resides; invalid directories are not added 8264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file = PthFile() 83ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon pth_file.cleanup(prep=True) # to make sure that nothing is 84ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon # pre-existing that shouldn't be 850096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 8664a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file.create() 8764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon site.addpackage(pth_file.base_dir, pth_file.filename, set()) 88ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.pth_file_tests(pth_file) 890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon finally: 9064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file.cleanup() 91ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_addsitedir(self): 9364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # Same tests for test_addpackage since addsitedir() essentially just 9464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon # calls addpackage() for every .pth file in the directory 9564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file = PthFile() 96ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon pth_file.cleanup(prep=True) # Make sure that nothing is pre-existing 97ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon # that is tested for 980096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 99ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon pth_file.create() 10064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon site.addsitedir(pth_file.base_dir, set()) 101ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.pth_file_tests(pth_file) 1020096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon finally: 10364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon pth_file.cleanup() 10464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 105af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes def test_s_option(self): 106af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes usersite = site.USER_SITE 1075c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(usersite in sys.path) 108af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 109af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-c', 110b03f532fe539fe7ce9bc9e26dbea34608da19291Antoine Pitrou 'import sys; sys.exit(%r in sys.path)' % usersite]) 111b7019d8e9e6cb08a3b428351823382f3fc37899bBrett Cannon self.assertEqual(rc, 1, "%r is not in sys.path (sys.exit returned %r)" 112b7019d8e9e6cb08a3b428351823382f3fc37899bBrett Cannon % (usersite, rc)) 113af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 114af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-s', '-c', 1159b69ed9d6733aacca64d043f555af263f98b7df6Amaury Forgeot d'Arc 'import sys; sys.exit(%r in sys.path)' % usersite]) 116af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes self.assertEqual(rc, 0) 117af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 118af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env = os.environ.copy() 119af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env["PYTHONNOUSERSITE"] = "1" 120af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-c', 1219b69ed9d6733aacca64d043f555af263f98b7df6Amaury Forgeot d'Arc 'import sys; sys.exit(%r in sys.path)' % usersite], 122af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env=env) 123af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes self.assertEqual(rc, 0) 124af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 125af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env = os.environ.copy() 126af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env["PYTHONUSERBASE"] = "/tmp" 127af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes rc = subprocess.call([sys.executable, '-c', 128af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 'import sys, site; sys.exit(site.USER_BASE.startswith("/tmp"))'], 129af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes env=env) 130af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes self.assertEqual(rc, 1) 131af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 132764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé def test_getuserbase(self): 133764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = None 134764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé user_base = site.getuserbase() 135764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 136764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé # the call sets site.USER_BASE 137764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(site.USER_BASE, user_base) 138764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 139764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé # let's set PYTHONUSERBASE and see if it uses it 140764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = None 141764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé with EnvironmentVarGuard() as environ: 142764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé environ['PYTHONUSERBASE'] = 'xoxo' 143764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertTrue(site.getuserbase().startswith('xoxo')) 144764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 145764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé def test_getusersitepackages(self): 146764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_SITE = None 147764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.USER_BASE = None 148764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé user_site = site.getusersitepackages() 149764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 150764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé # the call sets USER_BASE *and* USER_SITE 151764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(site.USER_SITE, user_site) 152764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertTrue(user_site.startswith(site.USER_BASE)) 153764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 154764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé def test_getsitepackages(self): 155764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.PREFIXES = ['xoxo'] 156764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé dirs = site.getsitepackages() 157764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 158764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if sys.platform in ('os2emx', 'riscos'): 159764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertTrue(len(dirs), 1) 160764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('xoxo', 'Lib', 'site-packages') 161764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(dirs[0], wanted) 162764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé elif os.sep == '/': 163764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertTrue(len(dirs), 2) 164764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3], 165764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 'site-packages') 166764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(dirs[0], wanted) 167764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('xoxo', 'lib', 'site-python') 168764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(dirs[1], wanted) 169764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé else: 170764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertTrue(len(dirs), 2) 171764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(dirs[0], 'xoxo') 172d24cab8c7454921c9279cc73a75d0b1fcf347a6dTarek Ziadé wanted = os.path.join('xoxo', 'lib', 'site-packages') 173764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(dirs[1], wanted) 174764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 175764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé # let's try the specific Apple location 176764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if sys.platform == "darwin": 177764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé site.PREFIXES = ['Python.framework'] 178764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé dirs = site.getsitepackages() 179764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertTrue(len(dirs), 4) 180764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('~', 'Library', 'Python', 181764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé sys.version[:3], 'site-packages') 182764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(dirs[2], os.path.expanduser(wanted)) 183764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé wanted = os.path.join('/Library', 'Python', sys.version[:3], 184764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 'site-packages') 185764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé self.assertEquals(dirs[3], wanted) 186af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 18764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannonclass PthFile(object): 18864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Helper class for handling testing of .pth files""" 18964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 19064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon def __init__(self, filename_base=TESTFN, imported="time", 19164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon good_dirname="__testdir__", bad_dirname="__bad"): 19264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Initialize instance variables""" 19364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.filename = filename_base + ".pth" 19464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.base_dir = os.path.abspath('') 19564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.file_path = os.path.join(self.base_dir, self.filename) 196ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.imported = imported 19764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.good_dirname = good_dirname 19864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.bad_dirname = bad_dirname 19964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.good_dir_path = os.path.join(self.base_dir, self.good_dirname) 20064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.bad_dir_path = os.path.join(self.base_dir, self.bad_dirname) 20164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 20264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon def create(self): 20364a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Create a .pth file with a comment, blank lines, an ``import 20464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon <self.imported>``, a line with self.good_dirname, and a line with 20564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.bad_dirname. 206182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 20764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon Creation of the directory for self.good_dir_path (based off of 20864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon self.good_dirname) is also performed. 20964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon 21064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon Make sure to call self.cleanup() to undo anything done by this method. 211182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 21264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """ 213ff52286d4a43d2a525ace6b68775f8fc60ed7a88Michael W. Hudson FILE = open(self.file_path, 'w') 21464a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon try: 21564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, "#import @bad module name" 21664a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, "\n" 21764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, "import %s" % self.imported 21864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, self.good_dirname 21964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon print>>FILE, self.bad_dirname 22064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon finally: 22164a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon FILE.close() 22264a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.mkdir(self.good_dir_path) 2230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 224ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon def cleanup(self, prep=False): 22564a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon """Make sure that the .pth file is deleted, self.imported is not in 22664a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon sys.modules, and that both self.good_dirname and self.bad_dirname are 22764a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon not existing directories.""" 228ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if os.path.exists(self.file_path): 22964a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.remove(self.file_path) 230ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if prep: 231ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon self.imported_module = sys.modules.get(self.imported) 232ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if self.imported_module: 233ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon del sys.modules[self.imported] 234ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon else: 235ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if self.imported_module: 236ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon sys.modules[self.imported] = self.imported_module 237ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if os.path.exists(self.good_dir_path): 23864a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.rmdir(self.good_dir_path) 239ee86a66dd87787e54772c93c961fa611311b1502Brett Cannon if os.path.exists(self.bad_dir_path): 24064a84702461a22bc36f8534ec42f47096abfcc94Brett Cannon os.rmdir(self.bad_dir_path) 2410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonclass ImportSideEffectTests(unittest.TestCase): 2430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Test side-effects from importing 'site'.""" 2440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2450096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def setUp(self): 2460096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Make a copy of sys.path""" 2470096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.sys_path = sys.path[:] 2480096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2490096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def tearDown(self): 2500096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Restore sys.path""" 251a0e0f9eda4bf3b6ed9712a8bb992081d90249d41Nick Coghlan sys.path[:] = self.sys_path 2520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2530096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_abs__file__(self): 2540096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure all imported modules have their __file__ attribute 2550096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # as an absolute path. 2560096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Handled by abs__file__() 2570096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.abs__file__() 258ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger for module in (sys, os, __builtin__): 2590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 2605c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(os.path.isabs(module.__file__), `module`) 2610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon except AttributeError: 2620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon continue 263ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # We could try everything in sys.modules; however, when regrtest.py 264ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # runs something like test_frozen before test_site, then we will 265ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # be testing things loaded *after* test_site did path normalization 2660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_no_duplicate_paths(self): 2680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # No duplicate paths should exist in sys.path 2690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Handled by removeduppaths() 2700096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.removeduppaths() 2710096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon seen_paths = set() 2720096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for path in sys.path: 2735c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(path not in seen_paths) 2740096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon seen_paths.add(path) 2750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2760096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_add_build_dir(self): 2770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Test that the build directory's Modules directory is used when it 2780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # should be. 2790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # XXX: implement 2800096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon pass 2810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2820096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_quit(self): 2830096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'quit' and 'exit' should be injected into __builtin__ 2845c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "quit")) 2855c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "exit")) 2860096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2870096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_copyright(self): 2880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'copyright' and 'credits' should be in __builtin__ 2895c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "copyright")) 2905c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "credits")) 2910096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_help(self): 2930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'help' should be set in __builtin__ 2945c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(hasattr(__builtin__, "help")) 2950096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 2960096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_aliasing_mbcs(self): 2970096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if sys.platform == "win32": 2980096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import locale 2990096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if locale.getdefaultlocale()[1].startswith('cp'): 3000096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for value in encodings.aliases.aliases.itervalues(): 3010096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if value == "mbcs": 3020096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon break 3030096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 3040096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.fail("did not alias mbcs") 3050096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3060096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setdefaultencoding_removed(self): 3070096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure sys.setdefaultencoding is gone 3085c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(not hasattr(sys, "setdefaultencoding")) 3090096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_sitecustomize_executed(self): 3110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # If sitecustomize is available, it should have been imported. 3120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if not sys.modules.has_key("sitecustomize"): 3130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 3140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import sitecustomize 3150096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon except ImportError: 3160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon pass 3170096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 3180096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.fail("sitecustomize not imported automatically") 3190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3200096e262ffe836b4c7511158678f9e257cc3a020Brett Cannondef test_main(): 3210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon run_unittest(HelperFunctionsTests, ImportSideEffectTests) 3220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 3230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonif __name__ == "__main__": 3240096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon test_main() 325