summaryrefslogtreecommitdiffstats
path: root/src/cmd/go/testdata/script/test_exit.txt
blob: 3703ba53d362b0b0930cde8aa2ff233c5eee9934 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# Builds and runs test binaries, so skip in short mode.
[short] skip

env GO111MODULE=on

# If a test invoked by 'go test' exits with a zero status code,
# it will panic.
! go test ./zero
! stdout ^ok
! stdout 'exit status'
stdout 'panic'
stdout ^FAIL

# If a test exits with a non-zero status code, 'go test' fails normally.
! go test ./one
! stdout ^ok
stdout 'exit status'
! stdout 'panic'
stdout ^FAIL

# Ensure that other flags still do the right thing.
go test -list=. ./zero
stdout ExitZero

! go test -bench=. ./zero
stdout 'panic'

# 'go test' with no args streams output without buffering. Ensure that it still
# catches a zero exit with missing output.
cd zero
! go test
stdout 'panic'
cd ../normal
go test
stdout ^ok
cd ..

# If a TestMain exits with a zero status code, 'go test' shouldn't
# complain about that. It's a common way to skip testing a package
# entirely.
go test ./main_zero
! stdout 'skipping all tests'
stdout ^ok

# With -v, we'll see the warning from TestMain.
go test -v ./main_zero
stdout 'skipping all tests'
stdout ^ok

# Listing all tests won't actually give a result if TestMain exits. That's okay,
# because this is how TestMain works. If we decide to support -list even when
# TestMain is used to skip entire packages, we can change this test case.
go test -list=. ./main_zero
stdout 'skipping all tests'
! stdout TestNotListed

# Running the test directly still fails, if we pass the flag.
go test -c -o ./zero.exe ./zero
! exec ./zero.exe -test.paniconexit0

# Using -json doesn't affect the exit status.
! go test -json ./zero
! stdout '"Output":"ok'
! stdout 'exit status'
stdout 'panic'
stdout '"Output":"FAIL'

# Running the test via test2json also fails.
! go tool test2json ./zero.exe -test.v -test.paniconexit0
! stdout '"Output":"ok'
! stdout 'exit status'
stdout 'panic'

-- go.mod --
module m

-- ./normal/normal.go --
package normal
-- ./normal/normal_test.go --
package normal

import "testing"

func TestExitZero(t *testing.T) {
}

-- ./zero/zero.go --
package zero
-- ./zero/zero_test.go --
package zero

import (
	"os"
	"testing"
)

func TestExitZero(t *testing.T) {
	os.Exit(0)
}

-- ./one/one.go --
package one
-- ./one/one_test.go --
package one

import (
	"os"
	"testing"
)

func TestExitOne(t *testing.T) {
	os.Exit(1)
}

-- ./main_zero/zero.go --
package zero
-- ./main_zero/zero_test.go --
package zero

import (
	"fmt"
	"os"
	"testing"
)

func TestMain(m *testing.M) {
	fmt.Println("skipping all tests")
	os.Exit(0)
}

func TestNotListed(t *testing.T) {}