mirror of
https://github.com/golang/go
synced 2024-11-21 17:34:40 -07:00
add test case
This commit is contained in:
parent
35c8f700a7
commit
3204c91d3b
@ -96,3 +96,103 @@ func main() {
|
|||||||
t.Fatalf("Program exited with error: %v\n%v", err, buf.String())
|
t.Fatalf("Program exited with error: %v\n%v", err, buf.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCtrlBreakForCustomizedSignal(t *testing.T) {
|
||||||
|
// Create source file.
|
||||||
|
const source = `
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const SIGINT = Signal(0x2)
|
||||||
|
|
||||||
|
// Signal is copied from x/sys.
|
||||||
|
type Signal int
|
||||||
|
|
||||||
|
func (s Signal) Signal() {}
|
||||||
|
|
||||||
|
func (s Signal) String() string {
|
||||||
|
if 0 <= s && int(s) < len(signals) {
|
||||||
|
str := signals[s]
|
||||||
|
if str != "" {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "signal " + itoa(int(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
var signals = [...]string{
|
||||||
|
1: "hangup",
|
||||||
|
2: "interrupt",
|
||||||
|
3: "quit",
|
||||||
|
4: "illegal instruction",
|
||||||
|
5: "trace/breakpoint trap",
|
||||||
|
6: "aborted",
|
||||||
|
7: "bus error",
|
||||||
|
8: "floating point exception",
|
||||||
|
9: "killed",
|
||||||
|
10: "user defined signal 1",
|
||||||
|
11: "segmentation fault",
|
||||||
|
12: "user defined signal 2",
|
||||||
|
13: "broken pipe",
|
||||||
|
14: "alarm clock",
|
||||||
|
15: "terminated",
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
c := make(chan os.Signal, 10)
|
||||||
|
signal.Notify(c, SIGINT)
|
||||||
|
select {
|
||||||
|
case s := <-c:
|
||||||
|
if s != os.Interrupt {
|
||||||
|
log.Fatalf("Wrong signal received: got %q, want %q\n", s, os.Interrupt)
|
||||||
|
}
|
||||||
|
case <-time.After(3 * time.Second):
|
||||||
|
log.Fatalf("Timeout waiting for Ctrl+Break\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
tmp := t.TempDir()
|
||||||
|
|
||||||
|
// Write ctrlbreak.go.
|
||||||
|
name := filepath.Join(tmp, "ctlbreak_customized_signal")
|
||||||
|
src := name + ".go"
|
||||||
|
f, err := os.Create(src)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create %v: %v", src, err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
f.Write([]byte(source))
|
||||||
|
|
||||||
|
// Compile it.
|
||||||
|
exe := name + ".exe"
|
||||||
|
defer os.Remove(exe)
|
||||||
|
o, err := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", exe, src).CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to compile: %v\n%v", err, string(o))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run it.
|
||||||
|
cmd := testenv.Command(t, exe)
|
||||||
|
var buf strings.Builder
|
||||||
|
cmd.Stdout = &buf
|
||||||
|
cmd.Stderr = &buf
|
||||||
|
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||||
|
CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
|
||||||
|
}
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
t.Fatalf("Start failed: %v", err)
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
sendCtrlBreak(t, cmd.Process.Pid)
|
||||||
|
}()
|
||||||
|
if err := cmd.Wait(); err != nil {
|
||||||
|
t.Fatalf("Program exited with error: %v\n%v", err, buf.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user