|
@@ -24,7 +24,6 @@ import (
|
|
"github.com/docker/docker/dockerversion"
|
|
"github.com/docker/docker/dockerversion"
|
|
"gotest.tools/assert"
|
|
"gotest.tools/assert"
|
|
is "gotest.tools/assert/cmp"
|
|
is "gotest.tools/assert/cmp"
|
|
- "gotest.tools/skip"
|
|
|
|
)
|
|
)
|
|
|
|
|
|
const (
|
|
const (
|
|
@@ -286,8 +285,10 @@ func TestLogClosed(t *testing.T) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// TestLogBlocking tests that the Log method blocks appropriately when
|
|
|
|
+// non-blocking behavior is not enabled. Blocking is achieved through an
|
|
|
|
+// internal channel that must be drained for Log to return.
|
|
func TestLogBlocking(t *testing.T) {
|
|
func TestLogBlocking(t *testing.T) {
|
|
- skip.If(t, runtime.GOOS == "windows", "FIXME: test is flaky on Windows. See #39857")
|
|
|
|
mockClient := newMockClient()
|
|
mockClient := newMockClient()
|
|
stream := &logStream{
|
|
stream := &logStream{
|
|
client: mockClient,
|
|
client: mockClient,
|
|
@@ -301,18 +302,20 @@ func TestLogBlocking(t *testing.T) {
|
|
err := stream.Log(&logger.Message{})
|
|
err := stream.Log(&logger.Message{})
|
|
errorCh <- err
|
|
errorCh <- err
|
|
}()
|
|
}()
|
|
|
|
+ // block until the goroutine above has started
|
|
<-started
|
|
<-started
|
|
select {
|
|
select {
|
|
case err := <-errorCh:
|
|
case err := <-errorCh:
|
|
t.Fatal("Expected stream.Log to block: ", err)
|
|
t.Fatal("Expected stream.Log to block: ", err)
|
|
default:
|
|
default:
|
|
- break
|
|
|
|
}
|
|
}
|
|
|
|
+ // assuming it is blocked, we can now try to drain the internal channel and
|
|
|
|
+ // unblock it
|
|
select {
|
|
select {
|
|
- case <-stream.messages:
|
|
|
|
- break
|
|
|
|
- default:
|
|
|
|
|
|
+ case <-time.After(10 * time.Millisecond):
|
|
|
|
+ // if we're unable to drain the channel within 10ms, something seems broken
|
|
t.Fatal("Expected to be able to read from stream.messages but was unable to")
|
|
t.Fatal("Expected to be able to read from stream.messages but was unable to")
|
|
|
|
+ case <-stream.messages:
|
|
}
|
|
}
|
|
select {
|
|
select {
|
|
case err := <-errorCh:
|
|
case err := <-errorCh:
|