def test_dangling_symlink(self): src = self.gen_dir("src") self.generate_tree(src, {"dir":["dir"]}) cset = livefs.scan(src, offset=src) dest = self.gen_dir("dest") os.symlink(pjoin(dest, "dest"), pjoin(dest, "dir")) self.assertTrue(ops.merge_contents(cset, offset=dest)) self.assertEqual(cset, livefs.scan(src, offset=dest))
def generic_merge_bits(self, entries): src = self.gen_dir("src") self.generate_tree(src, entries) cset = livefs.scan(src, offset=src) dest = self.gen_dir("dest") self.assertTrue(ops.merge_contents(cset, offset=dest)) self.assertEqual(livefs.scan(src, offset=src), livefs.scan(dest, offset=dest)) return src, dest, cset
def assertTrigger(self, touches, ran, dirs=['test-lib', 'test-lib2'], hook='merge', mode=const.INSTALL_MODE, mkdirs=True, same_mtime=False): # wipe whats there. for x in scan(self.dir).iterdirs(): if x.location == self.dir: continue shutil.rmtree(x.location) for x in scan(self.dir).iterdirs(True): os.unlink(x.location) ensure_dirs(pjoin(self.dir, "etc")) with open(pjoin(self.dir, "etc/ld.so.conf"), "w") as f: f.write("\n".join('/' + x for x in dirs)) # force directory mtime to 1s less. past = time.time() - 10.0 if mkdirs: for x in dirs: ensure_dirs(pjoin(self.dir, x)) os.utime(pjoin(self.dir, x), (past, past)) self.reset_objects() self.engine.phase = 'pre_%s' % hook self.engine.mode = mode self.trigger(self.engine, {}) self.assertFalse(self.trigger._passed_in_args) resets = set() for x in touches: fp = pjoin(self.dir, x.lstrip('/')) open(pjoin(fp), "w").close() if same_mtime: os.utime(fp, (past, past)) resets.add(os.path.dirname(fp)) for x in resets: os.utime(x, (past, past)) self.engine.phase = 'post_%s' % hook self.trigger(self.engine, {}) self.assertEqual([[getattr(x, 'offset', None) for x in y] for y in self.trigger._passed_in_args], [[self.dir]])
def assertTrigger(self, touches, ran, dirs=['test-lib', 'test-lib2'], hook='merge', mode=const.INSTALL_MODE, mkdirs=True, same_mtime=False): # wipe whats there. for x in scan(self.dir).iterdirs(): if x.location == self.dir: continue shutil.rmtree(x.location) for x in scan(self.dir).iterdirs(True): os.unlink(x.location) ensure_dirs(pjoin(self.dir, "etc")) open(pjoin(self.dir, "etc/ld.so.conf"), "w").write( "\n".join('/' + x for x in dirs)) # force directory mtime to 1s less. past = time.time() - 10.0 if mkdirs: for x in dirs: ensure_dirs(pjoin(self.dir, x)) os.utime(pjoin(self.dir, x), (past, past)) self.reset_objects() self.engine.phase = 'pre_%s' % hook self.engine.mode = mode self.trigger(self.engine, {}) self.assertFalse(self.trigger._passed_in_args) resets = set() for x in touches: fp = pjoin(self.dir, x.lstrip('/')) open(pjoin(fp), "w") if same_mtime: os.utime(fp, (past, past)) resets.add(os.path.dirname(fp)) for x in resets: os.utime(x, (past, past)) self.engine.phase = 'post_%s' % hook self.trigger(self.engine, {}) self.assertEqual([[getattr(x, 'offset', None) for x in y] for y in self.trigger._passed_in_args], [[self.dir]])
def test__get_livefs_intersect_cset(self): old_cset = self.simple_cset.insert_offset(self.dir) # have to add it; scan adds the root node old_cset.add(fsDir(self.dir)) os.mkdir(pjoin(self.dir, "usr")) open(pjoin(self.dir, "usr", "dar"), 'w').close() open(pjoin(self.dir, 'foon'), 'w').close() # note that this *is* a sym in the cset; adding this specific # check so that if the code differs, the test breaks, and the tests # get updated (additionally, folks may not be aware of the potential) open(pjoin(self.dir, 'broken-symlink'), 'w').close() engine = fake_engine(csets={'test': old_cset}) existent = livefs.scan(self.dir) generated = self.run_cset('_get_livefs_intersect_cset', engine, 'test') self.assertEqual(generated, existent)
def test__get_livefs_intersect_cset(self): old_cset = self.simple_cset.insert_offset(self.dir) # have to add it; scan adds the root node old_cset.add(fsDir(self.dir)) os.mkdir(pjoin(self.dir, "usr")) open(pjoin(self.dir, "usr", "dar"), 'w').close() open(pjoin(self.dir, 'foon'), 'w').close() # note that this *is* a sym in the cset; adding this specific # check so that if the code differs, the test breaks, and the tests # get updated (additionally, folks may not be aware of the potential) open(pjoin(self.dir, 'broken-symlink'), 'w').close() engine = fake_engine(csets={'test':old_cset}) existent = livefs.scan(self.dir) generated = self.run_cset('_get_livefs_intersect_cset', engine, 'test') self.assertEqual(generated, existent)
def test_exact_removal(self): img, cset = self.generic_unmerge_bits(self.entries_norm1) self.assertTrue(ops.unmerge_contents(cset, offset=img)) self.assertFalse(livefs.scan(img, offset=img))
def generic_unmerge_bits(self, entries, img="img"): img = self.gen_dir(img) self.generate_tree(img, entries) cset = livefs.scan(img, offset=img) return img, cset
def scan_contents(self, location): return scan(location, offset=location, mutable=True)
def scan_contents(self, location): return scan(location, offset=location)