bugfix: binary_storage: check before writing a key with an empty value. Added test.
[rrq/fuse_xattrs.git] / test / tests.py
index 48a10f3349cee8f478c4990606a8e07ab46ee26c..304676f2f17c0484a5bd630b4564e8303baba33a 100755 (executable)
@@ -14,6 +14,9 @@ import xattr
 from pathlib import Path
 import os
 
+if xattr.__version__ != '0.9.1':
+    print("WARNING, only tested with xattr version 0.9.1")
+
 # TODO
 # - listxattr: list too long
 # - sidecar file permissions
@@ -22,17 +25,30 @@ import os
 
 class TestXAttrs(unittest.TestCase):
     def setUp(self):
-        self.randomFile = "./mount/foo.txt"
-        self.randomFileSidecar = "./mount/foo.txt.xattr"
+        self.sourceDir = "./source/"
+        self.mountDir = "./mount/"
+        self.randomFilename = "foo.txt"
+
+        self.randomFile = self.mountDir + self.randomFilename
+        self.randomFileSidecar = self.randomFile + ".xattr"
+
+        self.randomSourceFile = self.sourceDir + self.randomFilename
+        self.randomSourceFileSidecar = self.randomSourceFile + ".xattr"
+
         if os.path.isfile(self.randomFile):
             os.remove(self.randomFile)
-        Path(self.randomFile).touch()
 
         if os.path.isfile(self.randomFileSidecar):
             os.remove(self.randomFileSidecar)
 
+        Path(self.randomFile).touch()
+        self.assertTrue(os.path.isfile(self.randomFile))
+        self.assertFalse(os.path.isfile(self.randomFileSidecar))
+
     def tearDown(self):
-        os.remove(self.randomFile)
+        if os.path.isfile(self.randomFile):
+            os.remove(self.randomFile)
+
         if os.path.isfile(self.randomFileSidecar):
             os.remove(self.randomFileSidecar)
 
@@ -104,6 +120,14 @@ class TestXAttrs(unittest.TestCase):
         read_value = xattr.getxattr(self.randomFile, key)
         self.assertEqual(value, read_value.decode(enc))
 
+    def test_xattr_set_empty(self):
+        enc = "utf-8"
+        key = "user.foo"
+        value = ""
+        xattr.setxattr(self.randomFile, key, bytes(value, enc))
+        read_value = xattr.getxattr(self.randomFile, key)
+        self.assertEqual(value, read_value.decode(enc))
+
     def test_xattr_set_override(self):
         enc = "utf-8"
         key = "user.foo"
@@ -148,9 +172,9 @@ class TestXAttrs(unittest.TestCase):
 
     def test_xattr_list(self):
         enc = "utf-8"
-        key1 = b"user.foo"
-        key2 = b"user.foo2"
-        key3 = b"user.foo3"
+        key1 = "user.foo"
+        key2 = "user.foo2"
+        key3 = "user.foo3"
         value = "bar"
 
         # set 3 keys
@@ -177,7 +201,7 @@ class TestXAttrs(unittest.TestCase):
         # list
         attrs = xattr.listxattr(self.randomFile)
         self.assertEqual(len(attrs), 1)
-        self.assertTrue(key.encode() in attrs)
+        self.assertEqual(attrs[0], key)
 
         # read
         read_value = xattr.getxattr(self.randomFile, key)
@@ -213,6 +237,51 @@ class TestXAttrs(unittest.TestCase):
         self.assertEqual(ex.exception.errno, 61)
         self.assertEqual(ex.exception.strerror, "No data available")
 
+    def test_hide_sidecar(self):
+        xattr.setxattr(self.randomFile, "user.foo", bytes("bar", "utf-8"))
+        self.assertTrue(os.path.isfile(self.randomFile))
+        self.assertFalse(os.path.isfile(self.randomFileSidecar))
+
+        sidecarFilename = self.randomFilename + ".xattr"
+        files_mount = os.listdir(self.mountDir)
+        self.assertTrue(self.randomFilename in files_mount)
+        self.assertTrue(sidecarFilename not in files_mount)
+
+        files_source = os.listdir(self.sourceDir)
+        self.assertTrue(self.randomFilename in files_source)
+        self.assertTrue(sidecarFilename in files_source)
+
+    def test_create_new_file(self):
+        test_filename = "test_create_new_file"
+        self.assertFalse(os.path.isfile(self.sourceDir + test_filename))
+        self.assertFalse(os.path.isfile(self.mountDir + test_filename))
+
+        open(self.mountDir + test_filename, "a").close()
+        self.assertTrue(os.path.isfile(self.sourceDir + test_filename))
+        self.assertTrue(os.path.isfile(self.mountDir + test_filename))
+        # FIXME: if one assert fails, the file isn't going to be deleted
+        os.remove(self.mountDir + test_filename)
+
+    def test_remove_file_with_sidecar(self):
+        xattr.setxattr(self.randomFile, "user.foo", bytes("bar", "utf-8"))
+        self.assertTrue(os.path.isfile(self.randomFile))
+        self.assertTrue(os.path.isfile(self.randomSourceFile))
+        self.assertTrue(os.path.isfile(self.randomSourceFileSidecar))
+
+        os.remove(self.randomFile)
+        self.assertFalse(os.path.isfile(self.randomFile))
+        self.assertFalse(os.path.isfile(self.randomSourceFile))
+        self.assertFalse(os.path.isfile(self.randomSourceFileSidecar))
+
+    def test_remove_file_without_sidecar(self):
+        self.assertTrue(os.path.isfile(self.randomFile))
+        self.assertTrue(os.path.isfile(self.randomSourceFile))
+        self.assertFalse(os.path.isfile(self.randomSourceFileSidecar))
+
+        os.remove(self.randomFile)
+        self.assertFalse(os.path.isfile(self.randomFile))
+        self.assertFalse(os.path.isfile(self.randomSourceFile))
+        self.assertFalse(os.path.isfile(self.randomSourceFileSidecar))
 
 if __name__ == '__main__':
     unittest.main()