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