The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/pkg/storage/unified/resource/broadcaster_test.go

144 lines
2.8 KiB

package resource
import (
"context"
"testing"
"github.com/stretchr/testify/require"
)
func TestCache(t *testing.T) {
c := newChannelCache[int](context.Background(), 10)
e := []int{}
err := c.Range(func(i int) error {
e = append(e, i)
return nil
})
require.Nil(t, err)
require.Equal(t, 0, len(e))
c.Add(1)
e = []int{}
err = c.Range(func(i int) error {
e = append(e, i)
return nil
})
require.Nil(t, err)
require.Equal(t, 1, len(e))
require.Equal(t, []int{1}, e)
require.Equal(t, 1, c.Get(0))
c.Add(2)
c.Add(3)
c.Add(4)
c.Add(5)
c.Add(6)
// should be able to range over values
e = []int{}
err = c.Range(func(i int) error {
e = append(e, i)
return nil
})
require.Nil(t, err)
require.Equal(t, 6, len(e))
require.Equal(t, []int{1, 2, 3, 4, 5, 6}, e)
// should be able to get length
require.Equal(t, 6, c.Len())
// should be able to get values
require.Equal(t, 1, c.Get(0))
require.Equal(t, 6, c.Get(5))
// zero value beyond cache size
require.Equal(t, 0, c.Get(6))
require.Equal(t, 0, c.Get(20))
require.Equal(t, 0, c.Get(-10))
// slice should return all values
require.Equal(t, []int{1, 2, 3, 4, 5, 6}, c.Slice())
c.Add(7)
c.Add(8)
c.Add(9)
c.Add(10)
c.Add(11)
// should be able to range over values
e = []int{}
err = c.Range(func(i int) error {
e = append(e, i)
return nil
})
require.Nil(t, err)
require.Equal(t, 10, len(e))
require.Equal(t, []int{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, e)
// should be able to get length
require.Equal(t, 10, c.Len())
// should be able to get values
require.Equal(t, 2, c.Get(0))
require.Equal(t, 3, c.Get(1))
// slice should return all values
require.Equal(t, []int{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, c.Slice())
c.Add(12)
c.Add(13)
// should be able to range over values
e = []int{}
err = c.Range(func(i int) error {
e = append(e, i)
return nil
})
require.Nil(t, err)
require.Equal(t, 10, len(e))
require.Equal(t, []int{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, e)
require.Equal(t, 4, c.Get(0))
require.Equal(t, 5, c.Get(1))
// slice should return all values
require.Equal(t, []int{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, c.Slice())
}
func TestBroadcaster(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
ch := make(chan int)
input := []int{1, 2, 3}
go func() {
for _, v := range input {
ch <- v
}
}()
t.Cleanup(func() {
close(ch)
})
b, err := NewBroadcaster(ctx, func(out chan<- int) error {
go func() {
for v := range ch {
out <- v
}
}()
return nil
})
require.NoError(t, err)
sub, err := b.Subscribe(ctx)
require.NoError(t, err)
for _, expected := range input {
v, ok := <-sub
require.True(t, ok)
require.Equal(t, expected, v)
}
// cancel the context should close the stream
cancel()
_, ok := <-sub
require.False(t, ok)
}