Skip to content

Commit

Permalink
perf/integration tests: Preparing for precalculated wallet addresses …
Browse files Browse the repository at this point in the history
…lib feature (#189)

* feat: new benchmark utils

* feat: new wallet address precalculation tool

* test: integrates precalculated wallets into tests

* fix: wallet generation script discarding relevant data

* style: eslint fixes

* test: skipping all multisig tests

* test: basic wallet precalculation helper tests passing

* test: persistent storage interaction for wallet precalculation

* test: increased test coverage for the precalculation helper

* docs: adds jsdocs to precalculation helper methods and interactions

* test: adds coverage to new address pre-calculation parameter

* test: removes developer scripts from application code coverage

* refactor: moved test constants to new file

* ci: force exit on tests

* test: skip multisig start test

* ci: removes force exit on mocked tests

* docs: adjustments to jsdocs

* test: generate all multisig wallets for a group of seeds

* ci: fix open connection handles at the end of the tests

* test: stopping the wallet before each '/start' test

* ci: added async to beforeEach to prevent issues

* docs: adds missing jsdocs and improves existing ones

* fix: multisig generation flag and precalculated addresses

* test: removing skip from multisig tests

* refactor: moves ./src/utils folder to ./scripts

* chore: updated wallet-lib version to 0.36.0

* docs: adds file headers to new helpers and utils

* refactor: reusing existing lib constants

* docs: clarifies location of addresses storage

* fix: updating wallet benchmark failure flag on error

* refactor: removes obsolete parameter from startMultipleWalletsForTest

* docs: clarifies and updates WalletData typedef

* fix: transaction summary amount

* docs: clarifies wallets file update on test setup

* docs: instructions on how to use the generate_wallets script

* feat: common wallet addresses generated using lib utils

Before, the full wallet constructor was being used.

* refactor: generating multisig wallets directly from lib methods

Before they were generated using the complete wallet instance.

* style: improved generator function name

* refactor: moved wallet-precalculation.helper.js to /scripts/helpers

* docs: fixes ambiguity on the docs and constant variables

* refactor: moved 24-word seed generation to common wallet code branch

* chore: removing used wallets json file at the end of the tests
  • Loading branch information
tuliomir authored May 12, 2022
1 parent ae1396d commit 1e134ba
Show file tree
Hide file tree
Showing 32 changed files with 1,720 additions and 378 deletions.
18 changes: 9 additions & 9 deletions __tests__/integration/address-info.test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import {
getRandomInt,
HATHOR_TOKEN_ID,
TestUtils,
WALLET_CONSTANTS,
} from './utils/test-utils-integration';
import { TestUtils } from './utils/test-utils-integration';
import { HATHOR_TOKEN_ID, WALLET_CONSTANTS } from './configuration/test-constants';
import { getRandomInt } from './utils/core.util';
import { WalletHelper } from './utils/wallet-helper';

describe('address-info routes', () => {
Expand All @@ -16,12 +13,15 @@ describe('address-info routes', () => {
beforeAll(async () => {
try {
// A random HTR value for the first wallet
wallet1 = new WalletHelper('addinfo-1');
wallet1 = WalletHelper.getPrecalculatedWallet('addinfo-1');
// A fixed custom token amount for the second wallet
wallet2 = new WalletHelper('addinfo-2');
wallet2 = WalletHelper.getPrecalculatedWallet('addinfo-2');
minerWallet = new WalletHelper(
WALLET_CONSTANTS.miner.walletId,
{ words: WALLET_CONSTANTS.miner.words }
{
words: WALLET_CONSTANTS.miner.words,
preCalculatedAddresses: WALLET_CONSTANTS.miner.addresses
}
);

await WalletHelper.startMultipleWalletsForTest([wallet1, wallet2, minerWallet]);
Expand Down
15 changes: 10 additions & 5 deletions __tests__/integration/balance.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { getRandomInt, TestUtils, WALLET_CONSTANTS } from './utils/test-utils-integration';
import { getRandomInt } from './utils/core.util';
import { TestUtils } from './utils/test-utils-integration';
import { WALLET_CONSTANTS } from './configuration/test-constants';
import { WalletHelper } from './utils/wallet-helper';

describe('balance routes', () => {
Expand All @@ -12,14 +14,17 @@ describe('balance routes', () => {
beforeAll(async () => {
try {
// First wallet, no balance
wallet1 = new WalletHelper('balance1');
wallet1 = WalletHelper.getPrecalculatedWallet('balance1');
// Second wallet, random balance
wallet2 = new WalletHelper('balance2');
wallet2 = WalletHelper.getPrecalculatedWallet('balance2');
// Third wallet, balance to be used for custom tokens
wallet3 = new WalletHelper('custom3');
wallet3 = WalletHelper.getPrecalculatedWallet('custom3');
minerWallet = new WalletHelper(
WALLET_CONSTANTS.miner.walletId,
{ words: WALLET_CONSTANTS.miner.words }
{
words: WALLET_CONSTANTS.miner.words,
preCalculatedAddresses: WALLET_CONSTANTS.miner.addresses
}
);

await WalletHelper.startMultipleWalletsForTest([wallet1, wallet2, wallet3, minerWallet]);
Expand Down

Large diffs are not rendered by default.

102 changes: 102 additions & 0 deletions __tests__/integration/configuration/precalculated-wallets.json

Large diffs are not rendered by default.

85 changes: 85 additions & 0 deletions __tests__/integration/configuration/test-constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { constants as libConstants, transaction as transactionUtils } from '@hathor/wallet-lib';

/**
* @type {Record<string,WalletData>}
*/
export const WALLET_CONSTANTS = {
genesis: {
walletId: 'genesiswallet',
words: 'avocado spot town typical traffic vault danger century property shallow divorce festival spend attack anchor afford rotate green audit adjust fade wagon depart level',
addresses: [
'WPhehTyNHTPz954CskfuSgLEfuKXbXeK3f',
'WY1URKUnqCTyiixW1Dw29vmeG99hNN4EW6', // Genesis funds, index 1
'WRTFYzhTHkfYwub8EWVtAcUgbdUpsYMBpb',
'WhpJeUtBLrDHbKDoMC9ffMxwHqvsrNzTFV',
'WeBBm1LfKBH3V5rEL5DAHtjjDiAws3Z83m',
'WWTNERwV3dcvWjCbR4rizMuEqPbFjZsd3C',
'WR4EQB8wZUzsVnqhodBBbtYsvKxrr9puG7',
'WjJZoqV3AbRfgBWNfjAyVYTydFuWNPgspW',
'Wh2FHvahkwvt29saUz7jnhuDh3WDHuc2ZY',
'Wg5bXXQpRE5DWwsGDNfHsKyisJPVotxhhS',
'WiodAJyH67sSTGgpRPXWsVGEfGESN7ykEt',
'WNpFPr1EDwBgtTqYUNTbKTRpbGj6vdNgdL',
'WVPeyNm4pWjJJixjj1DsRc4ceYd75xCyxq',
'WcZotwyy1FnFYuA8D2LqrUBSNEFcPr3T7a',
'Wki6BdLTCzS4ZoQSY1QgfgzQdgT9R3txEb',
'Wgk7UPN4zZZdMbsCNMSosRwsvHtMoWf8S6',
'Wmqn3sanBexFaNk3nDtdb4SnHxB5MRzr7m',
'Wbh9FrUF85FWUh7xgpqf9gjH7D2f3Py4kc',
'WWGKeK7yJcKqvxMj2C8TFFJLooqq8Kc65z',
'WRenJ9f6yqrYRzBUwqbBFAxAY7JzwryKut',
'WQozCB8X2FFM9QtEMoPjo6xERVTkiBw8Mj',
'Wds8d4vy691GwVDdzKrw1LpnvBR283VTci',
]
},
miner: {
walletId: 'miner-wallet',
words: 'scare more mobile text erupt flush paper snack despair goddess route solar keep search result author bounce pulp shine next butter unknown frozen trap',
addresses: [
'WTjhJXzQJETVx7BVXdyZmvk396DRRsubdw', // Miner rewards address
'Wdf7xQtKDNefhd6KTS68Vna1u4wUAyHjLQ',
'WaQf5igKpbdNyxTBzc3Nv8a8n4DRkcbpmX',
'WYzcaxpK4x8XjZKkvcpb5CXKuEsfAsD3vD',
'WjfMPKn7prjXUdzp7dFAxuDGreSTArnScE',
'WVE1uwNor9Haitx2qGu9SB4uv4wVwGAWDP',
'WbDaM4VGcWMBXPihJrViiYDphM7WoGDMWQ',
'WgPiV4KvwaeKeRxj434ZjkvakX23hBhLyd',
'We1t89h3YJuj9eU1SGfNwamk9FRBv3GhgD',
'WeDLxQhv4vs4K8HVy4FUPBWSsN49rNYGKd',
'WetZFhUkFqfv73k7AzcQm95vnRHCRzH7vQ',
'WNgP5CEqhW4yMLjARi7JVMh9iapnUcTQtG',
'WUr1RDAZVLY7w6M5M416uXLxpFekcXz1WH',
'WexLCpMTBdgAbhH8Br2sCn6SPu44CZWSpK',
'WWUdwEecrcFTdaFz1ZkeL1ZzyRg4YsvnY7',
'WmpwqZg1KCQvBMxaE6BLgFrSv2AZS1FCw5',
'WfiWuwxqcJMPSfjpDhqtRfW3sDg78hg34y',
'Wh781JkXsumkTZKMKZmV4BjV8Nnjevkxkk',
'Wb6792ceTDSJdySvQm7tikrNva4FRuVsUX',
'WYZigDNfJ6x5T7VfVrgd1CtkKGfoBRRbyr',
'WWGWrrUqpbP4ekx4zoNtBsrhCSEspxpDyA',
'WgWfrJqAgS3RwzXMMz8fywidQAUx6a5smc'
]
},
};

export const TOKEN_DATA = {
HTR: 0,
TOKEN: 1,

/**
* Checks if this token_data indicates this is an authority output, that is, if its 8th bit from
* the right is 1.
* @see https://github.com/HathorNetwork/rfcs/blob/master/text/0004-tokens.md#token_data-field
* @param {number} tokenData "token_data" property from an output
* @returns {boolean} True if this is an authority output
*/
isAuthorityToken: tokenData => transactionUtils.isTokenDataAuthority(tokenData)

};

export const AUTHORITY_VALUE = {
MINT: libConstants.TOKEN_MINT_MASK,
MELT: libConstants.TOKEN_MELT_MASK
};

export const HATHOR_TOKEN_ID = libConstants.HATHOR_TOKEN_CONFIG.uid;
7 changes: 4 additions & 3 deletions __tests__/integration/create-nft.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AUTHORITY_VALUE, TestUtils, TOKEN_DATA } from './utils/test-utils-integration';
import { TestUtils } from './utils/test-utils-integration';
import { AUTHORITY_VALUE, TOKEN_DATA } from './configuration/test-constants';
import { WalletHelper } from './utils/wallet-helper';

describe('create-nft routes', () => {
Expand All @@ -13,8 +14,8 @@ describe('create-nft routes', () => {
};

beforeAll(async () => {
wallet1 = new WalletHelper('create-nft-1');
wallet2 = new WalletHelper('create-nft-2');
wallet1 = WalletHelper.getPrecalculatedWallet('create-nft-1');
wallet2 = WalletHelper.getPrecalculatedWallet('create-nft-2');

await WalletHelper.startMultipleWalletsForTest([wallet1, wallet2]);

Expand Down
8 changes: 5 additions & 3 deletions __tests__/integration/create-token.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { getRandomInt, TestUtils, WALLET_CONSTANTS } from './utils/test-utils-integration';
import { getRandomInt } from './utils/core.util';
import { TestUtils } from './utils/test-utils-integration';
import { WALLET_CONSTANTS } from './configuration/test-constants';
import { WalletHelper } from './utils/wallet-helper';

describe('create token', () => {
Expand All @@ -12,8 +14,8 @@ describe('create token', () => {
};

beforeAll(async () => {
wallet1 = new WalletHelper('create-token-1');
wallet2 = new WalletHelper('create-token-2');
wallet1 = WalletHelper.getPrecalculatedWallet('create-token-1');
wallet2 = WalletHelper.getPrecalculatedWallet('create-token-2');

await WalletHelper.startMultipleWalletsForTest([wallet1, wallet2]);
await wallet1.injectFunds(10, 0);
Expand Down
5 changes: 3 additions & 2 deletions __tests__/integration/melt-tokens.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { TestUtils, WALLET_CONSTANTS } from './utils/test-utils-integration';
import { TestUtils } from './utils/test-utils-integration';
import { WALLET_CONSTANTS } from './configuration/test-constants';
import { WalletHelper } from './utils/wallet-helper';

describe('melt tokens', () => {
Expand All @@ -10,7 +11,7 @@ describe('melt tokens', () => {
};

beforeAll(async () => {
wallet1 = new WalletHelper('melt-token-1');
wallet1 = WalletHelper.getPrecalculatedWallet('melt-token-1');

// Starting the wallets
await WalletHelper.startMultipleWalletsForTest([wallet1]);
Expand Down
5 changes: 3 additions & 2 deletions __tests__/integration/mint-tokens.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { TestUtils, WALLET_CONSTANTS } from './utils/test-utils-integration';
import { TestUtils } from './utils/test-utils-integration';
import { WALLET_CONSTANTS } from './configuration/test-constants';
import { WalletHelper } from './utils/wallet-helper';

describe('mint token', () => {
Expand All @@ -10,7 +11,7 @@ describe('mint token', () => {
};

beforeAll(async () => {
wallet1 = new WalletHelper('mint-token-1');
wallet1 = WalletHelper.getPrecalculatedWallet('mint-token-1');

// Starting the wallets
await WalletHelper.startMultipleWalletsForTest([wallet1]);
Expand Down
120 changes: 48 additions & 72 deletions __tests__/integration/multisig.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import hathorLib from '@hathor/wallet-lib';
import { TestUtils } from './utils/test-utils-integration';
import { WalletHelper } from './utils/wallet-helper';
import { multisigWalletsData } from '../../scripts/helpers/wallet-precalculation.helper';
import precalculatedMultisig from './configuration/precalculated-multisig-wallets.json';

describe('send tx (HTR)', () => {
let wallet1;
Expand All @@ -10,57 +12,7 @@ describe('send tx (HTR)', () => {
let wallet5;
let walletExtra;

const words = [
'upon tennis increase embark dismiss diamond monitor face magnet jungle scout salute rural master shoulder cry juice jeans radar present close meat antenna mind',
'sample garment fun depart various renew require surge service undo cinnamon squeeze hundred nasty gasp ridge surge defense relax turtle wet antique october occur',
'intact wool rigid diary mountain issue tiny ugly swing rib alone base fold satoshi drift poverty autumn mansion state globe plug ancient pudding hope',
'monster opinion bracket aspect mask labor obvious hat matrix exact canoe race shift episode plastic debris dash sort motion juice leg mushroom maximum evidence',
'tilt lab swear uncle prize favorite river myth assault transfer venue soap lady someone marine reject fork brain swallow notice glad salt sudden pottery',
];

const pubkeys = [
'xpub6CvvCBtHqFfErbcW2Rv28TmZ3MqcFuWQVKGg8xDzLeAwEAHRz9LBTgSFSj7B99scSvZGbq6TxAyyATA9b6cnwsgduNs9NGKQJnEQr3PYtwK',
'xpub6CA16g2qPwukWAWBMdJKU3p2fQEEi831W3WAs2nesuCzPhbrG29aJsoRDSEDT4Ac3smqSk51uuv6oujU3MAAL3d1Nm87q9GDwE3HRGQLjdP',
'xpub6BwNT613Vzy7ARVHDEpoX23SMBEZQMJXdqTWYjQKvJZJVDBjEemU38exJEhc6qbFVc4MmarN68gUKHkyZ3NEgXXCbWtoXXGouHpwMEcXJLf',
'xpub6DCyPHg4AwXsdiMh7QSTHR7afmNVwZKHBBMFUiy5aCYQNaWp68ceQXYXCGQr5fZyLAe5hiJDdXrq6w3AXzvVmjFX9F7EdM87repxJEhsmjL',
'xpub6CgPUcCCJ9pAK7Rj52hwkxTutSRv91Fq74Hx1SjN62eg6Mp3S3YCJFPChPaDjpp9jCbCZHibBgdKnfNdq6hE9umyjyZKUCySBNF7wkoG4uK',
];

const multisigData = {
pubkeys,
total: 5,
minSignatures: 3,
};

/*
* This variable was removed because of the linter's no-unused-var rule.
* But since it is useful for developing tests, it will remain here as a comment.
const addresses = [
'wgyUgNjqZ18uYr4YfE2ALW6tP5hd8MumH5',
'wbe2eJdyZVimA7nJjmBQnKYJSXmpnpMKgG',
'wQQWdSZwp2CEGKsTvvbJ7i8HfHuV2i5QVQ',
'wfrtq9cMe1YfixVgSKXQNQ5hjsmR4hpjP6',
'wQG7itjdtZBsNTk9TG4f1HrehyQiAEMN18',
'wfgSqHUHPtmj2GDy8YfasbPPcFh8L1GPMA',
'wgZbCEMHHnhftCAwj7CRBmfi5TgBhfMZbk',
'wdz9NeMac7jyVeP2WK4BJWsM1zpd9tgsBb',
'wPs7WaRCqwC89uHycLbctDGmWPgH9oZvjp',
'wWJJxvr6oSk7WZdE9rpSRMoE6ZqJ3i8VDc',
'wbuDJtmM7vg8at2h5o3pTCHE4SASEFYusr',
'wPNkywbiw8UHbRQkD3nZ3EHMQsjyTamh9u',
'wQBNidXXYpE943BgydUNtarAwNzk612Yip',
'wh2eCGzUK9rLThr5D6tyCfckHpBjS97ERA',
'wZvajxVp3LabcZiY3XPrivrXiSS6wphRu7',
'wgPbL1WzbrEntepHRC92UX6mA2EmaqfDqt',
'wbdx4g3rucX3WHmZRXjPEKtRfZ7XSnCGKf',
'wiKTnqSN11ukuCWEXRVrRTTPo2mw4fGue3',
'wQ4aQP4YqJqfwshLggR2w1Gg3UFhhKhVKs',
'wca2xk9S2MVn2UrKh78UScdwXz3xrTp8Ky',
'wcUZ6J7t2B1s8bqRYiyuZAftcdCGRSiiau',
];
*/
const { words, pubkeys, walletConfig } = multisigWalletsData;

const fundTx1 = {
txId: null,
Expand All @@ -77,24 +29,48 @@ describe('send tx (HTR)', () => {
'multisig-extra': words[4],
};
global.config.multisig = {
'multisig-1': multisigData,
'multisig-2': multisigData,
'multisig-3': multisigData,
'multisig-4': multisigData,
'multisig-5': multisigData,
'multisig-1': walletConfig,
'multisig-2': walletConfig,
'multisig-3': walletConfig,
'multisig-4': walletConfig,
'multisig-5': walletConfig,
'multisig-extra': {
pubkeys,
total: 5,
minSignatures: 2, // Having a different minSignatures will change the wallet completely
},
};
try {
wallet1 = new WalletHelper('multisig-1', { seedKey: 'multisig-1', multisig: true });
wallet2 = new WalletHelper('multisig-2', { seedKey: 'multisig-2', multisig: true });
wallet3 = new WalletHelper('multisig-3', { seedKey: 'multisig-3', multisig: true });
wallet4 = new WalletHelper('multisig-4', { seedKey: 'multisig-4', multisig: true });
wallet5 = new WalletHelper('multisig-5', { seedKey: 'multisig-5', multisig: true });
walletExtra = new WalletHelper('multisig-extra', { seedKey: 'multisig-extra', multisig: true });
wallet1 = new WalletHelper('multisig-1', {
seedKey: 'multisig-1',
multisig: true,
preCalculatedAddresses: precalculatedMultisig[0].addresses
});
wallet2 = new WalletHelper('multisig-2', {
seedKey: 'multisig-2',
multisig: true,
preCalculatedAddresses: precalculatedMultisig[1].addresses
});
wallet3 = new WalletHelper('multisig-3', {
seedKey: 'multisig-3',
multisig: true,
preCalculatedAddresses: precalculatedMultisig[2].addresses
});
wallet4 = new WalletHelper('multisig-4', {
seedKey: 'multisig-4',
multisig: true,
preCalculatedAddresses: precalculatedMultisig[3].addresses
});
wallet5 = new WalletHelper('multisig-5', {
seedKey: 'multisig-5',
multisig: true,
preCalculatedAddresses: precalculatedMultisig[4].addresses
});
walletExtra = new WalletHelper('multisig-extra', {
seedKey: 'multisig-extra',
multisig: true,
preCalculatedAddresses: precalculatedMultisig[5].addresses
});

await WalletHelper.startMultipleWalletsForTest([
wallet1, wallet2, wallet3, wallet4, wallet5, walletExtra]);
Expand Down Expand Up @@ -127,8 +103,8 @@ describe('send tx (HTR)', () => {
const tx = {
input: [fundTx1],
outputs: [
{ address: 'WPynsVhyU6nP7RSZAkqfijEutC88KgAyFc', value: 100 },
{ address: 'wcUZ6J7t2B1s8bqRYiyuZAftcdCGRSiiau', value: 270 },
{ address: precalculatedMultisig[0].addresses[1], value: 100 },
{ address: precalculatedMultisig[0].addresses[2], value: 270 },
],
};

Expand Down Expand Up @@ -162,8 +138,8 @@ describe('send tx (HTR)', () => {
const tx = {
input: [fundTx1],
outputs: [
{ address: 'WPynsVhyU6nP7RSZAkqfijEutC88KgAyFc', value: 100 },
{ address: 'wcUZ6J7t2B1s8bqRYiyuZAftcdCGRSiiau', value: 270 },
{ address: precalculatedMultisig[0].addresses[1], value: 100 },
{ address: precalculatedMultisig[0].addresses[2], value: 270 },
],
};

Expand Down Expand Up @@ -206,8 +182,8 @@ describe('send tx (HTR)', () => {
const tx = {
input: [fundTx1],
outputs: [
{ address: 'WPynsVhyU6nP7RSZAkqfijEutC88KgAyFc', value: 100 },
{ address: 'wcUZ6J7t2B1s8bqRYiyuZAftcdCGRSiiau', value: 270 },
{ address: precalculatedMultisig[0].addresses[1], value: 100 },
{ address: precalculatedMultisig[0].addresses[2], value: 270 },
],
};

Expand Down Expand Up @@ -255,8 +231,8 @@ describe('send tx (HTR)', () => {
const tx = {
input: [fundTx1],
outputs: [
{ address: 'WPynsVhyU6nP7RSZAkqfijEutC88KgAyFc', value: 100 },
{ address: 'wcUZ6J7t2B1s8bqRYiyuZAftcdCGRSiiau', value: 270 },
{ address: precalculatedMultisig[0].addresses[1], value: 100 },
{ address: precalculatedMultisig[0].addresses[2], value: 270 },
],
};

Expand Down Expand Up @@ -293,8 +269,8 @@ describe('send tx (HTR)', () => {
it.skip('Should send a transaction with max signatures', async () => {
const tx = {
outputs: [
{ address: 'WPynsVhyU6nP7RSZAkqfijEutC88KgAyFc', value: 1 },
{ address: 'wcUZ6J7t2B1s8bqRYiyuZAftcdCGRSiiau', value: 2 },
{ address: precalculatedMultisig[0].addresses[1], value: 1 },
{ address: precalculatedMultisig[0].addresses[2], value: 2 },
],
};

Expand Down
Loading

0 comments on commit 1e134ba

Please sign in to comment.