test_site.py revision ebd95222bf732f78b3a443d57d00174fbee8904e
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 80096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonfrom test.test_support import TestSkipped, run_unittest, TESTFN 90096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport __builtin__ 100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport os 110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport sys 120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport encodings 130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonimport tempfile 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: 200096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon raise TestSkipped("importation of site.py suppressed") 210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonclass HelperFunctionsTests(unittest.TestCase): 230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Tests for helper functions. 24ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 250096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon The setting of the encoding (set using sys.setdefaultencoding) used by 260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon the Unicode implementation is not tested. 27ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 280096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """ 290096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 300096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def setUp(self): 310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Save a copy of sys.path""" 320096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.sys_path = sys.path[:] 330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def tearDown(self): 350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Restore sys.path""" 360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon sys.path = self.sys_path 37ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_makepath(self): 390096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Test makepath() have an absolute path for its first return value 400096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # and a case-normalized version of the absolute path for its 410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # second value. 420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon path_parts = ("Beginning", "End") 430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon original_dir = os.path.join(*path_parts) 440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon abs_dir, norm_dir = site.makepath(*path_parts) 450096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnlessEqual(os.path.abspath(original_dir), abs_dir) 460096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if original_dir == os.path.normcase(original_dir): 470096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnlessEqual(abs_dir, norm_dir) 480096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 490096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnlessEqual(os.path.normcase(abs_dir), norm_dir) 500096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 510096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_init_pathinfo(self): 520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon dir_set = site._init_pathinfo() 530096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for entry in [site.makepath(path)[1] for path in sys.path 540096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if path and os.path.isdir(path)]: 550096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(entry in dir_set, 560096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon "%s from sys.path not found in set returned " 570096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon "by _init_pathinfo(): %s" % (entry, dir_set)) 58ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_addpackage(self): 600096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure addpackage() imports if the line starts with 'import', 610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # otherwise add a directory combined from sitedir and 'name'. 620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Must also skip comment lines. 630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon dir_path, file_name, new_dir = createpth() 640096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 650096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.addpackage(dir_path, file_name, set()) 660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(site.makepath(os.path.join(dir_path, new_dir))[0] in 670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon sys.path) 680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon finally: 690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon cleanuppth(dir_path, file_name, new_dir) 70ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger 710096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_addsitedir(self): 720096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon dir_path, file_name, new_dir = createpth() 730096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 740096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.addsitedir(dir_path, set()) 750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(site.makepath(os.path.join(dir_path, new_dir))[0] in 760096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon sys.path) 770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon finally: 780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon cleanuppth(dir_path, file_name, new_dir) 790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 800096e262ffe836b4c7511158678f9e257cc3a020Brett Cannondef createpth(): 810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Create a temporary .pth file at the returned location and return the 820096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon directory where it was created, the pth file name, and the directory 830096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon specified in the pth file. 840096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 850096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Make sure to delete the file when finished. 860096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 870096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """ 880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon pth_dirname = "__testdir__" 890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon file_name = TESTFN + ".pth" 900096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon full_dirname = os.path.dirname(os.path.abspath(file_name)) 910096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon FILE = file(os.path.join(full_dirname, file_name), 'w') 920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon print>>FILE, "#import @bad module name" 940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon print>>FILE, '' 950096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon print>>FILE, "import os" 960096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon print>>FILE, pth_dirname 970096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon finally: 980096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon FILE.close() 990096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon os.mkdir(os.path.join(full_dirname, pth_dirname)) 1000096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon return full_dirname, file_name, pth_dirname 1010096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1020096e262ffe836b4c7511158678f9e257cc3a020Brett Cannondef cleanuppth(full_dirname, file_name, pth_dirname): 1030096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Clean up what createpth() made""" 1040096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon os.remove(os.path.join(full_dirname, file_name)) 1050096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon os.rmdir(os.path.join(full_dirname, pth_dirname)) 1060096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1070096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonclass ImportSideEffectTests(unittest.TestCase): 1080096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Test side-effects from importing 'site'.""" 1090096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def setUp(self): 1110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Make a copy of sys.path""" 1120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.sys_path = sys.path[:] 1130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def tearDown(self): 1150096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon """Restore sys.path""" 1160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon sys.path = self.sys_path 1170096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1180096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_abs__file__(self): 1190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure all imported modules have their __file__ attribute 1200096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # as an absolute path. 1210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Handled by abs__file__() 1220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.abs__file__() 123ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger for module in (sys, os, __builtin__): 1240096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 125ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger self.failUnless(os.path.isabs(module.__file__), `module`) 1260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon except AttributeError: 1270096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon continue 128ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # We could try everything in sys.modules; however, when regrtest.py 129ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # runs something like test_frozen before test_site, then we will 130ebd95222bf732f78b3a443d57d00174fbee8904eRaymond Hettinger # be testing things loaded *after* test_site did path normalization 1310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1320096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_no_duplicate_paths(self): 1330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # No duplicate paths should exist in sys.path 1340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Handled by removeduppaths() 1350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon site.removeduppaths() 1360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon seen_paths = set() 1370096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for path in sys.path: 1380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(path not in seen_paths) 1390096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon seen_paths.add(path) 1400096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_add_build_dir(self): 1420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Test that the build directory's Modules directory is used when it 1430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # should be. 1440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # XXX: implement 1450096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon pass 1460096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1470096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_quit(self): 1480096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'quit' and 'exit' should be injected into __builtin__ 1490096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(hasattr(__builtin__, "quit")) 1500096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(hasattr(__builtin__, "exit")) 1510096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_copyright(self): 1530096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'copyright' and 'credits' should be in __builtin__ 1540096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(hasattr(__builtin__, "copyright")) 1550096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(hasattr(__builtin__, "credits")) 1560096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1570096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setting_help(self): 1580096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # 'help' should be set in __builtin__ 1590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(hasattr(__builtin__, "help")) 1600096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_aliasing_mbcs(self): 1620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if sys.platform == "win32": 1630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import locale 1640096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if locale.getdefaultlocale()[1].startswith('cp'): 1650096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon for value in encodings.aliases.aliases.itervalues(): 1660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if value == "mbcs": 1670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon break 1680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 1690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.fail("did not alias mbcs") 1700096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1710096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_setdefaultencoding_removed(self): 1720096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # Make sure sys.setdefaultencoding is gone 1730096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.failUnless(not hasattr(sys, "setdefaultencoding")) 1740096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon def test_sitecustomize_executed(self): 1760096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon # If sitecustomize is available, it should have been imported. 1770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if not sys.modules.has_key("sitecustomize"): 1780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon try: 1790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon import sitecustomize 1800096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon except ImportError: 1810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon pass 1820096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else: 1830096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon self.fail("sitecustomize not imported automatically") 1840096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1850096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1860096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1870096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannondef test_main(): 1890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon run_unittest(HelperFunctionsTests, ImportSideEffectTests) 1900096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1910096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonif __name__ == "__main__": 1940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon test_main() 195