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) + } + } +}