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