From c06505934f23a6a4fb03cb77e942ec99a19516d4 Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Wed, 8 Jul 2020 20:46:16 +0800 Subject: [PATCH] chore: fix test flakiness and add mock helper (#10956) --- web3.js/test/connection.test.js | 97 +++++++-------------- web3.js/test/mockrpc/confirm-transaction.js | 31 +++++++ web3.js/test/nonce.test.js | 33 +++++-- 3 files changed, 89 insertions(+), 72 deletions(-) create mode 100644 web3.js/test/mockrpc/confirm-transaction.js diff --git a/web3.js/test/connection.test.js b/web3.js/test/connection.test.js index 2613fea71..610bdbf63 100644 --- a/web3.js/test/connection.test.js +++ b/web3.js/test/connection.test.js @@ -16,6 +16,7 @@ import {url} from './url'; import {sleep} from '../src/util/sleep'; import {BLOCKHASH_CACHE_TIMEOUT_MS} from '../src/connection'; import type {SignatureStatus, TransactionError} from '../src/connection'; +import {mockConfirmTransaction} from './mockrpc/confirm-transaction'; // Testing blockhash cache takes around 30s to complete jest.setTimeout(40000); @@ -1629,33 +1630,13 @@ test('transaction', async () => { '0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', }, ]); - mockRpc.push([ - url, - { - method: 'getSignatureStatuses', - params: [ - [ - '0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', - ], - ], - }, - { - error: null, - result: { - context: { - slot: 11, - }, - value: [ - { - slot: 0, - confirmations: 0, - status: {Ok: null}, - err: null, - }, - ], - }, - }, - ]); + const airdropFromSig = await connection.requestAirdrop( + accountFrom.publicKey, + minimumAmount + 100010, + ); + mockConfirmTransaction(airdropFromSig); + await connection.confirmTransaction(airdropFromSig, 0); + mockRpc.push([ url, { @@ -1672,11 +1653,6 @@ test('transaction', async () => { }, }, ]); - const airdropFromSig = await connection.requestAirdrop( - accountFrom.publicKey, - minimumAmount + 100010, - ); - await connection.confirmTransaction(airdropFromSig, 0); expect(await connection.getBalance(accountFrom.publicKey)).toBe( minimumAmount + 100010, ); @@ -1767,34 +1743,7 @@ test('transaction', async () => { {skipPreflight: true}, ); - mockRpc.push([ - url, - { - method: 'getSignatureStatuses', - params: [ - [ - '1WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', - ], - ], - }, - { - error: null, - result: { - context: { - slot: 11, - }, - value: [ - { - slot: 0, - confirmations: 0, - status: {Ok: null}, - err: null, - }, - ], - }, - }, - ]); - + mockConfirmTransaction(signature); let confirmResult = (await connection.confirmTransaction(signature, 0)).value; verifySignatureStatus(confirmResult); @@ -1826,6 +1775,9 @@ test('transaction', async () => { expect(signature).not.toEqual(signature2); expect(transaction.recentBlockhash).not.toEqual(transaction2.recentBlockhash); + mockConfirmTransaction(signature2); + await connection.confirmTransaction(signature2, 0); + mockRpc.push([ url, { @@ -1844,11 +1796,18 @@ test('transaction', async () => { toPubkey: accountTo.publicKey, lamports: 9, }); - await connection.sendTransaction(transaction3, [accountFrom], { - skipPreflight: true, - }); + const signature3 = await connection.sendTransaction( + transaction3, + [accountFrom], + { + skipPreflight: true, + }, + ); expect(transaction2.recentBlockhash).toEqual(transaction3.recentBlockhash); + mockConfirmTransaction(signature3); + await connection.confirmTransaction(signature3, 0); + // Sleep until blockhash cache times out await sleep( Math.max(0, 1000 + BLOCKHASH_CACHE_TIMEOUT_MS - (Date.now() - lastFetch)), @@ -1873,9 +1832,15 @@ test('transaction', async () => { lamports: 13, }); - await connection.sendTransaction(transaction4, [accountFrom], { - skipPreflight: true, - }); + const signature4 = await connection.sendTransaction( + transaction4, + [accountFrom], + { + skipPreflight: true, + }, + ); + mockConfirmTransaction(signature4); + await connection.confirmTransaction(signature4, 0); expect(transaction4.recentBlockhash).not.toEqual( transaction3.recentBlockhash, diff --git a/web3.js/test/mockrpc/confirm-transaction.js b/web3.js/test/mockrpc/confirm-transaction.js new file mode 100644 index 000000000..873900e4f --- /dev/null +++ b/web3.js/test/mockrpc/confirm-transaction.js @@ -0,0 +1,31 @@ +// @flow + +import type {TransactionSignature} from '../../src/transaction'; +import {url} from '../url'; +import {mockRpc} from '../__mocks__/node-fetch'; + +export function mockConfirmTransaction(signature: TransactionSignature) { + mockRpc.push([ + url, + { + method: 'getSignatureStatuses', + params: [[signature]], + }, + { + error: null, + result: { + context: { + slot: 11, + }, + value: [ + { + slot: 0, + confirmations: null, + status: {Ok: null}, + err: null, + }, + ], + }, + }, + ]); +} diff --git a/web3.js/test/nonce.test.js b/web3.js/test/nonce.test.js index fe12d3dbb..28b52bdd6 100644 --- a/web3.js/test/nonce.test.js +++ b/web3.js/test/nonce.test.js @@ -7,6 +7,7 @@ import {NONCE_ACCOUNT_LENGTH} from '../src/nonce-account'; import {mockRpc, mockRpcEnabled} from './__mocks__/node-fetch'; import {mockGetRecentBlockhash} from './mockrpc/get-recent-blockhash'; import {url} from './url'; +import {mockConfirmTransaction} from './mockrpc/confirm-transaction'; if (!mockRpcEnabled) { // Testing max commitment level takes around 20s to complete @@ -58,7 +59,12 @@ test('create and query nonce account', async () => { }, ]); - await connection.requestAirdrop(from.publicKey, minimumAmount * 2); + const signature = await connection.requestAirdrop( + from.publicKey, + minimumAmount * 2, + ); + mockConfirmTransaction(signature); + await connection.confirmTransaction(signature, 0); mockRpc.push([ url, @@ -99,9 +105,15 @@ test('create and query nonce account', async () => { authorizedPubkey: from.publicKey, lamports: minimumAmount, }); - await connection.sendTransaction(transaction, [from, nonceAccount], { - skipPreflight: true, - }); + const nonceSignature = await connection.sendTransaction( + transaction, + [from, nonceAccount], + { + skipPreflight: true, + }, + ); + mockConfirmTransaction(nonceSignature); + await connection.confirmTransaction(nonceSignature, 0); mockRpc.push([ url, @@ -173,7 +185,12 @@ test('create and query nonce account with seed', async () => { }, ]); - await connection.requestAirdrop(from.publicKey, minimumAmount * 2); + const signature = await connection.requestAirdrop( + from.publicKey, + minimumAmount * 2, + ); + mockConfirmTransaction(signature); + await connection.confirmTransaction(signature, 0); mockRpc.push([ url, @@ -216,7 +233,11 @@ test('create and query nonce account with seed', async () => { authorizedPubkey: from.publicKey, lamports: minimumAmount, }); - await connection.sendTransaction(transaction, [from], {skipPreflight: true}); + const nonceSignature = await connection.sendTransaction(transaction, [from], { + skipPreflight: true, + }); + mockConfirmTransaction(nonceSignature); + await connection.confirmTransaction(nonceSignature, 0); mockRpc.push([ url,