aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--tests/cli/directmount_test.go61
2 files changed, 65 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 8cf583a..beccc5f 100644
--- a/Makefile
+++ b/Makefile
@@ -10,9 +10,12 @@ test:
.phony: root_test
root_test:
./build.bash
- # Need to use TMPDIR=/var/tmp as TestOverlay fails on tmpfs.
+
+# Need to use TMPDIR=/var/tmp as TestOverlay fails on tmpfs.
cd tests/root_test && go test -c && sudo TMPDIR=/var/tmp ./root_test.test -test.v
+ cd tests/cli && go test -c && sudo ./cli.test -test.v -test.run=TestDirectMount
+
.phony: format
format:
go fmt ./...
diff --git a/tests/cli/directmount_test.go b/tests/cli/directmount_test.go
new file mode 100644
index 0000000..da78039
--- /dev/null
+++ b/tests/cli/directmount_test.go
@@ -0,0 +1,61 @@
+package cli
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+
+ "github.com/moby/sys/mountinfo"
+
+ "github.com/rfjakob/gocryptfs/v2/tests/test_helpers"
+)
+
+// TestDirectMount checks that the effective mount options are what we expect.
+//
+// This test should be run twice:
+// 1) As a normal user (uses fusermount): make test
+// 2) As root (mount syscall is called directly): make root_test
+func TestDirectMount(t *testing.T) {
+ type testCase struct {
+ allow_other bool
+ }
+ table := []testCase{
+ {allow_other: false},
+ {allow_other: true},
+ }
+
+ dir := test_helpers.InitFS(t)
+ mnt := dir + ".mnt"
+
+ doTestMountInfo := func(t *testing.T, row testCase) {
+ test_helpers.MountOrFatal(t, dir, mnt, "-extpass=echo test", fmt.Sprintf("-allow_other=%v", row.allow_other))
+ defer test_helpers.UnmountErr(mnt)
+
+ mounts, err := mountinfo.GetMounts(mountinfo.SingleEntryFilter(mnt))
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(mounts) != 1 {
+ t.Fatalf("Could not find mountpoint %q in /proc/self/mountinfo", mnt)
+ }
+ info := mounts[0]
+
+ if info.FSType != "fuse.gocryptfs" {
+ t.Errorf("wrong FSType: %q", info.FSType)
+ }
+ if info.Source != dir {
+ t.Errorf("wrong Source: have %q, want %q", info.Source, dir)
+ }
+ if !strings.Contains(info.VFSOptions, "max_read=") {
+ t.Errorf("VFSOptions is missing max_read")
+ }
+ if row.allow_other && !strings.Contains(info.VFSOptions, "allow_other") {
+ t.Errorf("VFSOptions is missing allow_other")
+ }
+ }
+
+ for _, row := range table {
+ doTestMountInfo(t, row)
+ }
+
+}