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