aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/sharedstorage/sharedstorage_test.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/sharedstorage/sharedstorage_test.go b/tests/sharedstorage/sharedstorage_test.go
new file mode 100644
index 0000000..d2230a0
--- /dev/null
+++ b/tests/sharedstorage/sharedstorage_test.go
@@ -0,0 +1,61 @@
+// test gocryptfs cipherdir mounted multiple times at the same time
+package sharedstorage
+
+import (
+ "testing"
+
+ "golang.org/x/sys/unix"
+
+ "github.com/rfjakob/gocryptfs/tests/test_helpers"
+)
+
+var flagSharestorage bool
+
+func TestMain(m *testing.M) {
+ flagSharestorage = false
+ m.Run()
+ flagSharestorage = true
+ m.Run()
+}
+
+// mountSharedstorage mounts `cipherdir` on `mnt` with or without the
+// `-sharedstorage` flag, depending on the global var `flagSharestorage`.
+func mountSharedstorage(t *testing.T, cipherdir string, mnt string) {
+ args := []string{"-extpass=echo test"}
+ if flagSharestorage {
+ args = append(args, "-sharedstorage")
+ }
+ test_helpers.MountOrFatal(t, cipherdir, mnt, args...)
+}
+
+func TestUnlink(t *testing.T) {
+ cipherdir := test_helpers.InitFS(t)
+ mnt1 := cipherdir + ".mnt1"
+ mnt2 := cipherdir + ".mnt2"
+ mountSharedstorage(t, cipherdir, mnt1)
+ defer test_helpers.UnmountPanic(mnt1)
+ mountSharedstorage(t, cipherdir, mnt2)
+ defer test_helpers.UnmountPanic(mnt2)
+
+ // Create dir via mnt1
+ if err := unix.Mkdir(mnt1+"/foo", 0700); err != nil {
+ t.Fatal(err)
+ }
+ // Replace dir with file via mnt2
+ if err := unix.Rmdir(mnt2 + "/foo"); err != nil {
+ t.Fatal(err)
+ }
+ if fd, err := unix.Creat(mnt2+"/foo", 0600); err != nil {
+ t.Fatal(err)
+ } else {
+ unix.Close(fd)
+ }
+ // Try to unlink via mnt1
+ if err := unix.Unlink(mnt1 + "/foo"); err != nil {
+ if flagSharestorage {
+ t.Fatal(err)
+ } else {
+ t.Logf("Unlink failed as expected: errno %d / %v", err, err)
+ }
+ }
+}