mirror of
https://github.com/golang/go
synced 2024-11-18 16:34:51 -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:
parent
d945b28675
commit
15442178c8
@ -11,6 +11,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCredentialNoSetGroups(t *testing.T) {
|
func TestCredentialNoSetGroups(t *testing.T) {
|
||||||
@ -43,3 +44,40 @@ func TestCredentialNoSetGroups(t *testing.T) {
|
|||||||
t.Errorf("Failed to run command: %v", err)
|
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
|
||||||
|
}
|
||||||
|
@ -868,6 +868,9 @@ func TestHelperProcess(*testing.T) {
|
|||||||
case "stderrfail":
|
case "stderrfail":
|
||||||
fmt.Fprintf(os.Stderr, "some stderr text\n")
|
fmt.Fprintf(os.Stderr, "some stderr text\n")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
case "sleep":
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
os.Exit(0)
|
||||||
default:
|
default:
|
||||||
fmt.Fprintf(os.Stderr, "Unknown command %q\n", cmd)
|
fmt.Fprintf(os.Stderr, "Unknown command %q\n", cmd)
|
||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build dragonfly nacl netbsd openbsd solaris
|
// +build darwin dragonfly nacl netbsd openbsd solaris
|
||||||
|
|
||||||
package os
|
package os
|
||||||
|
|
||||||
|
@ -2,7 +2,10 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// 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
|
package os
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user