348 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			348 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
| import py
 | |
| from py.path import local
 | |
| from py.__.path.common import checker
 | |
| from py.__.path.testing.fscommon import CommonFSTests, setuptestfs
 | |
| 
 | |
| class LocalSetup:
 | |
|     def setup_class(cls):
 | |
|         cls.root = py.test.ensuretemp(cls.__name__)
 | |
|         cls.root.ensure(dir=1)
 | |
|         setuptestfs(cls.root)
 | |
| 
 | |
|     def setup_method(self, method):
 | |
|         self.tmpdir = self.root.ensure('tmpdir', dir=1)
 | |
| 
 | |
|     def teardown_method(self, method):
 | |
|         self.tmpdir.remove(rec=1)
 | |
| 
 | |
| class TestLocalPath(LocalSetup, CommonFSTests):
 | |
| 
 | |
|     def test_join_normpath(self):
 | |
|         assert self.tmpdir.join(".") == self.tmpdir
 | |
|         p = self.tmpdir.join("../%s" % self.tmpdir.basename)
 | |
|         assert p == self.tmpdir
 | |
|         p = self.tmpdir.join("..//%s/" % self.tmpdir.basename)
 | |
|         assert p == self.tmpdir
 | |
| 
 | |
|     def test_gethash(self):
 | |
|         import md5
 | |
|         import sha
 | |
|         fn = self.tmpdir.join("testhashfile")
 | |
|         fn.write("hello")
 | |
|         assert fn.computehash("md5") == md5.md5("hello").hexdigest()
 | |
|         assert fn.computehash("sha") == sha.sha("hello").hexdigest()
 | |
|         py.test.raises(ValueError, fn.computehash, "asdasd")
 | |
| 
 | |
|     def test_remove_removes_readonly_file(self):
 | |
|         readonly_file = self.tmpdir.join('readonly').ensure()
 | |
|         readonly_file.chmod(0)
 | |
|         readonly_file.remove()
 | |
|         assert not readonly_file.check(exists=1)
 | |
| 
 | |
|     def test_remove_removes_readonly_dir(self):
 | |
|         readonly_dir = self.tmpdir.join('readonlydir').ensure(dir=1)
 | |
|         readonly_dir.chmod(0500)
 | |
|         readonly_dir.remove()
 | |
|         assert not readonly_dir.check(exists=1)
 | |
| 
 | |
|     def test_remove_removes_dir_and_readonly_file(self):
 | |
|         readonly_dir = self.tmpdir.join('readonlydir').ensure(dir=1)
 | |
|         readonly_file = readonly_dir.join('readonlyfile').ensure()
 | |
|         readonly_file.chmod(0)
 | |
|         readonly_dir.remove()
 | |
|         assert not readonly_dir.check(exists=1)
 | |
| 
 | |
|     def test_initialize_curdir(self):
 | |
|         assert str(local()) == py.std.os.getcwd()
 | |
| 
 | |
|     def test_initialize_reldir(self):
 | |
|         old = self.root.chdir()
 | |
|         try:
 | |
|             p = local('samplefile')
 | |
|             assert p.check()
 | |
|         finally:
 | |
|             old.chdir()
 | |
| 
 | |
|     def test_eq_with_strings(self):
 | |
|         path1 = self.root.join('sampledir')
 | |
|         path2 = str(path1)
 | |
|         assert path1 == path2
 | |
|         assert path2 == path1
 | |
|         path3 = self.root.join('samplefile')
 | |
|         assert path3 != path2
 | |
|         assert path2 != path3
 | |
| 
 | |
|     def test_dump(self):
 | |
|         import tempfile
 | |
|         for bin in 0, 1: 
 | |
|             try:
 | |
|                 fd, name = tempfile.mkstemp()
 | |
|                 f = py.std.os.fdopen(fd)
 | |
|             except AttributeError:
 | |
|                 name = tempfile.mktemp()
 | |
|                 f = open(name, 'w+')
 | |
|             try:
 | |
|                 d = {'answer' : 42}
 | |
