@@ -8,13 +8,15 @@ import (
8
8
"fmt"
9
9
"internal/testenv"
10
10
"io/ioutil"
11
+ "net"
11
12
"os"
12
13
"os/exec"
13
14
"path/filepath"
14
15
"runtime"
15
16
"strings"
16
17
"syscall"
17
18
"testing"
19
+ "time"
18
20
)
19
21
20
22
func TestVectoredHandlerDontCrashOnLibrary (t * testing.T ) {
@@ -80,6 +82,70 @@ func sendCtrlBreak(pid int) error {
80
82
return nil
81
83
}
82
84
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
+
83
149
// TestLibraryCtrlHandler tests that Go DLL allows calling program to handle console control events.
84
150
// See https://golang.org/issues/35965.
85
151
func TestLibraryCtrlHandler (t * testing.T ) {
0 commit comments