From b2724070d95234a8cd281f275211e0f827a8bbe1 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Mon, 16 Aug 2021 18:40:48 +0200 Subject: reverse mode: implement -one-file-system Fixes https://github.com/rfjakob/gocryptfs/issues/475 --- tests/reverse/one_file_system_test.go | 77 +++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tests/reverse/one_file_system_test.go (limited to 'tests/reverse/one_file_system_test.go') diff --git a/tests/reverse/one_file_system_test.go b/tests/reverse/one_file_system_test.go new file mode 100644 index 0000000..5d8b76b --- /dev/null +++ b/tests/reverse/one_file_system_test.go @@ -0,0 +1,77 @@ +package reverse + +import ( + "io/ioutil" + "net/url" + "os" + "runtime" + "syscall" + "testing" + + "github.com/rfjakob/gocryptfs/tests/test_helpers" +) + +func doTestOneFileSystem(t *testing.T, plaintextnames bool) { + // Let's not explode with "TempDir: pattern contains path separator" + myEscapedName := url.PathEscape(t.Name()) + mnt, err := ioutil.TempDir(test_helpers.TmpDir, myEscapedName) + if err != nil { + t.Fatal(err) + } + cliArgs := []string{"-reverse", "-zerokey", "-one-file-system"} + if plaintextnames { + cliArgs = append(cliArgs, "-plaintextnames") + } + test_helpers.MountOrFatal(t, "/", mnt, cliArgs...) + defer test_helpers.UnmountErr(mnt) + + // Copied from inomap + const maxPassthruIno = 1<<48 - 1 + + entries, err := os.ReadDir(mnt) + if err != nil { + t.Fatal(err) + } + mountpoints := []string{} + for _, e := range entries { + i, err := e.Info() + if err != nil { + continue + } + if !e.IsDir() { + // We are only interested in directories + continue + } + st := i.Sys().(*syscall.Stat_t) + // The inode numbers of files with a different device number are remapped + // to something above maxPassthruIno + if st.Ino > maxPassthruIno { + mountpoints = append(mountpoints, e.Name()) + } + } + if len(mountpoints) == 0 { + t.Skip("no mountpoints found, nothing to test") + } + for _, m := range mountpoints { + e, err := os.ReadDir(mnt + "/" + m) + if err != nil { + t.Error(err) + } + expected := 1 + if plaintextnames { + expected = 0 + } + if len(e) != expected { + t.Errorf("mountpoint %q does not look empty: %v", m, e) + } + } + t.Logf("tested %d mountpoints: %v", len(mountpoints), mountpoints) +} + +func TestOneFileSystem(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skip("only works on linux") + } + t.Run("normal", func(t *testing.T) { doTestOneFileSystem(t, false) }) + t.Run("plaintextnames", func(t *testing.T) { doTestOneFileSystem(t, true) }) +} -- cgit v1.2.3