Skip to content

Commit c5f54e3

Browse files
committed
fix flaky test
1 parent 7cba1ef commit c5f54e3

3 files changed

Lines changed: 50 additions & 13 deletions

File tree

dialer_test.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package bwlimit
22

33
import (
4+
"io"
45
"net/http"
56
"net/http/httptest"
67
"testing"
@@ -21,7 +22,9 @@ func TestDialer_Dial(t *testing.T) {
2122
ContextDialer: l2.Wrap(d1),
2223
}
2324

24-
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
25+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
26+
_, _ = w.Write([]byte("Hello world!"))
27+
}))
2528
defer srv.Close()
2629

2730
client1 := &http.Client{
@@ -34,23 +37,33 @@ func TestDialer_Dial(t *testing.T) {
3437
Dial: d2.Dial,
3538
},
3639
}
37-
<-l1.WaitCh()
3840
resp1, err1 := client1.Get(srv.URL)
3941
resp2, err2 := client2.Get(srv.URL)
40-
<-l1.WaitCh()
4142

4243
if err1 != nil {
4344
t.Fatal(err1)
4445
}
4546
t.Log(resp1.Status)
47+
if _, err := io.ReadAll(resp1.Body); err != nil {
48+
t.Fatal(err)
49+
}
50+
if err := resp1.Body.Close(); err != nil {
51+
t.Fatal(err)
52+
}
4653

4754
if err2 != nil {
4855
t.Fatal(err2)
4956
}
5057
t.Log(resp2.Status)
58+
if _, err := io.ReadAll(resp2.Body); err != nil {
59+
t.Fatal(err)
60+
}
61+
if err := resp2.Body.Close(); err != nil {
62+
t.Fatal(err)
63+
}
5164

52-
r1 := l1.Reads.Count.Load()
53-
r2 := l2.Reads.Count.Load()
65+
r1 := l1.Reads.Count.Load() + l1.Reads.count.Load()
66+
r2 := l2.Reads.Count.Load() + l2.Reads.count.Load()
5467
if r1 != r2*2 {
5568
t.Error(r1, r2)
5669
}

ticker.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ type Ticker struct {
1111
ch chan struct{}
1212
}
1313

14-
var DefaultTicker *Ticker
14+
var DefaultTicker *Ticker = NewTicker()
15+
16+
func NewTicker() (ot *Ticker) {
17+
ot = &Ticker{ch: make(chan struct{})}
18+
go ot.run()
19+
return
20+
}
1521

1622
// NewLimiter returns a new Limiter using this Ticker.
1723
// If you provide limits, the first will set
@@ -49,10 +55,3 @@ func (ot *Ticker) run() {
4955
close(oldCh)
5056
}
5157
}
52-
53-
func init() {
54-
DefaultTicker = &Ticker{
55-
ch: make(chan struct{}),
56-
}
57-
go DefaultTicker.run()
58-
}

ticker_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package bwlimit
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
"time"
7+
)
8+
9+
func TestTicker_zeroValue_NewLimiter(t *testing.T) {
10+
l := (&Ticker{}).NewLimiter(1000)
11+
defer l.Stop()
12+
13+
done := make(chan struct{})
14+
go func() {
15+
_, _ = l.Reads.io(bytes.NewReader(make([]byte, 1)).Read, make([]byte, 1))
16+
close(done)
17+
}()
18+
19+
select {
20+
case <-done:
21+
case <-time.After(time.Second):
22+
t.Fatal("read stalled with zero-value ticker")
23+
}
24+
}
25+

0 commit comments

Comments
 (0)