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("-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)
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user