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