...

Source file src/github.com/launchdarkly/go-server-sdk/v6/internal/broadcasters_test.go

Documentation: github.com/launchdarkly/go-server-sdk/v6/internal

     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