Fix race condition in pacer tests - fixes #156

This commit is contained in:
Nick Craig-Wood 2015-10-02 19:08:55 +01:00
parent 852acd5e4e
commit 4712043e26

View File

@ -111,23 +111,37 @@ func emptyTokens(p *Pacer) {
} }
} }
// waitForPace waits for duration for the pace to arrive
// returns the time that it arrived or a zero time
func waitForPace(p *Pacer, duration time.Duration) (when time.Time) {
select {
case <-time.After(duration):
return
case <-p.pacer:
return time.Now()
}
}
func TestBeginCall(t *testing.T) { func TestBeginCall(t *testing.T) {
p := New().SetMaxConnections(10).SetMinSleep(1 * time.Millisecond) p := New().SetMaxConnections(10).SetMinSleep(1 * time.Millisecond)
emptyTokens(p) emptyTokens(p)
go p.beginCall() go p.beginCall()
time.Sleep(2 * p.minSleep) if !waitForPace(p, 10*time.Millisecond).IsZero() {
if len(p.pacer) != 0 {
t.Errorf("beginSleep fired too early #1") t.Errorf("beginSleep fired too early #1")
} }
startTime := time.Now()
p.pacer <- struct{}{} p.pacer <- struct{}{}
time.Sleep(2 * p.minSleep) time.Sleep(1 * time.Millisecond)
if len(p.pacer) != 0 { connTime := time.Now()
t.Errorf("beginSleep fired too early #2")
}
p.connTokens <- struct{}{} p.connTokens <- struct{}{}
time.Sleep(2 * p.minSleep) time.Sleep(1 * time.Millisecond)
if len(p.pacer) == 0 { paceTime := waitForPace(p, 10*time.Millisecond)
if paceTime.IsZero() {
t.Errorf("beginSleep didn't fire") t.Errorf("beginSleep didn't fire")
} else if paceTime.Sub(startTime) < 0 {
t.Errorf("pace arrived before returning pace token")
} else if paceTime.Sub(connTime) < 0 {
t.Errorf("pace arrived before sending conn token")
} }
} }
@ -135,14 +149,17 @@ func TestBeginCallZeroConnections(t *testing.T) {
p := New().SetMaxConnections(0).SetMinSleep(1 * time.Millisecond) p := New().SetMaxConnections(0).SetMinSleep(1 * time.Millisecond)
emptyTokens(p) emptyTokens(p)
go p.beginCall() go p.beginCall()
time.Sleep(2 * p.minSleep) if !waitForPace(p, 10*time.Millisecond).IsZero() {
if len(p.pacer) != 0 {
t.Errorf("beginSleep fired too early #1") t.Errorf("beginSleep fired too early #1")
} }
startTime := time.Now()
p.pacer <- struct{}{} p.pacer <- struct{}{}
time.Sleep(2 * p.minSleep) time.Sleep(1 * time.Millisecond)
if len(p.pacer) == 0 { paceTime := waitForPace(p, 10*time.Millisecond)
if paceTime.IsZero() {
t.Errorf("beginSleep didn't fire") t.Errorf("beginSleep didn't fire")
} else if paceTime.Sub(startTime) < 0 {
t.Errorf("pace arrived before returning pace token")
} }
} }