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:
parent
4e5783591f
commit
22031d7e53
|
@ -72,7 +72,15 @@ func TestMain(m *testing.M) {
|
||||||
opts = append(opts, fmt.Sprintf("-aessiv=%v", testcase.aessiv))
|
opts = append(opts, fmt.Sprintf("-aessiv=%v", testcase.aessiv))
|
||||||
opts = append(opts, fmt.Sprintf("-raw64=%v", testcase.raw64))
|
opts = append(opts, fmt.Sprintf("-raw64=%v", testcase.raw64))
|
||||||
test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, opts...)
|
test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, opts...)
|
||||||
|
before := test_helpers.ListFds()
|
||||||
r := m.Run()
|
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)
|
test_helpers.UnmountPanic(test_helpers.DefaultPlainDir)
|
||||||
if r != 0 {
|
if r != 0 {
|
||||||
os.Exit(r)
|
os.Exit(r)
|
||||||
|
|
|
@ -178,9 +178,14 @@ func Mount(c string, p string, showOutput bool, extraArgs ...string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// We can close the fd after cmd.Run() has executed
|
||||||
|
defer pw.Close()
|
||||||
cmd.Stderr = pw
|
cmd.Stderr = pw
|
||||||
cmd.Stdout = pw
|
cmd.Stdout = pw
|
||||||
go func() { io.Copy(os.Stdout, pr) }()
|
go func() {
|
||||||
|
io.Copy(os.Stdout, pr)
|
||||||
|
pr.Close()
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
return cmd.Run()
|
return cmd.Run()
|
||||||
|
@ -412,3 +417,23 @@ func ExtractCmdExitCode(err error) int {
|
||||||
code := err2.Sys().(syscall.WaitStatus).ExitStatus()
|
code := err2.Sys().(syscall.WaitStatus).ExitStatus()
|
||||||
return code
|
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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue