github.com/anacrolix/torrent@v1.61.0/internal/alloclim/alloclim_test.go (about) 1 package alloclim 2 3 import ( 4 "context" 5 "testing" 6 "time" 7 8 _ "github.com/anacrolix/envpprof" 9 qt "github.com/go-quicktest/qt" 10 ) 11 12 func TestReserveOverMax(t *testing.T) { 13 l := &Limiter{Max: 10} 14 r := l.Reserve(20) 15 qt.Assert(t, qt.IsNotNil(r.Wait(context.Background()))) 16 } 17 18 func TestImmediateAllow(t *testing.T) { 19 l := &Limiter{Max: 10} 20 r := l.Reserve(10) 21 qt.Assert(t, qt.IsNil(r.Wait(context.Background()))) 22 } 23 24 func TestSimpleSequence(t *testing.T) { 25 l := &Limiter{Max: 10} 26 rs := make([]*Reservation, 0) 27 rs = append(rs, l.Reserve(6)) 28 rs = append(rs, l.Reserve(5)) 29 rs = append(rs, l.Reserve(5)) 30 qt.Assert(t, qt.IsNil(rs[0].Wait(context.Background()))) 31 ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Nanosecond)) 32 qt.Assert(t, qt.Equals(rs[1].Wait(ctx), context.DeadlineExceeded)) 33 go cancel() 34 ctx, cancel = context.WithCancel(context.Background()) 35 go cancel() 36 qt.Assert(t, qt.Equals(rs[2].Wait(ctx), context.Canceled)) 37 go rs[0].Release() 38 ctx, cancel = context.WithDeadline(context.Background(), time.Now().Add(time.Second)) 39 qt.Assert(t, qt.IsNil(rs[1].Wait(ctx))) 40 go rs[1].Release() 41 qt.Assert(t, qt.IsNil(rs[2].Wait(ctx))) 42 go rs[2].Release() 43 go cancel() 44 rs[2].Release() 45 rs[1].Release() 46 qt.Assert(t, qt.Equals(l.Value(), l.Max)) 47 } 48 49 func TestSequenceWithCancel(t *testing.T) { 50 l := &Limiter{Max: 10} 51 rs := make([]*Reservation, 0) 52 rs = append(rs, l.Reserve(6)) 53 rs = append(rs, l.Reserve(6)) 54 rs = append(rs, l.Reserve(4)) 55 rs = append(rs, l.Reserve(4)) 56 qt.Assert(t, qt.IsFalse(rs[0].Cancel())) 57 qt.Assert(t, qt.PanicMatches(func() { rs[1].Release() }, "not resolved")) 58 qt.Assert(t, qt.IsTrue(rs[1].Cancel())) 59 qt.Assert(t, qt.IsNil(rs[2].Wait(context.Background()))) 60 rs[0].Release() 61 qt.Assert(t, qt.IsNil(rs[3].Wait(context.Background()))) 62 qt.Assert(t, qt.Equals(l.Value(), int64(2))) 63 rs[1].Release() 64 rs[2].Release() 65 rs[3].Release() 66 qt.Assert(t, qt.Equals(l.Value(), l.Max)) 67 } 68 69 func TestCancelWhileWaiting(t *testing.T) { 70 l := &Limiter{Max: 10} 71 rs := make([]*Reservation, 0) 72 rs = append(rs, l.Reserve(6)) 73 rs = append(rs, l.Reserve(6)) 74 rs = append(rs, l.Reserve(4)) 75 rs = append(rs, l.Reserve(4)) 76 go rs[1].Cancel() 77 err := rs[1].Wait(context.Background()) 78 qt.Assert(t, qt.IsNotNil(err)) 79 err = rs[2].Wait(context.Background()) 80 qt.Assert(t, qt.IsNil(err)) 81 ctx, cancel := context.WithCancel(context.Background()) 82 go cancel() 83 err = rs[3].Wait(ctx) 84 qt.Assert(t, qt.Equals(err, context.Canceled)) 85 rs[0].Drop() 86 err = rs[3].Wait(ctx) 87 qt.Assert(t, qt.IsNil(err)) 88 }