Commit c2eb9454 authored by Russ Cox's avatar Russ Cox

cmd/go: deflake TestGoTestJSON further

Even after disabling on 1-CPU systems, builders are still flaking too often.
Unless there are at least 4 CPUs, don't require test interlacing at all.

Fixes #22665 (again).

Change-Id: Ief792c496c1ee70939532e6ca8bef012fe78178e
Reviewed-on: https://go-review.googlesource.com/77310
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent b9ebc675
...@@ -5119,9 +5119,6 @@ func TestGoTestMinusN(t *testing.T) { ...@@ -5119,9 +5119,6 @@ func TestGoTestMinusN(t *testing.T) {
} }
func TestGoTestJSON(t *testing.T) { func TestGoTestJSON(t *testing.T) {
if runtime.NumCPU() == 1 {
t.Skip("skipping on uniprocessor")
}
tg := testgo(t) tg := testgo(t)
defer tg.cleanup() defer tg.cleanup()
tg.parallel() tg.parallel()
...@@ -5130,32 +5127,42 @@ func TestGoTestJSON(t *testing.T) { ...@@ -5130,32 +5127,42 @@ func TestGoTestJSON(t *testing.T) {
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata")) tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
// Test that math and fmt output is interlaced. // Test that math and fmt output is interlaced.
if runtime.GOMAXPROCS(-1) < 2 { // This has the potential to be a flaky test,
tg.setenv("GOMAXPROCS", "2") // especially on uniprocessor systems, so only
} // require interlacing if we have at least 4 CPUs.
// This has the potential to be a flaky test. // We also try twice, hoping that the cache will be
// Probably the first try will work, but the second try should have // warmed up the second time.
// both tests equally cached and should definitely work. needInterlace := runtime.GOMAXPROCS(-1) >= 4
for try := 0; ; try++ { for try := 0; ; try++ {
tg.run("test", "-json", "-short", "-v", "sleepy1", "sleepy2") tg.run("test", "-json", "-short", "-v", "sleepy1", "sleepy2")
sawSleepy1 := false
sawSleepy2 := false
state := 0 state := 0
for _, line := range strings.Split(tg.getStdout(), "\n") { for _, line := range strings.Split(tg.getStdout(), "\n") {
if state == 0 && strings.Contains(line, `"Package":"sleepy1"`) { if strings.Contains(line, `"Package":"sleepy1"`) {
state = 1 sawSleepy1 = true
if state == 0 {
state = 1
}
if state == 2 {
state = 3
}
} }
if state == 1 && strings.Contains(line, `"Package":"sleepy2"`) { if strings.Contains(line, `"Package":"sleepy2"`) {
state = 2 sawSleepy2 = true
} if state == 1 {
if state == 2 && strings.Contains(line, `"Package":"sleepy1"`) { state = 2
state = 3 }
break
} }
} }
if state != 3 { if !sawSleepy1 || !sawSleepy2 {
t.Fatalf("did not see output from both sleepy1 and sleepy2")
}
if needInterlace && state != 3 {
if try < 1 { if try < 1 {
continue continue
} }
t.Fatalf("did not find fmt interlaced with math") t.Fatalf("did not find sleepy1 interlaced with sleepy2")
} }
break break
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment