From 40606103d5f4bd9af15f392b3af487863d4265b5 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Wed, 8 Nov 2023 22:23:22 -0500 Subject: [PATCH 01/28] add data stress test --- package.json | 1 + scripts/gen_accounts.js | 2 +- scripts/geth_binary.sh | 8 ++--- scripts/stressTests/data/index.js | 53 +++++++++++++++++++++++++++++++ scripts/stressTests/data/start.sh | 13 ++++++++ 5 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 scripts/stressTests/data/index.js create mode 100755 scripts/stressTests/data/start.sh diff --git a/package.json b/package.json index c136d147f66..e26fca8e303 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", + "test:stress:data": "scripts/stressTests/data/start.sh", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", diff --git a/scripts/gen_accounts.js b/scripts/gen_accounts.js index b67519a702e..676c3c2d2db 100644 --- a/scripts/gen_accounts.js +++ b/scripts/gen_accounts.js @@ -33,7 +33,7 @@ const addAccount = async (address, privateKey) => { from: mainAcc, to: address, gas: 1500000, - value: '1000000000000000000', + value: '100000000000000000000', }); }; diff --git a/scripts/geth_binary.sh b/scripts/geth_binary.sh index 59f9bfecaea..d2f9eedf79e 100755 --- a/scripts/geth_binary.sh +++ b/scripts/geth_binary.sh @@ -59,12 +59,12 @@ start() { download if [ -z "${ORIGARGS[1]}" ]; then echo "Starting geth..." - echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 " - ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 --rpc.enabledeprecatedpersonal else echo "Starting geth..." - echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 &>/dev/null &" - ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal &>/dev/null & + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null &" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 --rpc.enabledeprecatedpersonal &>/dev/null & echo "Waiting for geth..." npx wait-port -t 10000 "$WEB3_SYSTEM_TEST_PORT" fi diff --git a/scripts/stressTests/data/index.js b/scripts/stressTests/data/index.js new file mode 100644 index 00000000000..840e08d8367 --- /dev/null +++ b/scripts/stressTests/data/index.js @@ -0,0 +1,53 @@ +const { Web3 } = require('../../../packages/web3'); +const { IpcProvider } = require('../../../packages/web3-providers-ipc'); +const accounts = require('../../accounts.json'); +const contractData = require('../../../fixtures/build/Basic.json'); + +const DATA_AMOUNT = 50 * 1024; // 50 kB + +const sendAndGetData = async (web3, i) => { + const sendOptions = { from: accounts[i].address }; + const deployOptions = { + data: contractData.evm.bytecode.object, + arguments: [123, ''], + gasPrice: await web3.eth.getGasPrice(), + gas: BigInt(9000000000000), + gasLimit: BigInt(9000000000000), + type: BigInt(0), + }; + const c = new web3.eth.Contract(contractData.abi); + const contract = await c.deploy(deployOptions).send(sendOptions); + + console.time(`Send huge data [${i}]`); + const receipt = await contract.methods + .setValues(1, 'A'.repeat(DATA_AMOUNT), true) + .send({ from: accounts[i].address }); + console.timeLog(`Send huge data [${i}]`, receipt.transactionHash); + + console.time(`Get huge data [${i}]`); + await contract.methods.getStringValue().call(); + console.timeLog(`Get huge data [${i}]`); +}; + +const test = async () => { + const providerString = process.env.WEB3_SYSTEM_TEST_PROVIDER; + console.log(`Start test with provider: ${providerString}`); + const provider = providerString.includes('ipc') + ? new IpcProvider(providerString) + : new Web3.providers.WebsocketProvider(providerString); + const web3 = new Web3(provider); + + for (const a of accounts) { + const acc = web3.eth.accounts.privateKeyToAccount(a.privateKey); + web3.eth.accounts.wallet.add(acc); + } + + const prs = []; + for (let i = 0; i < 15; i++) { + prs.push(sendAndGetData(web3, i)); + } + await Promise.all(prs); + web3.provider.disconnect(); +}; + +test().catch(console.error); diff --git a/scripts/stressTests/data/start.sh b/scripts/stressTests/data/start.sh new file mode 100755 index 00000000000..da0e904192e --- /dev/null +++ b/scripts/stressTests/data/start.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +. scripts/env.sh + +yarn geth-binary:start:background +export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH +export WEB3_SYSTEM_TEST_BACKEND="geth" +yarn generate:accounts +node ./scripts/stressTests/data/index.js + +export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 +node ./scripts/stressTests/data/index.js + +yarn geth-binary:stop From b9188d63cbf187b88007f27e6b16c6b2b1f29ca3 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Thu, 9 Nov 2023 09:18:44 -0500 Subject: [PATCH 02/28] fix unit tests --- packages/web3-validator/test/unit/load.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/web3-validator/test/unit/load.test.ts b/packages/web3-validator/test/unit/load.test.ts index 9053be7e8f0..02f66d04cf6 100644 --- a/packages/web3-validator/test/unit/load.test.ts +++ b/packages/web3-validator/test/unit/load.test.ts @@ -115,7 +115,7 @@ describe('instance of validator', () => { validator.validateJSONSchema(hugeSchema, hugeData as object); t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(6000); + expect(t).toBeLessThan(7000); expect(t).toBeGreaterThan(0); }); @@ -126,7 +126,7 @@ describe('instance of validator', () => { validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(6000); + expect(t).toBeLessThan(7000); expect(t).toBeGreaterThan(0); }); @@ -139,7 +139,7 @@ describe('instance of validator', () => { } t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(3000); + expect(t).toBeLessThan(4000); expect(t).toBeGreaterThan(0); }); @@ -152,7 +152,7 @@ describe('instance of validator', () => { } t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(4000); + expect(t).toBeLessThan(5000); expect(t).toBeGreaterThan(0); }); @@ -165,7 +165,7 @@ describe('instance of validator', () => { } t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(4000); + expect(t).toBeLessThan(5000); expect(t).toBeGreaterThan(0); }); @@ -178,7 +178,7 @@ describe('instance of validator', () => { } t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(4000); + expect(t).toBeLessThan(5000); expect(t).toBeGreaterThan(0); }); }); From a9a11382fe4ccd68ed1636219f584cad7a8f7400 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Thu, 9 Nov 2023 10:14:42 -0500 Subject: [PATCH 03/28] fix --- scripts/gen_accounts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gen_accounts.js b/scripts/gen_accounts.js index 676c3c2d2db..b67519a702e 100644 --- a/scripts/gen_accounts.js +++ b/scripts/gen_accounts.js @@ -33,7 +33,7 @@ const addAccount = async (address, privateKey) => { from: mainAcc, to: address, gas: 1500000, - value: '100000000000000000000', + value: '1000000000000000000', }); }; From 7217b8cd6083365ea0a9193c761c7be9dccf29e3 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Thu, 9 Nov 2023 10:34:50 -0500 Subject: [PATCH 04/28] try to fix validator test --- packages/web3-validator/test/unit/load.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/web3-validator/test/unit/load.test.ts b/packages/web3-validator/test/unit/load.test.ts index 02f66d04cf6..5dc2fc847f5 100644 --- a/packages/web3-validator/test/unit/load.test.ts +++ b/packages/web3-validator/test/unit/load.test.ts @@ -115,7 +115,7 @@ describe('instance of validator', () => { validator.validateJSONSchema(hugeSchema, hugeData as object); t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(7000); + expect(t).toBeLessThan(8000); expect(t).toBeGreaterThan(0); }); @@ -126,7 +126,7 @@ describe('instance of validator', () => { validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(7000); + expect(t).toBeLessThan(8000); expect(t).toBeGreaterThan(0); }); @@ -139,7 +139,7 @@ describe('instance of validator', () => { } t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(4000); + expect(t).toBeLessThan(5000); expect(t).toBeGreaterThan(0); }); @@ -165,7 +165,7 @@ describe('instance of validator', () => { } t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(5000); + expect(t).toBeLessThan(6000); expect(t).toBeGreaterThan(0); }); @@ -178,7 +178,7 @@ describe('instance of validator', () => { } t = Number(new Date()) - t1; }).not.toThrow(); - expect(t).toBeLessThan(5000); + expect(t).toBeLessThan(6000); expect(t).toBeGreaterThan(0); }); }); From 071effb9010ffd9c9375b1799d987f3439b2a969 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Thu, 9 Nov 2023 11:22:42 -0500 Subject: [PATCH 05/28] fix ipc tests --- scripts/geth_binary.sh | 21 +++++++++++++++++---- scripts/stressTests/data/start.sh | 9 ++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/scripts/geth_binary.sh b/scripts/geth_binary.sh index d2f9eedf79e..82f48622ec6 100755 --- a/scripts/geth_binary.sh +++ b/scripts/geth_binary.sh @@ -59,17 +59,29 @@ start() { download if [ -z "${ORIGARGS[1]}" ]; then echo "Starting geth..." - echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000" - ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 --rpc.enabledeprecatedpersonal + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal else echo "Starting geth..." - echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null &" - ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 --rpc.enabledeprecatedpersonal &>/dev/null & + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 &>/dev/null &" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal &>/dev/null & echo "Waiting for geth..." npx wait-port -t 10000 "$WEB3_SYSTEM_TEST_PORT" fi } +startStress() { + download + + echo "Starting geth..." + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null &" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null & + echo "Waiting for geth..." + npx wait-port -t 10000 "$WEB3_SYSTEM_TEST_PORT" + +} + + startSync() { download @@ -95,6 +107,7 @@ stop() { } case $1 in +stressStart) startStress ;; syncStart) startSync ;; syncStop) syncStop ;; start) start ;; diff --git a/scripts/stressTests/data/start.sh b/scripts/stressTests/data/start.sh index da0e904192e..3da32b9ed56 100755 --- a/scripts/stressTests/data/start.sh +++ b/scripts/stressTests/data/start.sh @@ -1,13 +1,16 @@ #!/usr/bin/env bash . scripts/env.sh -yarn geth-binary:start:background -export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH export WEB3_SYSTEM_TEST_BACKEND="geth" + +./scripts/geth_binary.sh stressStart + yarn generate:accounts + +export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH node ./scripts/stressTests/data/index.js export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 node ./scripts/stressTests/data/index.js -yarn geth-binary:stop +./scripts/geth_binary.sh stop From a59ee258dd0088011fcdf51ef2cc331df6018399 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Thu, 9 Nov 2023 12:13:46 -0500 Subject: [PATCH 06/28] fix load test --- package.json | 2 + .../web3-validator/test/unit/load.test.ts | 184 ------------------ scripts/stressTests/validation/load.test.js | 133 +++++++++++++ 3 files changed, 135 insertions(+), 184 deletions(-) delete mode 100644 packages/web3-validator/test/unit/load.test.ts create mode 100644 scripts/stressTests/validation/load.test.js diff --git a/package.json b/package.json index e26fca8e303..51548c9d684 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,8 @@ "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", "test:stress:data": "scripts/stressTests/data/start.sh", + "test:stress:validation": "node ./scripts/stressTests/validation/load.test.js", + "test:stress": "yarn test:stress:data && yarn test:stress:validation", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", diff --git a/packages/web3-validator/test/unit/load.test.ts b/packages/web3-validator/test/unit/load.test.ts deleted file mode 100644 index 5dc2fc847f5..00000000000 --- a/packages/web3-validator/test/unit/load.test.ts +++ /dev/null @@ -1,184 +0,0 @@ -/* -This file is part of web3.js. - -web3.js is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -web3.js is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with web3.js. If not, see . -*/ - -import { Web3Validator } from '../../src/web3_validator'; -import { Json, JsonSchema, ValidationSchemaInput } from '../../src/types'; - -const abi = [ - { indexed: true, internalType: 'address', name: 'from', type: 'address' }, - { indexed: true, internalType: 'address', name: 'to', type: 'address' }, - { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, -]; - -const abiJsonSchema = { - type: 'array', - items: [ - { name: 'from', format: 'address' }, - { name: 'to', format: 'address' }, - { name: 'value', format: 'uint256' }, - ], -}; - -const abiData = [ - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', -]; - -const simpleSchema = { - type: 'object', - required: ['blockHash', 'blockNumber', 'from', 'to', 'data'], - properties: { - blockHash: { - format: 'bytes32', - }, - blockNumber: { - format: 'uint', - }, - from: { - format: 'address', - }, - to: { - oneOf: [{ format: 'address' }, { type: 'null' }], - }, - data: { - format: 'bytes', - }, - }, -}; - -const simpleData = { - blockHash: '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', - blockNumber: BigInt(2), - from: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - to: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - data: '0xafea', -} as unknown as ValidationSchemaInput; - -const createHugeSchema = ( - schema: JsonSchema, - data: Json, - n = 3, -): { schema: JsonSchema; data: Json } => { - if (n > 0) { - const { data: resultData, schema: resultSchema } = createHugeSchema( - { ...simpleSchema } as JsonSchema, - { ...simpleData } as Json, - n - 1, - ); - return { - data: { ...(data as unknown as object), simple: resultData }, - schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, - }; - } - return { - schema, - data, - }; -}; - -const { schema: hugeSchema, data: hugeData } = createHugeSchema( - { ...simpleSchema } as JsonSchema, - { ...simpleData } as Json, - 500, -); - -const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( - { ...simpleSchema } as JsonSchema, - { ...simpleData } as Json, - 1000, -); -describe('instance of validator', () => { - let validator: Web3Validator; - beforeAll(() => { - validator = new Web3Validator(); - }); - - it('huge schema', () => { - let t = 0; - expect(() => { - const t1 = Number(new Date()); - validator.validateJSONSchema(hugeSchema, hugeData as object); - t = Number(new Date()) - t1; - }).not.toThrow(); - expect(t).toBeLessThan(8000); - expect(t).toBeGreaterThan(0); - }); - - it('huge schema 1000', () => { - let t = 0; - expect(() => { - const t1 = Number(new Date()); - validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); - t = Number(new Date()) - t1; - }).not.toThrow(); - expect(t).toBeLessThan(8000); - expect(t).toBeGreaterThan(0); - }); - - it('simple schema multiple times', () => { - let t = 0; - expect(() => { - const t1 = Number(new Date()); - for (let i = 0; i < 500; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData as object); - } - t = Number(new Date()) - t1; - }).not.toThrow(); - expect(t).toBeLessThan(5000); - expect(t).toBeGreaterThan(0); - }); - - it('simple schema 1000 times', () => { - let t = 0; - expect(() => { - const t1 = Number(new Date()); - for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData as object); - } - t = Number(new Date()) - t1; - }).not.toThrow(); - expect(t).toBeLessThan(5000); - expect(t).toBeGreaterThan(0); - }); - - it('simple JSON schema 1000 times', () => { - let t = 0; - expect(() => { - const t1 = Number(new Date()); - for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(abiJsonSchema, abiData as object); - } - t = Number(new Date()) - t1; - }).not.toThrow(); - expect(t).toBeLessThan(6000); - expect(t).toBeGreaterThan(0); - }); - - it('simple ABI 1000 times', () => { - let t = 0; - expect(() => { - const t1 = Number(new Date()); - for (let i = 0; i < 1000; i += 1) { - validator.validate(abi, abiData); - } - t = Number(new Date()) - t1; - }).not.toThrow(); - expect(t).toBeLessThan(6000); - expect(t).toBeGreaterThan(0); - }); -}); diff --git a/scripts/stressTests/validation/load.test.js b/scripts/stressTests/validation/load.test.js new file mode 100644 index 00000000000..671799cf586 --- /dev/null +++ b/scripts/stressTests/validation/load.test.js @@ -0,0 +1,133 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const { Web3Validator } = require('../../../packages/web3-validator'); + +const abi = [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, +]; + +const abiJsonSchema = { + type: 'array', + items: [ + { name: 'from', format: 'address' }, + { name: 'to', format: 'address' }, + { name: 'value', format: 'uint256' }, + ], +}; + +const abiData = [ + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', +]; + +const simpleSchema = { + type: 'object', + required: ['blockHash', 'blockNumber', 'from', 'to', 'data'], + properties: { + blockHash: { + format: 'bytes32', + }, + blockNumber: { + format: 'uint', + }, + from: { + format: 'address', + }, + to: { + oneOf: [{ format: 'address' }, { type: 'null' }], + }, + data: { + format: 'bytes', + }, + }, +}; + +const simpleData = { + blockHash: '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + blockNumber: BigInt(2), + from: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + to: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + data: '0xafea', +}; + +const createHugeSchema = (schema, data, n = 3) => { + if (n > 0) { + const { data: resultData, schema: resultSchema } = createHugeSchema( + { ...simpleSchema }, + { ...simpleData }, + n - 1, + ); + return { + data: { ...data, simple: resultData }, + schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, + }; + } + return { + schema, + data, + }; +}; + +const { schema: hugeSchema, data: hugeData } = createHugeSchema( + { ...simpleSchema }, + { ...simpleData }, + 500, +); + +const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( + { ...simpleSchema }, + { ...simpleData }, + 1000, +); + +const validator = new Web3Validator(); + +console.time('huge schema'); +validator.validateJSONSchema(hugeSchema, hugeData); +console.timeLog('huge schema'); + +console.time('huge schema 1000'); +validator.validateJSONSchema(hugeSchema1000, hugeData1000); +console.timeLog('huge schema 1000'); + +console.time('simple schema multiple times'); +for (let i = 0; i < 500; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData); +} +console.timeLog('simple schema multiple times'); + +console.time('simple schema 1000 times'); +for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData); +} +console.timeLog('simple schema 1000 times'); + +console.time('simple JSON schema 1000 times'); +for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(abiJsonSchema, abiData); +} +console.timeLog('simple JSON schema 1000 times'); + +console.time('simple ABI 1000 times'); +for (let i = 0; i < 1000; i += 1) { + validator.validate(abi, abiData); +} +console.timeLog('simple ABI 1000 times'); From 7ac76be513c1132731d7fb3a66401c525b127998 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Thu, 9 Nov 2023 12:24:21 -0500 Subject: [PATCH 07/28] fix --- package.json | 2 +- scripts/stressTests/validation/{load.test.js => index.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename scripts/stressTests/validation/{load.test.js => index.js} (100%) diff --git a/package.json b/package.json index 51548c9d684..5e968385b54 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", "test:stress:data": "scripts/stressTests/data/start.sh", - "test:stress:validation": "node ./scripts/stressTests/validation/load.test.js", + "test:stress:validation": "node ./scripts/stressTests/validation/index.js", "test:stress": "yarn test:stress:data && yarn test:stress:validation", "husky:install": "husky install", "husky:uninstall": "husky uninstall", diff --git a/scripts/stressTests/validation/load.test.js b/scripts/stressTests/validation/index.js similarity index 100% rename from scripts/stressTests/validation/load.test.js rename to scripts/stressTests/validation/index.js From df948c0c28db34b9d7658bd298b4bb89739bb587 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Sun, 12 Nov 2023 20:53:55 -0500 Subject: [PATCH 08/28] move to tests folder --- package.json | 4 ++-- {scripts => tests}/stressTests/data/index.js | 2 +- {scripts => tests}/stressTests/data/start.sh | 4 ++-- {scripts => tests}/stressTests/validation/index.js | 0 4 files changed, 5 insertions(+), 5 deletions(-) rename {scripts => tests}/stressTests/data/index.js (96%) rename {scripts => tests}/stressTests/data/start.sh (76%) rename {scripts => tests}/stressTests/validation/index.js (100%) diff --git a/package.json b/package.json index 5e968385b54..11316571fb6 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,8 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:stress:data": "scripts/stressTests/data/start.sh", - "test:stress:validation": "node ./scripts/stressTests/validation/index.js", + "test:stress:data": "tests/stressTests/data/start.sh", + "test:stress:validation": "node tests/stressTests/validation/index.js", "test:stress": "yarn test:stress:data && yarn test:stress:validation", "husky:install": "husky install", "husky:uninstall": "husky uninstall", diff --git a/scripts/stressTests/data/index.js b/tests/stressTests/data/index.js similarity index 96% rename from scripts/stressTests/data/index.js rename to tests/stressTests/data/index.js index 840e08d8367..ce13b0620fe 100644 --- a/scripts/stressTests/data/index.js +++ b/tests/stressTests/data/index.js @@ -1,6 +1,6 @@ const { Web3 } = require('../../../packages/web3'); const { IpcProvider } = require('../../../packages/web3-providers-ipc'); -const accounts = require('../../accounts.json'); +const accounts = require('../../../scripts/accounts.json'); const contractData = require('../../../fixtures/build/Basic.json'); const DATA_AMOUNT = 50 * 1024; // 50 kB diff --git a/scripts/stressTests/data/start.sh b/tests/stressTests/data/start.sh similarity index 76% rename from scripts/stressTests/data/start.sh rename to tests/stressTests/data/start.sh index 3da32b9ed56..cdb649fcf14 100755 --- a/scripts/stressTests/data/start.sh +++ b/tests/stressTests/data/start.sh @@ -8,9 +8,9 @@ export WEB3_SYSTEM_TEST_BACKEND="geth" yarn generate:accounts export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -node ./scripts/stressTests/data/index.js +node ./tests/stressTests/data/index.js export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -node ./scripts/stressTests/data/index.js +node ./tests/stressTests/data/index.js ./scripts/geth_binary.sh stop diff --git a/scripts/stressTests/validation/index.js b/tests/stressTests/validation/index.js similarity index 100% rename from scripts/stressTests/validation/index.js rename to tests/stressTests/validation/index.js From 21114ebbdcd976d71f2094a7d2a9ac6835239710 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Sun, 12 Nov 2023 20:57:43 -0500 Subject: [PATCH 09/28] moved --- package.json | 4 ++-- .../web3-validator/test/stress}/index.js | 2 +- .../data => packages/web3/test/stress}/index.js | 8 ++++---- .../data => packages/web3/test/stress}/start.sh | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) rename {tests/stressTests/validation => packages/web3-validator/test/stress}/index.js (97%) rename {tests/stressTests/data => packages/web3/test/stress}/index.js (85%) rename {tests/stressTests/data => packages/web3/test/stress}/start.sh (76%) diff --git a/package.json b/package.json index 11316571fb6..e19da313f95 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,8 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:stress:data": "tests/stressTests/data/start.sh", - "test:stress:validation": "node tests/stressTests/validation/index.js", + "test:stress:data": "packages/web3/test/stress/start.sh", + "test:stress:validation": "node packages/web3-validator/test/stress/index.js", "test:stress": "yarn test:stress:data && yarn test:stress:validation", "husky:install": "husky install", "husky:uninstall": "husky uninstall", diff --git a/tests/stressTests/validation/index.js b/packages/web3-validator/test/stress/index.js similarity index 97% rename from tests/stressTests/validation/index.js rename to packages/web3-validator/test/stress/index.js index 671799cf586..1087715867c 100644 --- a/tests/stressTests/validation/index.js +++ b/packages/web3-validator/test/stress/index.js @@ -15,7 +15,7 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -const { Web3Validator } = require('../../../packages/web3-validator'); +const { Web3Validator } = require('../../lib/commonjs'); const abi = [ { indexed: true, internalType: 'address', name: 'from', type: 'address' }, diff --git a/tests/stressTests/data/index.js b/packages/web3/test/stress/index.js similarity index 85% rename from tests/stressTests/data/index.js rename to packages/web3/test/stress/index.js index ce13b0620fe..d946f31e1f0 100644 --- a/tests/stressTests/data/index.js +++ b/packages/web3/test/stress/index.js @@ -1,7 +1,7 @@ -const { Web3 } = require('../../../packages/web3'); -const { IpcProvider } = require('../../../packages/web3-providers-ipc'); -const accounts = require('../../../scripts/accounts.json'); -const contractData = require('../../../fixtures/build/Basic.json'); +const { Web3 } = require('../../lib/commonjs'); +const { IpcProvider } = require('../../../web3-providers-ipc/lib/commonjs'); +const accounts = require('../../../../scripts/accounts.json'); +const contractData = require('../../../../fixtures/build/Basic.json'); const DATA_AMOUNT = 50 * 1024; // 50 kB diff --git a/tests/stressTests/data/start.sh b/packages/web3/test/stress/start.sh similarity index 76% rename from tests/stressTests/data/start.sh rename to packages/web3/test/stress/start.sh index cdb649fcf14..1752882a79c 100755 --- a/tests/stressTests/data/start.sh +++ b/packages/web3/test/stress/start.sh @@ -8,9 +8,9 @@ export WEB3_SYSTEM_TEST_BACKEND="geth" yarn generate:accounts export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -node ./tests/stressTests/data/index.js +node ./packages/web3/test/stress/index.js export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -node ./tests/stressTests/data/index.js +node ./packages/web3/test/stress/index.js ./scripts/geth_binary.sh stop From ba56d6a7aee452adcc315bfcf4683c5eaa396082 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Sun, 12 Nov 2023 21:00:56 -0500 Subject: [PATCH 10/28] fix --- packages/web3-validator/test/stress/index.js | 2 ++ packages/web3/test/stress/index.js | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/web3-validator/test/stress/index.js b/packages/web3-validator/test/stress/index.js index 1087715867c..d1bab1ea562 100644 --- a/packages/web3-validator/test/stress/index.js +++ b/packages/web3-validator/test/stress/index.js @@ -15,6 +15,7 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ +/* eslint-disable */ const { Web3Validator } = require('../../lib/commonjs'); const abi = [ @@ -130,4 +131,5 @@ console.time('simple ABI 1000 times'); for (let i = 0; i < 1000; i += 1) { validator.validate(abi, abiData); } + console.timeLog('simple ABI 1000 times'); diff --git a/packages/web3/test/stress/index.js b/packages/web3/test/stress/index.js index d946f31e1f0..2124b1da6ed 100644 --- a/packages/web3/test/stress/index.js +++ b/packages/web3/test/stress/index.js @@ -1,3 +1,21 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable */ const { Web3 } = require('../../lib/commonjs'); const { IpcProvider } = require('../../../web3-providers-ipc/lib/commonjs'); const accounts = require('../../../../scripts/accounts.json'); From 40decbb45002b27a15d6f30d270b46e269edc26c Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 13 Nov 2023 20:33:05 -0500 Subject: [PATCH 11/28] add send tests --- package.json | 3 +- .../web3/test/stress/{index.js => data.js} | 0 packages/web3/test/stress/requests.js | 153 ++++++++++++++++++ .../test/stress/{start.sh => startData.sh} | 4 +- packages/web3/test/stress/startRequests.sh | 24 +++ 5 files changed, 181 insertions(+), 3 deletions(-) rename packages/web3/test/stress/{index.js => data.js} (100%) create mode 100644 packages/web3/test/stress/requests.js rename packages/web3/test/stress/{start.sh => startData.sh} (76%) create mode 100755 packages/web3/test/stress/startRequests.sh diff --git a/package.json b/package.json index e19da313f95..b5d04f72bfd 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,8 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:stress:data": "packages/web3/test/stress/start.sh", + "test:stress:data": "packages/web3/test/stress/startData.sh", + "test:stress:requests": "packages/web3/test/stress/startRequests.sh", "test:stress:validation": "node packages/web3-validator/test/stress/index.js", "test:stress": "yarn test:stress:data && yarn test:stress:validation", "husky:install": "husky install", diff --git a/packages/web3/test/stress/index.js b/packages/web3/test/stress/data.js similarity index 100% rename from packages/web3/test/stress/index.js rename to packages/web3/test/stress/data.js diff --git a/packages/web3/test/stress/requests.js b/packages/web3/test/stress/requests.js new file mode 100644 index 00000000000..7cad86a9147 --- /dev/null +++ b/packages/web3/test/stress/requests.js @@ -0,0 +1,153 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable */ +const { Web3 } = require('../../lib/commonjs'); +const { IpcProvider } = require('../../../web3-providers-ipc/lib/commonjs'); +const contractData = require('../../../../fixtures/build/Basic.json'); + +const providerString = process.env.WEB3_SYSTEM_TEST_PROVIDER; +const isWs = providerString.startsWith('ws'); +const isIpc = providerString.includes('ipc'); +const contracts = {}; + +const deployContracts = async (web3, accounts) => { + const prs = []; + for (let i = 0; i < accounts.length; i++) { + const account = accounts[i]; + const sendOptions = { from: account.address }; + const deployOptions = { + data: contractData.evm.bytecode.object, + arguments: [123, ''], + gas: BigInt(9000000000000), + gasLimit: BigInt(9000000000000), + type: BigInt(0), + }; + const c = new web3.eth.Contract(contractData.abi); + prs.push( + c + .deploy(deployOptions) + .send(sendOptions) + .then(contract => { + contracts[account.address] = contract; + }), + ); + } + await Promise.all(prs); +}; + +const addAccount = async (web3, mainAcc, address, privateKey, nonce) => { + web3.eth.accounts.wallet.add(privateKey); + return web3.eth.sendTransaction({ + from: mainAcc, + to: address, + nonce, + gas: 1500000, + value: '1000000000000000000', + }); +}; + +const prepareAccounts = async (web3, n = 1000) => { + const prs = []; + const list = await web3.eth.personal.getAccounts(); + const mainAcc = list[0]; + const accountList = []; + const nonce = await web3.eth.getTransactionCount(mainAcc); + for (let i = 0; i < n; i++) { + const acc = web3.eth.accounts.create(); + prs.push(addAccount(web3, mainAcc, acc.address, acc.privateKey, Number(nonce) + i)); + accountList.push(acc); + } + await Promise.all(prs); + return accountList; +}; + +const sendData = async (web3, account) => { + const contract = contracts[account.address]; + return contract.methods + .firesStringEvent(`String event: ${account.address}`) + .send({ from: account.address }); +}; + +const getData = async (web3, account) => { + const contract = contracts[account.address]; + await contract.methods.getStringValue().call(); +}; + +const receivedEvents = {}; +const subscribeContract = acc => { + const contract = contracts[acc.address]; + const event = contract.events.StringEvent(); + + event.on('data', res => { + if (res.returnValues.str !== `String event: ${acc.address}`) { + throw new Error('Event is not correct'); + } + receivedEvents[acc.address] = res; + }); +}; +const contractSubscriptions = (web3, accounts) => { + console.log(`Subscribe to ${accounts.length} contracts events`); + for (const acc of accounts) { + subscribeContract(acc); + } +}; +const test = async () => { + console.log(`Start test with provider: ${providerString}`); + const provider = isIpc + ? new IpcProvider(providerString) + : isWs + ? new Web3.providers.WebsocketProvider(providerString) + : new Web3.providers.HttpProvider(providerString); + const web3 = new Web3(provider); + const n = Number(process.env.PARALLEL_COUNT) || 500; + + console.log(`Prepare ${n} accounts in parallel`); + const accounts = await prepareAccounts(web3, n); + + console.log(`Deploy ${n} contracts in parallel`); + await deployContracts(web3, accounts); + // if socket subscribe to events + if (isIpc || isWs) { + contractSubscriptions(web3, accounts); + } + + console.log(`Send data from ${n} accounts in parallel`); + const sendPrs = []; + for (let i = 0; i < n; i++) { + sendPrs.push(sendData(web3, accounts[i])); + } + await Promise.all(sendPrs); + + if (isIpc || isWs) { + if (Object.keys(receivedEvents).length !== accounts.length) { + throw new Error('Incorrect event count'); + } + } + + console.log(`Get data from ${n} accounts in parallel`); + const getPrs = []; + for (let i = 0; i < n; i++) { + getPrs.push(getData(web3, accounts[i])); + } + await Promise.all(getPrs); + if (isIpc || isWs) { + web3.provider.disconnect(); + } +}; + +test().catch(console.error); diff --git a/packages/web3/test/stress/start.sh b/packages/web3/test/stress/startData.sh similarity index 76% rename from packages/web3/test/stress/start.sh rename to packages/web3/test/stress/startData.sh index 1752882a79c..0c37247c905 100755 --- a/packages/web3/test/stress/start.sh +++ b/packages/web3/test/stress/startData.sh @@ -8,9 +8,9 @@ export WEB3_SYSTEM_TEST_BACKEND="geth" yarn generate:accounts export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -node ./packages/web3/test/stress/index.js +node ./packages/web3/test/stress/data.js export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -node ./packages/web3/test/stress/index.js +node ./packages/web3/test/stress/data.js ./scripts/geth_binary.sh stop diff --git a/packages/web3/test/stress/startRequests.sh b/packages/web3/test/stress/startRequests.sh new file mode 100755 index 00000000000..7a001658dfa --- /dev/null +++ b/packages/web3/test/stress/startRequests.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +. scripts/env.sh + +export WEB3_SYSTEM_TEST_BACKEND="geth" + +./scripts/geth_binary.sh stressStart +export PARALLEL_COUNT=400 +export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH +node ./packages/web3/test/stress/requests.js +./scripts/geth_binary.sh stop + +./scripts/geth_binary.sh stressStart +export PARALLEL_COUNT=1000 +export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 +node ./packages/web3/test/stress/requests.js + + +./scripts/geth_binary.sh stressStart +export PARALLEL_COUNT=500 +export WEB3_SYSTEM_TEST_PROVIDER=http://127.0.0.1:8545 +node ./packages/web3/test/stress/requests.js +./scripts/geth_binary.sh stop + + From faba5aacbf8f5bad251f1edb822b5bd0df174465 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 14 Nov 2023 10:20:59 -0500 Subject: [PATCH 12/28] browser tests --- package.json | 2 +- packages/web3/test/stress/requests.html | 455 +++++++++++++++++++++ packages/web3/test/stress/startRequests.sh | 4 +- 3 files changed, 458 insertions(+), 3 deletions(-) create mode 100644 packages/web3/test/stress/requests.html diff --git a/package.json b/package.json index b5d04f72bfd..db2d5995b66 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "test:stress:data": "packages/web3/test/stress/startData.sh", "test:stress:requests": "packages/web3/test/stress/startRequests.sh", "test:stress:validation": "node packages/web3-validator/test/stress/index.js", - "test:stress": "yarn test:stress:data && yarn test:stress:validation", + "test:stress": "yarn test:stress:data && yarn test:stress:validation && test:stress:requests", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", diff --git a/packages/web3/test/stress/requests.html b/packages/web3/test/stress/requests.html new file mode 100644 index 00000000000..1311927b818 --- /dev/null +++ b/packages/web3/test/stress/requests.html @@ -0,0 +1,455 @@ + + + + +
+ Log: +
+
+ + + diff --git a/packages/web3/test/stress/startRequests.sh b/packages/web3/test/stress/startRequests.sh index 7a001658dfa..bef0820c97d 100755 --- a/packages/web3/test/stress/startRequests.sh +++ b/packages/web3/test/stress/startRequests.sh @@ -4,7 +4,7 @@ export WEB3_SYSTEM_TEST_BACKEND="geth" ./scripts/geth_binary.sh stressStart -export PARALLEL_COUNT=400 +export PARALLEL_COUNT=10 export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH node ./packages/web3/test/stress/requests.js ./scripts/geth_binary.sh stop @@ -16,7 +16,7 @@ node ./packages/web3/test/stress/requests.js ./scripts/geth_binary.sh stressStart -export PARALLEL_COUNT=500 +export PARALLEL_COUNT=100 export WEB3_SYSTEM_TEST_PROVIDER=http://127.0.0.1:8545 node ./packages/web3/test/stress/requests.js ./scripts/geth_binary.sh stop From 3ddf0dddd117324d05d65c939a0539d30e6b1a41 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 14 Nov 2023 10:24:12 -0500 Subject: [PATCH 13/28] move validator test to web3 package --- package.json | 2 +- .../test/stress/index.js => web3/test/stress/validator.js} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename packages/{web3-validator/test/stress/index.js => web3/test/stress/validator.js} (97%) diff --git a/package.json b/package.json index e19da313f95..32ed20a6eb7 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", "test:stress:data": "packages/web3/test/stress/start.sh", - "test:stress:validation": "node packages/web3-validator/test/stress/index.js", + "test:stress:validation": "node packages/web3/test/stress/validator.js", "test:stress": "yarn test:stress:data && yarn test:stress:validation", "husky:install": "husky install", "husky:uninstall": "husky uninstall", diff --git a/packages/web3-validator/test/stress/index.js b/packages/web3/test/stress/validator.js similarity index 97% rename from packages/web3-validator/test/stress/index.js rename to packages/web3/test/stress/validator.js index d1bab1ea562..36951e6c133 100644 --- a/packages/web3-validator/test/stress/index.js +++ b/packages/web3/test/stress/validator.js @@ -16,7 +16,7 @@ along with web3.js. If not, see . */ /* eslint-disable */ -const { Web3Validator } = require('../../lib/commonjs'); +const { Web3Validator } = require('../../../web3-validator/lib/commonjs'); const abi = [ { indexed: true, internalType: 'address', name: 'from', type: 'address' }, From e7eaee1bbef809aa8dca9f482edd436091d96740 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 14 Nov 2023 10:28:00 -0500 Subject: [PATCH 14/28] fix --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 1e4838a9b82..d45b1354c3f 100644 --- a/package.json +++ b/package.json @@ -84,10 +84,10 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:stress:data": "packages/web3/test/stress/startData.sh", - "test:stress:requests": "packages/web3/test/stress/startRequests.sh", + "test:stress:data": "./packages/web3/test/stress/startData.sh", + "test:stress:requests": "./packages/web3/test/stress/startRequests.sh", "test:stress:validation": "node packages/web3/test/stress/validator.js", - "test:stress": "yarn test:stress:data && yarn test:stress:validation && test:stress:requests", + "test:stress": "yarn test:stress:data && yarn test:stress:validation && yarn test:stress:requests", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", From 548eadbb54a8d516335b8cb569daf2a655e11c29 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 14 Nov 2023 10:38:07 -0500 Subject: [PATCH 15/28] fix naming --- package.json | 6 +++--- .../{data.js => large_request_data/index.js} | 8 ++++---- .../start.sh} | 4 ++-- .../index.js} | 16 ++++++++-------- .../{requests.html => many_requests/index.html} | 0 .../{requests.js => many_requests/index.js} | 6 +++--- .../{startRequests.sh => many_requests/start.sh} | 7 ++++--- 7 files changed, 24 insertions(+), 23 deletions(-) rename packages/web3/test/stress/{data.js => large_request_data/index.js} (88%) rename packages/web3/test/stress/{startData.sh => large_request_data/start.sh} (68%) rename packages/web3/test/stress/{validator.js => large_validator_data/index.js} (87%) rename packages/web3/test/stress/{requests.html => many_requests/index.html} (100%) rename packages/web3/test/stress/{requests.js => many_requests/index.js} (95%) rename packages/web3/test/stress/{startRequests.sh => many_requests/start.sh} (73%) diff --git a/package.json b/package.json index d45b1354c3f..062b3790cfe 100644 --- a/package.json +++ b/package.json @@ -84,9 +84,9 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:stress:data": "./packages/web3/test/stress/startData.sh", - "test:stress:requests": "./packages/web3/test/stress/startRequests.sh", - "test:stress:validation": "node packages/web3/test/stress/validator.js", + "test:stress:data": "packages/web3/test/stress/large_request_data/start.sh", + "test:stress:requests": "packages/web3/test/stress/many_requests/start.sh", + "test:stress:validation": "node packages/web3/test/stress/large_validator_data/index.js", "test:stress": "yarn test:stress:data && yarn test:stress:validation && yarn test:stress:requests", "husky:install": "husky install", "husky:uninstall": "husky uninstall", diff --git a/packages/web3/test/stress/data.js b/packages/web3/test/stress/large_request_data/index.js similarity index 88% rename from packages/web3/test/stress/data.js rename to packages/web3/test/stress/large_request_data/index.js index 2124b1da6ed..646281ef99a 100644 --- a/packages/web3/test/stress/data.js +++ b/packages/web3/test/stress/large_request_data/index.js @@ -16,10 +16,10 @@ along with web3.js. If not, see . */ /* eslint-disable */ -const { Web3 } = require('../../lib/commonjs'); -const { IpcProvider } = require('../../../web3-providers-ipc/lib/commonjs'); -const accounts = require('../../../../scripts/accounts.json'); -const contractData = require('../../../../fixtures/build/Basic.json'); +const { Web3 } = require('../../../lib/commonjs'); +const { IpcProvider } = require('../../../../web3-providers-ipc/lib/commonjs'); +const accounts = require('../../../../../scripts/accounts.json'); +const contractData = require('../../../../../fixtures/build/Basic.json'); const DATA_AMOUNT = 50 * 1024; // 50 kB diff --git a/packages/web3/test/stress/startData.sh b/packages/web3/test/stress/large_request_data/start.sh similarity index 68% rename from packages/web3/test/stress/startData.sh rename to packages/web3/test/stress/large_request_data/start.sh index 0c37247c905..5f7d798906f 100755 --- a/packages/web3/test/stress/startData.sh +++ b/packages/web3/test/stress/large_request_data/start.sh @@ -8,9 +8,9 @@ export WEB3_SYSTEM_TEST_BACKEND="geth" yarn generate:accounts export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -node ./packages/web3/test/stress/data.js +node ./packages/web3/test/stress/large_request_data/index.js export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -node ./packages/web3/test/stress/data.js +node ./packages/web3/test/stress/large_request_data/index.js ./scripts/geth_binary.sh stop diff --git a/packages/web3/test/stress/validator.js b/packages/web3/test/stress/large_validator_data/index.js similarity index 87% rename from packages/web3/test/stress/validator.js rename to packages/web3/test/stress/large_validator_data/index.js index 36951e6c133..0db94c9ca53 100644 --- a/packages/web3/test/stress/validator.js +++ b/packages/web3/test/stress/large_validator_data/index.js @@ -16,7 +16,7 @@ along with web3.js. If not, see . */ /* eslint-disable */ -const { Web3Validator } = require('../../../web3-validator/lib/commonjs'); +const { Web3Validator } = require('../../../../web3-validator/lib/commonjs'); const abi = [ { indexed: true, internalType: 'address', name: 'from', type: 'address' }, @@ -99,37 +99,37 @@ const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( 1000, ); -const validator = new Web3Validator(); +const index = new Web3Validator(); console.time('huge schema'); -validator.validateJSONSchema(hugeSchema, hugeData); +index.validateJSONSchema(hugeSchema, hugeData); console.timeLog('huge schema'); console.time('huge schema 1000'); -validator.validateJSONSchema(hugeSchema1000, hugeData1000); +index.validateJSONSchema(hugeSchema1000, hugeData1000); console.timeLog('huge schema 1000'); console.time('simple schema multiple times'); for (let i = 0; i < 500; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData); + index.validateJSONSchema(simpleSchema, simpleData); } console.timeLog('simple schema multiple times'); console.time('simple schema 1000 times'); for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData); + index.validateJSONSchema(simpleSchema, simpleData); } console.timeLog('simple schema 1000 times'); console.time('simple JSON schema 1000 times'); for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(abiJsonSchema, abiData); + index.validateJSONSchema(abiJsonSchema, abiData); } console.timeLog('simple JSON schema 1000 times'); console.time('simple ABI 1000 times'); for (let i = 0; i < 1000; i += 1) { - validator.validate(abi, abiData); + index.validate(abi, abiData); } console.timeLog('simple ABI 1000 times'); diff --git a/packages/web3/test/stress/requests.html b/packages/web3/test/stress/many_requests/index.html similarity index 100% rename from packages/web3/test/stress/requests.html rename to packages/web3/test/stress/many_requests/index.html diff --git a/packages/web3/test/stress/requests.js b/packages/web3/test/stress/many_requests/index.js similarity index 95% rename from packages/web3/test/stress/requests.js rename to packages/web3/test/stress/many_requests/index.js index 7cad86a9147..4549db7aef4 100644 --- a/packages/web3/test/stress/requests.js +++ b/packages/web3/test/stress/many_requests/index.js @@ -16,9 +16,9 @@ along with web3.js. If not, see . */ /* eslint-disable */ -const { Web3 } = require('../../lib/commonjs'); -const { IpcProvider } = require('../../../web3-providers-ipc/lib/commonjs'); -const contractData = require('../../../../fixtures/build/Basic.json'); +const { Web3 } = require('../../../lib/commonjs'); +const { IpcProvider } = require('../../../../web3-providers-ipc/lib/commonjs'); +const contractData = require('../../../../../fixtures/build/Basic.json'); const providerString = process.env.WEB3_SYSTEM_TEST_PROVIDER; const isWs = providerString.startsWith('ws'); diff --git a/packages/web3/test/stress/startRequests.sh b/packages/web3/test/stress/many_requests/start.sh similarity index 73% rename from packages/web3/test/stress/startRequests.sh rename to packages/web3/test/stress/many_requests/start.sh index bef0820c97d..7816e802d65 100755 --- a/packages/web3/test/stress/startRequests.sh +++ b/packages/web3/test/stress/many_requests/start.sh @@ -6,19 +6,20 @@ export WEB3_SYSTEM_TEST_BACKEND="geth" ./scripts/geth_binary.sh stressStart export PARALLEL_COUNT=10 export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -node ./packages/web3/test/stress/requests.js +node ./packages/web3/test/stress/many_requests/index.js ./scripts/geth_binary.sh stop ./scripts/geth_binary.sh stressStart export PARALLEL_COUNT=1000 export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -node ./packages/web3/test/stress/requests.js +node ./packages/web3/test/stress/many_requests/index.js ./scripts/geth_binary.sh stressStart export PARALLEL_COUNT=100 export WEB3_SYSTEM_TEST_PROVIDER=http://127.0.0.1:8545 -node ./packages/web3/test/stress/requests.js +node ./packages/web3/test/stress/many_requests/index.js ./scripts/geth_binary.sh stop +request From 61c41e5240f4648af505c1e6a9c42e01cec2e0e2 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 14 Nov 2023 12:06:37 -0500 Subject: [PATCH 16/28] add browser test --- .../web3/test/stress/many_requests/index.html | 63 +++++-------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/packages/web3/test/stress/many_requests/index.html b/packages/web3/test/stress/many_requests/index.html index 1311927b818..8eb9000d659 100644 --- a/packages/web3/test/stress/many_requests/index.html +++ b/packages/web3/test/stress/many_requests/index.html @@ -1,22 +1,21 @@ + + + + -
Log:
From c6a91e8849768eabaecc433ab77ba9a493f6f92f Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Tue, 14 Nov 2023 20:34:54 -0500 Subject: [PATCH 17/28] fix --- packages/web3/test/stress/many_requests/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/web3/test/stress/many_requests/index.html b/packages/web3/test/stress/many_requests/index.html index 8eb9000d659..17e3115e8fd 100644 --- a/packages/web3/test/stress/many_requests/index.html +++ b/packages/web3/test/stress/many_requests/index.html @@ -414,7 +414,6 @@ } (async () => { await testScope(provider, 1000) - // await testScope('ws://localhost:8545', 2000) })() From 3f35de29942f5f34c20975c3b067161a354ea0a3 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 10:43:35 -0500 Subject: [PATCH 18/28] move to TS. remove time logs --- .../web3/test/stress/{index.js => index.ts} | 33 +++++++++---------- packages/web3/test/stress/start.sh | 4 +-- .../stress/{validator.js => validator.ts} | 33 +++++++------------ 3 files changed, 30 insertions(+), 40 deletions(-) rename packages/web3/test/stress/{index.js => index.ts} (66%) rename packages/web3/test/stress/{validator.js => validator.ts} (76%) diff --git a/packages/web3/test/stress/index.js b/packages/web3/test/stress/index.ts similarity index 66% rename from packages/web3/test/stress/index.js rename to packages/web3/test/stress/index.ts index 2124b1da6ed..eb0fe1a4457 100644 --- a/packages/web3/test/stress/index.js +++ b/packages/web3/test/stress/index.ts @@ -16,43 +16,42 @@ along with web3.js. If not, see . */ /* eslint-disable */ -const { Web3 } = require('../../lib/commonjs'); -const { IpcProvider } = require('../../../web3-providers-ipc/lib/commonjs'); -const accounts = require('../../../../scripts/accounts.json'); -const contractData = require('../../../../fixtures/build/Basic.json'); - +import { Web3 } from 'web3'; +import { IpcProvider } from 'web3-providers-ipc'; +import accounts from '../shared_fixtures/accounts.json'; +// @ts-ignore +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic.ts'; +import WebSocketProvider from 'web3-providers-ws'; const DATA_AMOUNT = 50 * 1024; // 50 kB -const sendAndGetData = async (web3, i) => { +const sendAndGetData = async (web3: Web3, i: number) => { const sendOptions = { from: accounts[i].address }; const deployOptions = { - data: contractData.evm.bytecode.object, - arguments: [123, ''], + data: BasicBytecode, + arguments: [0, ''] as [number, string], gasPrice: await web3.eth.getGasPrice(), gas: BigInt(9000000000000), gasLimit: BigInt(9000000000000), type: BigInt(0), }; - const c = new web3.eth.Contract(contractData.abi); + const c = new web3.eth.Contract(BasicAbi); + // @ts-ignore const contract = await c.deploy(deployOptions).send(sendOptions); - console.time(`Send huge data [${i}]`); - const receipt = await contract.methods + await contract.methods + // @ts-ignore .setValues(1, 'A'.repeat(DATA_AMOUNT), true) .send({ from: accounts[i].address }); - console.timeLog(`Send huge data [${i}]`, receipt.transactionHash); - console.time(`Get huge data [${i}]`); await contract.methods.getStringValue().call(); - console.timeLog(`Get huge data [${i}]`); }; const test = async () => { - const providerString = process.env.WEB3_SYSTEM_TEST_PROVIDER; + const providerString = String(process.env.WEB3_SYSTEM_TEST_PROVIDER); console.log(`Start test with provider: ${providerString}`); const provider = providerString.includes('ipc') ? new IpcProvider(providerString) - : new Web3.providers.WebsocketProvider(providerString); + : providerString; const web3 = new Web3(provider); for (const a of accounts) { @@ -65,7 +64,7 @@ const test = async () => { prs.push(sendAndGetData(web3, i)); } await Promise.all(prs); - web3.provider.disconnect(); + (web3.provider as unknown as WebSocketProvider).disconnect(); }; test().catch(console.error); diff --git a/packages/web3/test/stress/start.sh b/packages/web3/test/stress/start.sh index 1752882a79c..21675f5f6a8 100755 --- a/packages/web3/test/stress/start.sh +++ b/packages/web3/test/stress/start.sh @@ -8,9 +8,9 @@ export WEB3_SYSTEM_TEST_BACKEND="geth" yarn generate:accounts export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -node ./packages/web3/test/stress/index.js +npx ts-node ./packages/web3/test/stress/index.js export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -node ./packages/web3/test/stress/index.js +npx ts-node node ./packages/web3/test/stress/index.js ./scripts/geth_binary.sh stop diff --git a/packages/web3/test/stress/validator.js b/packages/web3/test/stress/validator.ts similarity index 76% rename from packages/web3/test/stress/validator.js rename to packages/web3/test/stress/validator.ts index 36951e6c133..076351820c0 100644 --- a/packages/web3/test/stress/validator.js +++ b/packages/web3/test/stress/validator.ts @@ -16,7 +16,7 @@ along with web3.js. If not, see . */ /* eslint-disable */ -const { Web3Validator } = require('../../../web3-validator/lib/commonjs'); +import { Web3Validator, JsonSchema, Json } from 'web3-validator'; const abi = [ { indexed: true, internalType: 'address', name: 'from', type: 'address' }, @@ -69,15 +69,19 @@ const simpleData = { data: '0xafea', }; -const createHugeSchema = (schema, data, n = 3) => { +const createHugeSchema = ( + schema: JsonSchema, + data: Json, + n = 3, +): { schema: JsonSchema; data: Json } => { if (n > 0) { const { data: resultData, schema: resultSchema } = createHugeSchema( { ...simpleSchema }, - { ...simpleData }, + { ...simpleData } as unknown as Json, n - 1, ); return { - data: { ...data, simple: resultData }, + data: { ...(typeof data === 'object' ? data : { data }), simple: resultData }, schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, }; } @@ -89,47 +93,34 @@ const createHugeSchema = (schema, data, n = 3) => { const { schema: hugeSchema, data: hugeData } = createHugeSchema( { ...simpleSchema }, - { ...simpleData }, + { ...simpleData } as unknown as Json, 500, ); const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( { ...simpleSchema }, - { ...simpleData }, + { ...simpleData } as unknown as Json, 1000, ); const validator = new Web3Validator(); -console.time('huge schema'); -validator.validateJSONSchema(hugeSchema, hugeData); -console.timeLog('huge schema'); +validator.validateJSONSchema(hugeSchema, hugeData as object); -console.time('huge schema 1000'); -validator.validateJSONSchema(hugeSchema1000, hugeData1000); -console.timeLog('huge schema 1000'); +validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); -console.time('simple schema multiple times'); for (let i = 0; i < 500; i += 1) { validator.validateJSONSchema(simpleSchema, simpleData); } -console.timeLog('simple schema multiple times'); -console.time('simple schema 1000 times'); for (let i = 0; i < 1000; i += 1) { validator.validateJSONSchema(simpleSchema, simpleData); } -console.timeLog('simple schema 1000 times'); -console.time('simple JSON schema 1000 times'); for (let i = 0; i < 1000; i += 1) { validator.validateJSONSchema(abiJsonSchema, abiData); } -console.timeLog('simple JSON schema 1000 times'); -console.time('simple ABI 1000 times'); for (let i = 0; i < 1000; i += 1) { validator.validate(abi, abiData); } - -console.timeLog('simple ABI 1000 times'); From 11dd80433d43ca20e36a4467a85658cc73497691 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 11:14:31 -0500 Subject: [PATCH 19/28] fix start.sh --- packages/web3/test/stress/index.ts | 4 +--- packages/web3/test/stress/start.sh | 5 +++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/web3/test/stress/index.ts b/packages/web3/test/stress/index.ts index eb0fe1a4457..67471e136fb 100644 --- a/packages/web3/test/stress/index.ts +++ b/packages/web3/test/stress/index.ts @@ -19,8 +19,7 @@ along with web3.js. If not, see . import { Web3 } from 'web3'; import { IpcProvider } from 'web3-providers-ipc'; import accounts from '../shared_fixtures/accounts.json'; -// @ts-ignore -import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic.ts'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; import WebSocketProvider from 'web3-providers-ws'; const DATA_AMOUNT = 50 * 1024; // 50 kB @@ -35,7 +34,6 @@ const sendAndGetData = async (web3: Web3, i: number) => { type: BigInt(0), }; const c = new web3.eth.Contract(BasicAbi); - // @ts-ignore const contract = await c.deploy(deployOptions).send(sendOptions); await contract.methods diff --git a/packages/web3/test/stress/start.sh b/packages/web3/test/stress/start.sh index 21675f5f6a8..9de30d524d9 100755 --- a/packages/web3/test/stress/start.sh +++ b/packages/web3/test/stress/start.sh @@ -2,15 +2,16 @@ . scripts/env.sh export WEB3_SYSTEM_TEST_BACKEND="geth" +export TS_NODE_PREFER_TS_EXTS=true ./scripts/geth_binary.sh stressStart yarn generate:accounts export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -npx ts-node ./packages/web3/test/stress/index.js +npx ts-node ./packages/web3/test/stress/index.ts export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -npx ts-node node ./packages/web3/test/stress/index.js +npx ts-node ./packages/web3/test/stress/index.ts ./scripts/geth_binary.sh stop From af661271b82924afad584204b72cc14a4b776587 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 11:18:01 -0500 Subject: [PATCH 20/28] fix validation test run script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f06aa463f9a..44aebd4e2cd 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", "test:stress:data": "packages/web3/test/stress/start.sh", - "test:stress:validation": "node packages/web3/test/stress/validator.js", + "test:stress:validation": "npx ts-node packages/web3/test/stress/validator.ts", "test:stress": "yarn test:stress:data && yarn test:stress:validation", "husky:install": "husky install", "husky:uninstall": "husky uninstall", From cca93113447b51c87b85463a7116211a5ecfe8e7 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 12:22:33 -0500 Subject: [PATCH 21/28] fix name --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 44aebd4e2cd..6adc68ec73b 100644 --- a/package.json +++ b/package.json @@ -85,9 +85,9 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:stress:data": "packages/web3/test/stress/start.sh", - "test:stress:validation": "npx ts-node packages/web3/test/stress/validator.ts", - "test:stress": "yarn test:stress:data && yarn test:stress:validation", + "test:manual:stress:data": "packages/web3/test/stress/start.sh", + "test:manual:stress:validation": "npx ts-node packages/web3/test/stress/validator.ts", + "test:manual:stress": "yarn test:manual:stress:data && yarn test:manual:stress:validation", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", From 69e9b7b75536ba80498bfcc40ba6293445a5e734 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 12:42:05 -0500 Subject: [PATCH 22/28] move to TS --- package.json | 2 +- .../test/stress/large_request_data/index.ts | 13 ++--- .../test/stress/large_validator_data/index.ts | 24 ++------- .../many_requests/{index.js => index.ts} | 51 +++++++++++-------- .../web3/test/stress/many_requests/start.sh | 7 +-- 5 files changed, 42 insertions(+), 55 deletions(-) rename packages/web3/test/stress/many_requests/{index.js => index.ts} (73%) diff --git a/package.json b/package.json index 0a677245852..55f12907c7f 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:manual:stress:data": "packages/web3/stress/large_request_data/start.sh", + "test:manual:stress:data": "packages/web3/test/stress/large_request_data/start.sh", "test:manual:stress:requests": "packages/web3/test/stress/many_requests/start.sh", "test:manual:stress:validation": "npx ts-node packages/web3/test/stress/large_validator_data/index.ts", "test:manual:stress": "yarn test:manual:stress:data && yarn test:manual:stress:validation && yarn test:stress:requests", diff --git a/packages/web3/test/stress/large_request_data/index.ts b/packages/web3/test/stress/large_request_data/index.ts index 69862f436aa..8cc27001352 100644 --- a/packages/web3/test/stress/large_request_data/index.ts +++ b/packages/web3/test/stress/large_request_data/index.ts @@ -16,19 +16,12 @@ along with web3.js. If not, see . */ /* eslint-disable */ -<<<<<<<< HEAD:packages/web3/test/stress/large_request_data/index.js -const { Web3 } = require('../../../lib/commonjs'); -const { IpcProvider } = require('../../../../web3-providers-ipc/lib/commonjs'); -const accounts = require('../../../../../scripts/accounts.json'); -const contractData = require('../../../../../fixtures/build/Basic.json'); - -======== import { Web3 } from 'web3'; import { IpcProvider } from 'web3-providers-ipc'; -import accounts from '../shared_fixtures/accounts.json'; -import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import accounts from '../../shared_fixtures/accounts.json'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; import WebSocketProvider from 'web3-providers-ws'; ->>>>>>>> ok/5563-Stress-Tests-2---QA-Tests:packages/web3/test/stress/index.ts + const DATA_AMOUNT = 50 * 1024; // 50 kB const sendAndGetData = async (web3: Web3, i: number) => { diff --git a/packages/web3/test/stress/large_validator_data/index.ts b/packages/web3/test/stress/large_validator_data/index.ts index 3cc53386486..076351820c0 100644 --- a/packages/web3/test/stress/large_validator_data/index.ts +++ b/packages/web3/test/stress/large_validator_data/index.ts @@ -16,11 +16,7 @@ along with web3.js. If not, see . */ /* eslint-disable */ -<<<<<<<< HEAD:packages/web3/test/stress/large_validator_data/index.js -const { Web3Validator } = require('../../../../web3-validator/lib/commonjs'); -======== import { Web3Validator, JsonSchema, Json } from 'web3-validator'; ->>>>>>>> ok/5563-Stress-Tests-2---QA-Tests:packages/web3/test/stress/validator.ts const abi = [ { indexed: true, internalType: 'address', name: 'from', type: 'address' }, @@ -107,34 +103,24 @@ const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( 1000, ); -const index = new Web3Validator(); +const validator = new Web3Validator(); -<<<<<<<< HEAD:packages/web3/test/stress/large_validator_data/index.js -console.time('huge schema'); -index.validateJSONSchema(hugeSchema, hugeData); -console.timeLog('huge schema'); - -console.time('huge schema 1000'); -index.validateJSONSchema(hugeSchema1000, hugeData1000); -console.timeLog('huge schema 1000'); -======== validator.validateJSONSchema(hugeSchema, hugeData as object); validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); ->>>>>>>> ok/5563-Stress-Tests-2---QA-Tests:packages/web3/test/stress/validator.ts for (let i = 0; i < 500; i += 1) { - index.validateJSONSchema(simpleSchema, simpleData); + validator.validateJSONSchema(simpleSchema, simpleData); } for (let i = 0; i < 1000; i += 1) { - index.validateJSONSchema(simpleSchema, simpleData); + validator.validateJSONSchema(simpleSchema, simpleData); } for (let i = 0; i < 1000; i += 1) { - index.validateJSONSchema(abiJsonSchema, abiData); + validator.validateJSONSchema(abiJsonSchema, abiData); } for (let i = 0; i < 1000; i += 1) { - index.validate(abi, abiData); + validator.validate(abi, abiData); } diff --git a/packages/web3/test/stress/many_requests/index.js b/packages/web3/test/stress/many_requests/index.ts similarity index 73% rename from packages/web3/test/stress/many_requests/index.js rename to packages/web3/test/stress/many_requests/index.ts index 4549db7aef4..649bdba0a53 100644 --- a/packages/web3/test/stress/many_requests/index.js +++ b/packages/web3/test/stress/many_requests/index.ts @@ -16,33 +16,34 @@ along with web3.js. If not, see . */ /* eslint-disable */ -const { Web3 } = require('../../../lib/commonjs'); -const { IpcProvider } = require('../../../../web3-providers-ipc/lib/commonjs'); -const contractData = require('../../../../../fixtures/build/Basic.json'); +import { Web3, Contract, Numbers, EventLog } from 'web3'; +import { IpcProvider } from 'web3-providers-ipc'; +import { BasicBytecode, BasicAbi } from '../../shared_fixtures/build/Basic'; +import { Web3Account } from 'web3-eth-accounts'; -const providerString = process.env.WEB3_SYSTEM_TEST_PROVIDER; +const providerString = String(process.env.WEB3_SYSTEM_TEST_PROVIDER); const isWs = providerString.startsWith('ws'); const isIpc = providerString.includes('ipc'); -const contracts = {}; +const contracts: { [key: string]: Contract } = {}; -const deployContracts = async (web3, accounts) => { +const deployContracts = async (web3: Web3, accounts: Web3Account[]) => { const prs = []; for (let i = 0; i < accounts.length; i++) { const account = accounts[i]; const sendOptions = { from: account.address }; const deployOptions = { - data: contractData.evm.bytecode.object, - arguments: [123, ''], + data: BasicBytecode, + arguments: [123, ''] as [number, string], gas: BigInt(9000000000000), gasLimit: BigInt(9000000000000), type: BigInt(0), }; - const c = new web3.eth.Contract(contractData.abi); + const c = new web3.eth.Contract(BasicAbi); prs.push( c .deploy(deployOptions) .send(sendOptions) - .then(contract => { + .then((contract: typeof c) => { contracts[account.address] = contract; }), ); @@ -50,7 +51,13 @@ const deployContracts = async (web3, accounts) => { await Promise.all(prs); }; -const addAccount = async (web3, mainAcc, address, privateKey, nonce) => { +const addAccount = async ( + web3: Web3, + mainAcc: string, + address: string, + privateKey: string, + nonce: Numbers, +) => { web3.eth.accounts.wallet.add(privateKey); return web3.eth.sendTransaction({ from: mainAcc, @@ -61,11 +68,11 @@ const addAccount = async (web3, mainAcc, address, privateKey, nonce) => { }); }; -const prepareAccounts = async (web3, n = 1000) => { +const prepareAccounts = async (web3: Web3, n = 1000) => { const prs = []; const list = await web3.eth.personal.getAccounts(); const mainAcc = list[0]; - const accountList = []; + const accountList: Web3Account[] = []; const nonce = await web3.eth.getTransactionCount(mainAcc); for (let i = 0; i < n; i++) { const acc = web3.eth.accounts.create(); @@ -76,20 +83,20 @@ const prepareAccounts = async (web3, n = 1000) => { return accountList; }; -const sendData = async (web3, account) => { +const sendData = async (account: Web3Account) => { const contract = contracts[account.address]; return contract.methods .firesStringEvent(`String event: ${account.address}`) .send({ from: account.address }); }; -const getData = async (web3, account) => { +const getData = async (account: Web3Account) => { const contract = contracts[account.address]; await contract.methods.getStringValue().call(); }; -const receivedEvents = {}; -const subscribeContract = acc => { +const receivedEvents: { [key: string]: EventLog } = {}; +const subscribeContract = (acc: Web3Account) => { const contract = contracts[acc.address]; const event = contract.events.StringEvent(); @@ -100,7 +107,7 @@ const subscribeContract = acc => { receivedEvents[acc.address] = res; }); }; -const contractSubscriptions = (web3, accounts) => { +const contractSubscriptions = (accounts: Web3Account[]) => { console.log(`Subscribe to ${accounts.length} contracts events`); for (const acc of accounts) { subscribeContract(acc); @@ -123,13 +130,13 @@ const test = async () => { await deployContracts(web3, accounts); // if socket subscribe to events if (isIpc || isWs) { - contractSubscriptions(web3, accounts); + contractSubscriptions(accounts); } console.log(`Send data from ${n} accounts in parallel`); const sendPrs = []; for (let i = 0; i < n; i++) { - sendPrs.push(sendData(web3, accounts[i])); + sendPrs.push(sendData(accounts[i])); } await Promise.all(sendPrs); @@ -142,11 +149,11 @@ const test = async () => { console.log(`Get data from ${n} accounts in parallel`); const getPrs = []; for (let i = 0; i < n; i++) { - getPrs.push(getData(web3, accounts[i])); + getPrs.push(getData(accounts[i])); } await Promise.all(getPrs); if (isIpc || isWs) { - web3.provider.disconnect(); + (web3.provider as IpcProvider).disconnect(); } }; diff --git a/packages/web3/test/stress/many_requests/start.sh b/packages/web3/test/stress/many_requests/start.sh index 7816e802d65..a7d0688065f 100755 --- a/packages/web3/test/stress/many_requests/start.sh +++ b/packages/web3/test/stress/many_requests/start.sh @@ -2,23 +2,24 @@ . scripts/env.sh export WEB3_SYSTEM_TEST_BACKEND="geth" +export TS_NODE_PREFER_TS_EXTS=true ./scripts/geth_binary.sh stressStart export PARALLEL_COUNT=10 export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -node ./packages/web3/test/stress/many_requests/index.js +ts-node ./packages/web3/test/stress/many_requests/index.ts ./scripts/geth_binary.sh stop ./scripts/geth_binary.sh stressStart export PARALLEL_COUNT=1000 export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -node ./packages/web3/test/stress/many_requests/index.js +ts-node ./packages/web3/test/stress/many_requests/index.ts ./scripts/geth_binary.sh stressStart export PARALLEL_COUNT=100 export WEB3_SYSTEM_TEST_PROVIDER=http://127.0.0.1:8545 -node ./packages/web3/test/stress/many_requests/index.js +ts-node ./packages/web3/test/stress/many_requests/index.ts ./scripts/geth_binary.sh stop From 9c8878395bc327d7f80b590c17ab4cf97750bf0e Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 19:02:51 -0500 Subject: [PATCH 23/28] move to jest --- package.json | 9 +- packages/web3/package.json | 1 + .../index.ts => manual/data.test.ts} | 49 +- packages/web3/test/manual/jest.config.js | 33 ++ .../index.ts => manual/requests.test.ts} | 81 ++-- packages/web3/test/manual/setup.js | 24 + packages/web3/test/manual/validation.test.ts | 183 ++++++++ .../test/stress/large_request_data/start.sh | 17 - .../test/stress/large_validator_data/index.ts | 126 ------ .../web3/test/stress/many_requests/index.html | 421 ------------------ .../web3/test/stress/many_requests/start.sh | 26 -- scripts/gen_accounts.js | 4 +- scripts/geth_binary.sh | 7 +- scripts/test-runner.sh | 16 +- 14 files changed, 323 insertions(+), 674 deletions(-) rename packages/web3/test/{stress/large_request_data/index.ts => manual/data.test.ts} (62%) create mode 100644 packages/web3/test/manual/jest.config.js rename packages/web3/test/{stress/many_requests/index.ts => manual/requests.test.ts} (66%) create mode 100644 packages/web3/test/manual/setup.js create mode 100644 packages/web3/test/manual/validation.test.ts delete mode 100755 packages/web3/test/stress/large_request_data/start.sh delete mode 100644 packages/web3/test/stress/large_validator_data/index.ts delete mode 100644 packages/web3/test/stress/many_requests/index.html delete mode 100755 packages/web3/test/stress/many_requests/start.sh diff --git a/package.json b/package.json index 55f12907c7f..f4a7a6572ac 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,8 @@ "geth-binary:start": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh start", "geth-binary:start:background": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh start 1", "geth-binary:stop": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh stop", + "geth-manual:start:background": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh manualStart 1", + "geth-manual:stop": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh stop", "lint": "lerna run lint --stream --parallel", "lint:fix": "lerna run lint:fix --stream --parallel", "format": "lerna run format --stream --parallel && prettier --write ./scripts/**/*.ts", @@ -61,6 +63,7 @@ "test:coverage:integration": "lerna run test:coverage:integration --stream --parallel", "test:unit": "lerna run test:unit --stream --parallel && jest --config=./scripts/jest.config.js", "test:integration": "lerna run test:integration --stream", + "test:manual": "lerna run test:manual --stream", "test:e2e:ganache:http": "./scripts/test-runner.sh ganache http", "test:e2e:ganache:ws": "./scripts/test-runner.sh ganache ws", "test:e2e:geth:http": "./scripts/test-runner.sh geth http", @@ -74,6 +77,8 @@ "test:e2e:mainnet:ws": "./scripts/test-runner.sh mainnet ws", "test:e2e:sepolia:http": "./scripts/test-runner.sh sepolia http", "test:e2e:sepolia:ws": "./scripts/test-runner.sh sepolia ws", + "test:e2e:manual:geth:ws": "./scripts/test-runner.sh geth-manual ws node manual", + "test:e2e:manual:geth:ipc": "./scripts/test-runner.sh geth-manual ipc node manual", "generate:accounts": "node ./scripts/gen_accounts.js", "pre-blackbox": "yarn config set registry http://localhost:4873 && git init && git config --global user.email \"ci@github.com\" && git config --global user.name \"CI\"", "post-blackbox": "./scripts/verdaccio.sh stop", @@ -85,10 +90,6 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:manual:stress:data": "packages/web3/test/stress/large_request_data/start.sh", - "test:manual:stress:requests": "packages/web3/test/stress/many_requests/start.sh", - "test:manual:stress:validation": "npx ts-node packages/web3/test/stress/large_validator_data/index.ts", - "test:manual:stress": "yarn test:manual:stress:data && yarn test:manual:stress:validation && yarn test:stress:requests", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", diff --git a/packages/web3/package.json b/packages/web3/package.json index b9f54e5a950..0558b98820f 100644 --- a/packages/web3/package.json +++ b/packages/web3/package.json @@ -53,6 +53,7 @@ "test:watch": "npm test -- --watch", "test:unit": "jest --config=./test/unit/jest.config.js", "test:integration": "jest --config=./test/integration/jest.config.js --forceExit", + "test:manual": "jest --config=./test/manual/jest.config.js --forceExit", "test:blackbox:ganache:http": "./scripts/black_box_test.sh ganache http", "test:blackbox:ganache:ws": "./scripts/black_box_test.sh ganache ws", "test:blackbox:geth:http": "./scripts/black_box_test.sh geth http", diff --git a/packages/web3/test/stress/large_request_data/index.ts b/packages/web3/test/manual/data.test.ts similarity index 62% rename from packages/web3/test/stress/large_request_data/index.ts rename to packages/web3/test/manual/data.test.ts index 8cc27001352..eb57a6ebab8 100644 --- a/packages/web3/test/stress/large_request_data/index.ts +++ b/packages/web3/test/manual/data.test.ts @@ -17,10 +17,10 @@ along with web3.js. If not, see . /* eslint-disable */ import { Web3 } from 'web3'; -import { IpcProvider } from 'web3-providers-ipc'; -import accounts from '../../shared_fixtures/accounts.json'; -import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; import WebSocketProvider from 'web3-providers-ws'; +import accounts from '../../../../scripts/accounts.json'; +import { isWs, isIpc, getSystemTestProvider } from '../../../../scripts/system_tests_utils'; +import { BasicAbi, BasicBytecode } from '../../../../fixtures/build/Basic'; const DATA_AMOUNT = 50 * 1024; // 50 kB @@ -38,32 +38,33 @@ const sendAndGetData = async (web3: Web3, i: number) => { const contract = await c.deploy(deployOptions).send(sendOptions); await contract.methods - // @ts-ignore .setValues(1, 'A'.repeat(DATA_AMOUNT), true) .send({ from: accounts[i].address }); await contract.methods.getStringValue().call(); }; -const test = async () => { - const providerString = String(process.env.WEB3_SYSTEM_TEST_PROVIDER); - console.log(`Start test with provider: ${providerString}`); - const provider = providerString.includes('ipc') - ? new IpcProvider(providerString) - : providerString; - const web3 = new Web3(provider); +describe('huge data', () => { + let web3: Web3; + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + afterAll(() => { + if (isWs || isIpc) { + (web3.provider as unknown as WebSocketProvider).disconnect(); + } + }); - for (const a of accounts) { - const acc = web3.eth.accounts.privateKeyToAccount(a.privateKey); - web3.eth.accounts.wallet.add(acc); - } + it('send and get', async () => { + for (const a of accounts) { + const acc = web3.eth.accounts.privateKeyToAccount(a.privateKey); + web3.eth.accounts.wallet.add(acc); + } - const prs = []; - for (let i = 0; i < 15; i++) { - prs.push(sendAndGetData(web3, i)); - } - await Promise.all(prs); - (web3.provider as unknown as WebSocketProvider).disconnect(); -}; - -test().catch(console.error); + const prs = []; + for (let i = 0; i < 15; i++) { + prs.push(sendAndGetData(web3, i)); + } + await Promise.all(prs); + }); +}); diff --git a/packages/web3/test/manual/jest.config.js b/packages/web3/test/manual/jest.config.js new file mode 100644 index 00000000000..3ce6277a283 --- /dev/null +++ b/packages/web3/test/manual/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/manual/setup.js'], + testMatch: ['/test/manual/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3/test/stress/many_requests/index.ts b/packages/web3/test/manual/requests.test.ts similarity index 66% rename from packages/web3/test/stress/many_requests/index.ts rename to packages/web3/test/manual/requests.test.ts index 649bdba0a53..f4896fef2e6 100644 --- a/packages/web3/test/stress/many_requests/index.ts +++ b/packages/web3/test/manual/requests.test.ts @@ -16,14 +16,12 @@ along with web3.js. If not, see . */ /* eslint-disable */ -import { Web3, Contract, Numbers, EventLog } from 'web3'; -import { IpcProvider } from 'web3-providers-ipc'; -import { BasicBytecode, BasicAbi } from '../../shared_fixtures/build/Basic'; +import WebSocketProvider from 'web3-providers-ws'; import { Web3Account } from 'web3-eth-accounts'; +import { Web3, Contract, Numbers, EventLog } from 'web3'; +import { BasicBytecode, BasicAbi } from '../../../../fixtures/build/Basic'; +import { isWs, isIpc, getSystemTestProvider } from '../../../../scripts/system_tests_utils'; -const providerString = String(process.env.WEB3_SYSTEM_TEST_PROVIDER); -const isWs = providerString.startsWith('ws'); -const isIpc = providerString.includes('ipc'); const contracts: { [key: string]: Contract } = {}; const deployContracts = async (web3: Web3, accounts: Web3Account[]) => { @@ -108,53 +106,42 @@ const subscribeContract = (acc: Web3Account) => { }); }; const contractSubscriptions = (accounts: Web3Account[]) => { - console.log(`Subscribe to ${accounts.length} contracts events`); for (const acc of accounts) { subscribeContract(acc); } }; -const test = async () => { - console.log(`Start test with provider: ${providerString}`); - const provider = isIpc - ? new IpcProvider(providerString) - : isWs - ? new Web3.providers.WebsocketProvider(providerString) - : new Web3.providers.HttpProvider(providerString); - const web3 = new Web3(provider); - const n = Number(process.env.PARALLEL_COUNT) || 500; - - console.log(`Prepare ${n} accounts in parallel`); - const accounts = await prepareAccounts(web3, n); - - console.log(`Deploy ${n} contracts in parallel`); - await deployContracts(web3, accounts); - // if socket subscribe to events - if (isIpc || isWs) { - contractSubscriptions(accounts); - } - console.log(`Send data from ${n} accounts in parallel`); - const sendPrs = []; - for (let i = 0; i < n; i++) { - sendPrs.push(sendData(accounts[i])); - } - await Promise.all(sendPrs); +describe('huge data', () => { + let web3: Web3; + let parallelCount = 500; + beforeAll(() => { + parallelCount = isIpc ? 5 : parallelCount; + web3 = new Web3(getSystemTestProvider()); + }); + afterAll(() => { + if (isWs || isIpc) { + (web3.provider as unknown as WebSocketProvider).disconnect(); + } + }); + it('send requests', async () => { + const accounts = await prepareAccounts(web3, parallelCount); - if (isIpc || isWs) { - if (Object.keys(receivedEvents).length !== accounts.length) { - throw new Error('Incorrect event count'); + await deployContracts(web3, accounts); + // if socket subscribe to events + if (isIpc || isWs) { + contractSubscriptions(accounts); } - } - console.log(`Get data from ${n} accounts in parallel`); - const getPrs = []; - for (let i = 0; i < n; i++) { - getPrs.push(getData(accounts[i])); - } - await Promise.all(getPrs); - if (isIpc || isWs) { - (web3.provider as IpcProvider).disconnect(); - } -}; + const sendPrs = []; + for (let i = 0; i < parallelCount; i++) { + sendPrs.push(sendData(accounts[i])); + } + await Promise.all(sendPrs); -test().catch(console.error); + const getPrs = []; + for (let i = 0; i < parallelCount; i++) { + getPrs.push(getData(accounts[i])); + } + await Promise.all(getPrs); + }); +}); diff --git a/packages/web3/test/manual/setup.js b/packages/web3/test/manual/setup.js new file mode 100644 index 00000000000..63fd7e1772a --- /dev/null +++ b/packages/web3/test/manual/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 300000; // Sometimes `in3` takes long time because of its decentralized nature. + +jest.setTimeout(jestTimeout); diff --git a/packages/web3/test/manual/validation.test.ts b/packages/web3/test/manual/validation.test.ts new file mode 100644 index 00000000000..7ef7e44ef4c --- /dev/null +++ b/packages/web3/test/manual/validation.test.ts @@ -0,0 +1,183 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Validator, Json, JsonSchema, ValidationSchemaInput } from 'web3-validator'; + +const abi = [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, +]; + +const abiJsonSchema = { + type: 'array', + items: [ + { name: 'from', format: 'address' }, + { name: 'to', format: 'address' }, + { name: 'value', format: 'uint256' }, + ], +}; + +const abiData = [ + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', +]; + +const simpleSchema = { + type: 'object', + required: ['blockHash', 'blockNumber', 'from', 'to', 'data'], + properties: { + blockHash: { + format: 'bytes32', + }, + blockNumber: { + format: 'uint', + }, + from: { + format: 'address', + }, + to: { + oneOf: [{ format: 'address' }, { type: 'null' }], + }, + data: { + format: 'bytes', + }, + }, +}; + +const simpleData = { + blockHash: '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + blockNumber: BigInt(2), + from: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + to: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + data: '0xafea', +} as unknown as ValidationSchemaInput; + +const createHugeSchema = ( + schema: JsonSchema, + data: Json, + n = 3, +): { schema: JsonSchema; data: Json } => { + if (n > 0) { + const { data: resultData, schema: resultSchema } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + n - 1, + ); + return { + data: { ...(data as unknown as object), simple: resultData }, + schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, + }; + } + return { + schema, + data, + }; +}; + +const { schema: hugeSchema, data: hugeData } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + 500, +); + +const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + 1000, +); +describe('validator', () => { + let validator: Web3Validator; + beforeAll(() => { + validator = new Web3Validator(); + }); + + it('huge schema', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + validator.validateJSONSchema(hugeSchema, hugeData as object); + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(6000); + expect(t).toBeGreaterThan(0); + }); + + it('huge schema 1000', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(6000); + expect(t).toBeGreaterThan(0); + }); + + it('simple schema multiple times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 500; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(3000); + expect(t).toBeGreaterThan(0); + }); + + it('simple schema 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); + + it('simple JSON schema 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(abiJsonSchema, abiData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); + + it('simple ABI 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validate(abi, abiData); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); +}); diff --git a/packages/web3/test/stress/large_request_data/start.sh b/packages/web3/test/stress/large_request_data/start.sh deleted file mode 100755 index 8f499737d5f..00000000000 --- a/packages/web3/test/stress/large_request_data/start.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -. scripts/env.sh - -export WEB3_SYSTEM_TEST_BACKEND="geth" -export TS_NODE_PREFER_TS_EXTS=true - -./scripts/geth_binary.sh stressStart - -yarn generate:accounts - -export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -npx ts-node ./packages/web3/test/stress/large_request_data/index.ts - -export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -npx ts-node ./packages/web3/test/stress/large_request_data/index.ts - -./scripts/geth_binary.sh stop diff --git a/packages/web3/test/stress/large_validator_data/index.ts b/packages/web3/test/stress/large_validator_data/index.ts deleted file mode 100644 index 076351820c0..00000000000 --- a/packages/web3/test/stress/large_validator_data/index.ts +++ /dev/null @@ -1,126 +0,0 @@ -/* -This file is part of web3.js. - -web3.js is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -web3.js is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with web3.js. If not, see . -*/ - -/* eslint-disable */ -import { Web3Validator, JsonSchema, Json } from 'web3-validator'; - -const abi = [ - { indexed: true, internalType: 'address', name: 'from', type: 'address' }, - { indexed: true, internalType: 'address', name: 'to', type: 'address' }, - { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, -]; - -const abiJsonSchema = { - type: 'array', - items: [ - { name: 'from', format: 'address' }, - { name: 'to', format: 'address' }, - { name: 'value', format: 'uint256' }, - ], -}; - -const abiData = [ - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', -]; - -const simpleSchema = { - type: 'object', - required: ['blockHash', 'blockNumber', 'from', 'to', 'data'], - properties: { - blockHash: { - format: 'bytes32', - }, - blockNumber: { - format: 'uint', - }, - from: { - format: 'address', - }, - to: { - oneOf: [{ format: 'address' }, { type: 'null' }], - }, - data: { - format: 'bytes', - }, - }, -}; - -const simpleData = { - blockHash: '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', - blockNumber: BigInt(2), - from: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - to: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - data: '0xafea', -}; - -const createHugeSchema = ( - schema: JsonSchema, - data: Json, - n = 3, -): { schema: JsonSchema; data: Json } => { - if (n > 0) { - const { data: resultData, schema: resultSchema } = createHugeSchema( - { ...simpleSchema }, - { ...simpleData } as unknown as Json, - n - 1, - ); - return { - data: { ...(typeof data === 'object' ? data : { data }), simple: resultData }, - schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, - }; - } - return { - schema, - data, - }; -}; - -const { schema: hugeSchema, data: hugeData } = createHugeSchema( - { ...simpleSchema }, - { ...simpleData } as unknown as Json, - 500, -); - -const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( - { ...simpleSchema }, - { ...simpleData } as unknown as Json, - 1000, -); - -const validator = new Web3Validator(); - -validator.validateJSONSchema(hugeSchema, hugeData as object); - -validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); - -for (let i = 0; i < 500; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData); -} - -for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData); -} - -for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(abiJsonSchema, abiData); -} - -for (let i = 0; i < 1000; i += 1) { - validator.validate(abi, abiData); -} diff --git a/packages/web3/test/stress/many_requests/index.html b/packages/web3/test/stress/many_requests/index.html deleted file mode 100644 index 17e3115e8fd..00000000000 --- a/packages/web3/test/stress/many_requests/index.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - - -
- Log: -
-
- - - diff --git a/packages/web3/test/stress/many_requests/start.sh b/packages/web3/test/stress/many_requests/start.sh deleted file mode 100755 index a7d0688065f..00000000000 --- a/packages/web3/test/stress/many_requests/start.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -. scripts/env.sh - -export WEB3_SYSTEM_TEST_BACKEND="geth" -export TS_NODE_PREFER_TS_EXTS=true - -./scripts/geth_binary.sh stressStart -export PARALLEL_COUNT=10 -export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -ts-node ./packages/web3/test/stress/many_requests/index.ts -./scripts/geth_binary.sh stop - -./scripts/geth_binary.sh stressStart -export PARALLEL_COUNT=1000 -export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -ts-node ./packages/web3/test/stress/many_requests/index.ts - - -./scripts/geth_binary.sh stressStart -export PARALLEL_COUNT=100 -export WEB3_SYSTEM_TEST_PROVIDER=http://127.0.0.1:8545 -ts-node ./packages/web3/test/stress/many_requests/index.ts -./scripts/geth_binary.sh stop - - -request diff --git a/scripts/gen_accounts.js b/scripts/gen_accounts.js index b67519a702e..75d29bbe610 100644 --- a/scripts/gen_accounts.js +++ b/scripts/gen_accounts.js @@ -24,7 +24,9 @@ const addAccount = async (address, privateKey) => { if (!accountList.find(acc => acc.address === address)) { await web3Personal.importRawKey( - getSystemTestBackend() === 'geth' ? privateKey.slice(2) : privateKey, + ['geth', 'geth-manual'].includes(getSystemTestBackend()) + ? privateKey.slice(2) + : privateKey, '123456', ); } diff --git a/scripts/geth_binary.sh b/scripts/geth_binary.sh index 82f48622ec6..5bdc8cf24ea 100755 --- a/scripts/geth_binary.sh +++ b/scripts/geth_binary.sh @@ -70,12 +70,13 @@ start() { fi } -startStress() { +startManual() { download - echo "Starting geth..." + echo "Starting manual geth..." echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null &" ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null & + echo "Waiting for geth..." npx wait-port -t 10000 "$WEB3_SYSTEM_TEST_PORT" @@ -107,7 +108,7 @@ stop() { } case $1 in -stressStart) startStress ;; +manualStart) startManual ;; syncStart) startSync ;; syncStop) syncStop ;; start) start ;; diff --git a/scripts/test-runner.sh b/scripts/test-runner.sh index cdb3798e461..bbbf6bd61cd 100755 --- a/scripts/test-runner.sh +++ b/scripts/test-runner.sh @@ -13,11 +13,11 @@ MODE=${ORIGARGS[1]} ENGINE=${ORIGARGS[2]} TEST_OPTION=${ORIGARGS[3]} -SUPPORTED_BACKENDS=("geth" "ganache" "sepolia" "mainnet") +SUPPORTED_BACKENDS=("geth" "ganache" "sepolia" "mainnet" "geth-manual") SUPPORTED_MODE=("http" "ws" "ipc") # if you will add a new browser please also add it in the system_test_utils.ts => isBrowser SUPPORTED_ENGINES=("node" "electron" "firefox" "chrome" "") -SUPPORTED_TEST_OPTIONS=("coverage" "sync" "") +SUPPORTED_TEST_OPTIONS=("coverage" "sync" "manual" "") if [[ ! " ${SUPPORTED_BACKENDS[*]} " =~ " ${BACKEND} " ]]; then helpFunction @@ -47,11 +47,17 @@ TEST_COMMAND="" if [[ $MODE == "ipc" ]]; then export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH - BACKEND=geth-binary + if [[ $BACKEND != "geth-manual" ]]; then + BACKEND=geth-binary + fi fi + + if [[ $ENGINE == "node" ]] || [[ $ENGINE == "" ]]; then - if [[ $TEST_OPTION == "coverage" ]]; then + if [[ $TEST_OPTION == "manual" ]]; then + TEST_COMMAND="test:manual" + elif [[ $TEST_OPTION == "coverage" ]]; then TEST_COMMAND="test:coverage:integration" elif [[ $BACKEND == "sepolia" || $BACKEND == "mainnet" ]]; then TEST_COMMAND="lerna run test:e2e:$BACKEND" @@ -63,7 +69,7 @@ else fi -if [[ $BACKEND == "geth" || $BACKEND == "ganache" || $BACKEND == "geth-binary" ]]; then +if [[ $BACKEND == "geth" || $BACKEND == "ganache" || $BACKEND == "geth-binary" || $BACKEND == "geth-manual" ]]; then yarn "$BACKEND:start:background" && yarn generate:accounts && yarn $TEST_COMMAND && yarn "$BACKEND:stop" else yarn $TEST_COMMAND From 192f70b319c56221bf0dfad394efe84c69d19445 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 20:40:32 -0500 Subject: [PATCH 24/28] add browser tests --- README.md | 3 +- package.json | 11 +- packages/web3/cypress | 1 + packages/web3/cypress.config.js | 31 +++ packages/web3/package.json | 7 +- packages/web3/test/e2e_manual/data.test.ts | 70 +++++++ packages/web3/test/e2e_manual/jest.config.js | 32 +++ .../web3/test/e2e_manual/requests.test.ts | 147 ++++++++++++++ packages/web3/test/e2e_manual/setup.js | 24 +++ .../web3/test/e2e_manual/validation.test.ts | 183 ++++++++++++++++++ packages/web3/test/manual/requests.test.ts | 22 +-- packages/web3/test/manual/setup.js | 2 +- scripts/test-runner.sh | 8 +- 13 files changed, 519 insertions(+), 22 deletions(-) create mode 120000 packages/web3/cypress create mode 100644 packages/web3/cypress.config.js create mode 100644 packages/web3/test/e2e_manual/data.test.ts create mode 100644 packages/web3/test/e2e_manual/jest.config.js create mode 100644 packages/web3/test/e2e_manual/requests.test.ts create mode 100644 packages/web3/test/e2e_manual/setup.js create mode 100644 packages/web3/test/e2e_manual/validation.test.ts diff --git a/README.md b/README.md index 4baf220afb3..c1f5bcb2398 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ yarn add web3 ## Package.json Scripts | Script | Description | -| ---------------- | ------------------------------------------------------------------ | +| ---------------- |--------------------------------------------------------------------| | clean | Uses `rimraf` to remove `dist/` | | build | Uses `tsc` to build all packages | | lint | Uses `eslint` to lint all packages | @@ -86,6 +86,7 @@ yarn add web3 | test | Uses `jest` to run unit tests in each package | | test:integration | Uses `jest` to run tests under `/test/integration` in each package | | test:unit | Uses `jest` to run tests under `/test/unit` in each package | +| test:manual:long-connection-ws | Runs manual tests for keeping a long WebSocket connection | | test:manual | Runs manual tests under `test/manual` in the web3 package | [npm-url]: https://npmjs.org/package/web3 diff --git a/package.json b/package.json index 06e7acec37e..290086dff09 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "test:coverage:integration": "lerna run test:coverage:integration --stream --parallel", "test:unit": "lerna run test:unit --stream --parallel && jest --config=./scripts/jest.config.js", "test:integration": "lerna run test:integration --stream", - "test:manual": "lerna run test:manual --stream", + "test:integration:manual": "lerna run test:integration:manual --stream", "test:e2e:ganache:http": "./scripts/test-runner.sh ganache http", "test:e2e:ganache:ws": "./scripts/test-runner.sh ganache ws", "test:e2e:geth:http": "./scripts/test-runner.sh geth http", @@ -79,6 +79,10 @@ "test:e2e:sepolia:ws": "./scripts/test-runner.sh sepolia ws", "test:e2e:manual:geth:ws": "./scripts/test-runner.sh geth-manual ws node manual", "test:e2e:manual:geth:ipc": "./scripts/test-runner.sh geth-manual ipc node manual", + "test:e2e:manual:geth:http": "./scripts/test-runner.sh geth-manual http node manual", + "test:e2e:manual:geth:ws:chrome": "./scripts/test-runner.sh geth-manual ws chrome manual", + "test:e2e:manual:geth:ws:firefox": "./scripts/test-runner.sh geth-manual ws firefox manual", + "test:e2e:manual:geth:ws:electron": "./scripts/test-runner.sh geth-manual ws electron manual", "generate:accounts": "node ./scripts/gen_accounts.js", "pre-blackbox": "yarn config set registry http://localhost:4873 && git init && git config --global user.email \"ci@github.com\" && git config --global user.name \"CI\"", "post-blackbox": "./scripts/verdaccio.sh stop", @@ -90,11 +94,8 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:manual:stress:data": "packages/web3/test/stress/start.sh", - "test:manual:stress:validation": "npx ts-node packages/web3/test/stress/validator.ts", - "test:manual:stress": "yarn test:manual:stress:data && yarn test:manual:stress:validation", "test:manual:long-connection-ws":"node ./packages/web3/test/manual/long_ws_tests/nodejs_test/long_connection_ws.js", - "test:manual":"yarn test:manual:stress && yarn test:manual:long-connection-ws", + "test:manual":"yarn test:e2e:manual:geth:ws && yarn test:e2e:manual:geth:http && yarn test:e2e:manual:geth:ipc", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", diff --git a/packages/web3/cypress b/packages/web3/cypress new file mode 120000 index 00000000000..4a671a7beac --- /dev/null +++ b/packages/web3/cypress @@ -0,0 +1 @@ +../../templates/cypress \ No newline at end of file diff --git a/packages/web3/cypress.config.js b/packages/web3/cypress.config.js new file mode 100644 index 00000000000..d9c99839969 --- /dev/null +++ b/packages/web3/cypress.config.js @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +const config = { + screenshotOnRunFailure: false, + video: false, + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require('./cypress/plugins/index.js')(on, config); + }, + specPattern: 'test/e2e_manual/**/**/*.test.ts', + excludeSpecPattern: [], + }, +}; + +module.exports = config; diff --git a/packages/web3/package.json b/packages/web3/package.json index 0558b98820f..8f33f3e7b08 100644 --- a/packages/web3/package.json +++ b/packages/web3/package.json @@ -53,13 +53,16 @@ "test:watch": "npm test -- --watch", "test:unit": "jest --config=./test/unit/jest.config.js", "test:integration": "jest --config=./test/integration/jest.config.js --forceExit", - "test:manual": "jest --config=./test/manual/jest.config.js --forceExit", + "test:integration:manual": "jest --config=./test/manual/jest.config.js --forceExit", "test:blackbox:ganache:http": "./scripts/black_box_test.sh ganache http", "test:blackbox:ganache:ws": "./scripts/black_box_test.sh ganache ws", "test:blackbox:geth:http": "./scripts/black_box_test.sh geth http", "test:blackbox:geth:ws": "./scripts/black_box_test.sh geth ws", "test:blackbox:infura:http": "./scripts/black_box_test.sh infura http", - "test:blackbox:infura:ws": "./scripts/black_box_test.sh infura ws" + "test:blackbox:infura:ws": "./scripts/black_box_test.sh infura ws", + "test:e2e:electron:manual": "npx cypress run --headless --browser electron", + "test:e2e:chrome:manual": "npx cypress run --headless --browser chrome", + "test:e2e:firefox:manual": "npx cypress run --headless --browser firefox" }, "devDependencies": { "@truffle/hdwallet-provider": "^2.0.12", diff --git a/packages/web3/test/e2e_manual/data.test.ts b/packages/web3/test/e2e_manual/data.test.ts new file mode 100644 index 00000000000..eb57a6ebab8 --- /dev/null +++ b/packages/web3/test/e2e_manual/data.test.ts @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable */ +import { Web3 } from 'web3'; +import WebSocketProvider from 'web3-providers-ws'; +import accounts from '../../../../scripts/accounts.json'; +import { isWs, isIpc, getSystemTestProvider } from '../../../../scripts/system_tests_utils'; +import { BasicAbi, BasicBytecode } from '../../../../fixtures/build/Basic'; + +const DATA_AMOUNT = 50 * 1024; // 50 kB + +const sendAndGetData = async (web3: Web3, i: number) => { + const sendOptions = { from: accounts[i].address }; + const deployOptions = { + data: BasicBytecode, + arguments: [0, ''] as [number, string], + gasPrice: await web3.eth.getGasPrice(), + gas: BigInt(9000000000000), + gasLimit: BigInt(9000000000000), + type: BigInt(0), + }; + const c = new web3.eth.Contract(BasicAbi); + const contract = await c.deploy(deployOptions).send(sendOptions); + + await contract.methods + .setValues(1, 'A'.repeat(DATA_AMOUNT), true) + .send({ from: accounts[i].address }); + + await contract.methods.getStringValue().call(); +}; + +describe('huge data', () => { + let web3: Web3; + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + afterAll(() => { + if (isWs || isIpc) { + (web3.provider as unknown as WebSocketProvider).disconnect(); + } + }); + + it('send and get', async () => { + for (const a of accounts) { + const acc = web3.eth.accounts.privateKeyToAccount(a.privateKey); + web3.eth.accounts.wallet.add(acc); + } + + const prs = []; + for (let i = 0; i < 15; i++) { + prs.push(sendAndGetData(web3, i)); + } + await Promise.all(prs); + }); +}); diff --git a/packages/web3/test/e2e_manual/jest.config.js b/packages/web3/test/e2e_manual/jest.config.js new file mode 100644 index 00000000000..7ce09e43a4b --- /dev/null +++ b/packages/web3/test/e2e_manual/jest.config.js @@ -0,0 +1,32 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/e2e/setup.js'], + testMatch: [`/test/e2e_manual/**/*.(spec|test).(js|ts)`], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3/test/e2e_manual/requests.test.ts b/packages/web3/test/e2e_manual/requests.test.ts new file mode 100644 index 00000000000..b79e09fd573 --- /dev/null +++ b/packages/web3/test/e2e_manual/requests.test.ts @@ -0,0 +1,147 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable */ +import WebSocketProvider from 'web3-providers-ws'; +import { Web3Account } from 'web3-eth-accounts'; +import { Web3, Contract, Numbers, EventLog } from 'web3'; +import { BasicBytecode, BasicAbi } from '../../../../fixtures/build/Basic'; +import { isWs, isIpc, getSystemTestProvider } from '../../../../scripts/system_tests_utils'; + +const contracts: { [key: string]: Contract } = {}; + +const deployContracts = async (web3: Web3, accounts: Web3Account[]) => { + const prs = []; + for (let i = 0; i < accounts.length; i++) { + const account = accounts[i]; + const sendOptions = { from: account.address }; + const deployOptions = { + data: BasicBytecode, + arguments: [123, ''] as [number, string], + gas: BigInt(9000000000000), + gasLimit: BigInt(9000000000000), + type: BigInt(0), + }; + const c = new web3.eth.Contract(BasicAbi); + prs.push( + c + .deploy(deployOptions) + .send(sendOptions) + .then((contract: typeof c) => { + contracts[account.address] = contract; + }), + ); + } + await Promise.all(prs); +}; + +const addAccount = async ( + web3: Web3, + mainAcc: string, + address: string, + privateKey: string, + nonce: Numbers, +) => { + web3.eth.accounts.wallet.add(privateKey); + return web3.eth.sendTransaction({ + from: mainAcc, + to: address, + nonce, + gas: 1500000, + value: '1000000000000000000', + }); +}; + +const prepareAccounts = async (web3: Web3, n = 1000) => { + const prs = []; + const list = await web3.eth.personal.getAccounts(); + const mainAcc = list[0]; + const accountList: Web3Account[] = []; + const nonce = await web3.eth.getTransactionCount(mainAcc); + for (let i = 0; i < n; i++) { + const acc = web3.eth.accounts.create(); + prs.push(addAccount(web3, mainAcc, acc.address, acc.privateKey, Number(nonce) + i)); + accountList.push(acc); + } + await Promise.all(prs); + return accountList; +}; + +const sendData = async (account: Web3Account) => { + const contract = contracts[account.address]; + return contract.methods + .firesStringEvent(`String event: ${account.address}`) + .send({ from: account.address }); +}; + +const getData = async (account: Web3Account) => { + const contract = contracts[account.address]; + await contract.methods.getStringValue().call(); +}; + +const receivedEvents: { [key: string]: EventLog } = {}; +const subscribeContract = (acc: Web3Account) => { + const contract = contracts[acc.address]; + const event = contract.events.StringEvent(); + + event.on('data', res => { + if (res.returnValues.str !== `String event: ${acc.address}`) { + throw new Error('Event is not correct'); + } + receivedEvents[acc.address] = res; + }); +}; +const contractSubscriptions = (accounts: Web3Account[]) => { + for (const acc of accounts) { + subscribeContract(acc); + } +}; + +describe('huge data', () => { + let web3: Web3; + let parallelCount = 100; + let accounts: Web3Account[] = []; + beforeAll(async () => { + parallelCount = isIpc ? 5 : parallelCount; + web3 = new Web3(getSystemTestProvider()); + accounts = await prepareAccounts(web3, parallelCount); + await deployContracts(web3, accounts); + }); + afterAll(() => { + if (isWs || isIpc) { + (web3.provider as unknown as WebSocketProvider).disconnect(); + } + }); + it('send requests', async () => { + const sendPrs = []; + for (let i = 0; i < parallelCount; i++) { + sendPrs.push(sendData(accounts[i])); + } + await Promise.all(sendPrs); + // if socket subscribe to events + if (isIpc || isWs) { + contractSubscriptions(accounts); + } + }); + it('get requests', async () => { + const getPrs = []; + for (let i = 0; i < parallelCount; i++) { + getPrs.push(getData(accounts[i])); + } + await Promise.all(getPrs); + }); +}); diff --git a/packages/web3/test/e2e_manual/setup.js b/packages/web3/test/e2e_manual/setup.js new file mode 100644 index 00000000000..e9757a61e1c --- /dev/null +++ b/packages/web3/test/e2e_manual/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 300000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3/test/e2e_manual/validation.test.ts b/packages/web3/test/e2e_manual/validation.test.ts new file mode 100644 index 00000000000..7ef7e44ef4c --- /dev/null +++ b/packages/web3/test/e2e_manual/validation.test.ts @@ -0,0 +1,183 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Validator, Json, JsonSchema, ValidationSchemaInput } from 'web3-validator'; + +const abi = [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, +]; + +const abiJsonSchema = { + type: 'array', + items: [ + { name: 'from', format: 'address' }, + { name: 'to', format: 'address' }, + { name: 'value', format: 'uint256' }, + ], +}; + +const abiData = [ + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', +]; + +const simpleSchema = { + type: 'object', + required: ['blockHash', 'blockNumber', 'from', 'to', 'data'], + properties: { + blockHash: { + format: 'bytes32', + }, + blockNumber: { + format: 'uint', + }, + from: { + format: 'address', + }, + to: { + oneOf: [{ format: 'address' }, { type: 'null' }], + }, + data: { + format: 'bytes', + }, + }, +}; + +const simpleData = { + blockHash: '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + blockNumber: BigInt(2), + from: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + to: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + data: '0xafea', +} as unknown as ValidationSchemaInput; + +const createHugeSchema = ( + schema: JsonSchema, + data: Json, + n = 3, +): { schema: JsonSchema; data: Json } => { + if (n > 0) { + const { data: resultData, schema: resultSchema } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + n - 1, + ); + return { + data: { ...(data as unknown as object), simple: resultData }, + schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, + }; + } + return { + schema, + data, + }; +}; + +const { schema: hugeSchema, data: hugeData } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + 500, +); + +const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + 1000, +); +describe('validator', () => { + let validator: Web3Validator; + beforeAll(() => { + validator = new Web3Validator(); + }); + + it('huge schema', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + validator.validateJSONSchema(hugeSchema, hugeData as object); + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(6000); + expect(t).toBeGreaterThan(0); + }); + + it('huge schema 1000', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(6000); + expect(t).toBeGreaterThan(0); + }); + + it('simple schema multiple times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 500; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(3000); + expect(t).toBeGreaterThan(0); + }); + + it('simple schema 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); + + it('simple JSON schema 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(abiJsonSchema, abiData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); + + it('simple ABI 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validate(abi, abiData); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); +}); diff --git a/packages/web3/test/manual/requests.test.ts b/packages/web3/test/manual/requests.test.ts index f4896fef2e6..b79e09fd573 100644 --- a/packages/web3/test/manual/requests.test.ts +++ b/packages/web3/test/manual/requests.test.ts @@ -113,10 +113,13 @@ const contractSubscriptions = (accounts: Web3Account[]) => { describe('huge data', () => { let web3: Web3; - let parallelCount = 500; - beforeAll(() => { + let parallelCount = 100; + let accounts: Web3Account[] = []; + beforeAll(async () => { parallelCount = isIpc ? 5 : parallelCount; web3 = new Web3(getSystemTestProvider()); + accounts = await prepareAccounts(web3, parallelCount); + await deployContracts(web3, accounts); }); afterAll(() => { if (isWs || isIpc) { @@ -124,20 +127,17 @@ describe('huge data', () => { } }); it('send requests', async () => { - const accounts = await prepareAccounts(web3, parallelCount); - - await deployContracts(web3, accounts); - // if socket subscribe to events - if (isIpc || isWs) { - contractSubscriptions(accounts); - } - const sendPrs = []; for (let i = 0; i < parallelCount; i++) { sendPrs.push(sendData(accounts[i])); } await Promise.all(sendPrs); - + // if socket subscribe to events + if (isIpc || isWs) { + contractSubscriptions(accounts); + } + }); + it('get requests', async () => { const getPrs = []; for (let i = 0; i < parallelCount; i++) { getPrs.push(getData(accounts[i])); diff --git a/packages/web3/test/manual/setup.js b/packages/web3/test/manual/setup.js index 63fd7e1772a..e9757a61e1c 100644 --- a/packages/web3/test/manual/setup.js +++ b/packages/web3/test/manual/setup.js @@ -19,6 +19,6 @@ along with web3.js. If not, see . // eslint-disable-next-line @typescript-eslint/no-require-imports require('../config/setup'); -const jestTimeout = 300000; // Sometimes `in3` takes long time because of its decentralized nature. +const jestTimeout = 300000; jest.setTimeout(jestTimeout); diff --git a/scripts/test-runner.sh b/scripts/test-runner.sh index bbbf6bd61cd..4fb8e43c688 100755 --- a/scripts/test-runner.sh +++ b/scripts/test-runner.sh @@ -56,7 +56,7 @@ fi if [[ $ENGINE == "node" ]] || [[ $ENGINE == "" ]]; then if [[ $TEST_OPTION == "manual" ]]; then - TEST_COMMAND="test:manual" + TEST_COMMAND="test:integration:manual" elif [[ $TEST_OPTION == "coverage" ]]; then TEST_COMMAND="test:coverage:integration" elif [[ $BACKEND == "sepolia" || $BACKEND == "mainnet" ]]; then @@ -65,7 +65,11 @@ if [[ $ENGINE == "node" ]] || [[ $ENGINE == "" ]]; then TEST_COMMAND="test:integration" fi else - TEST_COMMAND="lerna run test:e2e:$ENGINE --stream" + if [[ $TEST_OPTION == "manual" ]]; then + TEST_COMMAND="lerna run test:e2e:$ENGINE:manual --stream" + else + TEST_COMMAND="lerna run test:e2e:$ENGINE --stream" + fi fi From acf1649fb3fb08bbf0ee9dd1d930212bc730d761 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 20 Nov 2023 20:44:20 -0500 Subject: [PATCH 25/28] fix --- packages/web3/.eslintignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/web3/.eslintignore b/packages/web3/.eslintignore index 81748e9e93c..22d50895f3c 100644 --- a/packages/web3/.eslintignore +++ b/packages/web3/.eslintignore @@ -3,5 +3,7 @@ lib hardhat.config.js jest.config.js webpack.config.js +cypress +cypress.config.js .eslintrc.js -webpack.analyze.js \ No newline at end of file +webpack.analyze.js From de28728db0835627a39201397f146faebb4801d5 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 27 Nov 2023 18:05:23 -0500 Subject: [PATCH 26/28] fixes --- package.json | 16 +-- packages/web3/package.json | 6 +- .../web3/test/{manual => stress}/data.test.ts | 14 +- packages/web3/test/stress/index.ts | 68 ---------- .../test/{manual => stress}/jest.config.js | 4 +- .../browser_test/connection.html | 0 .../nodejs_test/long_connection_ws.js | 0 .../test/{manual => stress}/requests.test.ts | 6 +- .../web3/test/{manual => stress}/setup.js | 0 packages/web3/test/stress/start.sh | 17 --- .../{manual => stress}/validation.test.ts | 0 packages/web3/test/stress/validator.ts | 126 ------------------ scripts/test-runner.sh | 4 +- 13 files changed, 24 insertions(+), 237 deletions(-) rename packages/web3/test/{manual => stress}/data.test.ts (84%) delete mode 100644 packages/web3/test/stress/index.ts rename packages/web3/test/{manual => stress}/jest.config.js (88%) rename packages/web3/test/{manual => stress}/long_ws_tests/browser_test/connection.html (100%) rename packages/web3/test/{manual => stress}/long_ws_tests/nodejs_test/long_connection_ws.js (100%) rename packages/web3/test/{manual => stress}/requests.test.ts (95%) rename packages/web3/test/{manual => stress}/setup.js (100%) delete mode 100755 packages/web3/test/stress/start.sh rename packages/web3/test/{manual => stress}/validation.test.ts (100%) delete mode 100644 packages/web3/test/stress/validator.ts diff --git a/package.json b/package.json index 290086dff09..2a767bf4d23 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "test:coverage:integration": "lerna run test:coverage:integration --stream --parallel", "test:unit": "lerna run test:unit --stream --parallel && jest --config=./scripts/jest.config.js", "test:integration": "lerna run test:integration --stream", - "test:integration:manual": "lerna run test:integration:manual --stream", + "test:integration:stress": "lerna run test:integration:stress --stream", "test:e2e:ganache:http": "./scripts/test-runner.sh ganache http", "test:e2e:ganache:ws": "./scripts/test-runner.sh ganache ws", "test:e2e:geth:http": "./scripts/test-runner.sh geth http", @@ -77,12 +77,10 @@ "test:e2e:mainnet:ws": "./scripts/test-runner.sh mainnet ws", "test:e2e:sepolia:http": "./scripts/test-runner.sh sepolia http", "test:e2e:sepolia:ws": "./scripts/test-runner.sh sepolia ws", - "test:e2e:manual:geth:ws": "./scripts/test-runner.sh geth-manual ws node manual", - "test:e2e:manual:geth:ipc": "./scripts/test-runner.sh geth-manual ipc node manual", - "test:e2e:manual:geth:http": "./scripts/test-runner.sh geth-manual http node manual", - "test:e2e:manual:geth:ws:chrome": "./scripts/test-runner.sh geth-manual ws chrome manual", - "test:e2e:manual:geth:ws:firefox": "./scripts/test-runner.sh geth-manual ws firefox manual", - "test:e2e:manual:geth:ws:electron": "./scripts/test-runner.sh geth-manual ws electron manual", + "test:stress:geth:ws": "./scripts/test-runner.sh geth-manual ws node manual", + "test:stress:geth:ipc": "./scripts/test-runner.sh geth-manual ipc node manual", + "test:stress:geth:http": "./scripts/test-runner.sh geth-manual http node manual", + "test:e2e:stress:geth:ws:chrome": "./scripts/test-runner.sh geth-manual ws chrome manual", "generate:accounts": "node ./scripts/gen_accounts.js", "pre-blackbox": "yarn config set registry http://localhost:4873 && git init && git config --global user.email \"ci@github.com\" && git config --global user.name \"CI\"", "post-blackbox": "./scripts/verdaccio.sh stop", @@ -94,8 +92,8 @@ "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", - "test:manual:long-connection-ws":"node ./packages/web3/test/manual/long_ws_tests/nodejs_test/long_connection_ws.js", - "test:manual":"yarn test:e2e:manual:geth:ws && yarn test:e2e:manual:geth:http && yarn test:e2e:manual:geth:ipc", + "test:manual:long-connection-ws": "node packages/web3/test/stress/long_ws_tests/nodejs_test/long_connection_ws.js", + "test:stress":"yarn test:stress:geth:ws && yarn test:stress:geth:http && yarn test:stress:geth:ipc && yarn test:e2e:stress:geth:ws:chrome", "husky:install": "husky install", "husky:uninstall": "husky uninstall", "postinstall": "yarn build", diff --git a/packages/web3/package.json b/packages/web3/package.json index 8f33f3e7b08..675264fdbfd 100644 --- a/packages/web3/package.json +++ b/packages/web3/package.json @@ -53,16 +53,14 @@ "test:watch": "npm test -- --watch", "test:unit": "jest --config=./test/unit/jest.config.js", "test:integration": "jest --config=./test/integration/jest.config.js --forceExit", - "test:integration:manual": "jest --config=./test/manual/jest.config.js --forceExit", + "test:integration:stress": "jest --config=./test/stress/jest.config.js --forceExit", "test:blackbox:ganache:http": "./scripts/black_box_test.sh ganache http", "test:blackbox:ganache:ws": "./scripts/black_box_test.sh ganache ws", "test:blackbox:geth:http": "./scripts/black_box_test.sh geth http", "test:blackbox:geth:ws": "./scripts/black_box_test.sh geth ws", "test:blackbox:infura:http": "./scripts/black_box_test.sh infura http", "test:blackbox:infura:ws": "./scripts/black_box_test.sh infura ws", - "test:e2e:electron:manual": "npx cypress run --headless --browser electron", - "test:e2e:chrome:manual": "npx cypress run --headless --browser chrome", - "test:e2e:firefox:manual": "npx cypress run --headless --browser firefox" + "test:e2e:chrome:stress": "npx cypress run --headless --browser chrome" }, "devDependencies": { "@truffle/hdwallet-provider": "^2.0.12", diff --git a/packages/web3/test/manual/data.test.ts b/packages/web3/test/stress/data.test.ts similarity index 84% rename from packages/web3/test/manual/data.test.ts rename to packages/web3/test/stress/data.test.ts index eb57a6ebab8..7e9eb6a7f24 100644 --- a/packages/web3/test/manual/data.test.ts +++ b/packages/web3/test/stress/data.test.ts @@ -37,11 +37,13 @@ const sendAndGetData = async (web3: Web3, i: number) => { const c = new web3.eth.Contract(BasicAbi); const contract = await c.deploy(deployOptions).send(sendOptions); - await contract.methods - .setValues(1, 'A'.repeat(DATA_AMOUNT), true) - .send({ from: accounts[i].address }); + await expect( + contract.methods + .setValues(1, 'A'.repeat(DATA_AMOUNT), true) + .send({ from: accounts[i].address }), + ).resolves.toBeDefined(); - await contract.methods.getStringValue().call(); + await expect(contract.methods.getStringValue().call()).resolves.toBe('A'.repeat(DATA_AMOUNT)); }; describe('huge data', () => { @@ -55,7 +57,7 @@ describe('huge data', () => { } }); - it('send and get', async () => { + it('send and get large data', async () => { for (const a of accounts) { const acc = web3.eth.accounts.privateKeyToAccount(a.privateKey); web3.eth.accounts.wallet.add(acc); @@ -65,6 +67,6 @@ describe('huge data', () => { for (let i = 0; i < 15; i++) { prs.push(sendAndGetData(web3, i)); } - await Promise.all(prs); + await expect(Promise.all(prs)).resolves.toBeDefined(); }); }); diff --git a/packages/web3/test/stress/index.ts b/packages/web3/test/stress/index.ts deleted file mode 100644 index 67471e136fb..00000000000 --- a/packages/web3/test/stress/index.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* -This file is part of web3.js. - -web3.js is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -web3.js is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with web3.js. If not, see . -*/ - -/* eslint-disable */ -import { Web3 } from 'web3'; -import { IpcProvider } from 'web3-providers-ipc'; -import accounts from '../shared_fixtures/accounts.json'; -import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; -import WebSocketProvider from 'web3-providers-ws'; -const DATA_AMOUNT = 50 * 1024; // 50 kB - -const sendAndGetData = async (web3: Web3, i: number) => { - const sendOptions = { from: accounts[i].address }; - const deployOptions = { - data: BasicBytecode, - arguments: [0, ''] as [number, string], - gasPrice: await web3.eth.getGasPrice(), - gas: BigInt(9000000000000), - gasLimit: BigInt(9000000000000), - type: BigInt(0), - }; - const c = new web3.eth.Contract(BasicAbi); - const contract = await c.deploy(deployOptions).send(sendOptions); - - await contract.methods - // @ts-ignore - .setValues(1, 'A'.repeat(DATA_AMOUNT), true) - .send({ from: accounts[i].address }); - - await contract.methods.getStringValue().call(); -}; - -const test = async () => { - const providerString = String(process.env.WEB3_SYSTEM_TEST_PROVIDER); - console.log(`Start test with provider: ${providerString}`); - const provider = providerString.includes('ipc') - ? new IpcProvider(providerString) - : providerString; - const web3 = new Web3(provider); - - for (const a of accounts) { - const acc = web3.eth.accounts.privateKeyToAccount(a.privateKey); - web3.eth.accounts.wallet.add(acc); - } - - const prs = []; - for (let i = 0; i < 15; i++) { - prs.push(sendAndGetData(web3, i)); - } - await Promise.all(prs); - (web3.provider as unknown as WebSocketProvider).disconnect(); -}; - -test().catch(console.error); diff --git a/packages/web3/test/manual/jest.config.js b/packages/web3/test/stress/jest.config.js similarity index 88% rename from packages/web3/test/manual/jest.config.js rename to packages/web3/test/stress/jest.config.js index 3ce6277a283..de1e19d4ace 100644 --- a/packages/web3/test/manual/jest.config.js +++ b/packages/web3/test/stress/jest.config.js @@ -4,8 +4,8 @@ const base = require('../config/jest.config'); module.exports = { ...base, - setupFilesAfterEnv: ['/test/manual/setup.js'], - testMatch: ['/test/manual/**/*.(spec|test).(js|ts)'], + setupFilesAfterEnv: ['/test/stress/setup.js'], + testMatch: ['/test/stress/**/*.(spec|test).(js|ts)'], /** * restoreMocks [boolean] * diff --git a/packages/web3/test/manual/long_ws_tests/browser_test/connection.html b/packages/web3/test/stress/long_ws_tests/browser_test/connection.html similarity index 100% rename from packages/web3/test/manual/long_ws_tests/browser_test/connection.html rename to packages/web3/test/stress/long_ws_tests/browser_test/connection.html diff --git a/packages/web3/test/manual/long_ws_tests/nodejs_test/long_connection_ws.js b/packages/web3/test/stress/long_ws_tests/nodejs_test/long_connection_ws.js similarity index 100% rename from packages/web3/test/manual/long_ws_tests/nodejs_test/long_connection_ws.js rename to packages/web3/test/stress/long_ws_tests/nodejs_test/long_connection_ws.js diff --git a/packages/web3/test/manual/requests.test.ts b/packages/web3/test/stress/requests.test.ts similarity index 95% rename from packages/web3/test/manual/requests.test.ts rename to packages/web3/test/stress/requests.test.ts index b79e09fd573..6509bf869ac 100644 --- a/packages/web3/test/manual/requests.test.ts +++ b/packages/web3/test/stress/requests.test.ts @@ -126,12 +126,12 @@ describe('huge data', () => { (web3.provider as unknown as WebSocketProvider).disconnect(); } }); - it('send requests', async () => { + it('send requests large number of requests', async () => { const sendPrs = []; for (let i = 0; i < parallelCount; i++) { sendPrs.push(sendData(accounts[i])); } - await Promise.all(sendPrs); + expect(await Promise.all(sendPrs)).resolves.toBeDefined(); // if socket subscribe to events if (isIpc || isWs) { contractSubscriptions(accounts); @@ -142,6 +142,6 @@ describe('huge data', () => { for (let i = 0; i < parallelCount; i++) { getPrs.push(getData(accounts[i])); } - await Promise.all(getPrs); + await expect(Promise.all(getPrs)).resolves.toBeDefined(); }); }); diff --git a/packages/web3/test/manual/setup.js b/packages/web3/test/stress/setup.js similarity index 100% rename from packages/web3/test/manual/setup.js rename to packages/web3/test/stress/setup.js diff --git a/packages/web3/test/stress/start.sh b/packages/web3/test/stress/start.sh deleted file mode 100755 index 9de30d524d9..00000000000 --- a/packages/web3/test/stress/start.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -. scripts/env.sh - -export WEB3_SYSTEM_TEST_BACKEND="geth" -export TS_NODE_PREFER_TS_EXTS=true - -./scripts/geth_binary.sh stressStart - -yarn generate:accounts - -export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH -npx ts-node ./packages/web3/test/stress/index.ts - -export WEB3_SYSTEM_TEST_PROVIDER=ws://127.0.0.1:8545 -npx ts-node ./packages/web3/test/stress/index.ts - -./scripts/geth_binary.sh stop diff --git a/packages/web3/test/manual/validation.test.ts b/packages/web3/test/stress/validation.test.ts similarity index 100% rename from packages/web3/test/manual/validation.test.ts rename to packages/web3/test/stress/validation.test.ts diff --git a/packages/web3/test/stress/validator.ts b/packages/web3/test/stress/validator.ts deleted file mode 100644 index 076351820c0..00000000000 --- a/packages/web3/test/stress/validator.ts +++ /dev/null @@ -1,126 +0,0 @@ -/* -This file is part of web3.js. - -web3.js is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -web3.js is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with web3.js. If not, see . -*/ - -/* eslint-disable */ -import { Web3Validator, JsonSchema, Json } from 'web3-validator'; - -const abi = [ - { indexed: true, internalType: 'address', name: 'from', type: 'address' }, - { indexed: true, internalType: 'address', name: 'to', type: 'address' }, - { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, -]; - -const abiJsonSchema = { - type: 'array', - items: [ - { name: 'from', format: 'address' }, - { name: 'to', format: 'address' }, - { name: 'value', format: 'uint256' }, - ], -}; - -const abiData = [ - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', -]; - -const simpleSchema = { - type: 'object', - required: ['blockHash', 'blockNumber', 'from', 'to', 'data'], - properties: { - blockHash: { - format: 'bytes32', - }, - blockNumber: { - format: 'uint', - }, - from: { - format: 'address', - }, - to: { - oneOf: [{ format: 'address' }, { type: 'null' }], - }, - data: { - format: 'bytes', - }, - }, -}; - -const simpleData = { - blockHash: '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', - blockNumber: BigInt(2), - from: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - to: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', - data: '0xafea', -}; - -const createHugeSchema = ( - schema: JsonSchema, - data: Json, - n = 3, -): { schema: JsonSchema; data: Json } => { - if (n > 0) { - const { data: resultData, schema: resultSchema } = createHugeSchema( - { ...simpleSchema }, - { ...simpleData } as unknown as Json, - n - 1, - ); - return { - data: { ...(typeof data === 'object' ? data : { data }), simple: resultData }, - schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, - }; - } - return { - schema, - data, - }; -}; - -const { schema: hugeSchema, data: hugeData } = createHugeSchema( - { ...simpleSchema }, - { ...simpleData } as unknown as Json, - 500, -); - -const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( - { ...simpleSchema }, - { ...simpleData } as unknown as Json, - 1000, -); - -const validator = new Web3Validator(); - -validator.validateJSONSchema(hugeSchema, hugeData as object); - -validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); - -for (let i = 0; i < 500; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData); -} - -for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(simpleSchema, simpleData); -} - -for (let i = 0; i < 1000; i += 1) { - validator.validateJSONSchema(abiJsonSchema, abiData); -} - -for (let i = 0; i < 1000; i += 1) { - validator.validate(abi, abiData); -} diff --git a/scripts/test-runner.sh b/scripts/test-runner.sh index 4fb8e43c688..cbe35641285 100755 --- a/scripts/test-runner.sh +++ b/scripts/test-runner.sh @@ -56,7 +56,7 @@ fi if [[ $ENGINE == "node" ]] || [[ $ENGINE == "" ]]; then if [[ $TEST_OPTION == "manual" ]]; then - TEST_COMMAND="test:integration:manual" + TEST_COMMAND="test:integration:stress" elif [[ $TEST_OPTION == "coverage" ]]; then TEST_COMMAND="test:coverage:integration" elif [[ $BACKEND == "sepolia" || $BACKEND == "mainnet" ]]; then @@ -66,7 +66,7 @@ if [[ $ENGINE == "node" ]] || [[ $ENGINE == "" ]]; then fi else if [[ $TEST_OPTION == "manual" ]]; then - TEST_COMMAND="lerna run test:e2e:$ENGINE:manual --stream" + TEST_COMMAND="lerna run test:e2e:$ENGINE:stress --stream" else TEST_COMMAND="lerna run test:e2e:$ENGINE --stream" fi From 425359b1dc9f7d29dc93dfb9322254bdf91842d7 Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 27 Nov 2023 18:06:42 -0500 Subject: [PATCH 27/28] fix --- packages/web3/test/stress/requests.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3/test/stress/requests.test.ts b/packages/web3/test/stress/requests.test.ts index 6509bf869ac..2c70a182f9a 100644 --- a/packages/web3/test/stress/requests.test.ts +++ b/packages/web3/test/stress/requests.test.ts @@ -131,7 +131,7 @@ describe('huge data', () => { for (let i = 0; i < parallelCount; i++) { sendPrs.push(sendData(accounts[i])); } - expect(await Promise.all(sendPrs)).resolves.toBeDefined(); + await expect(Promise.all(sendPrs)).resolves.toBeDefined(); // if socket subscribe to events if (isIpc || isWs) { contractSubscriptions(accounts); From bd18b4a71d4ab6f53a16538855a7633395f70c9e Mon Sep 17 00:00:00 2001 From: Oleksii Kosynskyi Date: Mon, 27 Nov 2023 18:20:26 -0500 Subject: [PATCH 28/28] fix tests count --- packages/web3/test/stress/data.test.ts | 2 +- packages/web3/test/stress/requests.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3/test/stress/data.test.ts b/packages/web3/test/stress/data.test.ts index 7e9eb6a7f24..e7bc4915369 100644 --- a/packages/web3/test/stress/data.test.ts +++ b/packages/web3/test/stress/data.test.ts @@ -19,8 +19,8 @@ along with web3.js. If not, see . import { Web3 } from 'web3'; import WebSocketProvider from 'web3-providers-ws'; import accounts from '../../../../scripts/accounts.json'; -import { isWs, isIpc, getSystemTestProvider } from '../../../../scripts/system_tests_utils'; import { BasicAbi, BasicBytecode } from '../../../../fixtures/build/Basic'; +import { getSystemTestProvider, isWs, isIpc } from '../shared_fixtures/system_tests_utils'; const DATA_AMOUNT = 50 * 1024; // 50 kB diff --git a/packages/web3/test/stress/requests.test.ts b/packages/web3/test/stress/requests.test.ts index 2c70a182f9a..6b082265674 100644 --- a/packages/web3/test/stress/requests.test.ts +++ b/packages/web3/test/stress/requests.test.ts @@ -116,7 +116,7 @@ describe('huge data', () => { let parallelCount = 100; let accounts: Web3Account[] = []; beforeAll(async () => { - parallelCount = isIpc ? 5 : parallelCount; + parallelCount = parallelCount; web3 = new Web3(getSystemTestProvider()); accounts = await prepareAccounts(web3, parallelCount); await deployContracts(web3, accounts);