|                 path = local(name)
 | |
|                 path.dump(d, bin=bin)
 | |
|                 from cPickle import load
 | |
|                 dnew = load(f)
 | |
|                 assert d == dnew
 | |
|             finally:
 | |
|                 f.close()
 | |
|                 py.std.os.remove(name)
 | |
| 
 | |
|     def test_setmtime(self):
 | |
|         import tempfile
 | |
|         import time
 | |
|         try:
 | |
|             fd, name = tempfile.mkstemp()
 | |
|             py.std.os.close(fd)
 | |
|         except AttributeError:
 | |
|             name = tempfile.mktemp()
 | |
|             open(name, 'w').close()
 | |
|         try:
 | |
|             mtime = int(time.time())-100
 | |
|             path = local(name)
 | |
|             assert path.mtime() != mtime
 | |
|             path.setmtime(mtime)
 | |
|             assert path.mtime() == mtime
 | |
|             path.setmtime()
 | |
|             assert path.mtime() != mtime
 | |
|         finally:
 | |
|             py.std.os.remove(name)
 | |
| 
 | |
|     def test_normpath(self):
 | |
|         new1 = self.root.join("/otherdir")
 | |
|         new2 = self.root.join("otherdir")
 | |
|         assert str(new1) == str(new2)
 | |
| 
 | |
|     def test_mkdtemp_creation(self):
 | |
|         d = local.mkdtemp()
 | |
|         try:
 | |
|             assert d.check(dir=1)
 | |
|         finally:
 | |
|             d.remove(rec=1)
 | |
| 
 | |
|     def test_tmproot(self):
 | |
|         d = local.mkdtemp()
 | |
|         tmproot = local.get_temproot()
 | |
|         try:
 | |
|             assert d.check(dir=1)
 | |
|             assert d.dirpath() == tmproot
 | |
|         finally:
 | |
|             d.remove(rec=1)
 | |
| 
 | |
|     def test_chdir(self):
 | |
|         tmpdir = self.tmpdir.realpath()
 | |
|         old = local()
 | |
|         try:
 | |
|             res = tmpdir.chdir()
 | |
|             assert str(res) == str(old)
 | |
|             assert py.std.os.getcwd() == str(tmpdir)
 | |
|         finally:
 | |
|             old.chdir()
 | |
| 
 | |
|     def test_ensure_filepath_withdir(self):
 | |
|         tmpdir = self.tmpdir
 | |
|         newfile = tmpdir.join('test1','test')
 | |
|         newfile.ensure()
 | |
|         assert newfile.check(file=1)
 | |
|         newfile.write("42")
 | |
|         newfile.ensure()
 | |
|         assert newfile.read() == "42"
 | |
| 
 | |
|     def test_ensure_filepath_withoutdir(self):
 | |
|         tmpdir = self.tmpdir
 | |
|         newfile = tmpdir.join('test1file')
 | |
|         t = newfile.ensure()
 | |
|         assert t == newfile
 | |
|         assert newfile.check(file=1)
 | |
| 
 | |
|     def test_ensure_dirpath(self):
 | |
|         tmpdir = self.tmpdir
 | |
|         newfile = tmpdir.join('test1','testfile')
 | |
|         t = newfile.ensure(dir=1)
 | |
|         assert t == newfile
 | |
|         assert newfile.check(dir=1)
 | |
| 
 | |
|     def test_init_from_path(self):
 | |
|         l = local()
 | |
|         l2 = local(l)
 | |
|         assert l2 is l
 | |
| 
 | |
|         wc = py.path.svnwc('.')
 | |
|         l3 = local(wc)
 | |
|         assert l3 is not wc
 | |
|         assert l3.strpath == wc.strpath
 | |
|         assert not hasattr(l3, 'commit')
 | |
| 
 | |
| class TestExecutionOnWindows(LocalSetup):
 | |
|     disabled = py.std.sys.platform != 'win32'
 | |
| 
 | |
|     def test_sysfind(self):
 | |
|         x = py.path.local.sysfind('cmd')
 | |
