diff options
| -rw-r--r-- | tests/sharedstorage/sharedstorage_test.go | 61 | 
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) +		} +	} +} | 
