chore: fix test flakiness and add mock helper (#10956)

This commit is contained in:
Justin Starry 2020-07-08 20:46:16 +08:00 committed by GitHub
parent e50227745d
commit c06505934f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 89 additions and 72 deletions

View File

@ -16,6 +16,7 @@ import {url} from './url';
import {sleep} from '../src/util/sleep'; import {sleep} from '../src/util/sleep';
import {BLOCKHASH_CACHE_TIMEOUT_MS} from '../src/connection'; import {BLOCKHASH_CACHE_TIMEOUT_MS} from '../src/connection';
import type {SignatureStatus, TransactionError} from '../src/connection'; import type {SignatureStatus, TransactionError} from '../src/connection';
import {mockConfirmTransaction} from './mockrpc/confirm-transaction';
// Testing blockhash cache takes around 30s to complete // Testing blockhash cache takes around 30s to complete
jest.setTimeout(40000); jest.setTimeout(40000);
@ -1629,33 +1630,13 @@ test('transaction', async () => {
'0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
}, },
]); ]);
mockRpc.push([ const airdropFromSig = await connection.requestAirdrop(
url, accountFrom.publicKey,
{ minimumAmount + 100010,
method: 'getSignatureStatuses', );
params: [ mockConfirmTransaction(airdropFromSig);
[ await connection.confirmTransaction(airdropFromSig, 0);
'0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
],
],
},
{
error: null,
result: {
context: {
slot: 11,
},
value: [
{
slot: 0,
confirmations: 0,
status: {Ok: null},
err: null,
},
],
},
},
]);
mockRpc.push([ mockRpc.push([
url, 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( expect(await connection.getBalance(accountFrom.publicKey)).toBe(
minimumAmount + 100010, minimumAmount + 100010,
); );
@ -1767,34 +1743,7 @@ test('transaction', async () => {
{skipPreflight: true}, {skipPreflight: true},
); );
mockRpc.push([ mockConfirmTransaction(signature);
url,
{
method: 'getSignatureStatuses',
params: [
[
'1WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
],
],
},
{
error: null,
result: {
context: {
slot: 11,
},
value: [
{
slot: 0,
confirmations: 0,
status: {Ok: null},
err: null,
},
],
},
},
]);
let confirmResult = (await connection.confirmTransaction(signature, 0)).value; let confirmResult = (await connection.confirmTransaction(signature, 0)).value;
verifySignatureStatus(confirmResult); verifySignatureStatus(confirmResult);
@ -1826,6 +1775,9 @@ test('transaction', async () => {
expect(signature).not.toEqual(signature2); expect(signature).not.toEqual(signature2);
expect(transaction.recentBlockhash).not.toEqual(transaction2.recentBlockhash); expect(transaction.recentBlockhash).not.toEqual(transaction2.recentBlockhash);
mockConfirmTransaction(signature2);
await connection.confirmTransaction(signature2, 0);
mockRpc.push([ mockRpc.push([
url, url,
{ {
@ -1844,11 +1796,18 @@ test('transaction', async () => {
toPubkey: accountTo.publicKey, toPubkey: accountTo.publicKey,
lamports: 9, lamports: 9,
}); });
await connection.sendTransaction(transaction3, [accountFrom], { const signature3 = await connection.sendTransaction(
skipPreflight: true, transaction3,
}); [accountFrom],
{
skipPreflight: true,
},
);
expect(transaction2.recentBlockhash).toEqual(transaction3.recentBlockhash); expect(transaction2.recentBlockhash).toEqual(transaction3.recentBlockhash);
mockConfirmTransaction(signature3);
await connection.confirmTransaction(signature3, 0);
// Sleep until blockhash cache times out // Sleep until blockhash cache times out
await sleep( await sleep(
Math.max(0, 1000 + BLOCKHASH_CACHE_TIMEOUT_MS - (Date.now() - lastFetch)), Math.max(0, 1000 + BLOCKHASH_CACHE_TIMEOUT_MS - (Date.now() - lastFetch)),
@ -1873,9 +1832,15 @@ test('transaction', async () => {
lamports: 13, lamports: 13,
}); });
await connection.sendTransaction(transaction4, [accountFrom], { const signature4 = await connection.sendTransaction(
skipPreflight: true, transaction4,
}); [accountFrom],
{
skipPreflight: true,
},
);
mockConfirmTransaction(signature4);
await connection.confirmTransaction(signature4, 0);
expect(transaction4.recentBlockhash).not.toEqual( expect(transaction4.recentBlockhash).not.toEqual(
transaction3.recentBlockhash, transaction3.recentBlockhash,

View File

@ -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,
},
],
},
},
]);
}

View File

@ -7,6 +7,7 @@ import {NONCE_ACCOUNT_LENGTH} from '../src/nonce-account';
import {mockRpc, mockRpcEnabled} from './__mocks__/node-fetch'; import {mockRpc, mockRpcEnabled} from './__mocks__/node-fetch';
import {mockGetRecentBlockhash} from './mockrpc/get-recent-blockhash'; import {mockGetRecentBlockhash} from './mockrpc/get-recent-blockhash';
import {url} from './url'; import {url} from './url';
import {mockConfirmTransaction} from './mockrpc/confirm-transaction';
if (!mockRpcEnabled) { if (!mockRpcEnabled) {
// Testing max commitment level takes around 20s to complete // 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([ mockRpc.push([
url, url,
@ -99,9 +105,15 @@ test('create and query nonce account', async () => {
authorizedPubkey: from.publicKey, authorizedPubkey: from.publicKey,
lamports: minimumAmount, lamports: minimumAmount,
}); });
await connection.sendTransaction(transaction, [from, nonceAccount], { const nonceSignature = await connection.sendTransaction(
skipPreflight: true, transaction,
}); [from, nonceAccount],
{
skipPreflight: true,
},
);
mockConfirmTransaction(nonceSignature);
await connection.confirmTransaction(nonceSignature, 0);
mockRpc.push([ mockRpc.push([
url, 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([ mockRpc.push([
url, url,
@ -216,7 +233,11 @@ test('create and query nonce account with seed', async () => {
authorizedPubkey: from.publicKey, authorizedPubkey: from.publicKey,
lamports: minimumAmount, 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([ mockRpc.push([
url, url,