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 <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Brad Fitzpatrick 2016-12-10 19:39:41 +00:00
parent a888bfdffa
commit 7d72743fce
2 changed files with 11 additions and 6 deletions

View File

@ -175,7 +175,7 @@ func startProcess(id, body string, dest chan<- *Message, opt *Options) *process
) )
go func() { go func() {
defer close(done) defer close(done)
for m := range buffer(limiter(out, p)) { for m := range buffer(limiter(out, p), time.After) {
m.Id = id m.Id = id
dest <- m 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 // coalesced; when a message of a different kind is received, any buffered
// messages are flushed. When the given channel is closed, buffer flushes the // messages are flushed. When the given channel is closed, buffer flushes the
// remaining buffered messages and closes the returned channel. // 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) out := make(chan *Message)
go func() { go func() {
defer close(out) defer close(out)
@ -292,7 +293,7 @@ func buffer(in <-chan *Message) <-chan *Message {
flush() flush()
kind = m.Kind kind = m.Kind
if tc == nil { if tc == nil {
tc = time.After(msgDelay) tc = timeAfter(msgDelay)
} }
} }
buf = append(buf, m.Body...) buf = append(buf, m.Body...)

View File

@ -10,24 +10,28 @@ import (
) )
func TestBuffer(t *testing.T) { func TestBuffer(t *testing.T) {
afterChan := make(chan time.Time)
ch := make(chan *Message) ch := make(chan *Message)
go func() { go func() {
ch <- &Message{Kind: "err", Body: "a"} ch <- &Message{Kind: "err", Body: "a"}
ch <- &Message{Kind: "err", Body: "b"} ch <- &Message{Kind: "err", Body: "b"}
ch <- &Message{Kind: "out", Body: "1"} ch <- &Message{Kind: "out", Body: "1"}
ch <- &Message{Kind: "out", Body: "2"} 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: "3"}
ch <- &Message{Kind: "out", Body: "4"} ch <- &Message{Kind: "out", Body: "4"}
close(ch) close(ch)
}() }()
var ms []*Message 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) ms = append(ms, m)
} }
if len(ms) != 3 { 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 { if g, w := ms[0].Body, "ab"; g != w {
t.Errorf("message 0 body = %q, want %q", g, w) t.Errorf("message 0 body = %q, want %q", g, w)