def test_round_trip_for_None_values(self): metadata = obnamlib.Metadata() encoded = obnamlib.fmt_6.metadata_codec.encode_metadata(metadata) decoded = obnamlib.fmt_6.metadata_codec.decode_metadata(encoded) for name in dir(metadata): if name in obnamlib.metadata_fields: self.assertEqual(getattr(decoded, name), None, 'attribute %s must be None' % name)
def setUp(self): self.now = None self.tempdir = tempfile.mkdtemp() fs = obnamlib.LocalFS(self.tempdir) self.hooks = obnamlib.HookManager() self.hooks.new('repository-toplevel-init') self.client = obnamlib.ClientMetadataTree( fs, 'clientid', obnamlib.DEFAULT_NODE_SIZE, obnamlib.DEFAULT_UPLOAD_QUEUE_SIZE, obnamlib.DEFAULT_LRU_SIZE, self) # Force use of filename hash collisions. self.client.default_file_id = self.client._bad_default_file_id self.client.start_generation() self.clientid = self.client.get_generation_id(self.client.tree) self.file_metadata = obnamlib.Metadata(st_mode=stat.S_IFREG | 0666) self.file_encoded = obnamlib.fmt_6.metadata_codec.encode_metadata( self.file_metadata) self.dir_metadata = obnamlib.Metadata(st_mode=stat.S_IFDIR | 0777) self.dir_encoded = obnamlib.fmt_6.metadata_codec.encode_metadata( self.dir_metadata)
def _make_metadata(self, get_value): metadata = obnamlib.Metadata() for key, field in obnamlib.metadata_file_key_mapping: value = get_value(key) if value is None: if key in obnamlib.REPO_FILE_INTEGER_KEYS: value = 0 else: value = '' setattr(metadata, field, value) return metadata
def decode_metadata(encoded): items = metadata_format.unpack_from(encoded) flags = items[0] pos = [1, metadata_format.size] metadata = obnamlib.Metadata() def is_present(field): i = obnamlib.metadata_fields.index(field) return (flags & (1 << i)) != 0 def decode(field, num_items, inc_offset, getvalue): if is_present(field): value = getvalue(pos[0], pos[1]) setattr(metadata, field, value) if inc_offset: pos[1] += len(value) pos[0] += num_items def decode_integer(field): decode(field, 1, False, lambda i, o: items[i]) def decode_string(field): decode(field, 1, True, lambda i, o: encoded[o:o + items[i]]) decode_integer('st_mode') decode_integer('st_mtime_sec') decode_integer('st_mtime_nsec') decode_integer('st_atime_sec') decode_integer('st_atime_nsec') decode_integer('st_nlink') decode_integer('st_size') decode_integer('st_uid') decode_integer('st_gid') decode_integer('st_dev') decode_integer('st_ino') decode_integer('st_blocks') decode_string('groupname') decode_string('username') decode_string('target') decode_string('md5') decode_string('xattr') # reset to start counting off extend items if pos[1] + extend_format.size <= len(encoded): items = extend_format.unpack(encoded[pos[1]:pos[1] + extend_format.size]) pos[0] = 0 decode_integer('st_rdev') return metadata
def setUp(self): self.now = None self.tempdir = tempfile.mkdtemp() fs = obnamlib.LocalFS(self.tempdir) self.hooks = obnamlib.HookManager() self.hooks.new('repository-toplevel-init') self.client = obnamlib.ClientMetadataTree( fs, 'clientid', obnamlib.DEFAULT_NODE_SIZE, obnamlib.DEFAULT_UPLOAD_QUEUE_SIZE, obnamlib.DEFAULT_LRU_SIZE, self) self.file_size = 123 self.file_metadata = obnamlib.Metadata(st_mode=stat.S_IFREG | 0666, st_size=self.file_size) self.file_encoded = obnamlib.fmt_6.metadata_codec.encode_metadata( self.file_metadata)
def test_round_trip_for_maximum_values(self): unsigned_max = 2**64 - 1 signed_max = 2**63 - 1 metadata = obnamlib.Metadata(st_mode=unsigned_max, st_mtime_sec=signed_max, st_mtime_nsec=unsigned_max, st_nlink=unsigned_max, st_size=signed_max, st_uid=unsigned_max, st_blocks=signed_max, st_dev=unsigned_max, st_gid=unsigned_max, st_ino=unsigned_max, st_atime_sec=signed_max, st_atime_nsec=unsigned_max) encoded = obnamlib.fmt_6.metadata_codec.encode_metadata(metadata) decoded = obnamlib.fmt_6.metadata_codec.decode_metadata(encoded) self.equal(metadata, decoded)
def test_round_trip(self): metadata = obnamlib.Metadata(st_mode=1, st_mtime_sec=2, st_mtime_nsec=12756, st_nlink=3, st_size=4, st_uid=5, st_blocks=6, st_dev=7, st_gid=8, st_ino=9, st_atime_sec=10, st_atime_nsec=123, groupname='group', username='******', target='target', md5='checksum') encoded = obnamlib.fmt_6.metadata_codec.encode_metadata(metadata) decoded = obnamlib.fmt_6.metadata_codec.decode_metadata(encoded) self.equal(metadata, decoded)
def get_metadata_from_generation(self, gen, pathname): return obnamlib.Metadata( st_mtime_sec=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_MTIME_SEC), st_mtime_nsec=self.repo.get_file_key( gen, pathname, obnamlib.REPO_FILE_MTIME_NSEC), st_mode=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_MODE), st_nlink=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_NLINK), st_size=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_SIZE), st_uid=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_UID), st_gid=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_GID), st_rdev=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_RDEV), xattr=self.repo.get_file_key(gen, pathname, obnamlib.REPO_FILE_XATTR_BLOB))
def backup_parents(self, root): '''Back up parents of root, non-recursively.''' root = self.fs.abspath(root) tracing.trace('backing up parents of %s', root) dummy_metadata = obnamlib.Metadata(st_mode=0777 | stat.S_IFDIR) while True: parent = os.path.dirname(root) try: metadata = obnamlib.read_metadata(self.fs, root) except OSError, e: logging.warning('Failed to get metadata for %s: %s: %s' % (root, e.errno or 0, e.strerror)) logging.warning('Using fake metadata instead for %s' % root) metadata = dummy_metadata if not self.pretend: self.add_file_to_generation(root, metadata) if root == parent: break root = parent
def lstat(self, pathname): (ret, dev, ino, mode, nlink, uid, gid, rdev, size, blksize, blocks, atime_sec, atime_nsec, mtime_sec, mtime_nsec, ctime_sec, ctime_nsec) = obnamlib._obnam.lstat(self.join(pathname)) if ret != 0: raise OSError(ret, os.strerror(ret), pathname) return obnamlib.Metadata(st_dev=dev, st_ino=ino, st_mode=mode, st_nlink=nlink, st_uid=uid, st_gid=gid, st_rdev=rdev, st_size=size, st_blksize=blksize, st_blocks=blocks, st_atime_sec=atime_sec, st_atime_nsec=atime_nsec, st_mtime_sec=mtime_sec, st_mtime_nsec=mtime_nsec, st_ctime_sec=ctime_sec, st_ctime_nsec=ctime_nsec)
def test_islink_returns_true_for_symlink(self): metadata = obnamlib.Metadata(st_mode=stat.S_IFLNK) self.assert_(metadata.islink())
def test_islink_returns_false_for_regular_file(self): metadata = obnamlib.Metadata(st_mode=stat.S_IFREG) self.assertFalse(metadata.islink())
def test_isdir_returns_true_for_directory(self): metadata = obnamlib.Metadata(st_mode=stat.S_IFDIR) self.assert_(metadata.isdir())
def test_sets_mtime_from_kwarg(self): metadata = obnamlib.Metadata(st_mtime_sec=123) self.assertEqual(metadata.st_mtime_sec, 123)
def test_greater_than_works(self): m1 = obnamlib.Metadata(st_size=1) m2 = obnamlib.Metadata(st_size=2) self.assert_(m2 > m1)
def test_less_than_works(self): m1 = obnamlib.Metadata(st_size=1) m2 = obnamlib.Metadata(st_size=2) self.assert_(m1 < m2)
def test_is_equal_to_itself(self): metadata = obnamlib.Metadata(st_mode=stat.S_IFREG) self.assertEqual(metadata, metadata)
def test_sets_md5(self): metadata = obnamlib.Metadata(md5='checksum') self.assertEqual(metadata.md5, 'checksum')
def test_isfile_returns_true_for_regular_file(self): metadata = obnamlib.Metadata(st_mode=stat.S_IFREG) self.assert_(metadata.isfile())
def test_isfile_returns_false_when_st_mode_is_not_set(self): metadata = obnamlib.Metadata() self.assertFalse(metadata.isfile())
def test_has_no_md5_by_default(self): metadata = obnamlib.Metadata() self.assertEqual(metadata.md5, None)