Tests assume the initial paths in sys.path once the interpreter has begun
executing have not been removed.
from test
.test_support
import TestSkipped
, TestFailed
, run_unittest
, TESTFN
# 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
if "site" in sys
.modules
:
raise TestSkipped("importation of site.py suppressed")
class HelperFunctionsTests(unittest
.TestCase
):
"""Tests for helper functions.
The setting of the encoding (set using sys.setdefaultencoding) used by
the Unicode implementation is not tested.
"""Save a copy of sys.path"""
self
.sys_path
= sys
.path
[:]
# Test makepath() have an absolute path for its first return value
# and a case-normalized version of the absolute path for its
path_parts
= ("Beginning", "End")
original_dir
= os
.path
.join(*path_parts
)
abs_dir
, norm_dir
= site
.makepath(*path_parts
)
self
.failUnlessEqual(os
.path
.abspath(original_dir
), abs_dir
)
if original_dir
== os
.path
.normcase(original_dir
):
self
.failUnlessEqual(abs_dir
, norm_dir
)
self
.failUnlessEqual(os
.path
.normcase(abs_dir
), norm_dir
)
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
)]:
self
.failUnless(entry
in dir_set
,
"%s from sys.path not found in set returned "
"by _init_pathinfo(): %s" % (entry
, dir_set
))
def pth_file_tests(self
, pth_file
):
"""Contain common code for testing results of reading a .pth file"""
self
.failUnless(pth_file
.imported
in sys
.modules
,
"%s not in sys.path" % pth_file
.imported
)
self
.failUnless(site
.makepath(pth_file
.good_dir_path
)[0] in sys
.path
)
self
.failUnless(not os
.path
.exists(pth_file
.bad_dir_path
))
def test_addpackage(self
):
# Make sure addpackage() imports if the line starts with 'import',
# 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
.cleanup(prep
=True) # to make sure that nothing is
# pre-existing that shouldn't be
site
.addpackage(pth_file
.base_dir
, pth_file
.filename
, set())
self
.pth_file_tests(pth_file
)
def test_addsitedir(self
):
# Same tests for test_addpackage since addsitedir() essentially just
# calls addpackage() for every .pth file in the directory
pth_file
.cleanup(prep
=True) # Make sure that nothing is pre-existing
site
.addsitedir(pth_file
.base_dir
, set())
self
.pth_file_tests(pth_file
)
"""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
)
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
)
"""Create a .pth file with a comment, blank lines, an ``import
<self.imported>``, a line with self.good_dirname, and a line with
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.
FILE
= open(self
.file_path
, 'wU')
print>>FILE
, "#import @bad module name"
print>>FILE
, "import %s" % self
.imported
print>>FILE
, self
.good_dirname
print>>FILE
, self
.bad_dirname
os
.mkdir(self
.good_dir_path
)
def cleanup(self
, prep
=False):
"""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."""
if os
.path
.exists(self
.file_path
):
os
.remove(self
.file_path
)
self
.imported_module
= sys
.modules
.get(self
.imported
)
del sys
.modules
[self
.imported
]
sys
.modules
[self
.imported
] = self
.imported_module
if os
.path
.exists(self
.good_dir_path
):
os
.rmdir(self
.good_dir_path
)
if os
.path
.exists(self
.bad_dir_path
):
os
.rmdir(self
.bad_dir_path
)
class ImportSideEffectTests(unittest
.TestCase
):
"""Test side-effects from importing 'site'."""
"""Make a copy of sys.path"""
self
.sys_path
= sys
.path
[:]
def test_abs__file__(self
):
# Make sure all imported modules have their __file__ attribute
# Handled by abs__file__()
for module
in (sys
, os
, __builtin__
):
self
.failUnless(os
.path
.isabs(module
.__file
__), `module`
)
# 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
def test_no_duplicate_paths(self
):
# No duplicate paths should exist in sys.path
# Handled by removeduppaths()
self
.failUnless(path
not in seen_paths
)
def test_add_build_dir(self
):
# Test that the build directory's Modules directory is used when it
def test_setting_quit(self
):
# 'quit' and 'exit' should be injected into __builtin__
self
.failUnless(hasattr(__builtin__
, "quit"))
self
.failUnless(hasattr(__builtin__
, "exit"))
def test_setting_copyright(self
):
# 'copyright' and 'credits' should be in __builtin__
self
.failUnless(hasattr(__builtin__
, "copyright"))
self
.failUnless(hasattr(__builtin__
, "credits"))
def test_setting_help(self
):
# 'help' should be set in __builtin__
self
.failUnless(hasattr(__builtin__
, "help"))
def test_aliasing_mbcs(self
):
if sys
.platform
== "win32":
if locale
.getdefaultlocale()[1].startswith('cp'):
for value
in encodings
.aliases
.aliases
.itervalues():
self
.fail("did not alias mbcs")
def test_setdefaultencoding_removed(self
):
# Make sure sys.setdefaultencoding is gone
self
.failUnless(not hasattr(sys
, "setdefaultencoding"))
def test_sitecustomize_executed(self
):
# If sitecustomize is available, it should have been imported.
if not sys
.modules
.has_key("sitecustomize"):
self
.fail("sitecustomize not imported automatically")
run_unittest(HelperFunctionsTests
, ImportSideEffectTests
)
if __name__
== "__main__":