test_path.py
403 lines
| 12.1 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r1617 | # encoding: utf-8 | |
Brian Granger
|
r2498 | """Tests for IPython.utils.path.py""" | |
Brian Granger
|
r1617 | ||
#----------------------------------------------------------------------------- | |||
# Copyright (C) 2008 The IPython Development Team | |||
# | |||
# Distributed under the terms of the BSD License. The full license is in | |||
# the file COPYING, distributed as part of this software. | |||
#----------------------------------------------------------------------------- | |||
#----------------------------------------------------------------------------- | |||
# Imports | |||
#----------------------------------------------------------------------------- | |||
Fernando Perez
|
r1843 | import os | |
import shutil | |||
import sys | |||
import tempfile | |||
MinRK
|
r4475 | import StringIO | |
Jorgen Stenarson
|
r1751 | ||
Jorgen Stenarson
|
r1801 | from os.path import join, abspath, split | |
Fernando Perez
|
r1843 | ||
Jorgen Stenarson
|
r1802 | import nose.tools as nt | |
Brian Granger
|
r1617 | ||
Fernando Perez
|
r1843 | from nose import with_setup | |
Brian Granger
|
r1617 | ||
Fernando Perez
|
r1843 | import IPython | |
Fernando Perez
|
r2436 | from IPython.testing import decorators as dec | |
bgranger
|
r2513 | from IPython.testing.decorators import skip_if_not_win32, skip_win32 | |
MinRK
|
r4475 | from IPython.utils import path, io | |
Fernando Perez
|
r1843 | ||
# Platform-dependent imports | |||
Jorgen Stenarson
|
r1750 | try: | |
import _winreg as wreg | |||
except ImportError: | |||
Jorgen Stenarson
|
r1793 | #Fake _winreg module on none windows platforms | |
import new | |||
Jorgen Stenarson
|
r1796 | sys.modules["_winreg"] = new.module("_winreg") | |
Jorgen Stenarson
|
r1793 | import _winreg as wreg | |
#Add entries that needs to be stubbed by the testing code | |||
(wreg.OpenKey, wreg.QueryValueEx,) = (None, None) | |||
Jorgen Stenarson
|
r1750 | ||
Fernando Perez
|
r1843 | #----------------------------------------------------------------------------- | |
# Globals | |||
#----------------------------------------------------------------------------- | |||
env = os.environ | |||
TEST_FILE_PATH = split(abspath(__file__))[0] | |||
TMP_TEST_DIR = tempfile.mkdtemp() | |||
HOME_TEST_DIR = join(TMP_TEST_DIR, "home_test_dir") | |||
MinRK
|
r3347 | XDG_TEST_DIR = join(HOME_TEST_DIR, "xdg_test_dir") | |
Fernando Perez
|
r2449 | IP_TEST_DIR = join(HOME_TEST_DIR,'.ipython') | |
Jorgen Stenarson
|
r1804 | # | |
# Setup/teardown functions/decorators | |||
Jorgen Stenarson
|
r1803 | # | |
def setup(): | |||
Jorgen Stenarson
|
r1805 | """Setup testenvironment for the module: | |
- Adds dummy home dir tree | |||
""" | |||
Fernando Perez
|
r1843 | # Do not mask exceptions here. In particular, catching WindowsError is a | |
# problem because that exception is only defined on Windows... | |||
os.makedirs(IP_TEST_DIR) | |||
MinRK
|
r3347 | os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython')) | |
Jorgen Stenarson
|
r1803 | ||
Brian Granger
|
r2505 | ||
Jorgen Stenarson
|
r1803 | def teardown(): | |
Jorgen Stenarson
|
r1805 | """Teardown testenvironment for the module: | |
- Remove dummy home dir tree | |||
""" | |||
Fernando Perez
|
r1843 | # Note: we remove the parent test dir, which is the root of all test | |
# subdirs we may have created. Use shutil instead of os.removedirs, so | |||
# that non-empty directories are all recursively removed. | |||
shutil.rmtree(TMP_TEST_DIR) | |||
Jorgen Stenarson
|
r1803 | ||
Brian Granger
|
r2505 | ||
Jorgen Stenarson
|
r1750 | def setup_environment(): | |
Jorgen Stenarson
|
r1805 | """Setup testenvironment for some functions that are tested | |
in this module. In particular this functions stores attributes | |||
and other things that we need to stub in some test functions. | |||
This needs to be done on a function level and not module level because | |||
each testfunction needs a pristine environment. | |||
""" | |||
Jorgen Stenarson
|
r1750 | global oldstuff, platformstuff | |
Brian Granger
|
r2505 | oldstuff = (env.copy(), os.name, path.get_home_dir, IPython.__file__) | |
Jorgen Stenarson
|
r1750 | ||
Jorgen Stenarson
|
r1796 | if os.name == 'nt': | |
platformstuff = (wreg.OpenKey, wreg.QueryValueEx,) | |||
Jorgen Stenarson
|
r1750 | ||
Brian Granger
|
r2505 | ||
Jorgen Stenarson
|
r1750 | def teardown_environment(): | |
Jorgen Stenarson
|
r1805 | """Restore things that were remebered by the setup_environment function | |
""" | |||
MinRK
|
r3896 | (oldenv, os.name, path.get_home_dir, IPython.__file__,) = oldstuff | |
MinRK
|
r4475 | reload(path) | |
Jorgen Stenarson
|
r1750 | for key in env.keys(): | |
if key not in oldenv: | |||
del env[key] | |||
env.update(oldenv) | |||
if hasattr(sys, 'frozen'): | |||
del sys.frozen | |||
Jorgen Stenarson
|
r1796 | if os.name == 'nt': | |
(wreg.OpenKey, wreg.QueryValueEx,) = platformstuff | |||
Jorgen Stenarson
|
r1750 | ||
Jorgen Stenarson
|
r1805 | # Build decorator that uses the setup_environment/setup_environment | |
Fernando Perez
|
r2436 | with_environment = with_setup(setup_environment, teardown_environment) | |
Jorgen Stenarson
|
r1750 | ||
Jorgen Stenarson
|
r1804 | ||
Jorgen Stenarson
|
r1820 | @skip_if_not_win32 | |
Fernando Perez
|
r2436 | @with_environment | |
Jorgen Stenarson
|
r1745 | def test_get_home_dir_1(): | |
Jorgen Stenarson
|
r1746 | """Testcase for py2exe logic, un-compressed lib | |
""" | |||
Jorgen Stenarson
|
r1796 | sys.frozen = True | |
Jorgen Stenarson
|
r1746 | ||
#fake filename for IPython.__init__ | |||
Jorgen Stenarson
|
r1855 | IPython.__file__ = abspath(join(HOME_TEST_DIR, "Lib/IPython/__init__.py")) | |
Jorgen Stenarson
|
r1746 | ||
bgranger
|
r2513 | home_dir = path.get_home_dir() | |
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | |
Brian Granger
|
r2505 | ||
Jorgen Stenarson
|
r1812 | @skip_if_not_win32 | |
Fernando Perez
|
r2436 | @with_environment | |
Jorgen Stenarson
|
r1800 | def test_get_home_dir_2(): | |
Jorgen Stenarson
|
r1746 | """Testcase for py2exe logic, compressed lib | |
""" | |||
Jorgen Stenarson
|
r1801 | sys.frozen = True | |
Jorgen Stenarson
|
r1746 | #fake filename for IPython.__init__ | |
Jorgen Stenarson
|
r1855 | IPython.__file__ = abspath(join(HOME_TEST_DIR, "Library.zip/IPython/__init__.py")).lower() | |
Jorgen Stenarson
|
r1746 | ||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | |
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR).lower()) | |
Jorgen Stenarson
|
r1746 | ||
Brian Granger
|
r2505 | ||
Fernando Perez
|
r2436 | @with_environment | |
bgranger
|
r2513 | @skip_win32 | |
Jorgen Stenarson
|
r1800 | def test_get_home_dir_3(): | |
Jorgen Stenarson
|
r1746 | """Testcase $HOME is set, then use its value as home directory.""" | |
Fernando Perez
|
r1843 | env["HOME"] = HOME_TEST_DIR | |
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | |
Jorgen Stenarson
|
r1802 | nt.assert_equal(home_dir, env["HOME"]) | |
Jorgen Stenarson
|
r1745 | ||
Brian Granger
|
r2505 | ||
Fernando Perez
|
r2436 | @with_environment | |
Min RK
|
r4105 | @skip_win32 | |
Jorgen Stenarson
|
r1800 | def test_get_home_dir_4(): | |
Brian Granger
|
r2505 | """Testcase $HOME is not set, os=='posix'. | |
Jorgen Stenarson
|
r1746 | This should fail with HomeDirError""" | |
Jorgen Stenarson
|
r1796 | os.name = 'posix' | |
Jorgen Stenarson
|
r1812 | if 'HOME' in env: del env['HOME'] | |
Brian Granger
|
r2505 | nt.assert_raises(path.HomeDirError, path.get_home_dir) | |
Jorgen Stenarson
|
r1820 | @skip_if_not_win32 | |
Fernando Perez
|
r2436 | @with_environment | |
Jorgen Stenarson
|
r1800 | def test_get_home_dir_5(): | |
bgranger
|
r2513 | """Using HOMEDRIVE + HOMEPATH, os=='nt'. | |
HOMESHARE is missing. | |||
""" | |||
Jorgen Stenarson
|
r1812 | ||
Jorgen Stenarson
|
r1796 | os.name = 'nt' | |
bgranger
|
r2513 | env.pop('HOMESHARE', None) | |
Jorgen Stenarson
|
r1855 | env['HOMEDRIVE'], env['HOMEPATH'] = os.path.splitdrive(HOME_TEST_DIR) | |
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | |
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | |
Jorgen Stenarson
|
r1746 | ||
Brian Granger
|
r2505 | ||
Jorgen Stenarson
|
r1820 | @skip_if_not_win32 | |
Fernando Perez
|
r2436 | @with_environment | |
Jorgen Stenarson
|
r1800 | def test_get_home_dir_6(): | |
bgranger
|
r2513 | """Using USERPROFILE, os=='nt'. | |
HOMESHARE, HOMEDRIVE, HOMEPATH are missing. | |||
Jorgen Stenarson
|
r1746 | """ | |
Jorgen Stenarson
|
r1750 | ||
Jorgen Stenarson
|
r1796 | os.name = 'nt' | |
bgranger
|
r2513 | env.pop('HOMESHARE', None) | |
env.pop('HOMEDRIVE', None) | |||
env.pop('HOMEPATH', None) | |||
Fernando Perez
|
r1843 | env["USERPROFILE"] = abspath(HOME_TEST_DIR) | |
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | |
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | |
Jorgen Stenarson
|
r1746 | ||
Brian Granger
|
r2505 | ||
Jorgen Stenarson
|
r1812 | @skip_if_not_win32 | |
Fernando Perez
|
r2436 | @with_environment | |
Jorgen Stenarson
|
r1800 | def test_get_home_dir_7(): | |
bgranger
|
r2513 | """Using HOMESHARE, os=='nt'.""" | |
os.name = 'nt' | |||
env["HOMESHARE"] = abspath(HOME_TEST_DIR) | |||
home_dir = path.get_home_dir() | |||
nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | |||
Fernando Perez
|
r3373 | ||
bgranger
|
r2513 | ||
# Should we stub wreg fully so we can run the test on all platforms? | |||
@skip_if_not_win32 | |||
@with_environment | |||
def test_get_home_dir_8(): | |||
"""Using registry hack for 'My Documents', os=='nt' | |||
Fernando Perez
|
r2447 | ||
bgranger
|
r2513 | HOMESHARE, HOMEDRIVE, HOMEPATH, USERPROFILE and others are missing. | |
Jorgen Stenarson
|
r1746 | """ | |
Jorgen Stenarson
|
r1796 | os.name = 'nt' | |
Fernando Perez
|
r2447 | # Remove from stub environment all keys that may be set | |
for key in ['HOME', 'HOMESHARE', 'HOMEDRIVE', 'HOMEPATH', 'USERPROFILE']: | |||
env.pop(key, None) | |||
Jorgen Stenarson
|
r1746 | ||
#Stub windows registry functions | |||
Jorgen Stenarson
|
r1796 | def OpenKey(x, y): | |
Jorgen Stenarson
|
r1746 | class key: | |
def Close(self): | |||
pass | |||
return key() | |||
Jorgen Stenarson
|
r1796 | def QueryValueEx(x, y): | |
Fernando Perez
|
r1843 | return [abspath(HOME_TEST_DIR)] | |
Jorgen Stenarson
|
r1746 | ||
Jorgen Stenarson
|
r1796 | wreg.OpenKey = OpenKey | |
wreg.QueryValueEx = QueryValueEx | |||
Jorgen Stenarson
|
r1746 | ||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | |
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | |
Jorgen Stenarson
|
r1745 | ||
Jorgen Stenarson
|
r1750 | ||
Fernando Perez
|
r2436 | @with_environment | |
Jorgen Stenarson
|
r1749 | def test_get_ipython_dir_1(): | |
Jorgen Stenarson
|
r1805 | """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions.""" | |
Min RK
|
r4105 | env_ipdir = os.path.join("someplace", ".ipython") | |
MinRK
|
r4475 | path._writable_dir = lambda path: True | |
Min RK
|
r4105 | env['IPYTHON_DIR'] = env_ipdir | |
Brian Granger
|
r2505 | ipdir = path.get_ipython_dir() | |
Min RK
|
r4105 | nt.assert_equal(ipdir, env_ipdir) | |
Jorgen Stenarson
|
r1749 | ||
Fernando Perez
|
r2436 | @with_environment | |
Jorgen Stenarson
|
r1800 | def test_get_ipython_dir_2(): | |
Jorgen Stenarson
|
r1805 | """test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions.""" | |
Brian Granger
|
r2505 | path.get_home_dir = lambda : "someplace" | |
MinRK
|
r4475 | path.get_xdg_dir = lambda : None | |
path._writable_dir = lambda path: True | |||
Jorgen Stenarson
|
r1796 | os.name = "posix" | |
Fernando Perez
|
r2449 | env.pop('IPYTHON_DIR', None) | |
env.pop('IPYTHONDIR', None) | |||
MinRK
|
r3347 | env.pop('XDG_CONFIG_HOME', None) | |
Brian Granger
|
r2505 | ipdir = path.get_ipython_dir() | |
Fernando Perez
|
r2392 | nt.assert_equal(ipdir, os.path.join("someplace", ".ipython")) | |
Jorgen Stenarson
|
r1749 | ||
MinRK
|
r3347 | @with_environment | |
def test_get_ipython_dir_3(): | |||
"""test_get_ipython_dir_3, use XDG if defined, and .ipython doesn't exist.""" | |||
path.get_home_dir = lambda : "someplace" | |||
MinRK
|
r4475 | path._writable_dir = lambda path: True | |
MinRK
|
r3347 | os.name = "posix" | |
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | |||
ipdir = path.get_ipython_dir() | |||
nt.assert_equal(ipdir, os.path.join(XDG_TEST_DIR, "ipython")) | |||
@with_environment | |||
def test_get_ipython_dir_4(): | |||
"""test_get_ipython_dir_4, use XDG if both exist.""" | |||
path.get_home_dir = lambda : HOME_TEST_DIR | |||
os.name = "posix" | |||
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | |||
xdg_ipdir = os.path.join(XDG_TEST_DIR, "ipython") | |||
ipdir = path.get_ipython_dir() | |||
nt.assert_equal(ipdir, xdg_ipdir) | |||
@with_environment | |||
def test_get_ipython_dir_5(): | |||
"""test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist.""" | |||
MinRK
|
r3896 | path.get_home_dir = lambda : HOME_TEST_DIR | |
MinRK
|
r3347 | os.name = "posix" | |
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | |||
os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython')) | |||
ipdir = path.get_ipython_dir() | |||
nt.assert_equal(ipdir, IP_TEST_DIR) | |||
@with_environment | |||
def test_get_ipython_dir_6(): | |||
"""test_get_ipython_dir_6, use XDG if defined and neither exist.""" | |||
MinRK
|
r4475 | xdg = os.path.join(HOME_TEST_DIR, 'somexdg') | |
os.mkdir(xdg) | |||
shutil.rmtree(os.path.join(HOME_TEST_DIR, '.ipython')) | |||
path.get_home_dir = lambda : HOME_TEST_DIR | |||
path.get_xdg_dir = lambda : xdg | |||
MinRK
|
r3347 | os.name = "posix" | |
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
MinRK
|
r4475 | env.pop('XDG_CONFIG_HOME', None) | |
xdg_ipdir = os.path.join(xdg, "ipython") | |||
MinRK
|
r3347 | ipdir = path.get_ipython_dir() | |
nt.assert_equal(ipdir, xdg_ipdir) | |||
@with_environment | |||
MinRK
|
r3896 | def test_get_ipython_dir_7(): | |
"""test_get_ipython_dir_7, test home directory expansion on IPYTHON_DIR""" | |||
MinRK
|
r4475 | path._writable_dir = lambda path: True | |
Min RK
|
r4105 | home_dir = os.path.expanduser('~') | |
env['IPYTHON_DIR'] = os.path.join('~', 'somewhere') | |||
MinRK
|
r3896 | ipdir = path.get_ipython_dir() | |
nt.assert_equal(ipdir, os.path.join(home_dir, 'somewhere')) | |||
@with_environment | |||
MinRK
|
r3347 | def test_get_xdg_dir_1(): | |
"""test_get_xdg_dir_1, check xdg_dir""" | |||
reload(path) | |||
MinRK
|
r4475 | path._writable_dir = lambda path: True | |
MinRK
|
r3347 | path.get_home_dir = lambda : 'somewhere' | |
os.name = "posix" | |||
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
env.pop('XDG_CONFIG_HOME', None) | |||
nt.assert_equal(path.get_xdg_dir(), os.path.join('somewhere', '.config')) | |||
@with_environment | |||
def test_get_xdg_dir_1(): | |||
"""test_get_xdg_dir_1, check nonexistant xdg_dir""" | |||
reload(path) | |||
path.get_home_dir = lambda : HOME_TEST_DIR | |||
os.name = "posix" | |||
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
env.pop('XDG_CONFIG_HOME', None) | |||
nt.assert_equal(path.get_xdg_dir(), None) | |||
@with_environment | |||
def test_get_xdg_dir_2(): | |||
"""test_get_xdg_dir_2, check xdg_dir default to ~/.config""" | |||
reload(path) | |||
path.get_home_dir = lambda : HOME_TEST_DIR | |||
os.name = "posix" | |||
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
env.pop('XDG_CONFIG_HOME', None) | |||
cfgdir=os.path.join(path.get_home_dir(), '.config') | |||
os.makedirs(cfgdir) | |||
nt.assert_equal(path.get_xdg_dir(), cfgdir) | |||
Fernando Perez
|
r1969 | ||
def test_filefind(): | |||
"""Various tests for filefind""" | |||
f = tempfile.NamedTemporaryFile() | |||
Brian Granger
|
r2505 | # print 'fname:',f.name | |
alt_dirs = path.get_ipython_dir() | |||
t = path.filefind(f.name, alt_dirs) | |||
# print 'found:',t | |||
Fernando Perez
|
r2357 | ||
def test_get_ipython_package_dir(): | |||
Brian Granger
|
r2505 | ipdir = path.get_ipython_package_dir() | |
Fernando Perez
|
r2357 | nt.assert_true(os.path.isdir(ipdir)) | |
Fernando Perez
|
r2436 | ||
Brian Granger
|
r2505 | ||
Brian Granger
|
r2498 | def test_get_ipython_module_path(): | |
Brian Granger
|
r2760 | ipapp_path = path.get_ipython_module_path('IPython.frontend.terminal.ipapp') | |
Brian Granger
|
r2498 | nt.assert_true(os.path.isfile(ipapp_path)) | |
Fernando Perez
|
r2436 | ||
Brian Granger
|
r2505 | ||
Brian Granger
|
r2498 | @dec.skip_if_not_win32 | |
def test_get_long_path_name_win32(): | |||
Brian Granger
|
r2505 | p = path.get_long_path_name('c:\\docume~1') | |
Brian Granger
|
r2498 | nt.assert_equals(p,u'c:\\Documents and Settings') | |
Fernando Perez
|
r2436 | ||
Brian Granger
|
r2505 | ||
Brian Granger
|
r2498 | @dec.skip_win32 | |
def test_get_long_path_name(): | |||
Brian Granger
|
r2505 | p = path.get_long_path_name('/usr/local') | |
Brian Granger
|
r2498 | nt.assert_equals(p,'/usr/local') | |
Fernando Perez
|
r2436 | ||
MinRK
|
r4483 | @dec.skip_win32 # can't create not-user-writable dir on win | |
MinRK
|
r4475 | @with_environment | |
def test_not_writable_ipdir(): | |||
tmpdir = tempfile.mkdtemp() | |||
os.name = "posix" | |||
env.pop('IPYTHON_DIR', None) | |||
env.pop('IPYTHONDIR', None) | |||
env.pop('XDG_CONFIG_HOME', None) | |||
env['HOME'] = tmpdir | |||
ipdir = os.path.join(tmpdir, '.ipython') | |||
os.mkdir(ipdir) | |||
os.chmod(ipdir, 600) | |||
stderr = io.stderr | |||
pipe = StringIO.StringIO() | |||
io.stderr = pipe | |||
ipdir = path.get_ipython_dir() | |||
io.stderr.flush() | |||
io.stderr = stderr | |||
nt.assert_true('WARNING' in pipe.getvalue()) | |||
env.pop('IPYTHON_DIR', None) | |||