From 7d72743fcee8196243e764bcff70047b6c3ce126 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Sat, 10 Dec 2016 19:39:41 +0000 Subject: [PATCH] playground/socket: deflake test, remove sleep Fixes golang/go#18275 Change-Id: Iedb0a21a3fe0b383a2e51fc92076d7fd005d71e6 Reviewed-on: https://go-review.googlesource.com/34277 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- playground/socket/socket.go | 7 ++++--- playground/socket/socket_test.go | 10 +++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/playground/socket/socket.go b/playground/socket/socket.go index 527c075539..0c275bffa9 100644 --- a/playground/socket/socket.go +++ b/playground/socket/socket.go @@ -175,7 +175,7 @@ func startProcess(id, body string, dest chan<- *Message, opt *Options) *process ) go func() { defer close(done) - for m := range buffer(limiter(out, p)) { + for m := range buffer(limiter(out, p), time.After) { m.Id = id dest <- m } @@ -259,7 +259,8 @@ func limiter(in <-chan *Message, p killer) <-chan *Message { // coalesced; when a message of a different kind is received, any buffered // messages are flushed. When the given channel is closed, buffer flushes the // remaining buffered messages and closes the returned channel. -func buffer(in <-chan *Message) <-chan *Message { +// The timeAfter func should be time.After. It exists for testing. +func buffer(in <-chan *Message, timeAfter func(time.Duration) <-chan time.Time) <-chan *Message { out := make(chan *Message) go func() { defer close(out) @@ -292,7 +293,7 @@ func buffer(in <-chan *Message) <-chan *Message { flush() kind = m.Kind if tc == nil { - tc = time.After(msgDelay) + tc = timeAfter(msgDelay) } } buf = append(buf, m.Body...) diff --git a/playground/socket/socket_test.go b/playground/socket/socket_test.go index 5dd2815ee4..0ceb2500f2 100644 --- a/playground/socket/socket_test.go +++ b/playground/socket/socket_test.go @@ -10,24 +10,28 @@ import ( ) func TestBuffer(t *testing.T) { + afterChan := make(chan time.Time) ch := make(chan *Message) go func() { ch <- &Message{Kind: "err", Body: "a"} ch <- &Message{Kind: "err", Body: "b"} ch <- &Message{Kind: "out", Body: "1"} ch <- &Message{Kind: "out", Body: "2"} - time.Sleep(msgDelay * 2) + afterChan <- time.Time{} // value itself doesn't matter ch <- &Message{Kind: "out", Body: "3"} ch <- &Message{Kind: "out", Body: "4"} close(ch) }() var ms []*Message - for m := range buffer(ch) { + timeAfter := func(d time.Duration) <-chan time.Time { + return afterChan + } + for m := range buffer(ch, timeAfter) { ms = append(ms, m) } if len(ms) != 3 { - t.Fatalf("got %v messages, want 2", len(ms)) + t.Fatalf("got %v messages, want 3", len(ms)) } if g, w := ms[0].Body, "ab"; g != w { t.Errorf("message 0 body = %q, want %q", g, w)