diff options
-rwxr-xr-x | test.bash | 5 | ||||
-rw-r--r-- | tests/example_filesystems/example_filesystems_test.go | 47 | ||||
-rw-r--r-- | tests/matrix/matrix_test.go (renamed from tests/integration_tests/main_test.go) | 127 | ||||
-rw-r--r-- | tests/normal/cli_test.go (renamed from tests/integration_tests/cli_test.go) | 12 | ||||
-rw-r--r-- | tests/normal/performance_test.go (renamed from tests/integration_tests/performance_test.go) | 2 | ||||
-rw-r--r-- | tests/plaintextnames/plaintextnames_test.go | 4 | ||||
-rw-r--r-- | tests/test_helpers/helpers.go | 71 |
7 files changed, 131 insertions, 137 deletions
@@ -8,4 +8,9 @@ source build.bash go test ./... $* +# Clean up after ourself, but don't descend into maybe still mounted +# example filesystems +# The tests cannot to this themselves as they are run in parallel +rm -Rf --one-file-system /tmp/gocryptfs-test-parent + go tool vet -shadow=true . diff --git a/tests/example_filesystems/example_filesystems_test.go b/tests/example_filesystems/example_filesystems_test.go index 6e0ab66..13aa941 100644 --- a/tests/example_filesystems/example_filesystems_test.go +++ b/tests/example_filesystems/example_filesystems_test.go @@ -15,20 +15,23 @@ import ( const statusTxtContent = "It works!\n" -var opensslOpt = "-openssl=false" +var opensslOpt string func TestMain(m *testing.M) { - test_helpers.ResetTmpDir(true) - r := m.Run() - opensslOpt = "-openssl=true" - r2 := m.Run() - os.Exit(r + r2) + for _, opensslOpt = range []string{"-openssl=false", "-openssl=true"} { + test_helpers.ResetTmpDir(true) + r := m.Run() + if r != 0 { + os.Exit(r) + } + } + os.Exit(0) } // This filesystem is not supported anymore. func TestExampleFSv04(t *testing.T) { cDir := "v0.4" - pDir := test_helpers.TmpDir + cDir + pDir := test_helpers.TmpDir + "/" + cDir err := test_helpers.Mount(cDir, pDir, false, "-extpass", "echo test", opensslOpt) if err == nil { t.Errorf("Mounting too old FS should fail") @@ -38,7 +41,7 @@ func TestExampleFSv04(t *testing.T) { // This filesystem is not supported anymore. func TestExampleFSv05(t *testing.T) { cDir := "v0.5" - pDir := test_helpers.TmpDir + cDir + pDir := test_helpers.TmpDir + "/" + cDir err := test_helpers.Mount(cDir, pDir, false, "-extpass", "echo test", opensslOpt) if err == nil { t.Errorf("Mounting too old FS should fail") @@ -48,7 +51,7 @@ func TestExampleFSv05(t *testing.T) { // This filesystem is not supported anymore. func TestExampleFSv06(t *testing.T) { cDir := "v0.6" - pDir := test_helpers.TmpDir + cDir + pDir := test_helpers.TmpDir + "/" + cDir err := test_helpers.Mount(cDir, pDir, false, "-extpass", "echo test", opensslOpt) if err == nil { t.Errorf("Mounting too old FS should fail") @@ -58,7 +61,7 @@ func TestExampleFSv06(t *testing.T) { // This filesystem is not supported anymore. func TestExampleFSv06PlaintextNames(t *testing.T) { cDir := "v0.6-plaintextnames" - pDir := test_helpers.TmpDir + cDir + pDir := test_helpers.TmpDir + "/" + cDir err := test_helpers.Mount(cDir, pDir, false, "-extpass", "echo test", opensslOpt) if err == nil { t.Errorf("Mounting too old FS should fail") @@ -69,8 +72,8 @@ func TestExampleFSv06PlaintextNames(t *testing.T) { // with password mount and -masterkey mount // v0.7 adds 128 bit GCM IVs func TestExampleFSv07(t *testing.T) { - pDir := test_helpers.TmpDir + "TestExampleFsV07/" cDir := "v0.7" + pDir := test_helpers.TmpDir + "/" + cDir err := os.Mkdir(pDir, 0777) if err != nil { t.Fatal(err) @@ -83,38 +86,31 @@ func TestExampleFSv07(t *testing.T) { opensslOpt) checkExampleFS(t, pDir, true) test_helpers.Unmount(pDir) - err = os.Remove(pDir) - if err != nil { - t.Error(err) - } } // gocryptfs v0.7 filesystem created with "-plaintextnames" func TestExampleFSv07PlaintextNames(t *testing.T) { cDir := "v0.7-plaintextnames" - pDir := test_helpers.TmpDir + cDir + ".mnt" + pDir := test_helpers.TmpDir + "/" + cDir + ".mnt" test_helpers.MountOrFatal(t, cDir, pDir, "-extpass", "echo test", opensslOpt) checkExampleFS(t, pDir, true) test_helpers.Unmount(pDir) - + // The actual unmount takes some time, this causes weird problems. Just don't + // reuse the mountpoint. + pDir = pDir + ".2" test_helpers.MountOrFatal(t, cDir, pDir, "-plaintextnames", "-masterkey", "6d96397b-585631e1-c7cba69d-61e738b6-4d5ad2c2-e21f0fb3-52f60d3a-b08526f7", opensslOpt) checkExampleFS(t, pDir, true) test_helpers.Unmount(pDir) - - err := os.Remove(pDir) - if err != nil { - t.Error(err) - } } // Test example_filesystems/v0.9 // (gocryptfs v0.9 introduced long file name support) func TestExampleFSv09(t *testing.T) { cDir := "v0.9" - pDir := test_helpers.TmpDir + "TestExampleFsV09/" + pDir := test_helpers.TmpDir + "/" + cDir err := os.Mkdir(pDir, 0777) if err != nil { t.Fatal(err) @@ -122,13 +118,10 @@ func TestExampleFSv09(t *testing.T) { test_helpers.MountOrFatal(t, cDir, pDir, "-extpass", "echo test", opensslOpt) checkExampleFSLongnames(t, pDir) test_helpers.Unmount(pDir) + pDir = pDir + ".2" test_helpers.MountOrFatal(t, cDir, pDir, "-masterkey", "1cafe3f4-bc316466-2214c47c-ecd89bf3-4e078fe4-f5faeea7-8b7cab02-884f5e1c", opensslOpt) checkExampleFSLongnames(t, pDir) test_helpers.Unmount(pDir) - err = os.Remove(pDir) - if err != nil { - t.Error(err) - } } diff --git a/tests/integration_tests/main_test.go b/tests/matrix/matrix_test.go index 17f9d9d..eb49d59 100644 --- a/tests/integration_tests/main_test.go +++ b/tests/matrix/matrix_test.go @@ -1,6 +1,14 @@ -package integration_tests +package matrix // File reading, writing, modification, truncate +// +// Runs everything four times, for all combinations of +// "-plaintextnames" and "-openssl". +// +// Test Matrix: +// openssl=true openssl=false +// plaintextnames=false X X +// plaintextnames=true X X import ( "bytes" @@ -18,61 +26,38 @@ import ( "github.com/rfjakob/gocryptfs/tests/test_helpers" ) -var plaintextNames bool +// Several tests need to be aware if plaintextnames is active or not, so make this +// a global variable +var plaintextnames bool // This is the entry point for the tests func TestMain(m *testing.M) { - var defaultonly bool - flag.BoolVar(&defaultonly, "defaultonly", false, "Only test default configuration (openssl=true, plaintextnames=false)") + // Make "testing.Verbose()" return the correct value flag.Parse() + for _, openssl := range []bool{true, false} { + for _, plaintextnames = range []bool{true, false} { + if testing.Verbose() { + fmt.Printf("Testing openssl=%v plaintextnames=%v\n", openssl, plaintextnames) - if testing.Verbose() { - fmt.Println("***** Testing with OpenSSL") - } - test_helpers.ResetTmpDir(false) // <- this also create gocryptfs.diriv - test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, "--zerokey") - r := m.Run() - test_helpers.Unmount(test_helpers.DefaultPlainDir) - - if r != 0 { - os.Exit(r) - } - - if defaultonly { - os.Exit(r) - } - - if testing.Verbose() { - fmt.Println("***** Testing with native Go crypto") - } - test_helpers.ResetTmpDir(false) - test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, "--zerokey", "--openssl=false") - r = m.Run() - test_helpers.Unmount(test_helpers.DefaultPlainDir) - - if r != 0 { - os.Exit(r) - } - - if testing.Verbose() { - fmt.Println("***** Testing \"--plaintextnames\"") - } - test_helpers.ResetTmpDir(true) // do not create gocryptfs.diriv - test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, "--zerokey", "--plaintextnames") - plaintextNames = true - r = m.Run() - test_helpers.Unmount(test_helpers.DefaultPlainDir) - - if r != 0 { - os.Exit(r) + } + test_helpers.ResetTmpDir(plaintextnames) + opts := []string{"--zerokey"} + opts = append(opts, fmt.Sprintf("-openssl=%v", openssl)) + opts = append(opts, fmt.Sprintf("-plaintextnames=%v", plaintextnames)) + test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, opts...) + r := m.Run() + test_helpers.Unmount(test_helpers.DefaultPlainDir) + if r != 0 { + os.Exit(r) + } + } } - - os.Exit(r) + os.Exit(0) } // Write "n" zero bytes to filename "fn", read again, compare hash func testWriteN(t *testing.T, fn string, n int) string { - file, err := os.Create(test_helpers.DefaultPlainDir + fn) + file, err := os.Create(test_helpers.DefaultPlainDir + "/" + fn) if err != nil { t.Fatal(err) } @@ -87,12 +72,12 @@ func testWriteN(t *testing.T, fn string, n int) string { t.Error(err) } - test_helpers.VerifySize(t, test_helpers.DefaultPlainDir+fn, n) + test_helpers.VerifySize(t, test_helpers.DefaultPlainDir+"/"+fn, n) bin := md5.Sum(d) hashWant := hex.EncodeToString(bin[:]) - hashActual := test_helpers.Md5fn(test_helpers.DefaultPlainDir + fn) + hashActual := test_helpers.Md5fn(test_helpers.DefaultPlainDir + "/" + fn) if hashActual != hashWant { t.Errorf("Wrong content, hashWant=%s hashActual=%s", hashWant, hashActual) @@ -113,14 +98,14 @@ func TestWrite1M(t *testing.T) { testWriteN(t, "1M", 1024*1024) } -func TestWrite1Mx100(t *testing.T) { - hashWant := testWriteN(t, "1Mx100", 1024*1024) +func TestWrite100x100(t *testing.T) { + hashWant := testWriteN(t, "100x100", 100) // Read and check 100 times to catch race conditions var i int for i = 0; i < 100; i++ { - hashActual := test_helpers.Md5fn(test_helpers.DefaultPlainDir + "1M") + hashActual := test_helpers.Md5fn(test_helpers.DefaultPlainDir + "/100") if hashActual != hashWant { - fmt.Printf("Read corruption in loop # %d\n", i) + fmt.Printf("Read corruption in loop #%d\n", i) t.FailNow() } else { //fmt.Print(".") @@ -129,7 +114,7 @@ func TestWrite1Mx100(t *testing.T) { } func TestTruncate(t *testing.T) { - fn := test_helpers.DefaultPlainDir + "truncate" + fn := test_helpers.DefaultPlainDir + "/truncate" file, err := os.Create(fn) if err != nil { t.FailNow() @@ -161,7 +146,7 @@ func TestTruncate(t *testing.T) { } func TestAppend(t *testing.T) { - fn := test_helpers.DefaultPlainDir + "append" + fn := test_helpers.DefaultPlainDir + "/append" file, err := os.Create(fn) if err != nil { t.FailNow() @@ -195,7 +180,7 @@ func TestAppend(t *testing.T) { // Create a file with holes by writing to offset 0 (block #0) and // offset 4096 (block #1). func TestFileHoles(t *testing.T) { - fn := test_helpers.DefaultPlainDir + "fileholes" + fn := test_helpers.DefaultPlainDir + "/fileholes" file, err := os.Create(fn) if err != nil { t.Errorf("file create failed") @@ -223,7 +208,7 @@ func TestRmwRace(t *testing.T) { runtime.GOMAXPROCS(10) - fn := test_helpers.DefaultPlainDir + "rmwrace" + fn := test_helpers.DefaultPlainDir + "/rmwrace" f1, err := os.Create(fn) if err != nil { t.Fatalf("file create failed") @@ -286,42 +271,38 @@ func TestRmwRace(t *testing.T) { } */ } - if testing.Verbose() { - fmt.Println(goodMd5) - } } // With "--plaintextnames", the name "/gocryptfs.conf" is reserved. // Otherwise there should be no restrictions. func TestFiltered(t *testing.T) { - filteredFile := test_helpers.DefaultPlainDir + "gocryptfs.conf" + filteredFile := test_helpers.DefaultPlainDir + "/gocryptfs.conf" file, err := os.Create(filteredFile) - if plaintextNames == true && err == nil { + if plaintextnames == true && err == nil { t.Errorf("should have failed but didn't") - } else if plaintextNames == false && err != nil { + } else if plaintextnames == false && err != nil { t.Error(err) } file.Close() err = os.Remove(filteredFile) - if plaintextNames == true && err == nil { + if plaintextnames == true && err == nil { t.Errorf("should have failed but didn't") - } else if plaintextNames == false && err != nil { + } else if plaintextnames == false && err != nil { t.Error(err) } } func TestFilenameEncryption(t *testing.T) { - file, err := os.Create(test_helpers.DefaultPlainDir + "TestFilenameEncryption.txt") + file, err := os.Create(test_helpers.DefaultPlainDir + "/TestFilenameEncryption.txt") file.Close() if err != nil { t.Fatal(err) } - - _, err = os.Stat(test_helpers.DefaultCipherDir + "TestFilenameEncryption.txt") - if plaintextNames == true && err != nil { + _, err = os.Stat(test_helpers.DefaultCipherDir + "/TestFilenameEncryption.txt") + if plaintextnames == true && err != nil { t.Errorf("plaintextnames not working: %v", err) - } else if plaintextNames == false && err == nil { + } else if plaintextnames == false && err == nil { t.Errorf("file name encryption not working") } } @@ -338,8 +319,8 @@ func testRename(t *testing.T) { // Overwrite an empty directory with another directory func TestDirOverwrite(t *testing.T) { - dir1 := test_helpers.DefaultPlainDir + "DirOverwrite1" - dir2 := test_helpers.DefaultPlainDir + "DirOverwrite2" + dir1 := test_helpers.DefaultPlainDir + "/DirOverwrite1" + dir2 := test_helpers.DefaultPlainDir + "/DirOverwrite2" err := os.Mkdir(dir1, 0777) if err != nil { t.Fatal(err) @@ -360,7 +341,7 @@ func TestLongNames(t *testing.T) { t.Fatal(err) } cnt1 := len(fi) - wd := test_helpers.DefaultPlainDir + wd := test_helpers.DefaultPlainDir + "/" // Create file with long name n255x := string(bytes.Repeat([]byte("x"), 255)) f, err := os.Create(wd + n255x) @@ -439,7 +420,7 @@ func TestLongNames(t *testing.T) { } func TestLchown(t *testing.T) { - name := test_helpers.DefaultPlainDir + "symlink" + name := test_helpers.DefaultPlainDir + "/symlink" err := os.Symlink("/target/does/not/exist", name) if err != nil { t.Fatal(err) diff --git a/tests/integration_tests/cli_test.go b/tests/normal/cli_test.go index 679a5c1..4c634f2 100644 --- a/tests/integration_tests/cli_test.go +++ b/tests/normal/cli_test.go @@ -1,4 +1,4 @@ -package integration_tests +package normal // Test CLI operations like "-init", "-password" etc @@ -13,6 +13,14 @@ import ( "github.com/rfjakob/gocryptfs/tests/test_helpers" ) +func TestMain(m *testing.M) { + test_helpers.ResetTmpDir(false) + test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, "--zerokey") + r := m.Run() + test_helpers.Unmount(test_helpers.DefaultPlainDir) + os.Exit(r) +} + // Test -init flag func TestInit(t *testing.T) { dir := test_helpers.InitFS(t) @@ -59,7 +67,7 @@ func TestPasswd(t *testing.T) { // Test -init & -config flag func TestInitConfig(t *testing.T) { - config := test_helpers.TmpDir + "TestInitConfig.conf" + config := test_helpers.TmpDir + "/TestInitConfig.conf" dir := test_helpers.InitFS(t, "-config="+config) _, err := os.Stat(config) diff --git a/tests/integration_tests/performance_test.go b/tests/normal/performance_test.go index 67f0b28..78ecf41 100644 --- a/tests/integration_tests/performance_test.go +++ b/tests/normal/performance_test.go @@ -1,4 +1,4 @@ -package integration_tests +package normal // Benchmarks diff --git a/tests/plaintextnames/plaintextnames_test.go b/tests/plaintextnames/plaintextnames_test.go index 7e7db7c..6c6d272 100644 --- a/tests/plaintextnames/plaintextnames_test.go +++ b/tests/plaintextnames/plaintextnames_test.go @@ -20,7 +20,9 @@ func TestMain(m *testing.M) { cDir = test_helpers.InitFS(nil, "-plaintextnames") pDir = cDir + ".mnt" test_helpers.MountOrExit(cDir, pDir, "-extpass", "echo test") - os.Exit(m.Run()) + r := m.Run() + test_helpers.Unmount(pDir) + os.Exit(r) } // Only the PlaintextNames feature flag should be set diff --git a/tests/test_helpers/helpers.go b/tests/test_helpers/helpers.go index 88ef039..a6c2b7d 100644 --- a/tests/test_helpers/helpers.go +++ b/tests/test_helpers/helpers.go @@ -10,17 +10,31 @@ import ( "path/filepath" "syscall" "testing" + "time" "github.com/rfjakob/gocryptfs/internal/nametransform" ) -// Note: the code assumes that all have a trailing slash -const TmpDir = "/tmp/gocryptfs_main_test/" -const DefaultPlainDir = TmpDir + "plain/" -const DefaultCipherDir = TmpDir + "cipher/" - +const testParentDir = "/tmp/gocryptfs-test-parent" const GocryptfsBinary = "../../gocryptfs" +// "go test" runs package tests in parallel! We must create a unique TmpDir on +// startup or the tests will interfere horribly +var TmpDir string +var DefaultPlainDir string +var DefaultCipherDir string + +func init() { + os.MkdirAll(testParentDir, 0700) + var err error + TmpDir, err = ioutil.TempDir(testParentDir, "") + if err != nil { + panic(err) + } + DefaultPlainDir = TmpDir + "/default-plain" + DefaultCipherDir = TmpDir + "/default-cipher" +} + // ResetTmpDir - delete TmpDir, create new dir tree: // // TmpDir @@ -28,38 +42,31 @@ const GocryptfsBinary = "../../gocryptfs" // *-- DefaultCipherDir // *-- gocryptfs.diriv func ResetTmpDir(plaintextNames bool) { - - // Try to unmount everything + // Try to unmount and delete everything entries, err := ioutil.ReadDir(TmpDir) if err == nil { for _, e := range entries { - fu := exec.Command("fusermount", "-z", "-u", filepath.Join(TmpDir, e.Name())) - fu.Run() + d := filepath.Join(TmpDir, e.Name()) + err = os.Remove(d) + if err != nil { + fu := exec.Command("fusermount", "-z", "-u", d) + fu.Run() + os.RemoveAll(d) + } } } - - err = os.RemoveAll(TmpDir) + err = os.Mkdir(DefaultPlainDir, 0700) if err != nil { - fmt.Println("resetTmpDir: RemoveAll:" + err.Error()) - os.Exit(1) + panic(err) } - - err = os.MkdirAll(DefaultPlainDir, 0777) + err = os.Mkdir(DefaultCipherDir, 0700) if err != nil { - fmt.Println(err) - os.Exit(1) - } - - err = os.MkdirAll(DefaultCipherDir, 0777) - if err != nil { - fmt.Println(err) - os.Exit(1) + panic(err) } if !plaintextNames { err = nametransform.WriteDirIV(DefaultCipherDir) if err != nil { - fmt.Println(err) - os.Exit(1) + panic(err) } } } @@ -73,7 +80,6 @@ func InitFS(t *testing.T, extraArgs ...string) string { if err != nil { t.Fatal(err) } - args := []string{"-q", "-init", "-extpass", "echo test", "-scryptn=10"} args = append(args, extraArgs...) args = append(args, dir) @@ -95,7 +101,7 @@ func InitFS(t *testing.T, extraArgs ...string) string { func Mount(c string, p string, showOutput bool, extraArgs ...string) error { var args []string args = append(args, extraArgs...) - args = append(args, "-nosyslog", "-q", "-wpanic") + args = append(args, "-q", "-wpanic") //args = append(args, "-fusedebug") //args = append(args, "-d") args = append(args, c) @@ -142,7 +148,9 @@ func Unmount(p string) error { err := fu.Run() if err != nil { fmt.Println(err) + panic(err) } + time.Sleep(10 * time.Millisecond) return err } @@ -184,7 +192,7 @@ func VerifySize(t *testing.T, path string, want int) { // Create and delete a directory func TestMkdirRmdir(t *testing.T, plainDir string) { - dir := plainDir + "dir1" + dir := plainDir + "/dir1" err := os.Mkdir(dir, 0777) if err != nil { t.Fatal(err) @@ -231,8 +239,8 @@ func TestMkdirRmdir(t *testing.T, plainDir string) { // Create and rename a file func TestRename(t *testing.T, plainDir string) { - file1 := plainDir + "rename1" - file2 := plainDir + "rename2" + file1 := plainDir + "/rename1" + file2 := plainDir + "/rename2" err := ioutil.WriteFile(file1, []byte("content"), 0777) if err != nil { t.Fatal(err) @@ -247,14 +255,12 @@ func TestRename(t *testing.T, plainDir string) { // verifyExistence - check in 3 ways that "path" exists: // stat, open, readdir func VerifyExistence(path string) bool { - // Check that file can be stated _, err := os.Stat(path) if err != nil { //t.Log(err) return false } - // Check that file can be opened fd, err := os.Open(path) if err != nil { @@ -262,7 +268,6 @@ func VerifyExistence(path string) bool { return false } fd.Close() - // Check that file shows up in directory listing dir := filepath.Dir(path) name := filepath.Base(path) |