tests: matrix: check for fd leaks

And fix two in test_helpers.Mount().

Leftover fds can cause an unmount failure like this later:
fusermount: failed to unmount /tmp/gocryptfs-test-parent/873632270/default-plain: Device or resource busy
so try to catch them early.
This commit is contained in:
Jakob Unterwurzacher 2018-04-07 15:21:05 +02:00
parent 4e5783591f
commit 22031d7e53
2 changed files with 34 additions and 1 deletions

View File

@ -72,7 +72,15 @@ func TestMain(m *testing.M) {
opts = append(opts, fmt.Sprintf("-aessiv=%v", testcase.aessiv))
opts = append(opts, fmt.Sprintf("-raw64=%v", testcase.raw64))
test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, opts...)
before := test_helpers.ListFds()
r := m.Run()
after := test_helpers.ListFds()
if len(before) != len(after) {
fmt.Printf("fd leak? before, after:\n")
fmt.Printf("%v\n", before)
fmt.Printf("%v\n", after)
os.Exit(1)
}
test_helpers.UnmountPanic(test_helpers.DefaultPlainDir)
if r != 0 {
os.Exit(r)

View File

@ -178,9 +178,14 @@ func Mount(c string, p string, showOutput bool, extraArgs ...string) error {
if err != nil {
return err
}
// We can close the fd after cmd.Run() has executed
defer pw.Close()
cmd.Stderr = pw
cmd.Stdout = pw
go func() { io.Copy(os.Stdout, pr) }()
go func() {
io.Copy(os.Stdout, pr)
pr.Close()
}()
}
return cmd.Run()
@ -412,3 +417,23 @@ func ExtractCmdExitCode(err error) int {
code := err2.Sys().(syscall.WaitStatus).ExitStatus()
return code
}
// ListFds lists our open file descriptors.
// We use /dev/fd because it exists on both Linux and MacOS.
func ListFds() []string {
f, err := os.Open("/dev/fd")
if err != nil {
log.Panic(err)
}
defer f.Close()
names, err := f.Readdirnames(0)
if err != nil {
log.Panic(err)
}
for i, n := range names {
// Note: Readdirnames filters "." and ".."
target, _ := os.Readlink("/dev/fd/" + n)
names[i] = n + "=" + target
}
return names
}