From 5f15e8e3b64a8b208e1676d5a659b6fd11fb0b50 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Fri, 5 Mar 2021 19:57:36 +0100 Subject: [PATCH] ringbuffer: add tests and benchmarks --- Makefile | 12 ++++ pkg/ringbuffer/ringbuffer_test.go | 114 ++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 pkg/ringbuffer/ringbuffer_test.go diff --git a/Makefile b/Makefile index 39e9848c..8a00b150 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ help: @echo " format format source files" @echo " test run tests" @echo " lint run linter" + @echo " bench run benchmarks" @echo "" blank := @@ -65,3 +66,14 @@ lint: docker run --rm -v $(PWD):/app -w /app \ $(LINT_IMAGE) \ golangci-lint run -v + +bench: + echo "$$DOCKERFILE_TEST" | docker build -q . -f - -t temp + docker run --rm -it \ + --network=host \ + --name temp \ + temp \ + make bench-nodocker + +bench-nodocker: + go test -bench=. -v ./pkg/ringbuffer diff --git a/pkg/ringbuffer/ringbuffer_test.go b/pkg/ringbuffer/ringbuffer_test.go new file mode 100644 index 00000000..9259a325 --- /dev/null +++ b/pkg/ringbuffer/ringbuffer_test.go @@ -0,0 +1,114 @@ +package ringbuffer + +import ( + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestPushBeforePull(t *testing.T) { + r := New(1024) + defer r.Close() + + data := make([]byte, 1024) + rand.Read(data) + + r.Push(data) + ret, ok := r.Pull() + require.Equal(t, true, ok) + require.Equal(t, data, ret) +} + +func TestPullBeforePush(t *testing.T) { + r := New(1024) + defer r.Close() + + data := make([]byte, 1024) + rand.Read(data) + + done := make(chan struct{}) + go func() { + defer close(done) + ret, ok := r.Pull() + require.Equal(t, true, ok) + require.Equal(t, data, ret) + }() + + time.Sleep(100 * time.Millisecond) + + r.Push(data) + <-done +} + +func BenchmarkPushPullContinuous(b *testing.B) { + r := New(1024 * 8) + defer r.Close() + + data := make([]byte, 1024) + + for n := 0; n < b.N; n++ { + done := make(chan struct{}) + go func() { + defer close(done) + for i := 0; i < 1024*8; i++ { + r.Push(data) + } + }() + + for i := 0; i < 1024*8; i++ { + r.Pull() + } + + <-done + } +} + +func BenchmarkPushPullPaused5(b *testing.B) { + r := New(128) + defer r.Close() + + data := make([]byte, 1024) + + for n := 0; n < b.N; n++ { + done := make(chan struct{}) + go func() { + defer close(done) + for i := 0; i < 128; i++ { + r.Push(data) + time.Sleep(5 * time.Millisecond) + } + }() + + for i := 0; i < 128; i++ { + r.Pull() + } + + <-done + } +} + +func BenchmarkPushPullPaused10(b *testing.B) { + r := New(1024 * 8) + defer r.Close() + + data := make([]byte, 1024) + + for n := 0; n < b.N; n++ { + done := make(chan struct{}) + go func() { + defer close(done) + for i := 0; i < 128; i++ { + r.Push(data) + time.Sleep(10 * time.Millisecond) + } + }() + + for i := 0; i < 128; i++ { + r.Pull() + } + + <-done + } +}