services: allow some slippage in TestNotary

1. Allow 1-block slippage for multisignature request block generation to
   ensure that PostPersist for fb's NVB-th block is properly finished.
2. Allow 1-block slippage before sent request checks to ensure that
   PostPersist for NVB fb's NVB-th block was finished and all
   stale mains were properly marked by Notary service.

Overall, this commits ports the approach of #3390 to the whole test.

Close #3366.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
This commit is contained in:
Anna Shaleva 2024-04-03 17:44:44 +03:00
parent be1b97d04e
commit 4c288720cd

View file

@ -492,6 +492,8 @@ func TestNotary(t *testing.T) {
ntr1.UpdateNotaryNodes(keys.PublicKeys{randomAcc.PublicKey()})
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, r, 1, false)
checkFallbackTxs(t, r, false)
@ -504,10 +506,14 @@ func TestNotary(t *testing.T) {
// check PostPersist with finalisation error
setFinalizeWithError(true)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
// check PostPersist without finalisation error
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), true)
// PostPersist: complete main transaction, multisignature account
@ -517,11 +523,15 @@ func TestNotary(t *testing.T) {
// check PostPersist with finalisation error
setFinalizeWithError(true)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
// check PostPersist without finalisation error
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), true)
checkFallbackTxs(t, requests, false)
@ -530,15 +540,19 @@ func TestNotary(t *testing.T) {
requests, requesters = checkCompleteStandardRequest(t, 3, false)
checkFallbackTxs(t, requests, false)
// make fallbacks valid
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
// check PostPersist for valid fallbacks with finalisation error
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
// check PostPersist for valid fallbacks without finalisation error
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, true)
@ -549,15 +563,19 @@ func TestNotary(t *testing.T) {
requests, requesters = checkCompleteMultisigRequest(t, nSigs, nKeys, false)
checkFallbackTxs(t, requests, false)
// make fallbacks valid
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
// check PostPersist for valid fallbacks with finalisation error
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
// check PostPersist for valid fallbacks without finalisation error
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests[:nSigs], true)
// the rest of fallbacks should also be applied even if the main tx was already constructed by the moment they were sent
@ -568,7 +586,7 @@ func TestNotary(t *testing.T) {
requests, requesters = checkCompleteStandardRequest(t, 5, false)
checkFallbackTxs(t, requests, false)
// make fallbacks valid
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
// some of fallbacks should fail finalisation
unluckies = []*payload.P2PNotaryRequest{requests[0], requests[4]}
@ -576,6 +594,8 @@ func TestNotary(t *testing.T) {
setChoosy(true)
// check PostPersist for lucky fallbacks
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, lucky, true)
checkFallbackTxs(t, unluckies, false)
@ -584,6 +604,8 @@ func TestNotary(t *testing.T) {
setFinalizeWithError(false)
// check PostPersist for unlucky fallbacks
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, lucky, true)
checkFallbackTxs(t, unluckies, true)
@ -596,12 +618,11 @@ func TestNotary(t *testing.T) {
requests, requesters = checkCompleteStandardRequest(t, 5, false, 1, 7, 11, 15, 19)
checkFallbackTxs(t, requests, false)
// generate blocks to reach the most earlier fallback's NVB
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
// Here and below add +1 slippage to ensure that PostPersist for (nvbDiffFallback+1) height is properly handled, i.e.
// to exclude race condition when main transaction is finalized between `finalizeWithError` disabling and new block addition.
e.GenerateNewBlocks(t, int((nvbDiffFallback+1)+1))
require.NoError(t, err)
// check PostPersist for valid fallbacks without finalisation error
// Add a block before allowing tx to be finalized without error to exclude race condition when
// main transaction is finalized between `finalizeWithError` disabling and new block addition.
e.AddNewBlock(t)
setFinalizeWithError(false)
for i := range requests {
e.AddNewBlock(t)
@ -620,13 +641,15 @@ func TestNotary(t *testing.T) {
requests, requesters = checkCompleteStandardRequest(t, 4, false)
checkFallbackTxs(t, requests, false)
// make fallbacks valid and remove one fallback
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
ntr1.UpdateNotaryNodes(keys.PublicKeys{randomAcc.PublicKey()})
ntr1.OnRequestRemoval(requests[3])
// non of the fallbacks should be completed
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
// set account back for the next tests
@ -638,13 +661,15 @@ func TestNotary(t *testing.T) {
requests, requesters = checkCompleteStandardRequest(t, 4, false)
checkFallbackTxs(t, requests, false)
// make fallbacks valid and remove one fallback
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
unlucky := requests[3]
ntr1.OnRequestRemoval(unlucky)
// rest of the fallbacks should be completed
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests[:3], true)
require.Nil(t, completedTxes[unlucky.FallbackTransaction.Hash()])
@ -653,7 +678,7 @@ func TestNotary(t *testing.T) {
setFinalizeWithError(true)
requests, requesters = checkCompleteStandardRequest(t, 4, false)
// remove all fallbacks
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
for i := range requests {
ntr1.OnRequestRemoval(requests[i])
@ -661,12 +686,16 @@ func TestNotary(t *testing.T) {
// then the whole request should be removed, i.e. there are no completed transactions
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
// OnRequestRemoval: signature request, remove unexisting fallback
ntr1.OnRequestRemoval(requests[0])
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
@ -678,13 +707,15 @@ func TestNotary(t *testing.T) {
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
// make fallbacks valid and remove the last fallback
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
unlucky = requests[nSigs-1]
ntr1.OnRequestRemoval(unlucky)
// then (m-1) out of n fallbacks should be completed
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests[:nSigs-1], true)
require.Nil(t, completedTxes[unlucky.FallbackTransaction.Hash()])
@ -695,7 +726,7 @@ func TestNotary(t *testing.T) {
setFinalizeWithError(true)
requests, requesters = checkCompleteMultisigRequest(t, nSigs, nKeys, false)
// make fallbacks valid and then remove all of them
e.GenerateNewBlocks(t, int(nvbDiffFallback))
e.GenerateNewBlocks(t, int(nvbDiffFallback+1))
require.NoError(t, err)
for i := range requests {
ntr1.OnRequestRemoval(requests[i])
@ -703,12 +734,16 @@ func TestNotary(t *testing.T) {
// then the whole request should be removed, i.e. there are no completed transactions
setFinalizeWithError(false)
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)
// // OnRequestRemoval: multisignature request, remove unexisting fallbac, i.e. there still shouldn't be any completed transactions after this
ntr1.OnRequestRemoval(requests[0])
e.AddNewBlock(t)
// Allow a single-block slippage since PostPersist is handled by Notary service via block notification routine.
e.AddNewBlock(t)
checkMainTx(t, requesters, requests, len(requests), false)
checkFallbackTxs(t, requests, false)