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