mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 01:32:08 +08:00

* add tests for broacaster * fix sql notifier not closing the stream * fix sql notifier not closing the stream * close sub * fix broadcaster test * fix broadcaster test * suggestion
145 lines
2.8 KiB
Go
145 lines
2.8 KiB
Go
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)
|
|
}
|