Source file
src/testing/testing_test.go
Documentation: testing
1
2
3
4
5 package testing_test
6
7 import (
8 "os"
9 "path/filepath"
10 "testing"
11 )
12
13
14
15
16
17 func TestMain(m *testing.M) {
18 os.Exit(m.Run())
19 }
20
21 func TestTempDirInCleanup(t *testing.T) {
22 var dir string
23
24 t.Run("test", func(t *testing.T) {
25 t.Cleanup(func() {
26 dir = t.TempDir()
27 })
28 _ = t.TempDir()
29 })
30
31 fi, err := os.Stat(dir)
32 if fi != nil {
33 t.Fatalf("Directory %q from user Cleanup still exists", dir)
34 }
35 if !os.IsNotExist(err) {
36 t.Fatalf("Unexpected error: %v", err)
37 }
38 }
39
40 func TestTempDirInBenchmark(t *testing.T) {
41 testing.Benchmark(func(b *testing.B) {
42 if !b.Run("test", func(b *testing.B) {
43
44 for i := 0; i < b.N; i++ {
45 _ = b.TempDir()
46 }
47 }) {
48 t.Fatal("Sub test failure in a benchmark")
49 }
50 })
51 }
52
53 func TestTempDir(t *testing.T) {
54 testTempDir(t)
55 t.Run("InSubtest", testTempDir)
56 t.Run("test/subtest", testTempDir)
57 t.Run("test\\subtest", testTempDir)
58 t.Run("test:subtest", testTempDir)
59 t.Run("test/..", testTempDir)
60 t.Run("../test", testTempDir)
61 t.Run("test[]", testTempDir)
62 t.Run("test*", testTempDir)
63 t.Run("äöüéè", testTempDir)
64 }
65
66 func testTempDir(t *testing.T) {
67 dirCh := make(chan string, 1)
68 t.Cleanup(func() {
69
70 select {
71 case dir := <-dirCh:
72 fi, err := os.Stat(dir)
73 if os.IsNotExist(err) {
74
75 return
76 }
77 if err != nil {
78 t.Fatal(err)
79 }
80 t.Errorf("directory %q still exists: %v, isDir=%v", dir, fi, fi.IsDir())
81 default:
82 if !t.Failed() {
83 t.Fatal("never received dir channel")
84 }
85 }
86 })
87
88 dir := t.TempDir()
89 if dir == "" {
90 t.Fatal("expected dir")
91 }
92 dir2 := t.TempDir()
93 if dir == dir2 {
94 t.Fatal("subsequent calls to TempDir returned the same directory")
95 }
96 if filepath.Dir(dir) != filepath.Dir(dir2) {
97 t.Fatalf("calls to TempDir do not share a parent; got %q, %q", dir, dir2)
98 }
99 dirCh <- dir
100 fi, err := os.Stat(dir)
101 if err != nil {
102 t.Fatal(err)
103 }
104 if !fi.IsDir() {
105 t.Errorf("dir %q is not a dir", dir)
106 }
107 files, err := os.ReadDir(dir)
108 if err != nil {
109 t.Fatal(err)
110 }
111 if len(files) > 0 {
112 t.Errorf("unexpected %d files in TempDir: %v", len(files), files)
113 }
114
115 glob := filepath.Join(dir, "*.txt")
116 if _, err := filepath.Glob(glob); err != nil {
117 t.Error(err)
118 }
119 }
120
121 func TestSetenv(t *testing.T) {
122 tests := []struct {
123 name string
124 key string
125 initialValueExists bool
126 initialValue string
127 newValue string
128 }{
129 {
130 name: "initial value exists",
131 key: "GO_TEST_KEY_1",
132 initialValueExists: true,
133 initialValue: "111",
134 newValue: "222",
135 },
136 {
137 name: "initial value exists but empty",
138 key: "GO_TEST_KEY_2",
139 initialValueExists: true,
140 initialValue: "",
141 newValue: "222",
142 },
143 {
144 name: "initial value is not exists",
145 key: "GO_TEST_KEY_3",
146 initialValueExists: false,
147 initialValue: "",
148 newValue: "222",
149 },
150 }
151
152 for _, test := range tests {
153 if test.initialValueExists {
154 if err := os.Setenv(test.key, test.initialValue); err != nil {
155 t.Fatalf("unable to set env: got %v", err)
156 }
157 } else {
158 os.Unsetenv(test.key)
159 }
160
161 t.Run(test.name, func(t *testing.T) {
162 t.Setenv(test.key, test.newValue)
163 if os.Getenv(test.key) != test.newValue {
164 t.Fatalf("unexpected value after t.Setenv: got %s, want %s", os.Getenv(test.key), test.newValue)
165 }
166 })
167
168 got, exists := os.LookupEnv(test.key)
169 if got != test.initialValue {
170 t.Fatalf("unexpected value after t.Setenv cleanup: got %s, want %s", got, test.initialValue)
171 }
172 if exists != test.initialValueExists {
173 t.Fatalf("unexpected value after t.Setenv cleanup: got %t, want %t", exists, test.initialValueExists)
174 }
175 }
176 }
177
178 func TestSetenvWithParallelAfterSetenv(t *testing.T) {
179 defer func() {
180 want := "testing: t.Parallel called after t.Setenv; cannot set environment variables in parallel tests"
181 if got := recover(); got != want {
182 t.Fatalf("expected panic; got %#v want %q", got, want)
183 }
184 }()
185
186 t.Setenv("GO_TEST_KEY_1", "value")
187
188 t.Parallel()
189 }
190
191 func TestSetenvWithParallelBeforeSetenv(t *testing.T) {
192 defer func() {
193 want := "testing: t.Setenv called after t.Parallel; cannot set environment variables in parallel tests"
194 if got := recover(); got != want {
195 t.Fatalf("expected panic; got %#v want %q", got, want)
196 }
197 }()
198
199 t.Parallel()
200
201 t.Setenv("GO_TEST_KEY_1", "value")
202 }
203
View as plain text