runtime: don't invoke t.Fatal* in goroutine in TestLibraryCtrlHandler

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>
This commit is contained in:
Emmanuel T Odeke 2020-02-29 02:32:21 -08:00 committed by Emmanuel Odeke
parent 33e98326a2
commit c1abd5ab70

View file

@ -5,6 +5,7 @@ package runtime_test
import ( import (
"bufio" "bufio"
"bytes" "bytes"
"fmt"
"internal/testenv" "internal/testenv"
"io/ioutil" "io/ioutil"
"os" "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") kernel32, err := syscall.LoadDLL("kernel32.dll")
if err != nil { if err != nil {
t.Fatalf("LoadDLL: %v\n", err) return fmt.Errorf("LoadDLL: %v\n", err)
} }
generateEvent, err := kernel32.FindProc("GenerateConsoleCtrlEvent") generateEvent, err := kernel32.FindProc("GenerateConsoleCtrlEvent")
if err != nil { 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)) result, _, err := generateEvent.Call(syscall.CTRL_BREAK_EVENT, uintptr(pid))
if result == 0 { 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. // 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) t.Fatalf("Start failed: %v", err)
} }
sentCtrl := make(chan bool) errCh := make(chan error, 1)
go func() { go func() {
defer close(sentCtrl)
if line, err := outReader.ReadString('\n'); err != nil { 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" { } 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 { if err := cmd.Wait(); err != nil {
t.Fatalf("Program exited with error: %v\n%s", err, &stderr) t.Fatalf("Program exited with error: %v\n%s", err, &stderr)
} }