Skip to content

Commit b6fa877

Browse files
committed
Add test case.
1 parent 4fcde2f commit b6fa877

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

src/runtime/signal_windows_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import (
88
"fmt"
99
"internal/testenv"
1010
"io/ioutil"
11+
"net"
1112
"os"
1213
"os/exec"
1314
"path/filepath"
1415
"runtime"
1516
"strings"
1617
"syscall"
1718
"testing"
19+
"time"
1820
)
1921

2022
func TestVectoredHandlerDontCrashOnLibrary(t *testing.T) {
@@ -80,6 +82,70 @@ func sendCtrlBreak(pid int) error {
8082
return nil
8183
}
8284

85+
func TestCtrlHandler(t *testing.T) {
86+
if *flagQuick {
87+
t.Skip("-quick")
88+
}
89+
testenv.MustHaveGoBuild(t)
90+
testenv.MustHaveExecPath(t, "gcc")
91+
testprog.Lock()
92+
defer testprog.Unlock()
93+
dir, err := ioutil.TempDir("", "go-build")
94+
if err != nil {
95+
t.Fatalf("failed to create temp directory: %v", err)
96+
}
97+
defer os.RemoveAll(dir)
98+
99+
// build go program
100+
exe := filepath.Join(dir, "test.exe")
101+
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, "testdata/testwinsignal/main.go")
102+
out, err := testenv.CleanCmdEnv(cmd).CombinedOutput()
103+
if err != nil {
104+
t.Fatalf("failed to build go exe: %v\n%s", err, out)
105+
}
106+
107+
// udp socket for synchronization
108+
conn, err := net.ListenPacket("udp", "[::1]:0")
109+
if err != nil {
110+
t.Fatalf("ListenPacket failed: %v", err)
111+
}
112+
defer conn.Close()
113+
conn.SetDeadline(time.Now().Add(5 * time.Second))
114+
115+
// run test program
116+
cmd = exec.Command("cmd.exe", "/c", "start", exe, conn.LocalAddr().String())
117+
if err := cmd.Start(); err != nil {
118+
t.Fatalf("Start failed: %v", err)
119+
}
120+
121+
// read pid
122+
var data [512]byte
123+
n, _, err := conn.ReadFrom(data[:])
124+
if err != nil {
125+
t.Fatalf("ReadFrom failed: %v", err)
126+
}
127+
128+
// gracefully kill pid
129+
err = exec.Command("taskkill.exe", "/pid", string(data[:n])).Run()
130+
if err != nil {
131+
t.Fatalf("failed to kill: %v", err)
132+
}
133+
134+
// check received signal
135+
n, _, err = conn.ReadFrom(data[:])
136+
if err != nil {
137+
t.Fatalf("ReadFrom failed: %v", err)
138+
}
139+
expected := syscall.SIGTERM.String()
140+
if n != len(expected) && string(data[:len(expected)]) != expected {
141+
t.Fatalf("Expected '%s' got: %s", expected, data[:n])
142+
}
143+
144+
if err := cmd.Wait(); err != nil {
145+
t.Fatalf("Program exited with error: %v", err)
146+
}
147+
}
148+
83149
// TestLibraryCtrlHandler tests that Go DLL allows calling program to handle console control events.
84150
// See https://golang.org/issues/35965.
85151
func TestLibraryCtrlHandler(t *testing.T) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package main
2+
3+
import (
4+
"net"
5+
"os"
6+
"os/signal"
7+
"strconv"
8+
"time"
9+
)
10+
11+
func main() {
12+
c := make(chan os.Signal, 1)
13+
signal.Notify(c)
14+
15+
con, _ := net.Dial("udp", os.Args[1])
16+
con.Write([]byte(strconv.Itoa(os.Getpid())))
17+
sig := <-c
18+
19+
time.Sleep(time.Second)
20+
con.Write([]byte(sig.String()))
21+
}

0 commit comments

Comments
 (0)