]> Cypherpunks repositories - gostls13.git/commitdiff
os/signal: run windows TestCtrlBreak during build
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 2 May 2012 07:05:52 +0000 (17:05 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 2 May 2012 07:05:52 +0000 (17:05 +1000)
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6136054

src/pkg/os/signal/signal_windows_test.go
src/pkg/syscall/exec_windows.go
src/pkg/syscall/ztypes_windows.go

index 8d807ff7b18d87160a6645228f5a8c8ac7c12e5a..26712f35b08bbc8b9f18f32d18006d883b44f6d1 100644 (file)
@@ -5,16 +5,16 @@
 package signal
 
 import (
-       "flag"
+       "bytes"
        "os"
+       "os/exec"
+       "path/filepath"
        "syscall"
        "testing"
        "time"
 )
 
-var runCtrlBreakTest = flag.Bool("run_ctlbrk_test", false, "force to run Ctrl+Break test")
-
-func sendCtrlBreak(t *testing.T) {
+func sendCtrlBreak(t *testing.T, pid int) {
        d, e := syscall.LoadDLL("kernel32.dll")
        if e != nil {
                t.Fatalf("LoadDLL: %v\n", e)
@@ -23,29 +23,74 @@ func sendCtrlBreak(t *testing.T) {
        if e != nil {
                t.Fatalf("FindProc: %v\n", e)
        }
-       r, _, e := p.Call(0, 0)
+       r, _, e := p.Call(syscall.CTRL_BREAK_EVENT, uintptr(pid))
        if r == 0 {
                t.Fatalf("GenerateConsoleCtrlEvent: %v\n", e)
        }
 }
 
 func TestCtrlBreak(t *testing.T) {
-       if !*runCtrlBreakTest {
-               t.Logf("test disabled; use -run_ctlbrk_test to enable")
-               return
-       }
-       go func() {
-               time.Sleep(1 * time.Second)
-               sendCtrlBreak(t)
-       }()
+       // create source file
+       const source = `
+package main
+
+import (
+       "log"
+       "os"
+       "os/signal"
+       "time"
+)
+
+
+func main() {
        c := make(chan os.Signal, 10)
-       Notify(c)
+       signal.Notify(c)
        select {
        case s := <-c:
                if s != os.Interrupt {
-                       t.Fatalf("Wrong signal received: got %q, want %q\n", s, os.Interrupt)
+                       log.Fatalf("Wrong signal received: got %q, want %q\n", s, os.Interrupt)
                }
        case <-time.After(3 * time.Second):
-               t.Fatalf("Timeout waiting for Ctrl+Break\n")
+               log.Fatalf("Timeout waiting for Ctrl+Break\n")
+       }
+}
+`
+       name := filepath.Join(os.TempDir(), "ctlbreak")
+       src := name + ".go"
+       defer os.Remove(src)
+       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 := exec.Command("go", "build", "-o", exe, src).CombinedOutput()
+       if err != nil {
+               t.Fatalf("Failed to compile: %v\n%v", err, string(o))
+       }
+
+       // run it
+       cmd := exec.Command(exe)
+       var b bytes.Buffer
+       cmd.Stdout = &b
+       cmd.Stderr = &b
+       cmd.SysProcAttr = &syscall.SysProcAttr{
+               CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
+       }
+       err = cmd.Start()
+       if err != nil {
+               t.Fatalf("Start failed: %v", err)
+       }
+       go func() {
+               time.Sleep(1 * time.Second)
+               sendCtrlBreak(t, cmd.Process.Pid)
+       }()
+       err = cmd.Wait()
+       if err != nil {
+               t.Fatalf("Program exited with error: %v\n%v", err, string(b.Bytes()))
        }
 }
index 4dc4d059d7e307bf16e376b5e22651fdeaff9045..9f1f1740343676ed6c0afcee35c8562b9fa90050 100644 (file)
@@ -225,8 +225,9 @@ type ProcAttr struct {
 }
 
 type SysProcAttr struct {
-       HideWindow bool
-       CmdLine    string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
+       HideWindow    bool
+       CmdLine       string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
+       CreationFlags uint32
 }
 
 var zeroProcAttr ProcAttr
@@ -313,7 +314,8 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle
 
        pi := new(ProcessInformation)
 
-       err = CreateProcess(argv0p, argvp, nil, nil, true, CREATE_UNICODE_ENVIRONMENT, createEnvBlock(attr.Env), dirp, si, pi)
+       flags := sys.CreationFlags | CREATE_UNICODE_ENVIRONMENT
+       err = CreateProcess(argv0p, argvp, nil, nil, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
        if err != nil {
                return 0, 0, err
        }
index 54168bb98a37577a53a151d7ddb72c0fb0a47b6d..125d9b16f548250c73935226d2b9dbf0fb056d5e 100644 (file)
@@ -146,6 +146,7 @@ const (
        WAIT_OBJECT_0  = 0x00000000
        WAIT_FAILED    = 0xFFFFFFFF
 
+       CREATE_NEW_PROCESS_GROUP   = 0x00000200
        CREATE_UNICODE_ENVIRONMENT = 0x00000400
 
        PROCESS_QUERY_INFORMATION = 0x00000400
@@ -162,6 +163,9 @@ const (
        FILE_MAP_WRITE   = 0x02
        FILE_MAP_READ    = 0x04
        FILE_MAP_EXECUTE = 0x20
+
+       CTRL_C_EVENT     = 0
+       CTRL_BREAK_EVENT = 1
 )
 
 const (