|
7 | 7 | package runtime_test
|
8 | 8 |
|
9 | 9 | import (
|
| 10 | + "fmt" |
10 | 11 | "internal/testenv"
|
11 | 12 | "os/exec"
|
12 | 13 | "runtime"
|
@@ -161,22 +162,35 @@ func TestCgoCheckBytes(t *testing.T) {
|
161 | 162 | t.Fatal(err)
|
162 | 163 | }
|
163 | 164 |
|
164 |
| - cmd := testEnv(exec.Command(exe, "CgoCheckBytes")) |
165 |
| - cmd.Env = append(cmd.Env, "GODEBUG=cgocheck=0") |
| 165 | + // Try it 10 times to avoid flakiness. |
| 166 | + const tries = 10 |
| 167 | + var tot1, tot2 time.Duration |
| 168 | + for i := 0; i < tries; i++ { |
| 169 | + cmd := testEnv(exec.Command(exe, "CgoCheckBytes")) |
| 170 | + cmd.Env = append(cmd.Env, "GODEBUG=cgocheck=0", fmt.Sprintf("GO_CGOCHECKBYTES_TRY=%d", i)) |
166 | 171 |
|
167 |
| - start := time.Now() |
168 |
| - cmd.Run() |
169 |
| - d1 := time.Since(start) |
| 172 | + start := time.Now() |
| 173 | + cmd.Run() |
| 174 | + d1 := time.Since(start) |
170 | 175 |
|
171 |
| - cmd = testEnv(exec.Command(exe, "CgoCheckBytes")) |
| 176 | + cmd = testEnv(exec.Command(exe, "CgoCheckBytes")) |
| 177 | + cmd.Env = append(cmd.Env, fmt.Sprintf("GO_CGOCHECKBYTES_TRY=%d", i)) |
172 | 178 |
|
173 |
| - start = time.Now() |
174 |
| - cmd.Run() |
175 |
| - d2 := time.Since(start) |
| 179 | + start = time.Now() |
| 180 | + cmd.Run() |
| 181 | + d2 := time.Since(start) |
176 | 182 |
|
177 |
| - if d1*20 < d2 { |
178 |
| - t.Errorf("cgo check too slow: got %v, expected at most %v", d1, d2*10) |
| 183 | + if d1*20 > d2 { |
| 184 | + // The slow version (d2) was less than 20 times |
| 185 | + // slower than the fast version (d1), so OK. |
| 186 | + return |
| 187 | + } |
| 188 | + |
| 189 | + tot1 += d1 |
| 190 | + tot2 += d2 |
179 | 191 | }
|
| 192 | + |
| 193 | + t.Errorf("cgo check too slow: got %v, expected at most %v", tot2/tries, (tot1/tries)*20) |
180 | 194 | }
|
181 | 195 |
|
182 | 196 | func TestCgoCCodeSIGPROF(t *testing.T) {
|
|
0 commit comments