]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: don't invoke t.Fatal* in goroutine in TestLibraryCtrlHandler
authorEmmanuel T Odeke <emmanuel@orijtech.com>
Sat, 29 Feb 2020 10:32:21 +0000 (02:32 -0800)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Sun, 1 Mar 2020 02:18:27 +0000 (02:18 +0000)
Change-Id: I8bb06c360cab3e5a74b0b0f98bb25cca4741d66d
Reviewed-on: https://go-review.googlesource.com/c/go/+/221605
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/signal_windows_test.go

index 423516df65d311d2c5de07644a7cd25cb85211a9..f99857193c1ad0f54f634c63de4e1d2c81218027 100644 (file)
@@ -5,6 +5,7 @@ package runtime_test
 import (
        "bufio"
        "bytes"
+       "fmt"
        "internal/testenv"
        "io/ioutil"
        "os"
@@ -63,19 +64,20 @@ func TestVectoredHandlerDontCrashOnLibrary(t *testing.T) {
        }
 }
 
-func sendCtrlBreak(t *testing.T, pid int) {
+func sendCtrlBreak(pid int) error {
        kernel32, err := syscall.LoadDLL("kernel32.dll")
        if err != nil {
-               t.Fatalf("LoadDLL: %v\n", err)
+               return fmt.Errorf("LoadDLL: %v\n", err)
        }
        generateEvent, err := kernel32.FindProc("GenerateConsoleCtrlEvent")
        if err != nil {
-               t.Fatalf("FindProc: %v\n", err)
+               return fmt.Errorf("FindProc: %v\n", err)
        }
        result, _, err := generateEvent.Call(syscall.CTRL_BREAK_EVENT, uintptr(pid))
        if result == 0 {
-               t.Fatalf("GenerateConsoleCtrlEvent: %v\n", err)
+               return fmt.Errorf("GenerateConsoleCtrlEvent: %v\n", err)
        }
+       return nil
 }
 
 // TestLibraryCtrlHandler tests that Go DLL allows calling program to handle console control events.
@@ -130,18 +132,20 @@ func TestLibraryCtrlHandler(t *testing.T) {
                t.Fatalf("Start failed: %v", err)
        }
 
-       sentCtrl := make(chan bool)
+       errCh := make(chan error, 1)
        go func() {
-               defer close(sentCtrl)
                if line, err := outReader.ReadString('\n'); err != nil {
-                       t.Fatalf("Could not read stdout: %v", err)
+                       errCh <- fmt.Errorf("could not read stdout: %v", err)
                } else if strings.TrimSpace(line) != "ready" {
-                       t.Fatalf("Unexpected message: %v", line)
+                       errCh <- fmt.Errorf("unexpected message: %v", line)
+               } else {
+                       errCh <- sendCtrlBreak(cmd.Process.Pid)
                }
-               sendCtrlBreak(t, cmd.Process.Pid)
        }()
 
-       <-sentCtrl
+       if err := <-errCh; err != nil {
+               t.Fatal(err)
+       }
        if err := cmd.Wait(); err != nil {
                t.Fatalf("Program exited with error: %v\n%s", err, &stderr)
        }