|         assert x.check(file=1)
 | |
|         assert py.path.local.sysfind('jaksdkasldqwe') is None
 | |
| 
 | |
| class TestExecution(LocalSetup):
 | |
|     disabled = py.std.sys.platform == 'win32'
 | |
| 
 | |
|     def test_sysfind(self):
 | |
|         x = py.path.local.sysfind('test')
 | |
|         assert x.check(file=1)
 | |
|         assert py.path.local.sysfind('jaksdkasldqwe') is None
 | |
| 
 | |
|     def test_sysfind_no_permisson(self):
 | |
|         dir = py.test.ensuretemp('sysfind') 
 | |
|         env = py.std.os.environ
 | |
|         oldpath = env['PATH']
 | |
|         try:
 | |
|             noperm = dir.ensure('noperm', dir=True)
 | |
|             env['PATH'] += ":%s" % (noperm)
 | |
|             noperm.chmod(0)
 | |
|             assert py.path.local.sysfind('a') is None
 | |
|             
 | |
|         finally:
 | |
|             env['PATH'] = oldpath
 | |
|             noperm.chmod(0644)
 | |
|             noperm.remove()
 | |
|             
 | |
|     def test_sysfind_absolute(self):
 | |
|         x = py.path.local.sysfind('test')
 | |
|         assert x.check(file=1)
 | |
|         y = py.path.local.sysfind(str(x)) 
 | |
|         assert y.check(file=1) 
 | |
|         assert y == x 
 | |
| 
 | |
|     def test_sysfind_multiple(self):
 | |
|         dir = py.test.ensuretemp('sysfind') 
 | |
|         env = py.std.os.environ
 | |
|         oldpath = env['PATH']
 | |
|         try:
 | |
|             env['PATH'] += ":%s:%s" % (dir.ensure('a'),
 | |
|                                        dir.join('b'))
 | |
|             dir.ensure('b', 'a')
 | |
|             checker = lambda x: x.dirpath().basename == 'b'
 | |
|             x = py.path.local.sysfind('a', checker=checker)
 | |
|             assert x.basename == 'a'
 | |
|             assert x.dirpath().basename == 'b'
 | |
|             checker = lambda x: None
 | |
|             assert py.path.local.sysfind('a', checker=checker) is None
 | |
|         finally:
 | |
|             env['PATH'] = oldpath
 | |
|             #dir.remove()
 | |
| 
 | |
|     def test_sysexec(self):
 | |
|         x = py.path.local.sysfind('ls') 
 | |
|         out = x.sysexec('-a')
 | |
|         for x in py.path.local().listdir(): 
 | |
|             assert out.find(x.basename) != -1
 | |
| 
 | |
|     def test_sysexec_failing(self):
 | |
|         x = py.path.local.sysfind('false')
 | |
|         py.test.raises(py.process.cmdexec.Error, """
 | |
|             x.sysexec('aksjdkasjd')
 | |
|         """)
 | |
| 
 | |
|     def test_make_numbered_dir(self):
 | |
|         root = self.tmpdir
 | |
|         root.ensure('base.not_an_int', dir=1)
 | |
|         for i in range(10):
 | |
|             numdir = local.make_numbered_dir(prefix='base.', rootdir=root,
 | |
|                                              keep=2, lock_timeout=0)
 | |
|             assert numdir.check()
 | |
|             assert numdir.basename == 'base.%d' %i
 | |
|             if i>=1:
 | |
|                 assert numdir.new(ext=str(i-1)).check()
 | |
|             if i>=2:
 | |
|                 assert numdir.new(ext=str(i-2)).check()
 | |
|             if i>=3:
 | |
|                 assert not numdir.new(ext=str(i-3)).check()
 | |
| 
 | |
|     def test_locked_make_numbered_dir(self):
 | |
|         if py.test.config.option.boxed: 
 | |
|             py.test.skip("Fails when run as boxed tests")
 | |
|         root = self.tmpdir
 | |
|         for i in range(10):
 | |
