test/cli-plugins: Try to make TestConnectAndWait less flaky
- Add runtime.Gosched() calls to encourage goroutine scheduling - Increase the timeout from 10ms to 500ms - Use poll.WaitOn with appropriate delays to ensure the goroutine has spawned before checking - Lock the test goroutines to its own thread Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
This commit is contained in:
parent
2d74733942
commit
0ce8989a78
@ -178,24 +178,39 @@ func TestConnectAndWait(t *testing.T) {
|
|||||||
// TODO: this test cannot be executed with `t.Parallel()`, due to
|
// TODO: this test cannot be executed with `t.Parallel()`, due to
|
||||||
// relying on goroutine numbers to ensure correct behaviour
|
// relying on goroutine numbers to ensure correct behaviour
|
||||||
t.Run("connect goroutine exits after EOF", func(t *testing.T) {
|
t.Run("connect goroutine exits after EOF", func(t *testing.T) {
|
||||||
|
runtime.LockOSThread()
|
||||||
|
defer runtime.UnlockOSThread()
|
||||||
srv, err := NewPluginServer(nil)
|
srv, err := NewPluginServer(nil)
|
||||||
assert.NilError(t, err, "failed to setup server")
|
assert.NilError(t, err, "failed to setup server")
|
||||||
|
|
||||||
defer srv.Close()
|
defer srv.Close()
|
||||||
|
|
||||||
t.Setenv(EnvKey, srv.Addr().String())
|
t.Setenv(EnvKey, srv.Addr().String())
|
||||||
|
|
||||||
|
runtime.Gosched()
|
||||||
numGoroutines := runtime.NumGoroutine()
|
numGoroutines := runtime.NumGoroutine()
|
||||||
|
|
||||||
ConnectAndWait(func() {})
|
ConnectAndWait(func() {})
|
||||||
assert.Equal(t, runtime.NumGoroutine(), numGoroutines+1)
|
|
||||||
|
runtime.Gosched()
|
||||||
|
poll.WaitOn(t, func(t poll.LogT) poll.Result {
|
||||||
|
// +1 goroutine for the poll.WaitOn
|
||||||
|
// +1 goroutine for the connect goroutine
|
||||||
|
if runtime.NumGoroutine() < numGoroutines+1+1 {
|
||||||
|
return poll.Continue("waiting for connect goroutine to spawn")
|
||||||
|
}
|
||||||
|
return poll.Success()
|
||||||
|
}, poll.WithDelay(1*time.Millisecond), poll.WithTimeout(500*time.Millisecond))
|
||||||
|
|
||||||
srv.Close()
|
srv.Close()
|
||||||
|
|
||||||
|
runtime.Gosched()
|
||||||
poll.WaitOn(t, func(t poll.LogT) poll.Result {
|
poll.WaitOn(t, func(t poll.LogT) poll.Result {
|
||||||
|
// +1 goroutine for the poll.WaitOn
|
||||||
if runtime.NumGoroutine() > numGoroutines+1 {
|
if runtime.NumGoroutine() > numGoroutines+1 {
|
||||||
return poll.Continue("waiting for connect goroutine to exit")
|
return poll.Continue("waiting for connect goroutine to exit")
|
||||||
}
|
}
|
||||||
return poll.Success()
|
return poll.Success()
|
||||||
}, poll.WithDelay(1*time.Millisecond), poll.WithTimeout(10*time.Millisecond))
|
}, poll.WithDelay(1*time.Millisecond), poll.WithTimeout(500*time.Millisecond))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user