Skip to content

Commit

Permalink
added a new test TestRefreshWillNotifySubscribers
Browse files Browse the repository at this point in the history
To cover periodic timeout update
  • Loading branch information
dkrotx committed Sep 12, 2024
1 parent 21f3717 commit 9030438
Showing 1 changed file with 43 additions and 3 deletions.
46 changes: 43 additions & 3 deletions common/membership/hashring_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func Test_ring_compareMembers(t *testing.T) {

type hashringTestData struct {
mockPeerProvider *MockPeerProvider
mockTimeSource clock.TimeSource
mockTimeSource clock.MockedTimeSource
hashRing *ring
}

Expand All @@ -111,7 +111,13 @@ func newHashringTestData(t *testing.T) *hashringTestData {
td.mockPeerProvider = NewMockPeerProvider(ctrl)
td.mockTimeSource = clock.NewMockedTimeSourceAt(time.Now())

td.hashRing = newHashring("test-service", td.mockPeerProvider, td.mockTimeSource, log.NewNoop(), metrics.NoopScope(0))
td.hashRing = newHashring(
"test-service",
td.mockPeerProvider,
td.mockTimeSource,
log.NewNoop(),
metrics.NoopScope(0),
)

return &td
}
Expand Down Expand Up @@ -153,7 +159,6 @@ func TestRefreshWillNotifySubscribers(t *testing.T) {
td.mockPeerProvider.EXPECT().Subscribe(gomock.Any(), gomock.Any()).Times(1)
td.mockPeerProvider.EXPECT().GetMembers("test-service").Times(2).DoAndReturn(func(service string) ([]HostInfo, error) {
hostsToReturn = randomHostInfo(5)
time.Sleep(time.Millisecond * 70)
return hostsToReturn, nil
})

Expand Down Expand Up @@ -188,6 +193,41 @@ func TestRefreshWillNotifySubscribers(t *testing.T) {
assert.ElementsMatch(t, td.hashRing.Members(), hostsToReturn, "members should contain just-added nodes")
}

func TestSubscribersAreNotifiedPeriodically(t *testing.T) {
td := newHashringTestData(t)

var hostsToReturn []HostInfo

td.mockPeerProvider.EXPECT().Subscribe(gomock.Any(), gomock.Any()).Times(1)
td.mockPeerProvider.EXPECT().GetMembers("test-service").Times(3).DoAndReturn(func(service string) ([]HostInfo, error) {
// we have to change members since subscribers are only notified on change
hostsToReturn = randomHostInfo(5)
return hostsToReturn, nil
})
td.mockPeerProvider.EXPECT().WhoAmI().AnyTimes()

td.hashRing.Start()

var changeCh = make(chan *ChangedEvent, 1)
assert.NoError(t, td.hashRing.Subscribe("subscriber1", changeCh))

wg := sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
event := <-changeCh
assert.Empty(t, event, "event should be empty when periodical update happens")
}()

td.mockTimeSource.BlockUntil(1) // we should wait until ticker(defaultRefreshInterval) is created
td.mockTimeSource.Advance(defaultRefreshInterval) // and only then to advance time

wg.Wait() // wait until subscriber will get notification

// Test if internal members are updated
assert.ElementsMatch(t, td.hashRing.Members(), hostsToReturn, "members should contain just-added nodes")
}

func TestSubscribeIgnoresDuplicates(t *testing.T) {
var changeCh = make(chan *ChangedEvent)
td := newHashringTestData(t)
Expand Down

0 comments on commit 9030438

Please sign in to comment.