difftreelog
tests: add transfer load script
in: master
3 files changed
tests/package.jsondiffbeforeafterboth1{2 "name": "NftTests",3 "version": "1.0.0",4 "description": "Substrate Nft tests",5 "main": "",6 "devDependencies": {7 "@polkadot/dev": "^0.61.24",8 "@polkadot/ts": "^0.3.59",9 "@polkadot/typegen": "^3.6.4",10 "@polkadot/util-crypto": "^5.4.4",11 "@types/chai": "^4.2.12",12 "@types/chai-as-promised": "^7.1.3",13 "@types/mocha": "^8.0.3",14 "chai": "^4.2.0",15 "mocha": "^8.1.1",16 "ts-node": "^9.0.0",17 "tslint": "^5.20.1",18 "typescript": "^3.9.7"19 },20 "scripts": {21 "test": "mocha --timeout 9999999 -r ts-node/register ./**/*.test.ts",22 "load": "mocha --timeout 9999999 -r ts-node/register ./**/*.load.ts",23 "testAddCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/addCollectionAdmin.test.ts",24 "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts",25 "testSetVariableMetaData": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetaData.test.ts",26 "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts",27 "testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts",28 "testRemoveFromWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromWhiteList.test.ts",29 "testConnection": "mocha --timeout 9999999 -r ts-node/register ./**/connection.test.ts",30 "testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",31 "testCreateMultipleItems": "mocha --timeout 9999999 -r ts-node/register ./**/createMultipleItems.test.ts",32 "testApprove": "mocha --timeout 9999999 -r ts-node/register ./**/approve.test.ts",33 "testTransferFrom": "mocha --timeout 9999999 -r ts-node/register ./**/transferFrom.test.ts",34 "testCreateCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",35 "testToggleContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/toggleContractWhiteList.test.ts",36 "testAddToContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/addToContractWhiteList.test.ts",37 "testTransfer": "mocha --timeout 9999999 -r ts-node/register ./**/transfer.test.ts",38 "testBurnItem": "mocha --timeout 9999999 -r ts-node/register ./**/burnItem.test.ts",39 "testSetMintPermission": "mocha --timeout 9999999 -r ts-node/register ./**/setMintPermission.test.ts",40 "testCreditFeesToTreasury": "mocha --timeout 9999999 -r ts-node/register ./**/creditFeesToTreasury.test.ts",41 "testEnableContractSponsoring": "mocha --timeout 9999999 -r ts-node/register ./**/enableContractSponsoring.test.ts",42 "testSetContractSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setContractSponsoringRateLimit.test.ts"43 },44 "author": "",45 "license": "SEE LICENSE IN ../LICENSE",46 "homepage": "",47 "dependencies": {48 "@polkadot/api": "^3.6.4",49 "@polkadot/api-contract": "^3.6.4",50 "@polkadot/util": "^3.6.4",51 "bignumber.js": "^9.0.0",52 "chai-as-promised": "^7.1.1"53 },54 "standard": {55 "globals": [56 "it",57 "assert",58 "beforeEach",59 "afterEach",60 "describe",61 "contract",62 "artifacts"63 ]64 }65}1{2 "name": "NftTests",3 "version": "1.0.0",4 "description": "Substrate Nft tests",5 "main": "",6 "devDependencies": {7 "@polkadot/dev": "^0.61.24",8 "@polkadot/ts": "^0.3.59",9 "@polkadot/typegen": "^3.6.4",10 "@polkadot/util-crypto": "^5.4.4",11 "@types/chai": "^4.2.12",12 "@types/chai-as-promised": "^7.1.3",13 "@types/mocha": "^8.0.3",14 "chai": "^4.2.0",15 "mocha": "^8.1.1",16 "ts-node": "^9.0.0",17 "tslint": "^5.20.1",18 "typescript": "^3.9.7"19 },20 "scripts": {21 "test": "mocha --timeout 9999999 -r ts-node/register ./**/*.test.ts",22 "load": "mocha --timeout 9999999 -r ts-node/register ./**/*.load.ts",23 "loadTransfer": "ts-node src/transfer.nload.ts",24 "testAddCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/addCollectionAdmin.test.ts",25 "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts",26 "testSetVariableMetaData": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetaData.test.ts",27 "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts",28 "testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts",29 "testRemoveFromWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromWhiteList.test.ts",30 "testConnection": "mocha --timeout 9999999 -r ts-node/register ./**/connection.test.ts",31 "testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",32 "testCreateMultipleItems": "mocha --timeout 9999999 -r ts-node/register ./**/createMultipleItems.test.ts",33 "testApprove": "mocha --timeout 9999999 -r ts-node/register ./**/approve.test.ts",34 "testTransferFrom": "mocha --timeout 9999999 -r ts-node/register ./**/transferFrom.test.ts",35 "testCreateCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",36 "testToggleContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/toggleContractWhiteList.test.ts",37 "testAddToContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/addToContractWhiteList.test.ts",38 "testTransfer": "mocha --timeout 9999999 -r ts-node/register ./**/transfer.test.ts",39 "testBurnItem": "mocha --timeout 9999999 -r ts-node/register ./**/burnItem.test.ts",40 "testSetMintPermission": "mocha --timeout 9999999 -r ts-node/register ./**/setMintPermission.test.ts",41 "testCreditFeesToTreasury": "mocha --timeout 9999999 -r ts-node/register ./**/creditFeesToTreasury.test.ts",42 "testEnableContractSponsoring": "mocha --timeout 9999999 -r ts-node/register ./**/enableContractSponsoring.test.ts",43 "testSetContractSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setContractSponsoringRateLimit.test.ts"44 },45 "author": "",46 "license": "SEE LICENSE IN ../LICENSE",47 "homepage": "",48 "dependencies": {49 "@polkadot/api": "^3.6.4",50 "@polkadot/api-contract": "^3.6.4",51 "@polkadot/util": "^3.6.4",52 "bignumber.js": "^9.0.0",53 "chai-as-promised": "^7.1.1"54 },55 "standard": {56 "globals": [57 "it",58 "assert",59 "beforeEach",60 "afterEach",61 "describe",62 "contract",63 "artifacts"64 ]65 }66}tests/src/transfer.load.tsdiffbeforeafterboth--- a/tests/src/transfer.load.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-import { ApiPromise } from "@polkadot/api";
-import { IKeyringPair } from '@polkadot/types/types';
-import privateKey from "./substrate/privateKey";
-import usingApi, { submitTransactionAsync } from "./substrate/substrate-api";
-import waitNewBlocks from "./substrate/wait-new-blocks";
-import { findUnusedAddresses } from "./util/helpers";
-import * as cluster from 'cluster';
-import os from 'os';
-
-// Innacurate transfer fee
-const FEE = 10n ** 8n;
-
-let counters: { [key: string]: number } = {};
-function increaseCounter(name: string, amount: number) {
- if (!counters[name]) {
- counters[name] = 0;
- }
- counters[name] += amount;
-}
-function flushCounterToMaster() {
- if (Object.keys(counters).length === 0) {
- return;
- }
- process.send!(counters);
- counters = {};
-}
-
-async function distributeBalance(source: IKeyringPair, api: ApiPromise, totalAmount: bigint, stages: number) {
- let accounts = [source];
- // we don't need source in output array
- const failedAccounts = [0];
-
- const finalUserAmount = 2 ** stages - 1;
- accounts.push(...await findUnusedAddresses(api, finalUserAmount));
- // findUnusedAddresses produces at least 1 request per user
- increaseCounter('requests', finalUserAmount);
-
- for (let stage = 0; stage < stages; stage++) {
- let usersWithBalance = 2 ** stage;
- let amount = totalAmount / (2n ** BigInt(stage)) - FEE * BigInt(stage);
- // console.log(`Stage ${stage}/${stages}, ${usersWithBalance} => ${usersWithBalance * 2} = ${amount}`);
- let txs = [];
- for (let i = 0; i < usersWithBalance; i++) {
- let newUser = accounts[i + usersWithBalance];
- // console.log(`${accounts[i].address} => ${newUser.address} = ${amountToSplit}`);
- const tx = api.tx.balances.transfer(newUser.address, amount);
- txs.push(submitTransactionAsync(accounts[i], tx).catch(e => {
- failedAccounts.push(i + usersWithBalance);
- increaseCounter('txFailed', 1);
- }));
- increaseCounter('tx', 1);
- }
- await Promise.all(txs);
- }
-
- for (let account of failedAccounts.reverse()) {
- accounts.splice(account, 1);
- }
- return accounts;
-}
-
-if (cluster.isMaster) {
- let testDone = false;
- usingApi(async (api) => {
- let prevCounters: { [key: string]: number } = {};
- while (!testDone) {
- for (let name in counters) {
- if (!(name in prevCounters)) {
- prevCounters[name] = 0;
- }
- if(counters[name] === prevCounters[name]) {
- continue;
- }
- console.log(`${name.padEnd(15)} = ${counters[name] - prevCounters[name]}`);
- prevCounters[name] = counters[name];
- }
- await waitNewBlocks(api, 1);
- }
- });
- let waiting: Promise<void>[] = [];
- console.log(`Starting ${os.cpus().length} workers`);
- usingApi(async (api) => {
- const alice = privateKey('//Alice');
- for (let id in os.cpus()) {
- const WORKER_NAME = `//LoadWorker${id}_${Date.now()}`;
- const workerAccount = privateKey(WORKER_NAME);
- const tx = api.tx.balances.transfer(workerAccount.address, 400n * 10n ** 23n);
- await submitTransactionAsync(alice, tx);
-
- let worker = cluster.fork({
- WORKER_NAME,
- STAGES: id + 2
- });
- worker.on('message', msg => {
- for (let key in msg) {
- increaseCounter(key, msg[key]);
- }
- });
- waiting.push(new Promise(res => worker.on('exit', res)));
- }
- await Promise.all(waiting);
- testDone = true;
- })
-} else {
- increaseCounter('startedWorkers', 1);
- usingApi(async (api) => {
- await distributeBalance(privateKey(process.env.WORKER_NAME as string), api, 400n * 10n ** 22n, 10);
- });
- const interval = setInterval(() => {
- flushCounterToMaster();
- }, 100);
- interval.unref();
-}
\ No newline at end of file
tests/src/transfer.nload.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/transfer.nload.ts
@@ -0,0 +1,113 @@
+import { ApiPromise } from "@polkadot/api";
+import { IKeyringPair } from '@polkadot/types/types';
+import privateKey from "./substrate/privateKey";
+import usingApi, { submitTransactionAsync } from "./substrate/substrate-api";
+import waitNewBlocks from "./substrate/wait-new-blocks";
+import { findUnusedAddresses } from "./util/helpers";
+import * as cluster from 'cluster';
+import os from 'os';
+
+// Innacurate transfer fee
+const FEE = 10n ** 8n;
+
+let counters: { [key: string]: number } = {};
+function increaseCounter(name: string, amount: number) {
+ if (!counters[name]) {
+ counters[name] = 0;
+ }
+ counters[name] += amount;
+}
+function flushCounterToMaster() {
+ if (Object.keys(counters).length === 0) {
+ return;
+ }
+ process.send!(counters);
+ counters = {};
+}
+
+async function distributeBalance(source: IKeyringPair, api: ApiPromise, totalAmount: bigint, stages: number) {
+ let accounts = [source];
+ // we don't need source in output array
+ const failedAccounts = [0];
+
+ const finalUserAmount = 2 ** stages - 1;
+ accounts.push(...await findUnusedAddresses(api, finalUserAmount));
+ // findUnusedAddresses produces at least 1 request per user
+ increaseCounter('requests', finalUserAmount);
+
+ for (let stage = 0; stage < stages; stage++) {
+ let usersWithBalance = 2 ** stage;
+ let amount = totalAmount / (2n ** BigInt(stage)) - FEE * BigInt(stage);
+ // console.log(`Stage ${stage}/${stages}, ${usersWithBalance} => ${usersWithBalance * 2} = ${amount}`);
+ let txs = [];
+ for (let i = 0; i < usersWithBalance; i++) {
+ let newUser = accounts[i + usersWithBalance];
+ // console.log(`${accounts[i].address} => ${newUser.address} = ${amountToSplit}`);
+ const tx = api.tx.balances.transfer(newUser.address, amount);
+ txs.push(submitTransactionAsync(accounts[i], tx).catch(e => {
+ failedAccounts.push(i + usersWithBalance);
+ increaseCounter('txFailed', 1);
+ }));
+ increaseCounter('tx', 1);
+ }
+ await Promise.all(txs);
+ }
+
+ for (let account of failedAccounts.reverse()) {
+ accounts.splice(account, 1);
+ }
+ return accounts;
+}
+
+if (cluster.isMaster) {
+ let testDone = false;
+ usingApi(async (api) => {
+ let prevCounters: { [key: string]: number } = {};
+ while (!testDone) {
+ for (let name in counters) {
+ if (!(name in prevCounters)) {
+ prevCounters[name] = 0;
+ }
+ if(counters[name] === prevCounters[name]) {
+ continue;
+ }
+ console.log(`${name.padEnd(15)} = ${counters[name] - prevCounters[name]}`);
+ prevCounters[name] = counters[name];
+ }
+ await waitNewBlocks(api, 1);
+ }
+ });
+ let waiting: Promise<void>[] = [];
+ console.log(`Starting ${os.cpus().length} workers`);
+ usingApi(async (api) => {
+ const alice = privateKey('//Alice');
+ for (let id in os.cpus()) {
+ const WORKER_NAME = `//LoadWorker${id}_${Date.now()}`;
+ const workerAccount = privateKey(WORKER_NAME);
+ const tx = api.tx.balances.transfer(workerAccount.address, 400n * 10n ** 23n);
+ await submitTransactionAsync(alice, tx);
+
+ let worker = cluster.fork({
+ WORKER_NAME,
+ STAGES: id + 2
+ });
+ worker.on('message', msg => {
+ for (let key in msg) {
+ increaseCounter(key, msg[key]);
+ }
+ });
+ waiting.push(new Promise(res => worker.on('exit', res)));
+ }
+ await Promise.all(waiting);
+ testDone = true;
+ })
+} else {
+ increaseCounter('startedWorkers', 1);
+ usingApi(async (api) => {
+ await distributeBalance(privateKey(process.env.WORKER_NAME as string), api, 400n * 10n ** 22n, 10);
+ });
+ const interval = setInterval(() => {
+ flushCounterToMaster();
+ }, 100);
+ interval.unref();
+}
\ No newline at end of file