1
0
mirror of https://github.com/golang/go synced 2024-11-18 13:54:59 -07:00

os: don't use waitid on Darwin

According to issue #19314 waitid on Darwin returns if the process is
stopped, even though we specify WEXITED.

Fixes #19314.

Change-Id: I95faf196c11e43b7741efff79351bab45c811bc2
Reviewed-on: https://go-review.googlesource.com/37610
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Ian Lance Taylor 2017-02-28 15:01:38 -08:00
parent d945b28675
commit 15442178c8
4 changed files with 46 additions and 2 deletions

View File

@ -11,6 +11,7 @@ import (
"strconv"
"syscall"
"testing"
"time"
)
func TestCredentialNoSetGroups(t *testing.T) {
@ -43,3 +44,40 @@ func TestCredentialNoSetGroups(t *testing.T) {
t.Errorf("Failed to run command: %v", err)
}
}
// For issue #19314: make sure that SIGSTOP does not cause the process
// to appear done.
func TestWaitid(t *testing.T) {
t.Parallel()
cmd := helperCommand(t, "sleep")
if err := cmd.Start(); err != nil {
t.Fatal(err)
}
// The sleeps here are unnecessary in the sense that the test
// should still pass, but they are useful to make it more
// likely that we are testing the expected state of the child.
time.Sleep(100 * time.Millisecond)
if err := cmd.Process.Signal(syscall.SIGSTOP); err != nil {
cmd.Process.Kill()
t.Fatal(err)
}
ch := make(chan error)
go func() {
ch <- cmd.Wait()
}()
time.Sleep(100 * time.Millisecond)
if err := cmd.Process.Signal(syscall.SIGCONT); err != nil {
t.Error(err)
syscall.Kill(cmd.Process.Pid, syscall.SIGCONT)
}
cmd.Process.Kill()
<-ch
}

View File

@ -868,6 +868,9 @@ func TestHelperProcess(*testing.T) {
case "stderrfail":
fmt.Fprintf(os.Stderr, "some stderr text\n")
os.Exit(1)
case "sleep":
time.Sleep(3 * time.Second)
os.Exit(0)
default:
fmt.Fprintf(os.Stderr, "Unknown command %q\n", cmd)
os.Exit(2)

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build dragonfly nacl netbsd openbsd solaris
// +build darwin dragonfly nacl netbsd openbsd solaris
package os

View File

@ -2,7 +2,10 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build darwin linux
// We used to used this code for Darwin, but according to issue #19314
// waitid returns if the process is stopped, even when using WEXITED.
// +build linux
package os