From 8c2d37e093ca64d591fc0aec15a7e2ed424b2e47 Mon Sep 17 00:00:00 2001 From: hozan23 Date: Thu, 13 Jun 2024 06:02:24 +0200 Subject: use message dispatcher to process responses and notifications & spread out comments --- jsonrpc/client/message_dispatcher_test.go | 101 ++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 jsonrpc/client/message_dispatcher_test.go (limited to 'jsonrpc/client/message_dispatcher_test.go') diff --git a/jsonrpc/client/message_dispatcher_test.go b/jsonrpc/client/message_dispatcher_test.go new file mode 100644 index 0000000..7cc1366 --- /dev/null +++ b/jsonrpc/client/message_dispatcher_test.go @@ -0,0 +1,101 @@ +package client + +import ( + // "sync" + // "sync/atomic" + + "sync" + "sync/atomic" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDispatchToChannel(t *testing.T) { + + messageDispatcher := newMessageDispatcher[int, int](10) + + chanKey := 1 + rx := messageDispatcher.register(chanKey) + + chanKey2 := 2 + rx2 := messageDispatcher.register(chanKey2) + + var wg sync.WaitGroup + + wg.Add(1) + go func() { + for i := 0; i < 50; i++ { + err := messageDispatcher.disptach(chanKey, i) + assert.Nil(t, err) + } + + messageDispatcher.unregister(chanKey) + wg.Done() + }() + + wg.Add(1) + go func() { + for i := 0; i < 50; i++ { + err := messageDispatcher.disptach(chanKey2, i) + assert.Nil(t, err) + } + + messageDispatcher.unregister(chanKey2) + wg.Done() + }() + + var receivedItem atomic.Int32 + + wg.Add(1) + go func() { + for range rx { + receivedItem.Add(1) + } + wg.Done() + }() + + wg.Add(1) + go func() { + for range rx2 { + receivedItem.Add(1) + } + wg.Done() + }() + + wg.Wait() + assert.Equal(t, receivedItem.Load(), int32(100)) +} + +func TestUnregisterChannel(t *testing.T) { + messageDispatcher := newMessageDispatcher[int, int](1) + + chanKey := 1 + rx := messageDispatcher.register(chanKey) + + messageDispatcher.unregister(chanKey) + assert.Equal(t, messageDispatcher.length(), 0, "channels should be empty") + + _, ok := <-rx + assert.False(t, ok, "chan closed") + + err := messageDispatcher.disptach(chanKey, 1) + assert.NotNil(t, err) +} + +func TestClearChannels(t *testing.T) { + + messageDispatcher := newMessageDispatcher[int, int](1) + + chanKey := 1 + rx := messageDispatcher.register(chanKey) + + messageDispatcher.clear() + assert.Equal(t, messageDispatcher.length(), 0, "channels should be empty") + + _, ok := <-rx + assert.False(t, ok, "chan closed") + + err := messageDispatcher.disptach(chanKey, 1) + assert.NotNil(t, err) +} -- cgit v1.2.3