--- a/tests/src/util/playgrounds/unique.dev.ts +++ b/tests/src/util/playgrounds/unique.dev.ts @@ -383,12 +383,31 @@ this.helper = helper; } + sleep(milliseconds: number) { + return new Promise((resolve) => setTimeout(resolve, milliseconds)); + } + + private async waitWithTimeout(promise: Promise, timeout: number) { + let isBlock = false; + promise.then(() => isBlock = true).catch(() => isBlock = true); + let totalTime = 0; + const step = 100; + while(!isBlock) { + console.log('Waiting...'); + await this.sleep(step); + totalTime += step; + if(totalTime >= timeout) throw Error('Blocks production failed'); + } + return promise; + } + /** * Wait for specified number of blocks * @param blocksCount number of blocks to wait * @returns */ - newBlocks(blocksCount = 1): Promise { + async newBlocks(blocksCount = 1, timeout?: number): Promise { + timeout = timeout ?? blocksCount * 60_000; // eslint-disable-next-line no-async-promise-executor const promise = new Promise(async (resolve) => { const unsubscribe = await this.helper.getApi().rpc.chain.subscribeNewHeads(() => { @@ -400,12 +419,14 @@ } }); }); + await this.waitWithTimeout(promise, timeout); return promise; } - forParachainBlockNumber(blockNumber: bigint) { + async forParachainBlockNumber(blockNumber: bigint, timeout?: number) { + timeout = timeout ?? 300_000; // eslint-disable-next-line no-async-promise-executor - return new Promise(async (resolve) => { + const promise = new Promise(async (resolve) => { const unsubscribe = await this.helper.getApi().rpc.chain.subscribeNewHeads((data: any) => { if (data.number.toNumber() >= blockNumber) { unsubscribe(); @@ -413,11 +434,14 @@ } }); }); + await this.waitWithTimeout(promise, timeout); + return promise; } - forRelayBlockNumber(blockNumber: bigint) { + async forRelayBlockNumber(blockNumber: bigint, timeout?: number) { + timeout = timeout ?? 300_000; // eslint-disable-next-line no-async-promise-executor - return new Promise(async (resolve) => { + const promise = new Promise(async (resolve) => { const unsubscribe = await this.helper.getApi().query.parachainSystem.validationData((data: any) => { if (data.value.relayParentNumber.toNumber() >= blockNumber) { // @ts-ignore @@ -426,6 +450,8 @@ } }); }); + await this.waitWithTimeout(promise, timeout); + return promise; } noScheduledTasks() {