Source file
src/runtime/ehooks_test.go
1
2
3
4
5 package runtime_test
6
7 import (
8 "internal/platform"
9 "internal/testenv"
10 "os/exec"
11 "runtime"
12 "strings"
13 "testing"
14 )
15
16 func TestExitHooks(t *testing.T) {
17 bmodes := []string{""}
18 if testing.Short() {
19 t.Skip("skipping due to -short")
20 }
21
22
23 haverace := platform.RaceDetectorSupported(runtime.GOOS, runtime.GOARCH)
24 if haverace && testenv.HasCGO() {
25 bmodes = append(bmodes, "-race")
26 }
27 for _, bmode := range bmodes {
28 scenarios := []struct {
29 mode string
30 expected string
31 musthave []string
32 }{
33 {
34 mode: "simple",
35 expected: "bar foo",
36 },
37 {
38 mode: "goodexit",
39 expected: "orange apple",
40 },
41 {
42 mode: "badexit",
43 expected: "blub blix",
44 },
45 {
46 mode: "panics",
47 musthave: []string{
48 "fatal error: exit hook invoked panic",
49 "main.testPanics",
50 },
51 },
52 {
53 mode: "callsexit",
54 musthave: []string{
55 "fatal error: exit hook invoked exit",
56 },
57 },
58 {
59 mode: "exit2",
60 expected: "",
61 },
62 }
63
64 exe, err := buildTestProg(t, "testexithooks", bmode)
65 if err != nil {
66 t.Fatal(err)
67 }
68
69 bt := ""
70 if bmode != "" {
71 bt = " bmode: " + bmode
72 }
73 for _, s := range scenarios {
74 cmd := exec.Command(exe, []string{"-mode", s.mode}...)
75 out, _ := cmd.CombinedOutput()
76 outs := strings.ReplaceAll(string(out), "\n", " ")
77 outs = strings.TrimSpace(outs)
78 if s.expected != "" && s.expected != outs {
79 t.Fatalf("failed%s mode %s: wanted %q\noutput:\n%s", bt,
80 s.mode, s.expected, outs)
81 }
82 for _, need := range s.musthave {
83 if !strings.Contains(outs, need) {
84 t.Fatalf("failed mode %s: output does not contain %q\noutput:\n%s",
85 s.mode, need, outs)
86 }
87 }
88 if s.expected == "" && s.musthave == nil && outs != "" {
89 t.Errorf("failed mode %s: wanted no output\noutput:\n%s", s.mode, outs)
90 }
91 }
92 }
93 }
94
View as plain text