From 29cd4aee683de113d858b495d36fe13c71628f11 Mon Sep 17 00:00:00 2001 From: "kayos@tcp.direct" Date: Sun, 29 Oct 2023 20:18:23 -0700 Subject: [PATCH] Feat[pool]: Add new interfaces for compatibility --- pool/interface.go | 19 ++++++++++++ pool/interface_test.go | 68 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 pool/interface.go create mode 100644 pool/interface_test.go diff --git a/pool/interface.go b/pool/interface.go new file mode 100644 index 0000000..f13ed5a --- /dev/null +++ b/pool/interface.go @@ -0,0 +1,19 @@ +package pool + +type Pool[T any] interface { + Get() T + Put(T) +} + +type WithPutError[T any] interface { + Get() T + Put(T) error +} + +type BufferFactoryInterfaceCompat struct { + BufferFactory +} + +func (b BufferFactoryInterfaceCompat) Put(buf *Buffer) { + _ = b.BufferFactory.Put(buf) +} diff --git a/pool/interface_test.go b/pool/interface_test.go new file mode 100644 index 0000000..b36c712 --- /dev/null +++ b/pool/interface_test.go @@ -0,0 +1,68 @@ +package pool + +import ( + "bytes" + "sync" + "testing" +) + +// ensure compatibility with interface +func TestInterfaces(t *testing.T) { + t.Parallel() + defer func() { + if r := recover(); r != nil { + t.Error("interface not implemented") + } + }() + var ( + bf any = NewBufferFactory() + bfCompat any = BufferFactoryInterfaceCompat{NewBufferFactory()} + sPool any = &sync.Pool{ + New: func() any { return new(bytes.Buffer) }, + } + ) + if _, ok := sPool.(Pool[any]); !ok { + t.Fatal("Pool[any] not implemented by sync.Pool") + } + testMe1, ok1 := bfCompat.(Pool[*Buffer]) + if !ok1 { + t.Fatal("Pool[*Buffer] not implemented") + } + + t.Run("Pool", func(t *testing.T) { + t.Parallel() + b := testMe1.Get() + if _, err := b.WriteString("test"); err != nil { + t.Fatal(err) + } + testMe1.Put(b) + b = testMe1.Get() + if b.Len() != 0 { + t.Fatal("buffer not reset") + } + testMe1.Put(b) + }) + + t.Run("PoolWithPutError", func(t *testing.T) { + t.Parallel() + testMe2, ok2 := bf.(WithPutError[*Buffer]) + if !ok2 { + t.Error("PoolWithPutError[*Buffer] not implemented") + } + b := testMe2.Get() + if _, err := b.WriteString("test"); err != nil { + t.Fatal(err) + } + if err := testMe2.Put(b); err != nil { + t.Fatal(err) + } + b = testMe2.Get() + if b.Len() != 0 { + t.Fatal("buffer not reset") + } + if err := testMe2.Put(b); err != nil { + t.Fatal(err) + } + }) + +}