diff options
Diffstat (limited to 'tests/deterministic_names/deterministic_names_test.go')
-rw-r--r-- | tests/deterministic_names/deterministic_names_test.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/tests/deterministic_names/deterministic_names_test.go b/tests/deterministic_names/deterministic_names_test.go new file mode 100644 index 0000000..1b355df --- /dev/null +++ b/tests/deterministic_names/deterministic_names_test.go @@ -0,0 +1,79 @@ +package deterministic_names + +// integration tests that target "-deterministic-names" specifically + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/rfjakob/gocryptfs/tests/test_helpers" +) + +var cDir string +var pDir string + +var testPw = []byte("test") + +// Create and mount "-deterministic-names" fs +func TestMain(m *testing.M) { + cDir = test_helpers.InitFS(nil, "-deterministic-names") + pDir = cDir + ".mnt" + test_helpers.MountOrExit(cDir, pDir, "-deterministic-names", "-extpass", "echo test") + r := m.Run() + test_helpers.UnmountPanic(pDir) + os.Exit(r) +} + +// TestDeterministicNames checks that a file with the same plaintext name +// always encrypts to the same ciphertext name +func TestDeterministicNames(t *testing.T) { + // "foo" should encrypt to the same name in both directories + if err := os.MkdirAll(pDir+"/x/foo", 0700); err != nil { + t.Fatal(err) + } + if err := os.MkdirAll(pDir+"/y/foo", 0700); err != nil { + t.Fatal(err) + } + matches, err := filepath.Glob(cDir + "/*/*") + if err != nil || len(matches) != 2 { + t.Fatal(matches, err) + } + if filepath.Base(matches[0]) != filepath.Base(matches[1]) { + t.Error(matches) + } + fooEncrypted := filepath.Base(matches[0]) + + // "foo" should also encrypt to the same name in the root directory + if err := os.Mkdir(pDir+"/foo", 0700); err != nil { + t.Fatal(err) + } + _, err = os.Stat(cDir + "/" + fooEncrypted) + if err != nil { + t.Error(err) + } + + // Replace directory with file + if err := os.RemoveAll(pDir + "/foo"); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile(pDir+"/foo", nil, 0700); err != nil { + t.Fatal(err) + } + _, err = os.Stat(cDir + "/" + fooEncrypted) + if err != nil { + t.Error(err) + } + + // Rename back and forth, name should stay the same + if err := os.Rename(pDir+"/foo", pDir+"/foo.tmp"); err != nil { + t.Fatal(err) + } + if err := os.Rename(pDir+"/foo.tmp", pDir+"/foo"); err != nil { + t.Fatal(err) + } + if _, err := os.Stat(cDir + "/" + fooEncrypted); err != nil { + t.Error(err) + } +} |