diff options
author | Jakob Unterwurzacher | 2019-10-06 19:04:16 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2019-10-06 19:37:51 +0200 |
commit | 1fb18f4a9ef2bbbc6e7c774fa064808a3952bb3f (patch) | |
tree | 5e27aa2b53c1af53e280dea269cf0039f499f888 /tests | |
parent | d361f6e35bb97ef8f060131ea5b29f922e613c49 (diff) |
tests: filter leaked fds by prefix
When running
$ go test ./tests/matrix/
in isolation, it failed like this:
fd leak? before, after:
[0r=/dev/null 3w=/dev/null 5r=/proc/8078/fd (hidden:4)]
[0r=/dev/null 3w=/dev/null 5w=/tmp/go-build366655199/b001/testlog.txt 7r=/proc/8078/fd (hidden:4)]
Filter by prefix to get rid of this spurious test failure.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/cli/cli_test.go | 4 | ||||
-rw-r--r-- | tests/matrix/matrix_test.go | 6 | ||||
-rw-r--r-- | tests/test_helpers/mount_unmount.go | 20 |
3 files changed, 18 insertions, 12 deletions
diff --git a/tests/cli/cli_test.go b/tests/cli/cli_test.go index d0ac5d8..423afdf 100644 --- a/tests/cli/cli_test.go +++ b/tests/cli/cli_test.go @@ -22,9 +22,9 @@ var testPw = []byte("test") func TestMain(m *testing.M) { test_helpers.ResetTmpDir(false) - before := test_helpers.ListFds(0) + before := test_helpers.ListFds(0, "") r := m.Run() - after := test_helpers.ListFds(0) + after := test_helpers.ListFds(0, "") if len(before) != len(after) { fmt.Printf("fd leak in test process? before, after:\n%v\n%v\n", before, after) os.Exit(1) diff --git a/tests/matrix/matrix_test.go b/tests/matrix/matrix_test.go index e4424a7..af4769a 100644 --- a/tests/matrix/matrix_test.go +++ b/tests/matrix/matrix_test.go @@ -77,11 +77,13 @@ func TestMain(m *testing.M) { opts = append(opts, fmt.Sprintf("-raw64=%v", testcase.raw64)) opts = append(opts, testcase.extraArgs...) test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, opts...) - before := test_helpers.ListFds(0) + before := test_helpers.ListFds(0, test_helpers.TmpDir) r := m.Run() // Catch fd leaks in the tests. NOTE: this does NOT catch leaks in // the gocryptfs FUSE process, but only in the tests that access it! - after := test_helpers.ListFds(0) + // All fds that point outside TmpDir are not interesting (the Go test + // infrastucture creates temporary log files we don't care about). + after := test_helpers.ListFds(0, test_helpers.TmpDir) if len(before) != len(after) { fmt.Printf("fd leak in test process? before, after:\n%v\n%v\n", before, after) os.Exit(1) diff --git a/tests/test_helpers/mount_unmount.go b/tests/test_helpers/mount_unmount.go index 453ea20..7b5dafa 100644 --- a/tests/test_helpers/mount_unmount.go +++ b/tests/test_helpers/mount_unmount.go @@ -91,7 +91,7 @@ func Mount(c string, p string, showOutput bool, extraArgs ...string) error { } // Save PID and open FDs - MountInfo[p] = mountInfo{pid, ListFds(pid)} + MountInfo[p] = mountInfo{pid, ListFds(pid, "")} return nil } @@ -160,13 +160,13 @@ func UnmountErr(dir string) (err error) { // when testing "-ctlsock" is as well. Wait a little and // hope that all close commands get through to the gocryptfs // process. - fdsNow = ListFds(pid) + fdsNow = ListFds(pid, "") if len(fdsNow) <= len(fds)+maxCacheFds { break } fmt.Printf("UnmountErr: fdsOld=%d fdsNow=%d, retrying\n", len(fds), len(fdsNow)) time.Sleep(10 * time.Millisecond) - fdsNow = ListFds(pid) + fdsNow = ListFds(pid, "") } } cmd := exec.Command(UnmountScript, "-u", dir) @@ -187,8 +187,8 @@ func UnmountErr(dir string) (err error) { } // ListFds lists the open file descriptors for process "pid". Pass pid=0 for -// ourselves. -func ListFds(pid int) []string { +// ourselves. Pass a prefix to ignore all paths that do not start with "prefix". +func ListFds(pid int, prefix string) []string { // We need /proc to get the list of fds for other processes. Only exists // on Linux. if runtime.GOOS != "linux" && pid > 0 { @@ -211,7 +211,7 @@ func ListFds(pid int) []string { log.Panic(err) } var out []string - hidden := 0 + var filtered []string for _, n := range names { fdPath := dir + "/" + n fi, err := os.Lstat(fdPath) @@ -235,11 +235,15 @@ func ListFds(pid int) []string { // creates spurious test failures. Ignore all pipes. // Also get rid of the "eventpoll" fd that is always there and not // interesting. - hidden++ + filtered = append(filtered, target) + continue + } + if prefix != "" && !strings.HasPrefix(target, prefix) { + filtered = append(filtered, target) continue } out = append(out, n+"="+target) } - out = append(out, fmt.Sprintf("(hidden:%d)", hidden)) + out = append(out, fmt.Sprintf("(filtered: %s)", strings.Join(filtered, ", "))) return out } |