diff --git a/scripts/launch-local-docker.sh b/scripts/launch-local-docker.sh index deae4928bb..86d7bbaf4e 100755 --- a/scripts/launch-local-docker.sh +++ b/scripts/launch-local-docker.sh @@ -10,13 +10,6 @@ function usage() { CHAIN=$1 -# interval and rounds to wait to check the block production and finalization of parachain -WAIT_INTERVAL_SECONDS=10 -WAIT_ROUNDS=30 - -# if the parachain has produced the first block -BLOCK_PRODUCED=false - function print_divider() { echo "------------------------------------------------------------" } @@ -31,53 +24,29 @@ cd "$ROOTDIR/docker/generated-$CHAIN/" docker compose up -d --build -# sleep for a while to make sure `docker compose` is ready -# otherwise `docker compose logs` could print empty output -sleep 10 +print_divider + +# Install Node.js dependencies in the middle. +# It also buys `docker compose` some time. +cd "$ROOTDIR/ts-tests" +if [[ -z "${NODE_ENV}" ]]; then + echo "NODE_ENV=ci" > .env +else + echo "NODE_ENV=${NODE_ENV}" > .env +fi -parachain_service=$(docker compose ps --services --filter 'status=running' | grep -F 'parachain-') +pnpm install print_divider -echo "waiting for parachain to produce blocks ..." +echo "Waiting for parachain to produce block #1..." +pnpm run wait-finalized-block 2>&1 -for _ in $(seq 1 $WAIT_ROUNDS); do - sleep $WAIT_INTERVAL_SECONDS - if docker compose logs "$parachain_service" 2>&1 | grep -F '0 peers' 2>/dev/null | grep -Fq "best: #1" 2>/dev/null; then - echo "parachain produced #1" - BLOCK_PRODUCED=true - break - fi -done +print_divider -if [ "$BLOCK_PRODUCED" = "false" ]; then - echo "no block production detected, you might want to check it manually. Quit now" - exit 1 -fi +echo "Extending leasing period..." +pnpm run upgrade-parathread 2>&1 print_divider - -echo "waiting for parachain to finalize blocks ..." - -for _ in $(seq 1 $WAIT_ROUNDS); do - sleep $WAIT_INTERVAL_SECONDS - if docker compose logs "$parachain_service" 2>&1 | grep -F '0 peers' 2>/dev/null | grep -Fq "finalized #1" 2>/dev/null; then - echo "parachain finalized #1, all good." - print_divider - echo "extend leasing period now ..." - cd "$ROOTDIR/ts-tests" - if [[ -z "${NODE_ENV}" ]]; then - echo "NODE_ENV=ci" > .env - else - echo "NODE_ENV=${NODE_ENV}" > .env - fi - pnpm install - pnpm run upgrade-parathread 2>&1 - print_divider - echo "Done." - exit 0 - fi -done - -echo "no block finalization detected, you might want to check it manually. Quit now" -exit 1 \ No newline at end of file +echo "Done." +exit 0 diff --git a/ts-tests/common/setup/wait-finalized-block.ts b/ts-tests/common/setup/wait-finalized-block.ts new file mode 100644 index 0000000000..46aef0ba48 --- /dev/null +++ b/ts-tests/common/setup/wait-finalized-block.ts @@ -0,0 +1,59 @@ +import '@polkadot/api-augment'; +import { ApiPromise, Keyring, WsProvider } from '@polkadot/api'; +import type { VoidFn } from '@polkadot/api/types'; +import type { ISubmittableResult } from '@polkadot/types/types'; +import { loadConfig } from '../utils'; + +const FINALIZED_BLOCKS_COUNT = 1; +const TIMEOUT_MIN = 1000 * 60 * 3; // 1min + +/** + * Connects to the parachain via the config file + * and waits for `FINALIZED_BLOCKS_COUNT` blocks to + * get finalized. + * + * It times out after `TIMEOUT_MIN` min. + */ +(async () => { + const config = loadConfig(); + let timeout: NodeJS.Timeout; + let count = 0; + let unsub: VoidFn; + let api: ApiPromise; + + const provider = new WsProvider(config.parachain_ws); + + console.log(`Connecting to parachain ${config.parachain_ws}`); + + timeout = global.setTimeout(async () => { + + if (typeof unsub === 'function') unsub(); + + if (api) api.disconnect(); + provider.on('disconnected', () => { + console.log(`\nno block production detected after ${TIMEOUT_MIN}min, you might want to check it manually. Quit now`); + process.exit(1); + }); + }, TIMEOUT_MIN); + + api = await ApiPromise.create({ + provider: provider, + }); + + unsub = await api.rpc.chain.subscribeFinalizedHeads(async (head) => { + const blockNumber = head.number.toNumber(); + console.log(`Parachain finalized block #${blockNumber} with hash ${head.hash}`); + count += 1; + + if (blockNumber >= 1 && count >= FINALIZED_BLOCKS_COUNT) { + unsub(); + if (timeout) global.clearTimeout(timeout) + + await api.disconnect(); + provider.on('disconnected', () => { + console.log('Done.'); + process.exit(0); + }); + } + }) +})(); diff --git a/ts-tests/package.json b/ts-tests/package.json index ca9bdb873a..c5237b64f8 100644 --- a/ts-tests/package.json +++ b/ts-tests/package.json @@ -9,6 +9,7 @@ "scripts": { "register-parathread": "pnpm exec ts-node common/setup/register-parathread.ts", "upgrade-parathread": "pnpm exec ts-node common/setup/upgrade-parathread.ts", + "wait-finalized-block": "pnpm exec ts-node common/setup/wait-finalized-block.ts", "setup-enclave": "pnpm exec ts-node common/setup/setup-enclave.ts", "test-filter": "pnpm exec mocha --exit --sort -r ts-node/register 'integration-tests/base-filter.test.ts'", "test-bridge": "pnpm exec mocha --exit --sort -r ts-node/register 'integration-tests/bridge.test.ts'",