##// END OF EJS Templates
Add description of test.
Thomas Kluyver -
Show More
@@ -1,415 +1,420 b''
1 1 # encoding: utf-8
2 2 """Tests for IPython.utils.path.py"""
3 3
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (C) 2008-2011 The IPython Development Team
6 6 #
7 7 # Distributed under the terms of the BSD License. The full license is in
8 8 # the file COPYING, distributed as part of this software.
9 9 #-----------------------------------------------------------------------------
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Imports
13 13 #-----------------------------------------------------------------------------
14 14
15 15 from __future__ import with_statement
16 16
17 17 import os
18 18 import shutil
19 19 import sys
20 20 import tempfile
21 21 from io import StringIO
22 22
23 23 from os.path import join, abspath, split
24 24
25 25 import nose.tools as nt
26 26
27 27 from nose import with_setup
28 28
29 29 import IPython
30 30 from IPython.testing import decorators as dec
31 31 from IPython.testing.decorators import skip_if_not_win32, skip_win32
32 32 from IPython.testing.tools import make_tempfile, AssertPrints
33 33 from IPython.utils import path, io
34 34 from IPython.utils import py3compat
35 35
36 36 # Platform-dependent imports
37 37 try:
38 38 import _winreg as wreg
39 39 except ImportError:
40 40 #Fake _winreg module on none windows platforms
41 41 import types
42 42 wr_name = "winreg" if py3compat.PY3 else "_winreg"
43 43 sys.modules[wr_name] = types.ModuleType(wr_name)
44 44 import _winreg as wreg
45 45 #Add entries that needs to be stubbed by the testing code
46 46 (wreg.OpenKey, wreg.QueryValueEx,) = (None, None)
47 47
48 48 try:
49 49 reload
50 50 except NameError: # Python 3
51 51 from imp import reload
52 52
53 53 #-----------------------------------------------------------------------------
54 54 # Globals
55 55 #-----------------------------------------------------------------------------
56 56 env = os.environ
57 57 TEST_FILE_PATH = split(abspath(__file__))[0]
58 58 TMP_TEST_DIR = tempfile.mkdtemp()
59 59 HOME_TEST_DIR = join(TMP_TEST_DIR, "home_test_dir")
60 60 XDG_TEST_DIR = join(HOME_TEST_DIR, "xdg_test_dir")
61 61 IP_TEST_DIR = join(HOME_TEST_DIR,'.ipython')
62 62 #
63 63 # Setup/teardown functions/decorators
64 64 #
65 65
66 66 def setup():
67 67 """Setup testenvironment for the module:
68 68
69 69 - Adds dummy home dir tree
70 70 """
71 71 # Do not mask exceptions here. In particular, catching WindowsError is a
72 72 # problem because that exception is only defined on Windows...
73 73 os.makedirs(IP_TEST_DIR)
74 74 os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython'))
75 75
76 76
77 77 def teardown():
78 78 """Teardown testenvironment for the module:
79 79
80 80 - Remove dummy home dir tree
81 81 """
82 82 # Note: we remove the parent test dir, which is the root of all test
83 83 # subdirs we may have created. Use shutil instead of os.removedirs, so
84 84 # that non-empty directories are all recursively removed.
85 85 shutil.rmtree(TMP_TEST_DIR)
86 86
87 87
88 88 def setup_environment():
89 89 """Setup testenvironment for some functions that are tested
90 90 in this module. In particular this functions stores attributes
91 91 and other things that we need to stub in some test functions.
92 92 This needs to be done on a function level and not module level because
93 93 each testfunction needs a pristine environment.
94 94 """
95 95 global oldstuff, platformstuff
96 96 oldstuff = (env.copy(), os.name, path.get_home_dir, IPython.__file__, os.getcwd())
97 97
98 98 if os.name == 'nt':
99 99 platformstuff = (wreg.OpenKey, wreg.QueryValueEx,)
100 100
101 101
102 102 def teardown_environment():
103 103 """Restore things that were remebered by the setup_environment function
104 104 """
105 105 (oldenv, os.name, path.get_home_dir, IPython.__file__, old_wd) = oldstuff
106 106 os.chdir(old_wd)
107 107 reload(path)
108 108
109 109 for key in env.keys():
110 110 if key not in oldenv:
111 111 del env[key]
112 112 env.update(oldenv)
113 113 if hasattr(sys, 'frozen'):
114 114 del sys.frozen
115 115 if os.name == 'nt':
116 116 (wreg.OpenKey, wreg.QueryValueEx,) = platformstuff
117 117
118 118 # Build decorator that uses the setup_environment/setup_environment
119 119 with_environment = with_setup(setup_environment, teardown_environment)
120 120
121 121 @skip_if_not_win32
122 122 @with_environment
123 123 def test_get_home_dir_1():
124 124 """Testcase for py2exe logic, un-compressed lib
125 125 """
126 126 sys.frozen = True
127 127
128 128 #fake filename for IPython.__init__
129 129 IPython.__file__ = abspath(join(HOME_TEST_DIR, "Lib/IPython/__init__.py"))
130 130
131 131 home_dir = path.get_home_dir()
132 132 nt.assert_equal(home_dir, abspath(HOME_TEST_DIR))
133 133
134 134
135 135 @skip_if_not_win32
136 136 @with_environment
137 137 def test_get_home_dir_2():
138 138 """Testcase for py2exe logic, compressed lib
139 139 """
140 140 sys.frozen = True
141 141 #fake filename for IPython.__init__
142 142 IPython.__file__ = abspath(join(HOME_TEST_DIR, "Library.zip/IPython/__init__.py")).lower()
143 143
144 144 home_dir = path.get_home_dir(True)
145 145 nt.assert_equal(home_dir, abspath(HOME_TEST_DIR).lower())
146 146
147 147
148 148 @with_environment
149 149 def test_get_home_dir_3():
150 150 """get_home_dir() uses $HOME if set"""
151 151 env["HOME"] = HOME_TEST_DIR
152 152 home_dir = path.get_home_dir(True)
153 153 # get_home_dir expands symlinks
154 154 nt.assert_equal(home_dir, os.path.realpath(env["HOME"]))
155 155
156 156
157 157 @with_environment
158 158 def test_get_home_dir_4():
159 159 """get_home_dir() still works if $HOME is not set"""
160 160
161 161 if 'HOME' in env: del env['HOME']
162 162 # this should still succeed, but we don't know what the answer should be
163 163 home = path.get_home_dir(True)
164 164 nt.assert_true(path._writable_dir(home))
165 165
166 166 @with_environment
167 167 def test_get_home_dir_5():
168 168 """raise HomeDirError if $HOME is specified, but not a writable dir"""
169 169 env['HOME'] = abspath(HOME_TEST_DIR+'garbage')
170 170 # set os.name = posix, to prevent My Documents fallback on Windows
171 171 os.name = 'posix'
172 172 nt.assert_raises(path.HomeDirError, path.get_home_dir, True)
173 173
174 174
175 175 # Should we stub wreg fully so we can run the test on all platforms?
176 176 @skip_if_not_win32
177 177 @with_environment
178 178 def test_get_home_dir_8():
179 179 """Using registry hack for 'My Documents', os=='nt'
180 180
181 181 HOMESHARE, HOMEDRIVE, HOMEPATH, USERPROFILE and others are missing.
182 182 """
183 183 os.name = 'nt'
184 184 # Remove from stub environment all keys that may be set
185 185 for key in ['HOME', 'HOMESHARE', 'HOMEDRIVE', 'HOMEPATH', 'USERPROFILE']:
186 186 env.pop(key, None)
187 187
188 188 #Stub windows registry functions
189 189 def OpenKey(x, y):
190 190 class key:
191 191 def Close(self):
192 192 pass
193 193 return key()
194 194 def QueryValueEx(x, y):
195 195 return [abspath(HOME_TEST_DIR)]
196 196
197 197 wreg.OpenKey = OpenKey
198 198 wreg.QueryValueEx = QueryValueEx
199 199
200 200 home_dir = path.get_home_dir()
201 201 nt.assert_equal(home_dir, abspath(HOME_TEST_DIR))
202 202
203 203
204 204 @with_environment
205 205 def test_get_ipython_dir_1():
206 206 """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions."""
207 207 env_ipdir = os.path.join("someplace", ".ipython")
208 208 path._writable_dir = lambda path: True
209 209 env['IPYTHON_DIR'] = env_ipdir
210 210 ipdir = path.get_ipython_dir()
211 211 nt.assert_equal(ipdir, env_ipdir)
212 212
213 213
214 214 @with_environment
215 215 def test_get_ipython_dir_2():
216 216 """test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions."""
217 217 path.get_home_dir = lambda : "someplace"
218 218 path.get_xdg_dir = lambda : None
219 219 path._writable_dir = lambda path: True
220 220 os.name = "posix"
221 221 env.pop('IPYTHON_DIR', None)
222 222 env.pop('IPYTHONDIR', None)
223 223 env.pop('XDG_CONFIG_HOME', None)
224 224 ipdir = path.get_ipython_dir()
225 225 nt.assert_equal(ipdir, os.path.join("someplace", ".ipython"))
226 226
227 227 @with_environment
228 228 def test_get_ipython_dir_3():
229 229 """test_get_ipython_dir_3, use XDG if defined, and .ipython doesn't exist."""
230 230 path.get_home_dir = lambda : "someplace"
231 231 path._writable_dir = lambda path: True
232 232 os.name = "posix"
233 233 env.pop('IPYTHON_DIR', None)
234 234 env.pop('IPYTHONDIR', None)
235 235 env['XDG_CONFIG_HOME'] = XDG_TEST_DIR
236 236 ipdir = path.get_ipython_dir()
237 237 nt.assert_equal(ipdir, os.path.join(XDG_TEST_DIR, "ipython"))
238 238
239 239 @with_environment
240 240 def test_get_ipython_dir_4():
241 241 """test_get_ipython_dir_4, use XDG if both exist."""
242 242 path.get_home_dir = lambda : HOME_TEST_DIR
243 243 os.name = "posix"
244 244 env.pop('IPYTHON_DIR', None)
245 245 env.pop('IPYTHONDIR', None)
246 246 env['XDG_CONFIG_HOME'] = XDG_TEST_DIR
247 247 xdg_ipdir = os.path.join(XDG_TEST_DIR, "ipython")
248 248 ipdir = path.get_ipython_dir()
249 249 nt.assert_equal(ipdir, xdg_ipdir)
250 250
251 251 @with_environment
252 252 def test_get_ipython_dir_5():
253 253 """test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist."""
254 254 path.get_home_dir = lambda : HOME_TEST_DIR
255 255 os.name = "posix"
256 256 env.pop('IPYTHON_DIR', None)
257 257 env.pop('IPYTHONDIR', None)
258 258 env['XDG_CONFIG_HOME'] = XDG_TEST_DIR
259 259 os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython'))
260 260 ipdir = path.get_ipython_dir()
261 261 nt.assert_equal(ipdir, IP_TEST_DIR)
262 262
263 263 @with_environment
264 264 def test_get_ipython_dir_6():
265 265 """test_get_ipython_dir_6, use XDG if defined and neither exist."""
266 266 xdg = os.path.join(HOME_TEST_DIR, 'somexdg')
267 267 os.mkdir(xdg)
268 268 shutil.rmtree(os.path.join(HOME_TEST_DIR, '.ipython'))
269 269 path.get_home_dir = lambda : HOME_TEST_DIR
270 270 path.get_xdg_dir = lambda : xdg
271 271 os.name = "posix"
272 272 env.pop('IPYTHON_DIR', None)
273 273 env.pop('IPYTHONDIR', None)
274 274 env.pop('XDG_CONFIG_HOME', None)
275 275 xdg_ipdir = os.path.join(xdg, "ipython")
276 276 ipdir = path.get_ipython_dir()
277 277 nt.assert_equal(ipdir, xdg_ipdir)
278 278
279 279 @with_environment
280 280 def test_get_ipython_dir_7():
281 281 """test_get_ipython_dir_7, test home directory expansion on IPYTHON_DIR"""
282 282 path._writable_dir = lambda path: True
283 283 home_dir = os.path.expanduser('~')
284 284 env['IPYTHON_DIR'] = os.path.join('~', 'somewhere')
285 285 ipdir = path.get_ipython_dir()
286 286 nt.assert_equal(ipdir, os.path.join(home_dir, 'somewhere'))
287 287
288 288
289 289 @with_environment
290 290 def test_get_xdg_dir_1():
291 291 """test_get_xdg_dir_1, check xdg_dir"""
292 292 reload(path)
293 293 path._writable_dir = lambda path: True
294 294 path.get_home_dir = lambda : 'somewhere'
295 295 os.name = "posix"
296 296 env.pop('IPYTHON_DIR', None)
297 297 env.pop('IPYTHONDIR', None)
298 298 env.pop('XDG_CONFIG_HOME', None)
299 299
300 300 nt.assert_equal(path.get_xdg_dir(), os.path.join('somewhere', '.config'))
301 301
302 302
303 303 @with_environment
304 304 def test_get_xdg_dir_1():
305 305 """test_get_xdg_dir_1, check nonexistant xdg_dir"""
306 306 reload(path)
307 307 path.get_home_dir = lambda : HOME_TEST_DIR
308 308 os.name = "posix"
309 309 env.pop('IPYTHON_DIR', None)
310 310 env.pop('IPYTHONDIR', None)
311 311 env.pop('XDG_CONFIG_HOME', None)
312 312 nt.assert_equal(path.get_xdg_dir(), None)
313 313
314 314 @with_environment
315 315 def test_get_xdg_dir_2():
316 316 """test_get_xdg_dir_2, check xdg_dir default to ~/.config"""
317 317 reload(path)
318 318 path.get_home_dir = lambda : HOME_TEST_DIR
319 319 os.name = "posix"
320 320 env.pop('IPYTHON_DIR', None)
321 321 env.pop('IPYTHONDIR', None)
322 322 env.pop('XDG_CONFIG_HOME', None)
323 323 cfgdir=os.path.join(path.get_home_dir(), '.config')
324 324 os.makedirs(cfgdir)
325 325
326 326 nt.assert_equal(path.get_xdg_dir(), cfgdir)
327 327
328 328 def test_filefind():
329 329 """Various tests for filefind"""
330 330 f = tempfile.NamedTemporaryFile()
331 331 # print 'fname:',f.name
332 332 alt_dirs = path.get_ipython_dir()
333 333 t = path.filefind(f.name, alt_dirs)
334 334 # print 'found:',t
335 335
336 336
337 337 def test_get_ipython_package_dir():
338 338 ipdir = path.get_ipython_package_dir()
339 339 nt.assert_true(os.path.isdir(ipdir))
340 340
341 341
342 342 def test_get_ipython_module_path():
343 343 ipapp_path = path.get_ipython_module_path('IPython.frontend.terminal.ipapp')
344 344 nt.assert_true(os.path.isfile(ipapp_path))
345 345
346 346
347 347 @dec.skip_if_not_win32
348 348 def test_get_long_path_name_win32():
349 349 p = path.get_long_path_name('c:\\docume~1')
350 350 nt.assert_equals(p,u'c:\\Documents and Settings')
351 351
352 352
353 353 @dec.skip_win32
354 354 def test_get_long_path_name():
355 355 p = path.get_long_path_name('/usr/local')
356 356 nt.assert_equals(p,'/usr/local')
357 357
358 358 @dec.skip_win32 # can't create not-user-writable dir on win
359 359 @with_environment
360 360 def test_not_writable_ipdir():
361 361 tmpdir = tempfile.mkdtemp()
362 362 os.name = "posix"
363 363 env.pop('IPYTHON_DIR', None)
364 364 env.pop('IPYTHONDIR', None)
365 365 env.pop('XDG_CONFIG_HOME', None)
366 366 env['HOME'] = tmpdir
367 367 ipdir = os.path.join(tmpdir, '.ipython')
368 368 os.mkdir(ipdir)
369 369 os.chmod(ipdir, 600)
370 370 with AssertPrints('is not a writable location', channel='stderr'):
371 371 ipdir = path.get_ipython_dir()
372 372 env.pop('IPYTHON_DIR', None)
373 373
374 374 def test_unquote_filename():
375 375 for win32 in (True, False):
376 376 nt.assert_equals(path.unquote_filename('foo.py', win32=win32), 'foo.py')
377 377 nt.assert_equals(path.unquote_filename('foo bar.py', win32=win32), 'foo bar.py')
378 378 nt.assert_equals(path.unquote_filename('"foo.py"', win32=True), 'foo.py')
379 379 nt.assert_equals(path.unquote_filename('"foo bar.py"', win32=True), 'foo bar.py')
380 380 nt.assert_equals(path.unquote_filename("'foo.py'", win32=True), 'foo.py')
381 381 nt.assert_equals(path.unquote_filename("'foo bar.py'", win32=True), 'foo bar.py')
382 382 nt.assert_equals(path.unquote_filename('"foo.py"', win32=False), '"foo.py"')
383 383 nt.assert_equals(path.unquote_filename('"foo bar.py"', win32=False), '"foo bar.py"')
384 384 nt.assert_equals(path.unquote_filename("'foo.py'", win32=False), "'foo.py'")
385 385 nt.assert_equals(path.unquote_filename("'foo bar.py'", win32=False), "'foo bar.py'")
386 386
387 387 @with_environment
388 388 def test_get_py_filename():
389 389 os.chdir(TMP_TEST_DIR)
390 390 for win32 in (True, False):
391 391 with make_tempfile('foo.py'):
392 392 nt.assert_equals(path.get_py_filename('foo.py', force_win32=win32), 'foo.py')
393 393 nt.assert_equals(path.get_py_filename('foo', force_win32=win32), 'foo.py')
394 394 with make_tempfile('foo'):
395 395 nt.assert_equals(path.get_py_filename('foo', force_win32=win32), 'foo')
396 396 nt.assert_raises(IOError, path.get_py_filename, 'foo.py', force_win32=win32)
397 397 nt.assert_raises(IOError, path.get_py_filename, 'foo', force_win32=win32)
398 398 nt.assert_raises(IOError, path.get_py_filename, 'foo.py', force_win32=win32)
399 399 true_fn = 'foo with spaces.py'
400 400 with make_tempfile(true_fn):
401 401 nt.assert_equals(path.get_py_filename('foo with spaces', force_win32=win32), true_fn)
402 402 nt.assert_equals(path.get_py_filename('foo with spaces.py', force_win32=win32), true_fn)
403 403 if win32:
404 404 nt.assert_equals(path.get_py_filename('"foo with spaces.py"', force_win32=True), true_fn)
405 405 nt.assert_equals(path.get_py_filename("'foo with spaces.py'", force_win32=True), true_fn)
406 406 else:
407 407 nt.assert_raises(IOError, path.get_py_filename, '"foo with spaces.py"', force_win32=False)
408 408 nt.assert_raises(IOError, path.get_py_filename, "'foo with spaces.py'", force_win32=False)
409 409
410 410 def test_unicode_in_filename():
411 """When a file doesn't exist, the exception raised should be safe to call
412 str() on - i.e. in Python 2 it must only have ASCII characters.
413
414 https://github.com/ipython/ipython/issues/875
415 """
411 416 try:
412 417 # these calls should not throw unicode encode exceptions
413 418 path.get_py_filename(u'fooéè.py', force_win32=False)
414 419 except IOError as ex:
415 420 str(ex)
General Comments 0
You need to be logged in to leave comments. Login now