summaryrefslogtreecommitdiff
path: root/rdiff-backup/testing/rpathtest.py
diff options
context:
space:
mode:
Diffstat (limited to 'rdiff-backup/testing/rpathtest.py')
-rw-r--r--rdiff-backup/testing/rpathtest.py337
1 files changed, 337 insertions, 0 deletions
diff --git a/rdiff-backup/testing/rpathtest.py b/rdiff-backup/testing/rpathtest.py
new file mode 100644
index 0000000..0b28f14
--- /dev/null
+++ b/rdiff-backup/testing/rpathtest.py
@@ -0,0 +1,337 @@
+import os, cPickle, sys, unittest
+execfile("commontest.py")
+rbexec("highlevel.py")
+
+
+
+class RPathTest(unittest.TestCase):
+ lc = Globals.local_connection
+ prefix = "testfiles/various_file_types/"
+ mainprefix = "testfiles/"
+ rp_prefix = RPath(lc, prefix, ())
+ rp_main = RPath(lc, mainprefix, ())
+
+
+class RORPStateTest(RPathTest):
+ """Test Pickling of RORPaths"""
+ def testPickle(self):
+ rorp = RPath(self.lc, self.prefix, ("regular_file",)).getRORPath()
+ rorp.file = sys.stdin # try to confuse pickler
+ assert rorp.isreg()
+ rorp2 = cPickle.loads(cPickle.dumps(rorp, 1))
+ assert rorp2.isreg()
+ assert rorp2.data == rorp.data and rorp.index == rorp2.index
+
+
+class CheckTypes(RPathTest):
+ """Check to see if file types are identified correctly"""
+ def testExist(self):
+ """Can tell if files exist"""
+ assert RPath(self.lc, self.prefix, ()).lstat()
+ assert not RPath(self.lc, "asuthasetuouo", ()).lstat()
+
+ def testDir(self):
+ """Directories identified correctly"""
+ assert RPath(self.lc, self.prefix, ()).isdir()
+ assert not RPath(self.lc, self.prefix, ("regular_file",)).isdir()
+
+ def testSym(self):
+ """Symbolic links identified"""
+ assert RPath(self.lc, self.prefix, ("symbolic_link",)).issym()
+ assert not RPath(self.lc, self.prefix, ()).issym()
+
+ def testReg(self):
+ """Regular files identified"""
+ assert RPath(self.lc, self.prefix, ("regular_file",)).isreg()
+ assert not RPath(self.lc, self.prefix, ("symbolic_link",)).isreg()
+
+ def testFifo(self):
+ """Fifo's identified"""
+ assert RPath(self.lc, self.prefix, ("fifo",)).isfifo()
+ assert not RPath(self.lc, self.prefix, ()).isfifo()
+
+ def testCharDev(self):
+ """Char special files identified"""
+ assert RPath(self.lc, "/dev/tty2", ()).ischardev()
+ assert not RPath(self.lc, self.prefix, ("regular_file",)).ischardev()
+
+ def testBlockDev(self):
+ """Block special files identified"""
+ assert RPath(self.lc, "/dev/hda", ()).isblkdev()
+ assert not RPath(self.lc, self.prefix, ("regular_file",)).isblkdev()
+
+
+class CheckPerms(RPathTest):
+ """Check to see if permissions are reported and set accurately"""
+ def testExecReport(self):
+ """Check permissions for executable files"""
+ assert self.rp_prefix.append('executable').getperms() == 0755
+ assert self.rp_prefix.append('executable2').getperms() == 0700
+
+ def testOrdinaryReport(self):
+ """Ordinary file permissions..."""
+ assert self.rp_prefix.append("regular_file").getperms() == 0644
+ assert self.rp_prefix.append('two_hardlinked_files1').getperms() == 0640
+
+ def testChmod(self):
+ """Test changing file permission"""
+ rp = self.rp_prefix.append("changeable_permission")
+ rp.chmod(0700)
+ assert rp.getperms() == 0700
+ rp.chmod(0644)
+ assert rp.getperms() == 0644
+
+ def testExceptions(self):
+ """What happens when file absent"""
+ self.assertRaises(Exception,
+ RPath(self.lc, self.prefix, ("aoeunto",)).getperms)
+
+
+class CheckDir(RPathTest):
+ """Check directory related functions"""
+ def testCreation(self):
+ """Test directory creation and deletion"""
+ d = self.rp_prefix.append("tempdir")
+ assert not d.lstat()
+ d.mkdir()
+ assert d.isdir()
+ d.rmdir()
+ assert not d.lstat()
+
+ def testExceptions(self):
+ """Should raise os.errors when no files"""
+ d = RPath(self.lc, self.prefix, ("suthosutho",))
+ self.assertRaises(os.error, d.rmdir)
+ d.mkdir()
+ self.assertRaises(os.error, d.mkdir)
+ d.rmdir()
+
+ def testListdir(self):
+ """Checking dir listings"""
+ assert (RPath(self.lc, self.mainprefix, ("sampledir",)).listdir() ==
+ ["1", "2", "3", "4"])
+
+
+class CheckSyms(RPathTest):
+ """Check symlinking and reading"""
+ def testRead(self):
+ """symlink read"""
+ assert (RPath(self.lc, self.prefix, ("symbolic_link",)).readlink() ==
+ "regular_file")
+
+ def testMake(self):
+ """Creating symlink"""
+ link = RPath(self.lc, self.mainprefix, ("symlink",))
+ assert not link.lstat()
+ link.symlink("abcdefg")
+ assert link.issym()
+ assert link.readlink() == "abcdefg"
+ link.delete()
+
+
+class TouchDelete(RPathTest):
+ """Check touching and deletion of files"""
+ def testTouch(self):
+ """Creation of 0 length files"""
+ t = RPath(self.lc, self.mainprefix, ("testtouch",))
+ assert not t.lstat()
+ t.touch()
+ assert t.lstat()
+ t.delete()
+
+ def testDelete(self):
+ """Deletion of files"""
+ d = RPath(self.lc, self.mainprefix, ("testdelete",))
+ d.touch()
+ assert d.lstat()
+ d.delete()
+ assert not d.lstat()
+
+
+class MiscFileInfo(RPathTest):
+ """Check Miscellaneous file information"""
+ def testFileLength(self):
+ """File length = getsize()"""
+ assert (RPath(self.lc, self.prefix, ("regular_file",)).getsize() ==
+ 75650)
+
+
+class FilenameOps(RPathTest):
+ """Check filename operations"""
+ weirdfilename = eval('\'\\xd8\\xab\\xb1Wb\\xae\\xc5]\\x8a\\xbb\\x15v*\\xf4\\x0f!\\xf9>\\xe2Y\\x86\\xbb\\xab\\xdbp\\xb0\\x84\\x13k\\x1d\\xc2\\xf1\\xf5e\\xa5U\\x82\\x9aUV\\xa0\\xf4\\xdf4\\xba\\xfdX\\x03\\x82\\x07s\\xce\\x9e\\x8b\\xb34\\x04\\x9f\\x17 \\xf4\\x8f\\xa6\\xfa\\x97\\xab\\xd8\\xac\\xda\\x85\\xdcKvC\\xfa#\\x94\\x92\\x9e\\xc9\\xb7\\xc3_\\x0f\\x84g\\x9aB\\x11<=^\\xdbM\\x13\\x96c\\x8b\\xa7|*"\\\\\\\'^$@#!(){}?+ ~` \'')
+ normdict = {"/": "/",
+ ".": ".",
+ "//": "/",
+ "/a/b": "/a/b",
+ "a/b": "a/b",
+ "a//b": "a/b",
+ "a////b//c": "a/b/c",
+ "..": "..",
+ "a/": "a",
+ "/a//b///": "/a/b"}
+ dirsplitdict = {"/": ("", ""),
+ "/a": ("", "a"),
+ "/a/b": ("/a", "b"),
+ ".": (".", "."),
+ "b/c": ("b", "c"),
+ "a": (".", "a")}
+
+ def testQuote(self):
+ """See if filename quoting works"""
+ wtf = RPath(self.lc, self.prefix, (self.weirdfilename,))
+ reg = RPath(self.lc, self.prefix, ("regular_file",))
+ assert wtf.lstat()
+ assert reg.lstat()
+ assert not os.system("ls %s >/dev/null 2>&1" % wtf.quote())
+ assert not os.system("ls %s >/dev/null 2>&1" % reg.quote())
+
+ def testNormalize(self):
+ """rpath.normalize() dictionary test"""
+ for (before, after) in self.normdict.items():
+ assert RPath(self.lc, before, ()).normalize().path == after, \
+ "Normalize fails for %s => %s" % (before, after)
+
+ def testDirsplit(self):
+ """Test splitting of various directories"""
+ for full, split in self.dirsplitdict.items():
+ result = RPath(self.lc, full, ()).dirsplit()
+ assert result == split, \
+ "%s => %s instead of %s" % (full, result, split)
+
+ def testGetnums(self):
+ """Test getting file numbers"""
+ devnums = RPath(self.lc, "/dev/hda", ()).getdevnums()
+ assert devnums == (3, 0), devnums
+ devnums = RPath(self.lc, "/dev/tty2", ()).getdevnums()
+ assert devnums == (4, 2), devnums
+
+
+class FileIO(RPathTest):
+ """Test file input and output"""
+ def testRead(self):
+ """File reading"""
+ fp = RPath(self.lc, self.prefix, ("executable",)).open("r")
+ assert fp.read(6) == "#!/bin"
+ fp.close()
+
+ def testWrite(self):
+ """File writing"""
+ rp = RPath(self.lc, self.mainprefix, ("testfile",))
+ fp = rp.open("w")
+ fp.write("hello")
+ fp.close()
+ fp_input = rp.open("r")
+ assert fp_input.read() == "hello"
+ fp_input.close()
+ rp.delete()
+
+
+class FileCopying(RPathTest):
+ """Test file copying and comparison"""
+ def setUp(self):
+ self.hl1 = RPath(self.lc, self.prefix, ("two_hardlinked_files1",))
+ self.hl2 = RPath(self.lc, self.prefix, ("two_hardlinked_files2",))
+ self.sl = RPath(self.lc, self.prefix, ("symbolic_link",))
+ self.dir = RPath(self.lc, self.prefix, ())
+ self.fifo = RPath(self.lc, self.prefix, ("fifo",))
+ self.rf = RPath(self.lc, self.prefix, ("regular_file",))
+ self.dest = RPath(self.lc, self.mainprefix, ("dest",))
+ if self.dest.lstat(): self.dest.delete()
+ assert not self.dest.lstat()
+
+ def testComp(self):
+ """Test comparisons involving regular files"""
+ assert RPath.cmp(self.hl1, self.hl2)
+ assert not RPath.cmp(self.rf, self.hl1)
+ assert not RPath.cmp(self.dir, self.rf)
+
+ def testCompMisc(self):
+ """Test miscellaneous comparisons"""
+ assert RPath.cmp(self.dir, RPath(self.lc, self.mainprefix, ()))
+ self.dest.symlink("regular_file")
+ assert RPath.cmp(self.sl, self.dest)
+ self.dest.delete()
+ assert not RPath.cmp(self.sl, self.fifo)
+ assert not RPath.cmp(self.dir, self.sl)
+
+ def testCopy(self):
+ """Test copy of various files"""
+ for rp in [self.sl, self.rf, self.fifo, self.dir]:
+ RPath.copy(rp, self.dest)
+ assert self.dest.lstat(), "%s doesn't exist" % self.dest.path
+ assert RPath.cmp(rp, self.dest)
+ assert RPath.cmp(self.dest, rp)
+ self.dest.delete()
+
+
+class FileAttributes(FileCopying):
+ """Test file attribute operations"""
+ def setUp(self):
+ FileCopying.setUp(self)
+ self.noperms = RPath(self.lc, self.mainprefix, ("noperms",))
+ self.nowrite = RPath(self.lc, self.mainprefix, ("nowrite",))
+ self.exec1 = RPath(self.lc, self.prefix, ("executable",))
+ self.exec2 = RPath(self.lc, self.prefix, ("executable2",))
+ self.test = RPath(self.lc, self.prefix, ("test",))
+ self.nothing = RPath(self.lc, self.prefix, ("aoeunthoenuouo",))
+ self.sym = RPath(self.lc, self.prefix, ("symbolic_link",))
+
+ def testComp(self):
+ """Test attribute comparison success"""
+ testpairs = [(self.hl1, self.hl2)]
+ for a, b in testpairs:
+ assert RPath.cmp_attribs(a, b), "Err with %s %s" % (a.path, b.path)
+ assert RPath.cmp_attribs(b, a), "Err with %s %s" % (b.path, a.path)
+
+ def testCompFail(self):
+ """Test attribute comparison failures"""
+ testpairs = [(self.nowrite, self.noperms),
+ (self.exec1, self.exec2),
+ (self.rf, self.hl1)]
+ for a, b in testpairs:
+ assert not RPath.cmp_attribs(a, b), \
+ "Err with %s %s" % (a.path, b.path)
+ assert not RPath.cmp_attribs(b, a), \
+ "Err with %s %s" % (b.path, a.path)
+
+ def testCompRaise(self):
+ """Should raise exception when file missing"""
+ self.assertRaises(RPathException, RPath.cmp_attribs,
+ self.nothing, self.hl1)
+ self.assertRaises(RPathException, RPath.cmp_attribs,
+ self.noperms, self.nothing)
+
+ def testCopyAttribs(self):
+ """Test copying attributes"""
+ t = RPath(self.lc, self.mainprefix, ("testattribs",))
+ if t.lstat(): t.delete()
+ for rp in [self.noperms, self.nowrite, self.rf, self.exec1,
+ self.exec2, self.hl1, self.dir]:
+ t.touch()
+ RPath.copy_attribs(rp, t)
+ assert RPath.cmp_attribs(t, rp), \
+ "Attributes for file %s not copied successfully" % rp.path
+ t.delete()
+
+ def testCopyWithAttribs(self):
+ """Test copying with attribs (bug found earlier)"""
+ out = RPath(self.lc, self.mainprefix, ("out",))
+ if out.lstat(): out.delete()
+ for rp in [self.noperms, self.nowrite, self.rf, self.exec1,
+ self.exec2, self.hl1, self.dir, self.sym]:
+ RPath.copy_with_attribs(rp, out)
+ assert RPath.cmp(rp, out)
+ assert RPath.cmp_attribs(rp, out)
+ out.delete()
+
+ def testCopyRaise(self):
+ """Should raise exception for non-existent files"""
+ self.assertRaises(RPathException, RPath.copy_attribs,
+ self.hl1, self.nothing)
+ self.assertRaises(RPathException, RPath.copy_attribs,
+ self.nothing, self.nowrite)
+
+
+
+if __name__ == "__main__":
+ unittest.main()