@@ -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