2004-06-04 22:12:51 -03:00
|
|
|
"""Tests for 'site'.
|
|
|
|
|
|
|
|
Tests assume the initial paths in sys.path once the interpreter has begun
|
|
|
|
executing have not been removed.
|
|
|
|
|
|
|
|
"""
|
|
|
|
import unittest
|
2009-04-26 17:51:44 -03:00
|
|
|
from test.test_support import run_unittest, TESTFN, EnvironmentVarGuard
|
Merged revisions 87497 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87497 | r.david.murray | 2010-12-26 14:54:29 -0500 (Sun, 26 Dec 2010) | 7 lines
#5258/#10642: print fn, line, traceback and continue when .pth file is broken
If a .pth file contained an error, it could cause a traceback in site.py,
terminating its processing. In 2.7 and 3.2, the interpreter will then not
start. Previously, a message would print saying to use -v to get the
traceback. In either case, the traceback generated for a failed .pth file did
not include the .pth filename, making it difficult to debug the problem. Now
site.py reports not only the .pth filename but also the line number causing the
error, and just skips the remainder of the file.
........
2010-12-26 18:29:53 -04:00
|
|
|
from test.test_support import captured_output
|
2018-12-05 16:56:24 -04:00
|
|
|
from test import support
|
2004-06-04 22:12:51 -03:00
|
|
|
import __builtin__
|
2017-05-04 13:52:26 -03:00
|
|
|
import errno
|
2004-06-04 22:12:51 -03:00
|
|
|
import os
|
|
|
|
import sys
|
2010-12-26 20:09:41 -04:00
|
|
|
import re
|
2004-06-04 22:12:51 -03:00
|
|
|
import encodings
|
2008-05-06 19:41:46 -03:00
|
|
|
import subprocess
|
2010-01-23 05:23:15 -04:00
|
|
|
import sysconfig
|
|
|
|
from copy import copy
|
|
|
|
|
2004-06-04 22:12:51 -03:00
|
|
|
# Need to make sure to not import 'site' if someone specified ``-S`` at the
|
|
|
|
# command-line. Detect this by just making sure 'site' has not been imported
|
|
|
|
# already.
|
|
|
|
if "site" in sys.modules:
|
|
|
|
import site
|
|
|
|
else:
|
2009-03-26 18:10:30 -03:00
|
|
|
raise unittest.SkipTest("importation of site.py suppressed")
|
2004-06-04 22:12:51 -03:00
|
|
|
|
2017-05-04 13:21:52 -03:00
|
|
|
|
|
|
|
OLD_SYS_PATH = None
|
|
|
|
|
|
|
|
|
|
|
|
def setUpModule():
|
|
|
|
global OLD_SYS_PATH
|
|
|
|
OLD_SYS_PATH = sys.path[:]
|
|
|
|
|
|
|
|
if site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE):
|
|
|
|
# need to add user site directory for tests
|
|
|
|
try:
|
|
|
|
os.makedirs(site.USER_SITE)
|
|
|
|
# modify sys.path: will be restored by tearDownModule()
|
|
|
|
site.addsitedir(site.USER_SITE)
|
2017-05-04 13:52:26 -03:00
|
|
|
except OSError as exc:
|
|
|
|
if exc.errno in (errno.EACCES, errno.EPERM):
|
|
|
|
raise unittest.SkipTest('unable to create user site directory (%r): %s'
|
|
|
|
% (site.USER_SITE, exc))
|
|
|
|
else:
|
|
|
|
raise
|
2017-05-04 13:21:52 -03:00
|
|
|
|
|
|
|
|
|
|
|
def tearDownModule():
|
|
|
|
sys.path[:] = OLD_SYS_PATH
|
2016-03-14 13:49:46 -03:00
|
|
|
|
2008-05-06 19:41:46 -03:00
|
|
|
|
2004-06-04 22:12:51 -03:00
|
|
|
class HelperFunctionsTests(unittest.TestCase):
|
|
|
|
"""Tests for helper functions.
|
2004-06-27 00:02:18 -03:00
|
|
|
|
2004-06-04 22:12:51 -03:00
|
|
|
The setting of the encoding (set using sys.setdefaultencoding) used by
|
|
|
|
the Unicode implementation is not tested.
|
2004-06-27 00:02:18 -03:00
|
|
|
|
2004-06-04 22:12:51 -03:00
|
|
|
"""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Save a copy of sys.path"""
|
|
|
|
self.sys_path = sys.path[:]
|
2009-08-20 18:23:13 -03:00
|
|
|
self.old_base = site.USER_BASE
|
|
|
|
self.old_site = site.USER_SITE
|
|
|
|
self.old_prefixes = site.PREFIXES
|
2010-01-23 05:23:15 -04:00
|
|
|
self.old_vars = copy(sysconfig._CONFIG_VARS)
|
2004-06-04 22:12:51 -03:00
|
|
|
|
2008-05-14 03:47:56 -03:00
|
|
|
def tearDown(self):
|
2004-06-04 22:12:51 -03:00
|
|
|
"""Restore sys.path"""
|
2009-10-17 13:19:51 -03:00
|
|
|
sys.path[:] = self.sys_path
|
2009-08-20 18:23:13 -03:00
|
|
|
site.USER_BASE = self.old_base
|
|
|
|
site.USER_SITE = self.old_site
|
|
|
|
site.PREFIXES = self.old_prefixes
|
2010-01-23 05:23:15 -04:00
|
|
|
sysconfig._CONFIG_VARS = self.old_vars
|
2004-06-27 00:02:18 -03:00
|
|
|
|
2004-06-04 22:12:51 -03:00
|
|
|
def test_makepath(self):
|
|
|
|
# Test makepath() have an absolute path for its first return value
|
|
|
|
# and a case-normalized version of the absolute path for its
|
|
|
|
# second value.
|
|
|
|
path_parts = ("Beginning", "End")
|
|
|
|
original_dir = os.path.join(*path_parts)
|
|
|
|
abs_dir, norm_dir = site.makepath(*path_parts)
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertEqual(os.path.abspath(original_dir), abs_dir)
|
2004-06-04 22:12:51 -03:00
|
|
|
if original_dir == os.path.normcase(original_dir):
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertEqual(abs_dir, norm_dir)
|
2004-06-04 22:12:51 -03:00
|
|
|
else:
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertEqual(os.path.normcase(abs_dir), norm_dir)
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
def test_init_pathinfo(self):
|
|
|
|
dir_set = site._init_pathinfo()
|
|
|
|
for entry in [site.makepath(path)[1] for path in sys.path
|
|
|
|
if path and os.path.isdir(path)]:
|
2010-01-23 19:04:36 -04:00
|
|
|
self.assertIn(entry, dir_set,
|
|
|
|
"%s from sys.path not found in set returned "
|
|
|
|
"by _init_pathinfo(): %s" % (entry, dir_set))
|
2004-06-27 00:02:18 -03:00
|
|
|
|
2004-07-13 04:12:25 -03:00
|
|
|
def pth_file_tests(self, pth_file):
|
|
|
|
"""Contain common code for testing results of reading a .pth file"""
|
2010-01-23 19:04:36 -04:00
|
|
|
self.assertIn(pth_file.imported, sys.modules,
|
|
|
|
"%s not in sys.modules" % pth_file.imported)
|
2009-11-01 19:54:20 -04:00
|
|
|
self.assertIn(site.makepath(pth_file.good_dir_path)[0], sys.path)
|
|
|
|
self.assertFalse(os.path.exists(pth_file.bad_dir_path))
|
2004-07-13 04:12:25 -03:00
|
|
|
|
2004-06-04 22:12:51 -03:00
|
|
|
def test_addpackage(self):
|
|
|
|
# Make sure addpackage() imports if the line starts with 'import',
|
2004-07-09 23:10:45 -03:00
|
|
|
# adds directories to sys.path for any line in the file that is not a
|
|
|
|
# comment or import that is a valid directory name for where the .pth
|
|
|
|
# file resides; invalid directories are not added
|
|
|
|
pth_file = PthFile()
|
2004-07-13 04:12:25 -03:00
|
|
|
pth_file.cleanup(prep=True) # to make sure that nothing is
|
|
|
|
# pre-existing that shouldn't be
|
2004-06-04 22:12:51 -03:00
|
|
|
try:
|
2004-07-09 23:10:45 -03:00
|
|
|
pth_file.create()
|
|
|
|
site.addpackage(pth_file.base_dir, pth_file.filename, set())
|
2004-07-13 04:12:25 -03:00
|
|
|
self.pth_file_tests(pth_file)
|
2004-06-04 22:12:51 -03:00
|
|
|
finally:
|
2004-07-09 23:10:45 -03:00
|
|
|
pth_file.cleanup()
|
2004-06-27 00:02:18 -03:00
|
|
|
|
Merged revisions 87497 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87497 | r.david.murray | 2010-12-26 14:54:29 -0500 (Sun, 26 Dec 2010) | 7 lines
#5258/#10642: print fn, line, traceback and continue when .pth file is broken
If a .pth file contained an error, it could cause a traceback in site.py,
terminating its processing. In 2.7 and 3.2, the interpreter will then not
start. Previously, a message would print saying to use -v to get the
traceback. In either case, the traceback generated for a failed .pth file did
not include the .pth filename, making it difficult to debug the problem. Now
site.py reports not only the .pth filename but also the line number causing the
error, and just skips the remainder of the file.
........
2010-12-26 18:29:53 -04:00
|
|
|
def make_pth(self, contents, pth_dir='.', pth_name=TESTFN):
|
|
|
|
# Create a .pth file and return its (abspath, basename).
|
|
|
|
pth_dir = os.path.abspath(pth_dir)
|
|
|
|
pth_basename = pth_name + '.pth'
|
|
|
|
pth_fn = os.path.join(pth_dir, pth_basename)
|
|
|
|
pth_file = open(pth_fn, 'w')
|
|
|
|
self.addCleanup(lambda: os.remove(pth_fn))
|
|
|
|
pth_file.write(contents)
|
|
|
|
pth_file.close()
|
|
|
|
return pth_dir, pth_basename
|
|
|
|
|
|
|
|
def test_addpackage_import_bad_syntax(self):
|
|
|
|
# Issue 10642
|
|
|
|
pth_dir, pth_fn = self.make_pth("import bad)syntax\n")
|
|
|
|
with captured_output("stderr") as err_out:
|
|
|
|
site.addpackage(pth_dir, pth_fn, set())
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), "line 1")
|
2010-12-26 20:09:41 -04:00
|
|
|
self.assertRegexpMatches(err_out.getvalue(),
|
|
|
|
re.escape(os.path.join(pth_dir, pth_fn)))
|
Merged revisions 87497 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87497 | r.david.murray | 2010-12-26 14:54:29 -0500 (Sun, 26 Dec 2010) | 7 lines
#5258/#10642: print fn, line, traceback and continue when .pth file is broken
If a .pth file contained an error, it could cause a traceback in site.py,
terminating its processing. In 2.7 and 3.2, the interpreter will then not
start. Previously, a message would print saying to use -v to get the
traceback. In either case, the traceback generated for a failed .pth file did
not include the .pth filename, making it difficult to debug the problem. Now
site.py reports not only the .pth filename but also the line number causing the
error, and just skips the remainder of the file.
........
2010-12-26 18:29:53 -04:00
|
|
|
# XXX: the previous two should be independent checks so that the
|
|
|
|
# order doesn't matter. The next three could be a single check
|
|
|
|
# but my regex foo isn't good enough to write it.
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), 'Traceback')
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), r'import bad\)syntax')
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), 'SyntaxError')
|
|
|
|
|
|
|
|
def test_addpackage_import_bad_exec(self):
|
|
|
|
# Issue 10642
|
|
|
|
pth_dir, pth_fn = self.make_pth("randompath\nimport nosuchmodule\n")
|
|
|
|
with captured_output("stderr") as err_out:
|
|
|
|
site.addpackage(pth_dir, pth_fn, set())
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), "line 2")
|
2010-12-26 20:09:41 -04:00
|
|
|
self.assertRegexpMatches(err_out.getvalue(),
|
|
|
|
re.escape(os.path.join(pth_dir, pth_fn)))
|
Merged revisions 87497 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87497 | r.david.murray | 2010-12-26 14:54:29 -0500 (Sun, 26 Dec 2010) | 7 lines
#5258/#10642: print fn, line, traceback and continue when .pth file is broken
If a .pth file contained an error, it could cause a traceback in site.py,
terminating its processing. In 2.7 and 3.2, the interpreter will then not
start. Previously, a message would print saying to use -v to get the
traceback. In either case, the traceback generated for a failed .pth file did
not include the .pth filename, making it difficult to debug the problem. Now
site.py reports not only the .pth filename but also the line number causing the
error, and just skips the remainder of the file.
........
2010-12-26 18:29:53 -04:00
|
|
|
# XXX: ditto previous XXX comment.
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), 'Traceback')
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), 'ImportError')
|
|
|
|
|
2010-12-27 00:37:25 -04:00
|
|
|
@unittest.skipIf(sys.platform == "win32", "Windows does not raise an "
|
|
|
|
"error for file paths containing null characters")
|
Merged revisions 87497 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87497 | r.david.murray | 2010-12-26 14:54:29 -0500 (Sun, 26 Dec 2010) | 7 lines
#5258/#10642: print fn, line, traceback and continue when .pth file is broken
If a .pth file contained an error, it could cause a traceback in site.py,
terminating its processing. In 2.7 and 3.2, the interpreter will then not
start. Previously, a message would print saying to use -v to get the
traceback. In either case, the traceback generated for a failed .pth file did
not include the .pth filename, making it difficult to debug the problem. Now
site.py reports not only the .pth filename but also the line number causing the
error, and just skips the remainder of the file.
........
2010-12-26 18:29:53 -04:00
|
|
|
def test_addpackage_import_bad_pth_file(self):
|
|
|
|
# Issue 5258
|
|
|
|
pth_dir, pth_fn = self.make_pth("abc\x00def\n")
|
|
|
|
with captured_output("stderr") as err_out:
|
|
|
|
site.addpackage(pth_dir, pth_fn, set())
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), "line 1")
|
2010-12-26 20:09:41 -04:00
|
|
|
self.assertRegexpMatches(err_out.getvalue(),
|
|
|
|
re.escape(os.path.join(pth_dir, pth_fn)))
|
Merged revisions 87497 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87497 | r.david.murray | 2010-12-26 14:54:29 -0500 (Sun, 26 Dec 2010) | 7 lines
#5258/#10642: print fn, line, traceback and continue when .pth file is broken
If a .pth file contained an error, it could cause a traceback in site.py,
terminating its processing. In 2.7 and 3.2, the interpreter will then not
start. Previously, a message would print saying to use -v to get the
traceback. In either case, the traceback generated for a failed .pth file did
not include the .pth filename, making it difficult to debug the problem. Now
site.py reports not only the .pth filename but also the line number causing the
error, and just skips the remainder of the file.
........
2010-12-26 18:29:53 -04:00
|
|
|
# XXX: ditto previous XXX comment.
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), 'Traceback')
|
|
|
|
self.assertRegexpMatches(err_out.getvalue(), 'TypeError')
|
|
|
|
|
2004-06-04 22:12:51 -03:00
|
|
|
def test_addsitedir(self):
|
2004-07-09 23:10:45 -03:00
|
|
|
# Same tests for test_addpackage since addsitedir() essentially just
|
|
|
|
# calls addpackage() for every .pth file in the directory
|
|
|
|
pth_file = PthFile()
|
2004-07-13 04:12:25 -03:00
|
|
|
pth_file.cleanup(prep=True) # Make sure that nothing is pre-existing
|
|
|
|
# that is tested for
|
2004-06-04 22:12:51 -03:00
|
|
|
try:
|
2004-07-13 04:12:25 -03:00
|
|
|
pth_file.create()
|
2004-07-09 23:10:45 -03:00
|
|
|
site.addsitedir(pth_file.base_dir, set())
|
2004-07-13 04:12:25 -03:00
|
|
|
self.pth_file_tests(pth_file)
|
2004-06-04 22:12:51 -03:00
|
|
|
finally:
|
2004-07-09 23:10:45 -03:00
|
|
|
pth_file.cleanup()
|
|
|
|
|
2011-10-31 20:14:52 -03:00
|
|
|
@unittest.skipUnless(site.ENABLE_USER_SITE, "requires access to PEP 370 "
|
|
|
|
"user-site (site.ENABLE_USER_SITE)")
|
2008-05-06 19:41:46 -03:00
|
|
|
def test_s_option(self):
|
|
|
|
usersite = site.USER_SITE
|
2009-11-01 19:54:20 -04:00
|
|
|
self.assertIn(usersite, sys.path)
|
2008-05-06 19:41:46 -03:00
|
|
|
|
2011-01-03 13:57:29 -04:00
|
|
|
env = os.environ.copy()
|
2008-05-06 19:41:46 -03:00
|
|
|
rc = subprocess.call([sys.executable, '-c',
|
2011-01-03 13:57:29 -04:00
|
|
|
'import sys; sys.exit(%r in sys.path)' % usersite],
|
|
|
|
env=env)
|
2009-02-24 18:01:02 -04:00
|
|
|
self.assertEqual(rc, 1, "%r is not in sys.path (sys.exit returned %r)"
|
|
|
|
% (usersite, rc))
|
2008-05-06 19:41:46 -03:00
|
|
|
|
2011-01-03 13:57:29 -04:00
|
|
|
env = os.environ.copy()
|
2008-05-06 19:41:46 -03:00
|
|
|
rc = subprocess.call([sys.executable, '-s', '-c',
|
2011-01-03 13:57:29 -04:00
|
|
|
'import sys; sys.exit(%r in sys.path)' % usersite],
|
|
|
|
env=env)
|
2008-05-06 19:41:46 -03:00
|
|
|
self.assertEqual(rc, 0)
|
|
|
|
|
|
|
|
env = os.environ.copy()
|
|
|
|
env["PYTHONNOUSERSITE"] = "1"
|
|
|
|
rc = subprocess.call([sys.executable, '-c',
|
2008-06-19 18:17:12 -03:00
|
|
|
'import sys; sys.exit(%r in sys.path)' % usersite],
|
2008-05-06 19:41:46 -03:00
|
|
|
env=env)
|
|
|
|
self.assertEqual(rc, 0)
|
|
|
|
|
|
|
|
env = os.environ.copy()
|
|
|
|
env["PYTHONUSERBASE"] = "/tmp"
|
|
|
|
rc = subprocess.call([sys.executable, '-c',
|
|
|
|
'import sys, site; sys.exit(site.USER_BASE.startswith("/tmp"))'],
|
|
|
|
env=env)
|
|
|
|
self.assertEqual(rc, 1)
|
|
|
|
|
2009-08-20 18:23:13 -03:00
|
|
|
def test_getuserbase(self):
|
|
|
|
site.USER_BASE = None
|
|
|
|
user_base = site.getuserbase()
|
|
|
|
|
|
|
|
# the call sets site.USER_BASE
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(site.USER_BASE, user_base)
|
2009-08-20 18:23:13 -03:00
|
|
|
|
|
|
|
# let's set PYTHONUSERBASE and see if it uses it
|
|
|
|
site.USER_BASE = None
|
2010-01-23 05:23:15 -04:00
|
|
|
import sysconfig
|
|
|
|
sysconfig._CONFIG_VARS = None
|
|
|
|
|
2009-08-20 18:23:13 -03:00
|
|
|
with EnvironmentVarGuard() as environ:
|
|
|
|
environ['PYTHONUSERBASE'] = 'xoxo'
|
2009-11-01 19:54:20 -04:00
|
|
|
self.assertTrue(site.getuserbase().startswith('xoxo'),
|
|
|
|
site.getuserbase())
|
2009-08-20 18:23:13 -03:00
|
|
|
|
|
|
|
def test_getusersitepackages(self):
|
|
|
|
site.USER_SITE = None
|
|
|
|
site.USER_BASE = None
|
|
|
|
user_site = site.getusersitepackages()
|
|
|
|
|
|
|
|
# the call sets USER_BASE *and* USER_SITE
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(site.USER_SITE, user_site)
|
2009-11-01 19:54:20 -04:00
|
|
|
self.assertTrue(user_site.startswith(site.USER_BASE), user_site)
|
2018-12-05 16:56:24 -04:00
|
|
|
self.assertEqual(site.USER_BASE, site.getuserbase())
|
2009-08-20 18:23:13 -03:00
|
|
|
|
|
|
|
def test_getsitepackages(self):
|
|
|
|
site.PREFIXES = ['xoxo']
|
|
|
|
dirs = site.getsitepackages()
|
|
|
|
|
|
|
|
if sys.platform in ('os2emx', 'riscos'):
|
2009-11-01 19:54:20 -04:00
|
|
|
self.assertEqual(len(dirs), 1)
|
2009-08-20 18:23:13 -03:00
|
|
|
wanted = os.path.join('xoxo', 'Lib', 'site-packages')
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(dirs[0], wanted)
|
2009-08-20 18:23:13 -03:00
|
|
|
elif os.sep == '/':
|
2016-12-03 03:14:09 -04:00
|
|
|
# OS X, Linux, FreeBSD, etc
|
2010-08-17 05:38:05 -03:00
|
|
|
self.assertEqual(len(dirs), 2)
|
2009-08-20 18:23:13 -03:00
|
|
|
wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3],
|
|
|
|
'site-packages')
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(dirs[0], wanted)
|
2009-08-20 18:23:13 -03:00
|
|
|
wanted = os.path.join('xoxo', 'lib', 'site-python')
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(dirs[1], wanted)
|
2009-08-20 18:23:13 -03:00
|
|
|
else:
|
2012-02-05 19:55:50 -04:00
|
|
|
# other platforms
|
2010-08-17 05:38:05 -03:00
|
|
|
self.assertEqual(len(dirs), 2)
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(dirs[0], 'xoxo')
|
2009-10-27 18:20:27 -03:00
|
|
|
wanted = os.path.join('xoxo', 'lib', 'site-packages')
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(dirs[1], wanted)
|
2009-08-20 18:23:13 -03:00
|
|
|
|
2018-12-05 16:56:24 -04:00
|
|
|
def test_no_home_directory(self):
|
|
|
|
# bpo-10496: getuserbase() and getusersitepackages() must not fail if
|
|
|
|
# the current user has no home directory (if expanduser() returns the
|
|
|
|
# path unchanged).
|
|
|
|
site.USER_SITE = None
|
|
|
|
site.USER_BASE = None
|
|
|
|
sysconfig._CONFIG_VARS = None
|
|
|
|
|
|
|
|
with EnvironmentVarGuard() as environ, \
|
|
|
|
support.swap_attr(os.path, 'expanduser', lambda path: path):
|
|
|
|
|
|
|
|
del environ['PYTHONUSERBASE']
|
|
|
|
del environ['APPDATA']
|
|
|
|
|
|
|
|
user_base = site.getuserbase()
|
|
|
|
self.assertTrue(user_base.startswith('~' + os.sep),
|
|
|
|
user_base)
|
|
|
|
|
|
|
|
user_site = site.getusersitepackages()
|
|
|
|
self.assertTrue(user_site.startswith(user_base), user_site)
|
|
|
|
|
|
|
|
def fake_isdir(path):
|
|
|
|
fake_isdir.arg = path
|
|
|
|
return False
|
|
|
|
fake_isdir.arg = None
|
|
|
|
|
|
|
|
def must_not_be_called(*args):
|
|
|
|
raise AssertionError
|
|
|
|
|
|
|
|
with support.swap_attr(os.path, 'isdir', fake_isdir), \
|
|
|
|
support.swap_attr(site, 'addsitedir', must_not_be_called), \
|
|
|
|
support.swap_attr(site, 'ENABLE_USER_SITE', True):
|
|
|
|
|
|
|
|
# addusersitepackages() must not add user_site to sys.path
|
|
|
|
# if it is not an existing directory
|
|
|
|
known_paths = set()
|
|
|
|
site.addusersitepackages(known_paths)
|
|
|
|
|
|
|
|
self.assertEqual(fake_isdir.arg, user_site)
|
|
|
|
self.assertFalse(known_paths)
|
|
|
|
|
|
|
|
|
2004-07-09 23:10:45 -03:00
|
|
|
class PthFile(object):
|
|
|
|
"""Helper class for handling testing of .pth files"""
|
|
|
|
|
|
|
|
def __init__(self, filename_base=TESTFN, imported="time",
|
|
|
|
good_dirname="__testdir__", bad_dirname="__bad"):
|
|
|
|
"""Initialize instance variables"""
|
|
|
|
self.filename = filename_base + ".pth"
|
|
|
|
self.base_dir = os.path.abspath('')
|
|
|
|
self.file_path = os.path.join(self.base_dir, self.filename)
|
2004-07-13 04:12:25 -03:00
|
|
|
self.imported = imported
|
2004-07-09 23:10:45 -03:00
|
|
|
self.good_dirname = good_dirname
|
|
|
|
self.bad_dirname = bad_dirname
|
|
|
|
self.good_dir_path = os.path.join(self.base_dir, self.good_dirname)
|
|
|
|
self.bad_dir_path = os.path.join(self.base_dir, self.bad_dirname)
|
|
|
|
|
|
|
|
def create(self):
|
|
|
|
"""Create a .pth file with a comment, blank lines, an ``import
|
|
|
|
<self.imported>``, a line with self.good_dirname, and a line with
|
|
|
|
self.bad_dirname.
|
2004-07-18 03:16:08 -03:00
|
|
|
|
2004-07-09 23:10:45 -03:00
|
|
|
Creation of the directory for self.good_dir_path (based off of
|
|
|
|
self.good_dirname) is also performed.
|
|
|
|
|
|
|
|
Make sure to call self.cleanup() to undo anything done by this method.
|
2004-07-18 03:16:08 -03:00
|
|
|
|
2004-07-09 23:10:45 -03:00
|
|
|
"""
|
2005-05-27 11:58:06 -03:00
|
|
|
FILE = open(self.file_path, 'w')
|
2004-07-09 23:10:45 -03:00
|
|
|
try:
|
|
|
|
print>>FILE, "#import @bad module name"
|
|
|
|
print>>FILE, "\n"
|
|
|
|
print>>FILE, "import %s" % self.imported
|
|
|
|
print>>FILE, self.good_dirname
|
|
|
|
print>>FILE, self.bad_dirname
|
|
|
|
finally:
|
|
|
|
FILE.close()
|
|
|
|
os.mkdir(self.good_dir_path)
|
2004-06-04 22:12:51 -03:00
|
|
|
|
2004-07-13 04:12:25 -03:00
|
|
|
def cleanup(self, prep=False):
|
2004-07-09 23:10:45 -03:00
|
|
|
"""Make sure that the .pth file is deleted, self.imported is not in
|
|
|
|
sys.modules, and that both self.good_dirname and self.bad_dirname are
|
|
|
|
not existing directories."""
|
2004-07-13 04:12:25 -03:00
|
|
|
if os.path.exists(self.file_path):
|
2004-07-09 23:10:45 -03:00
|
|
|
os.remove(self.file_path)
|
2004-07-13 04:12:25 -03:00
|
|
|
if prep:
|
|
|
|
self.imported_module = sys.modules.get(self.imported)
|
|
|
|
if self.imported_module:
|
|
|
|
del sys.modules[self.imported]
|
|
|
|
else:
|
|
|
|
if self.imported_module:
|
|
|
|
sys.modules[self.imported] = self.imported_module
|
|
|
|
if os.path.exists(self.good_dir_path):
|
2004-07-09 23:10:45 -03:00
|
|
|
os.rmdir(self.good_dir_path)
|
2004-07-13 04:12:25 -03:00
|
|
|
if os.path.exists(self.bad_dir_path):
|
2004-07-09 23:10:45 -03:00
|
|
|
os.rmdir(self.bad_dir_path)
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
class ImportSideEffectTests(unittest.TestCase):
|
|
|
|
"""Test side-effects from importing 'site'."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Make a copy of sys.path"""
|
|
|
|
self.sys_path = sys.path[:]
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
"""Restore sys.path"""
|
2009-10-17 13:19:51 -03:00
|
|
|
sys.path[:] = self.sys_path
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
def test_abs__file__(self):
|
|
|
|
# Make sure all imported modules have their __file__ attribute
|
|
|
|
# as an absolute path.
|
|
|
|
# Handled by abs__file__()
|
|
|
|
site.abs__file__()
|
2004-06-27 00:02:18 -03:00
|
|
|
for module in (sys, os, __builtin__):
|
2004-06-04 22:12:51 -03:00
|
|
|
try:
|
2010-02-03 01:37:26 -04:00
|
|
|
self.assertTrue(os.path.isabs(module.__file__), repr(module))
|
2004-06-04 22:12:51 -03:00
|
|
|
except AttributeError:
|
|
|
|
continue
|
2004-06-27 00:02:18 -03:00
|
|
|
# We could try everything in sys.modules; however, when regrtest.py
|
|
|
|
# runs something like test_frozen before test_site, then we will
|
|
|
|
# be testing things loaded *after* test_site did path normalization
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
def test_no_duplicate_paths(self):
|
|
|
|
# No duplicate paths should exist in sys.path
|
|
|
|
# Handled by removeduppaths()
|
|
|
|
site.removeduppaths()
|
|
|
|
seen_paths = set()
|
|
|
|
for path in sys.path:
|
2010-01-23 19:04:36 -04:00
|
|
|
self.assertNotIn(path, seen_paths)
|
2004-06-04 22:12:51 -03:00
|
|
|
seen_paths.add(path)
|
|
|
|
|
2013-12-10 16:09:20 -04:00
|
|
|
@unittest.skip('test not implemented')
|
2004-06-04 22:12:51 -03:00
|
|
|
def test_add_build_dir(self):
|
|
|
|
# Test that the build directory's Modules directory is used when it
|
|
|
|
# should be.
|
|
|
|
# XXX: implement
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_setting_quit(self):
|
|
|
|
# 'quit' and 'exit' should be injected into __builtin__
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(hasattr(__builtin__, "quit"))
|
|
|
|
self.assertTrue(hasattr(__builtin__, "exit"))
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
def test_setting_copyright(self):
|
|
|
|
# 'copyright' and 'credits' should be in __builtin__
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(hasattr(__builtin__, "copyright"))
|
|
|
|
self.assertTrue(hasattr(__builtin__, "credits"))
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
def test_setting_help(self):
|
|
|
|
# 'help' should be set in __builtin__
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(hasattr(__builtin__, "help"))
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
def test_aliasing_mbcs(self):
|
|
|
|
if sys.platform == "win32":
|
|
|
|
import locale
|
|
|
|
if locale.getdefaultlocale()[1].startswith('cp'):
|
|
|
|
for value in encodings.aliases.aliases.itervalues():
|
|
|
|
if value == "mbcs":
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
self.fail("did not alias mbcs")
|
|
|
|
|
|
|
|
def test_setdefaultencoding_removed(self):
|
|
|
|
# Make sure sys.setdefaultencoding is gone
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(not hasattr(sys, "setdefaultencoding"))
|
2004-06-04 22:12:51 -03:00
|
|
|
|
|
|
|
def test_sitecustomize_executed(self):
|
|
|
|
# If sitecustomize is available, it should have been imported.
|
2010-02-03 01:37:26 -04:00
|
|
|
if "sitecustomize" not in sys.modules:
|
2004-06-04 22:12:51 -03:00
|
|
|
try:
|
|
|
|
import sitecustomize
|
|
|
|
except ImportError:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
self.fail("sitecustomize not imported automatically")
|
|
|
|
|
|
|
|
def test_main():
|
|
|
|
run_unittest(HelperFunctionsTests, ImportSideEffectTests)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
test_main()
|