...
1 package internal
2
3 import (
4 "fmt"
5 "testing"
6 "time"
7
8 th "github.com/launchdarkly/go-test-helpers/v3"
9
10 "github.com/stretchr/testify/assert"
11 )
12
13 func TestBroadcaster(t *testing.T) {
14 var n int
15 testBroadcasterGenerically(t, NewBroadcaster[string],
16 func() string {
17 n += 1
18 return fmt.Sprintf("value%d", n)
19 })
20 }
21
22 func testBroadcasterGenerically[V any](t *testing.T, broadcasterFactory func() *Broadcaster[V], valueFactory func() V) {
23 timeout := time.Second
24
25 withBroadcaster := func(t *testing.T, action func(*Broadcaster[V])) {
26 b := broadcasterFactory()
27 defer b.Close()
28 action(b)
29 }
30
31 t.Run("broadcast with no subscribers", func(t *testing.T) {
32 withBroadcaster(t, func(b *Broadcaster[V]) {
33 b.Broadcast(valueFactory())
34 })
35 })
36
37 t.Run("broadcast with subscribers", func(t *testing.T) {
38 withBroadcaster(t, func(b *Broadcaster[V]) {
39 ch1 := b.AddListener()
40 ch2 := b.AddListener()
41
42 value := valueFactory()
43 b.Broadcast(value)
44
45 assert.Equal(t, value, th.RequireValue(t, ch1, timeout))
46 assert.Equal(t, value, th.RequireValue(t, ch2, timeout))
47 })
48 })
49
50 t.Run("unregister subscriber", func(t *testing.T) {
51 withBroadcaster(t, func(b *Broadcaster[V]) {
52 ch1 := b.AddListener()
53 ch2 := b.AddListener()
54
55 b.RemoveListener(ch1)
56 th.AssertChannelClosed(t, ch1, time.Millisecond)
57
58 value := valueFactory()
59 b.Broadcast(value)
60
61 assert.Equal(t, value, th.RequireValue(t, ch2, timeout))
62 })
63 })
64
65 t.Run("hasListeners", func(t *testing.T) {
66 withBroadcaster(t, func(b *Broadcaster[V]) {
67 assert.False(t, b.HasListeners())
68
69 ch1 := b.AddListener()
70 ch2 := b.AddListener()
71
72 assert.True(t, b.HasListeners())
73
74 b.RemoveListener(ch1)
75
76 assert.True(t, b.HasListeners())
77
78 b.RemoveListener(ch2)
79
80 assert.False(t, b.HasListeners())
81 })
82 })
83 }
84
View as plain text