Skip to content

Commit ad1acbf

Browse files
committed
add more test coverage
1 parent cd6d40c commit ad1acbf

File tree

1 file changed

+53
-3
lines changed

1 file changed

+53
-3
lines changed

limit_test.go

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,60 @@ const (
1717
sleep = time.Microsecond * 10
1818
)
1919

20-
func TestLimit(t *testing.T) {
20+
func TestLimitSilent(t *testing.T) {
21+
testLimit(t, false)
22+
}
23+
24+
func TestLimitVerbose(t *testing.T) {
25+
testLimit(t, true)
26+
}
27+
28+
func testLimit(t *testing.T, withStuck bool) {
2129
t.Parallel()
2230

2331
var running int32
2432
var wg sync.WaitGroup
2533
limit := simultaneous.New[any](max)
2634

35+
var stuckCalled atomic.Int32
36+
var unstuckCalled atomic.Int32
37+
someUnstuck := make(chan struct{})
38+
39+
if withStuck {
40+
limit = limit.SetForeverMessaging(time.Millisecond,
41+
func() {
42+
if stuckCalled.Add(1) == 1 {
43+
close(someUnstuck)
44+
}
45+
},
46+
func() {
47+
unstuckCalled.Add(1)
48+
},
49+
)
50+
}
51+
52+
var fail atomic.Int32
53+
var success atomic.Int32
54+
2755
for i := 0; i < threadCount; i++ {
2856
i := i
2957
wg.Add(1)
3058
go func() {
3159
defer wg.Done()
3260
var done simultaneous.Limited[any]
33-
if i%2 == 0 {
61+
switch i % 3 {
62+
case 0:
3463
done = limit.Forever()
35-
} else {
64+
case 1:
65+
var err error
66+
done, err = limit.Timeout(0)
67+
if err != nil {
68+
fail.Add(1)
69+
return
70+
} else {
71+
success.Add(1)
72+
}
73+
case 2:
3674
var err error
3775
done, err = limit.Timeout(time.Second * 2)
3876
if !assert.NoError(t, err) {
@@ -42,8 +80,20 @@ func TestLimit(t *testing.T) {
4280
assert.LessOrEqual(t, atomic.AddInt32(&running, 1), int32(max))
4381
time.Sleep(sleep)
4482
assert.GreaterOrEqual(t, atomic.AddInt32(&running, -1), int32(0))
83+
if withStuck {
84+
<-someUnstuck
85+
}
4586
done.Done()
4687
}()
4788
}
4889
wg.Wait()
90+
91+
if withStuck {
92+
t.Logf("stuck called %d unstuck called %d", stuckCalled.Load(), unstuckCalled.Load())
93+
assert.NotZero(t, stuckCalled.Load(), "stuck reported")
94+
assert.Equal(t, stuckCalled.Load(), unstuckCalled.Load(), "stuck == unstuck")
95+
}
96+
t.Logf("timeout 0 failed %d succeeded %d", fail.Load(), success.Load())
97+
assert.NotZero(t, fail.Load(), "fail")
98+
assert.NotZero(t, success.Load(), "succeed")
4999
}

0 commit comments

Comments
 (0)