aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJakob Unterwurzacher2019-10-06 19:04:16 +0200
committerJakob Unterwurzacher2019-10-06 19:37:51 +0200
commit1fb18f4a9ef2bbbc6e7c774fa064808a3952bb3f (patch)
tree5e27aa2b53c1af53e280dea269cf0039f499f888 /tests
parentd361f6e35bb97ef8f060131ea5b29f922e613c49 (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.go4
-rw-r--r--tests/matrix/matrix_test.go6
-rw-r--r--tests/test_helpers/mount_unmount.go20
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
}