rpcsrv: allow one-block slippage in TestWSClient_SubscriptionsCompat

Close #2956. The failure reason is similar to the one described in #3396
for TestNotary: Blockchain's notificationDispatcher is listening to
block events from storeBlock via separate channel. By the moment single
block addition is finished, notification may or may not be properly
handled by notificationDispatcher, especially given the fact that our
runners are slow. As a result, assert.Eventually with 1-second awaiting
period may fail. This issue is solved by adding one more block, because
the second AddBlock finishes only when it sends block addition event to
notificationDispatcher loop, which means that the previous event was
handled.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
This commit is contained in:
Anna Shaleva 2024-04-04 10:53:52 +03:00
parent b1a986fba8
commit ef3ec190d0

View file

@ -2124,19 +2124,20 @@ func TestWSClient_SubscriptionsCompat(t *testing.T) {
blocks := getTestBlocks(t) blocks := getTestBlocks(t)
bCount := uint32(0) bCount := uint32(0)
getData := func(t *testing.T) (*block.Block, byte, util.Uint160, string, string) { getData := func(t *testing.T) (*block.Block, *block.Block, byte, util.Uint160, string, string) {
b1 := blocks[bCount] b1 := blocks[bCount]
primary := b1.PrimaryIndex primary := b1.PrimaryIndex
tx := b1.Transactions[0] tx := b1.Transactions[0]
sender := tx.Sender() sender := tx.Sender()
ntfName := "Transfer" ntfName := "Transfer"
st := vmstate.Halt.String() st := vmstate.Halt.String()
bCount++ b2 := blocks[bCount+1]
return b1, primary, sender, ntfName, st bCount += 2
return b1, b2, primary, sender, ntfName, st
} }
checkRelevant := func(t *testing.T, filtered bool) { checkRelevant := func(t *testing.T, filtered bool) {
b, primary, sender, ntfName, st := getData(t) b, bNext, primary, sender, ntfName, st := getData(t)
var ( var (
bID, txID, ntfID, aerID string bID, txID, ntfID, aerID string
blockCh = make(chan *block.Block) blockCh = make(chan *block.Block)
@ -2212,6 +2213,10 @@ func TestWSClient_SubscriptionsCompat(t *testing.T) {
// Accept the next block and wait for events. // Accept the next block and wait for events.
require.NoError(t, chain.AddBlock(b)) require.NoError(t, chain.AddBlock(b))
// Blockchain's events channel is not buffered, and thus, by adding one more extra block
// we're ensuring that the previous block event receiving was successfully handled by Blockchain's
// notificationDispatcher loop. Once we're sure in that, we may start to check the actual notifications.
require.NoError(t, chain.AddBlock(bNext))
assert.Eventually(t, func() bool { assert.Eventually(t, func() bool {
lock.RLock() lock.RLock()
defer lock.RUnlock() defer lock.RUnlock()