-
Notifications
You must be signed in to change notification settings - Fork 0
/
bytepool_test.go
59 lines (55 loc) · 1.21 KB
/
bytepool_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package bytepool
import (
"context"
"runtime"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestBytePool(t *testing.T) {
p := NewBytePool(2, 3, 0)
require.Equal(t, 2, len(p.ch))
require.Equal(t, 3, p.BufferSize())
bs := p.Get()
b := bs.Data()
require.Equal(t, []byte{0, 0, 0}, b)
require.Equal(t, 1, len(p.ch))
p.Get()
// ch empty, get timeout
ctx, cancel := context.WithTimeout(context.TODO(), 100*time.Millisecond)
defer cancel()
_, err := p.GetWithCtx(ctx)
require.Equal(t, context.DeadlineExceeded, err)
// change data and get the same data
b[0] = 1
bs.PutBack()
require.Equal(t, 1, len(p.ch))
// put same buffer no effect
bs.PutBack()
require.Equal(t, 1, len(p.ch))
b2 := p.Get()
require.Equal(t, []byte{1, 0, 0}, b2.Data())
bs = nil
// forgot to reput, gc
runtime.GC()
runtime.GC()
require.Equal(t, 2, len(p.ch))
p.put(nil)
require.Equal(t, 2, len(p.ch))
}
func TestGC(t *testing.T) {
p := NewBytePool(1, 3, 100*time.Millisecond)
bs := p.Get()
b := bs.Data()
b[0] = 1
bs.PutBack()
bs = p.Get()
b = bs.Data()
require.Equal(t, []byte{1, 0, 0}, b)
bs.PutBack()
b = nil
time.Sleep(150 * time.Millisecond)
bs = p.Get()
b = bs.Data()
require.Equal(t, []byte{0, 0, 0}, b)
}