Add in-process event bus with ring buffer for workflow event broadcasting
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
package eventbus
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestRingBuffer_PushPop(t *testing.T) {
|
||||
ring := NewRingBuffer[int](5)
|
||||
|
||||
ring.Push(1)
|
||||
ring.Push(2)
|
||||
ring.Push(3)
|
||||
|
||||
v, ok := ring.Pop()
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, 1, v)
|
||||
|
||||
v, ok = ring.Pop()
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, 2, v)
|
||||
|
||||
v, ok = ring.Pop()
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, 3, v)
|
||||
}
|
||||
|
||||
func TestRingBuffer_Empty(t *testing.T) {
|
||||
ring := NewRingBuffer[int](5)
|
||||
|
||||
v, ok := ring.Pop()
|
||||
assert.False(t, ok)
|
||||
assert.Equal(t, 0, v)
|
||||
}
|
||||
|
||||
func TestRingBuffer_OverwriteOldest(t *testing.T) {
|
||||
ring := NewRingBuffer[int](4)
|
||||
|
||||
ring.Push(1)
|
||||
ring.Push(2)
|
||||
ring.Push(3)
|
||||
ring.Push(4)
|
||||
ring.Push(5)
|
||||
ring.Push(6)
|
||||
|
||||
var values []int
|
||||
for {
|
||||
v, ok := ring.Pop()
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
values = append(values, v)
|
||||
}
|
||||
|
||||
assert.Equal(t, []int{3, 4, 5, 6}, values)
|
||||
}
|
||||
|
||||
func TestRingBuffer_Len(t *testing.T) {
|
||||
ring := NewRingBuffer[int](5)
|
||||
|
||||
assert.Equal(t, 0, ring.Len())
|
||||
|
||||
ring.Push(1)
|
||||
assert.Equal(t, 1, ring.Len())
|
||||
|
||||
ring.Push(2)
|
||||
ring.Push(3)
|
||||
assert.Equal(t, 3, ring.Len())
|
||||
|
||||
ring.Pop()
|
||||
assert.Equal(t, 2, ring.Len())
|
||||
|
||||
ring.Push(4)
|
||||
ring.Push(5)
|
||||
ring.Push(6)
|
||||
ring.Push(7)
|
||||
assert.Equal(t, 5, ring.Len())
|
||||
|
||||
ring.Push(8)
|
||||
assert.Equal(t, 5, ring.Len())
|
||||
}
|
||||
|
||||
func TestRingBuffer_Concurrent(t *testing.T) {
|
||||
ring := NewRingBuffer[int](100)
|
||||
var wg sync.WaitGroup
|
||||
|
||||
for i := 0; i < 10; i++ {
|
||||
wg.Add(1)
|
||||
go func(id int) {
|
||||
defer wg.Done()
|
||||
for j := 0; j < 100; j++ {
|
||||
ring.Push(id*100 + j)
|
||||
}
|
||||
}(i)
|
||||
}
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for i := 0; i < 500; i++ {
|
||||
ring.Pop()
|
||||
}
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
Reference in New Issue
Block a user