|             numdir = local.make_numbered_dir(prefix='base2.', rootdir=root,
 | |
|                                              keep=2)
 | |
|             assert numdir.check()
 | |
|             assert numdir.basename == 'base2.%d' %i
 | |
|             for j in range(i):
 | |
|                 assert numdir.new(ext=str(j)).check()
 | |
| 
 | |
|     def test_error_preservation(self):
 | |
|         py.test.raises (EnvironmentError, self.root.join('qwoeqiwe').mtime)
 | |
|         py.test.raises (EnvironmentError, self.root.join('qwoeqiwe').read)
 | |
| 
 | |
|     #def test_parentdirmatch(self):
 | |
|     #    local.parentdirmatch('std', startmodule=__name__)
 | |
|     #
 | |
| 
 | |
|     # importing tests 
 | |
|     def test_pyimport(self):
 | |
|         obj = self.root.join('execfile.py').pyimport()
 | |
|         assert obj.x == 42
 | |
|         assert obj.__name__ == 'execfile' 
 | |
| 
 | |
|     def test_pyimport_execfile_different_name(self):
 | |
|         obj = self.root.join('execfile.py').pyimport(modname="0x.y.z")
 | |
|         assert obj.x == 42
 | |
|         assert obj.__name__ == '0x.y.z' 
 | |
| 
 | |
|     def test_pyimport_a(self):
 | |
|         otherdir = self.root.join('otherdir')
 | |
|         mod = otherdir.join('a.py').pyimport()
 | |
|         assert mod.result == "got it"
 | |
|         assert mod.__name__ == 'otherdir.a' 
 | |
| 
 | |
|     def test_pyimport_b(self):
 | |
|         otherdir = self.root.join('otherdir')
 | |
|         mod = otherdir.join('b.py').pyimport()
 | |
|         assert mod.stuff == "got it"
 | |
|         assert mod.__name__ == 'otherdir.b' 
 | |
| 
 | |
|     def test_pyimport_c(self):
 | |
|         otherdir = self.root.join('otherdir')
 | |
|         mod = otherdir.join('c.py').pyimport()
 | |
|         assert mod.value == "got it"
 | |
| 
 | |
|     def test_pyimport_d(self):
 | |
|         otherdir = self.root.join('otherdir')
 | |
|         mod = otherdir.join('d.py').pyimport()
 | |
|         assert mod.value2 == "got it"
 | |
| 
 | |
|     def test_pyimport_and_import(self):
 | |
|         # XXX maybe a bit of a fragile test ...
 | |
|         p = py.test.ensuretemp("pyimport") 
 | |
|         p.ensure('xxxpackage', '__init__.py') 
 | |
|         mod1path = p.ensure('xxxpackage', 'module1.py')
 | |
|         mod1 = mod1path.pyimport() 
 | |
|         assert mod1.__name__ == 'xxxpackage.module1' 
 | |
|         from xxxpackage import module1 
 | |
|         assert module1 is mod1
 | |
| 
 | |
| def test_pypkgdir():
 | |
|     datadir = py.test.ensuretemp("pypkgdir")
 | |
| 
 | |
|     pkg = datadir.ensure('pkg1', dir=1)
 | |
|     pkg.ensure("__init__.py")
 | |
|     pkg.ensure("subdir/__init__.py")
 | |
|     assert pkg.pypkgpath() == pkg
 | |
|     assert pkg.join('subdir', '__init__.py').pypkgpath() == pkg
 | |
| 
 | |
| def test_homedir():
 | |
|     homedir = py.path.local._gethomedir()
 | |
|     assert homedir.check(dir=1)
 | |
| 
 | |
| #class XTestLocalPath(TestLocalPath):
 | |
| #    def __init__(self):
 | |
| #        TestLocalPath.__init__(self)
 | |
| #        self.root = local(self.root)
 | |
| #
 | |
| #class XXTestLocalPath(TestLocalPath):
 | |
| #    def __init__(self):
 | |
| #        TestLocalPath.__init__(self)
 | |
| #        self.root = local(self.root)
 |