|
@@ -974,7 +974,7 @@ class ArchiverTestCase(ArchiverTestCaseBase):
|
|
|
assert 'This command initializes' not in self.cmd('help', 'init', '--usage-only')
|
|
|
|
|
|
@unittest.skipUnless(has_llfuse, 'llfuse not installed')
|
|
|
- def test_fuse_mount(self):
|
|
|
+ def test_fuse(self):
|
|
|
self.cmd('init', self.repository_location)
|
|
|
self.create_test_files()
|
|
|
self.cmd('create', self.repository_location + '::archive', 'input')
|
|
@@ -987,6 +987,55 @@ class ArchiverTestCase(ArchiverTestCaseBase):
|
|
|
# mount only 1 archive, its contents shall show up directly in mountpoint:
|
|
|
with self.fuse_mount(self.repository_location + '::archive', mountpoint):
|
|
|
self.assert_dirs_equal(self.input_path, os.path.join(mountpoint, 'input'))
|
|
|
+ # regular file
|
|
|
+ in_fn = 'input/file1'
|
|
|
+ out_fn = os.path.join(mountpoint, 'input', 'file1')
|
|
|
+ # stat
|
|
|
+ sti1 = os.stat(in_fn)
|
|
|
+ sto1 = os.stat(out_fn)
|
|
|
+ assert sti1.st_mode == sto1.st_mode
|
|
|
+ assert sti1.st_uid == sto1.st_uid
|
|
|
+ assert sti1.st_gid == sto1.st_gid
|
|
|
+ assert sti1.st_size == sto1.st_size
|
|
|
+ assert sti1.st_atime == sto1.st_atime
|
|
|
+ assert sti1.st_ctime == sto1.st_ctime
|
|
|
+ assert sti1.st_mtime == sto1.st_mtime
|
|
|
+ # note: there is another hardlink to this, see below
|
|
|
+ assert sti1.st_nlink == sto1.st_nlink == 2
|
|
|
+ # read
|
|
|
+ with open(in_fn, 'rb') as in_f, open(out_fn, 'rb') as out_f:
|
|
|
+ assert in_f.read() == out_f.read()
|
|
|
+ # list/read xattrs
|
|
|
+ if xattr.is_enabled(self.input_path):
|
|
|
+ assert xattr.listxattr(out_fn) == ['user.foo', ]
|
|
|
+ assert xattr.getxattr(out_fn, 'user.foo') == b'bar'
|
|
|
+ else:
|
|
|
+ assert xattr.listxattr(out_fn) == []
|
|
|
+ try:
|
|
|
+ xattr.getxattr(out_fn, 'user.foo')
|
|
|
+ except OSError as e:
|
|
|
+ assert e.errno == llfuse.ENOATTR
|
|
|
+ else:
|
|
|
+ assert False, "expected OSError(ENOATTR), but no error was raised"
|
|
|
+ # hardlink (to 'input/file1')
|
|
|
+ in_fn = 'input/hardlink'
|
|
|
+ out_fn = os.path.join(mountpoint, 'input', 'hardlink')
|
|
|
+ sti2 = os.stat(in_fn)
|
|
|
+ sto2 = os.stat(out_fn)
|
|
|
+ assert sti2.st_nlink == sto2.st_nlink == 2
|
|
|
+ assert sto1.st_ino == sto2.st_ino
|
|
|
+ # symlink
|
|
|
+ in_fn = 'input/link1'
|
|
|
+ out_fn = os.path.join(mountpoint, 'input', 'link1')
|
|
|
+ sti = os.stat(in_fn, follow_symlinks=False)
|
|
|
+ sto = os.stat(out_fn, follow_symlinks=False)
|
|
|
+ assert stat.S_ISLNK(sti.st_mode)
|
|
|
+ assert stat.S_ISLNK(sto.st_mode)
|
|
|
+ assert os.readlink(in_fn) == os.readlink(out_fn)
|
|
|
+ # FIFO
|
|
|
+ out_fn = os.path.join(mountpoint, 'input', 'fifo1')
|
|
|
+ sto = os.stat(out_fn)
|
|
|
+ assert stat.S_ISFIFO(sto.st_mode)
|
|
|
|
|
|
def verify_aes_counter_uniqueness(self, method):
|
|
|
seen = set() # Chunks already seen
|
|
@@ -1160,7 +1209,7 @@ class RemoteArchiverTestCase(ArchiverTestCase):
|
|
|
# this was introduced because some tests expect stderr contents to show up
|
|
|
# in "output" also. Also, the non-forking exec_cmd catches both, too.
|
|
|
@unittest.skip('deadlock issues')
|
|
|
- def test_fuse_mount(self):
|
|
|
+ def test_fuse(self):
|
|
|
pass
|
|
|
|
|
|
@unittest.skip('only works locally')
|