186 lines
5.9 KiB
Python
186 lines
5.9 KiB
Python
|
import py
|
||
|
|
||
|
class TestPOSIXLocalPath:
|
||
|
#root = local(TestLocalPath.root)
|
||
|
disabled = py.std.sys.platform == 'win32'
|
||
|
|
||
|
def setup_class(cls):
|
||
|
cls.root = py.test.ensuretemp(cls.__name__)
|
||
|
|
||
|
def setup_method(self, method):
|
||
|
name = method.im_func.func_name
|
||
|
self.tmpdir = self.root.ensure(name, dir=1)
|
||
|
|
||
|
def test_hardlink(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
linkpath = tmpdir.join('test')
|
||
|
filepath = tmpdir.join('file')
|
||
|
filepath.write("Hello")
|
||
|
nlink = filepath.stat().st_nlink
|
||
|
linkpath.mklinkto(filepath)
|
||
|
assert filepath.stat().st_nlink == nlink + 1
|
||
|
|
||
|
def test_symlink_are_identical(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
filepath = tmpdir.join('file')
|
||
|
filepath.write("Hello")
|
||
|
linkpath = tmpdir.join('test')
|
||
|
linkpath.mksymlinkto(filepath)
|
||
|
assert linkpath.readlink() == str(filepath)
|
||
|
|
||
|
def test_symlink_isfile(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
linkpath = tmpdir.join('test')
|
||
|
filepath = tmpdir.join('file')
|
||
|
filepath.write("")
|
||
|
linkpath.mksymlinkto(filepath)
|
||
|
assert linkpath.check(file=1)
|
||
|
assert not linkpath.check(link=0, file=1)
|
||
|
|
||
|
def test_symlink_relative(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
linkpath = tmpdir.join('test')
|
||
|
filepath = tmpdir.join('file')
|
||
|
filepath.write("Hello")
|
||
|
linkpath.mksymlinkto(filepath, absolute=False)
|
||
|
assert linkpath.readlink() == "file"
|
||
|
assert filepath.read() == linkpath.read()
|
||
|
|
||
|
def test_symlink_not_existing(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
linkpath = tmpdir.join('testnotexisting')
|
||
|
assert not linkpath.check(link=1)
|
||
|
assert linkpath.check(link=0)
|
||
|
|
||
|
def test_relto_with_root(self):
|
||
|
y = self.root.join('x').relto(py.path.local('/'))
|
||
|
assert y[0] == str(self.root)[1]
|
||
|
|
||
|
def test_visit_recursive_symlink(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
linkpath = tmpdir.join('test')
|
||
|
linkpath.mksymlinkto(tmpdir)
|
||
|
visitor = tmpdir.visit(None, lambda x: x.check(link=0))
|
||
|
assert list(visitor) == [linkpath]
|
||
|
|
||
|
def test_symlink_isdir(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
linkpath = tmpdir.join('test')
|
||
|
linkpath.mksymlinkto(tmpdir)
|
||
|
assert linkpath.check(dir=1)
|
||
|
assert not linkpath.check(link=0, dir=1)
|
||
|
|
||
|
def test_symlink_remove(self):
|
||
|
tmpdir = self.tmpdir.realpath()
|
||
|
linkpath = tmpdir.join('test')
|
||
|
linkpath.mksymlinkto(linkpath) # point to itself
|
||
|
assert linkpath.check(link=1)
|
||
|
linkpath.remove()
|
||
|
assert not linkpath.check()
|
||
|
|
||
|
def test_realpath_file(self):
|
||
|
tmpdir = self.tmpdir
|
||
|
linkpath = tmpdir.join('test')
|
||
|
filepath = tmpdir.join('file')
|
||
|
filepath.write("")
|
||
|
linkpath.mksymlinkto(filepath)
|
||
|
realpath = linkpath.realpath()
|
||
|
assert realpath.basename == 'file'
|
||
|
|
||
|
def test_owner(self):
|
||
|
from pwd import getpwuid
|
||
|
from grp import getgrgid
|
||
|
stat = self.root.stat()
|
||
|
assert stat.path == self.root
|
||
|
|
||
|
uid = stat.st_uid
|
||
|
gid = stat.st_gid
|
||
|
owner = getpwuid(uid)[0]
|
||
|
group = getgrgid(gid)[0]
|
||
|
|
||
|
assert uid == stat.uid
|
||
|
assert owner == stat.owner
|
||
|
assert gid == stat.gid
|
||
|
assert group == stat.group
|
||
|
|
||
|
def XXXtest_atime(self):
|
||
|
# XXX disabled. this test is just not platform independent enough
|
||
|
# because acesstime resolution is very different through
|
||
|
# filesystems even on one platform.
|
||
|
import time
|
||
|
path = self.root.join('samplefile')
|
||
|
atime = path.atime()
|
||
|
time.sleep(1)
|
||
|
path.read(1)
|
||
|
assert path.atime() != atime
|
||
|
|
||
|
def test_commondir(self):
|
||
|
# XXX This is here in local until we find a way to implement this
|
||
|
# using the subversion command line api.
|
||
|
p1 = self.root.join('something')
|
||
|
p2 = self.root.join('otherthing')
|
||
|
assert p1.common(p2) == self.root
|
||
|
assert p2.common(p1) == self.root
|
||
|
|
||
|
def test_commondir_nocommon(self):
|
||
|
# XXX This is here in local until we find a way to implement this
|
||
|
# using the subversion command line api.
|
||
|
p1 = self.root.join('something')
|
||
|
p2 = py.path.local(self.root.sep+'blabla')
|
||
|
assert p1.common(p2) == '/'
|
||
|
|
||
|
def test_join_to_root(self):
|
||
|
root = self.root.parts()[0]
|
||
|
assert len(str(root)) == 1
|
||
|
assert str(root.join('a')) == '/a'
|
||
|
|
||
|
def test_join_root_to_root_with_no_abs(self):
|
||
|
nroot = self.root.join('/')
|
||
|
assert str(self.root) == str(nroot)
|
||
|
assert self.root == nroot
|
||
|
|
||
|
def test_chmod_simple_int(self):
|
||
|
print "self.root is", self.root
|
||
|
mode = self.root.mode()
|
||
|
self.root.chmod(mode/2)
|
||
|
try:
|
||
|
assert self.root.mode() != mode
|
||
|
finally:
|
||
|
self.root.chmod(mode)
|
||
|
assert self.root.mode() == mode
|
||
|
|
||
|
def test_chmod_rec_int(self):
|
||
|
# XXX fragile test
|
||
|
print "self.root is", self.root
|
||
|
recfilter = lambda x: x.check(dotfile=0, link=0)
|
||
|
oldmodes = {}
|
||
|
for x in self.root.visit(rec=recfilter):
|
||
|
oldmodes[x] = x.mode()
|
||
|
self.root.chmod(0772, rec=recfilter)
|
||
|
try:
|
||
|
for x in self.root.visit(rec=recfilter):
|
||
|
assert x.mode() & 0777 == 0772
|
||
|
finally:
|
||
|
for x,y in oldmodes.items():
|
||
|
x.chmod(y)
|
||
|
|
||
|
def test_chown_identity(self):
|
||
|
owner = self.root.owner()
|
||
|
group = self.root.group()
|
||
|
self.root.chown(owner, group)
|
||
|
|
||
|
def test_chown_dangling_link(self):
|
||
|
owner = self.root.owner()
|
||
|
group = self.root.group()
|
||
|
x = self.root.join('hello')
|
||
|
x.mksymlinkto('qlwkejqwlek')
|
||
|
try:
|
||
|
self.root.chown(owner, group, rec=1)
|
||
|
finally:
|
||
|
x.remove(rec=0)
|
||
|
|
||
|
def test_chown_identity_rec_mayfail(self):
|
||
|
owner = self.root.owner()
|
||
|
group = self.root.group()
|
||
|
self.root.chown(owner, group)
|