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  }