2026-03-03 19:50:09 +01:00
|
|
|
package pool_test
|
2026-03-05 12:34:35 +01:00
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"code.squareroundforest.org/arpio/pool"
|
|
|
|
|
"errors"
|
|
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestEvent(t *testing.T) {
|
|
|
|
|
t.Run("get put allocate free", func(t *testing.T) {
|
|
|
|
|
alloc := func() ([]byte, error) { return make([]byte, 1<<9), nil }
|
|
|
|
|
e := make(chan pool.Event, 7)
|
|
|
|
|
o := pool.Options{
|
|
|
|
|
Algo: pool.Max(2),
|
|
|
|
|
Events: e,
|
|
|
|
|
EventMask: pool.AllEvents,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p := pool.Make(alloc, nil, o)
|
|
|
|
|
|
|
|
|
|
var b [][]byte
|
|
|
|
|
for i := 0; i < 3; i++ {
|
|
|
|
|
bi, err := p.Get()
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
b = append(b, bi)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, bi := range b {
|
|
|
|
|
p.Put(bi)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := 0; i < 3; i++ {
|
|
|
|
|
ev := <-e
|
|
|
|
|
if ev.Type != pool.GetOperation|pool.AllocateOperation {
|
|
|
|
|
t.Fatal(ev)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := 0; i < 2; i++ {
|
|
|
|
|
ev := <-e
|
|
|
|
|
if ev.Type != pool.PutOperation {
|
|
|
|
|
t.Fatal(ev)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ev := <-e
|
|
|
|
|
if ev.Type != pool.PutOperation|pool.FreeOperation {
|
|
|
|
|
t.Fatal(ev)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("allocate error", func(t *testing.T) {
|
|
|
|
|
alloc := func() ([]byte, error) { return nil, errTest }
|
|
|
|
|
e := make(chan pool.Event, 1)
|
|
|
|
|
o := pool.Options{
|
|
|
|
|
Algo: pool.NoShrink(),
|
|
|
|
|
Events: e,
|
|
|
|
|
EventMask: pool.AllEvents,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p := pool.Make(alloc, nil, o)
|
|
|
|
|
_, err := p.Get()
|
|
|
|
|
if !errors.Is(err, errTest) {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ev := <-e
|
|
|
|
|
if ev.Type != pool.GetOperation|pool.AllocateOperation|pool.AllocateError {
|
|
|
|
|
t.Fatal(ev)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("drop", func(t *testing.T) {
|
|
|
|
|
alloc := func() ([]byte, error) { return make([]byte, 1<<9), nil }
|
|
|
|
|
e := make(chan pool.Event)
|
|
|
|
|
o := pool.Options{
|
|
|
|
|
Algo: pool.NoShrink(),
|
|
|
|
|
Events: e,
|
|
|
|
|
EventMask: pool.AllEvents,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p := pool.Make(alloc, nil, o)
|
|
|
|
|
_, err := p.Get()
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
select {
|
|
|
|
|
case <-e:
|
|
|
|
|
t.Fatal("unexpected event")
|
|
|
|
|
default:
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("mask", func(t *testing.T) {
|
|
|
|
|
alloc := func() ([]byte, error) { return make([]byte, 1<<9), nil }
|
|
|
|
|
e := make(chan pool.Event, 1)
|
|
|
|
|
o := pool.Options{
|
|
|
|
|
Algo: pool.NoShrink(),
|
|
|
|
|
Events: e,
|
|
|
|
|
EventMask: pool.GetOperation,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p := pool.Make(alloc, nil, o)
|
|
|
|
|
b, err := p.Get()
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p.Put(b)
|
|
|
|
|
ev := <-e
|
|
|
|
|
if ev.Type != pool.AllocateOperation|pool.GetOperation {
|
|
|
|
|
t.Fatal(ev)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
select {
|
|
|
|
|
case <-e:
|
|
|
|
|
t.Fatal("unexpected event")
|
|
|
|
|
default:
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|