@cardano-sdk/e2e 0.25.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +1 -7
- package/CHANGELOG.md +13 -0
- package/README.md +0 -29
- package/dist/cjs/environment.d.ts.map +1 -1
- package/dist/cjs/environment.js.map +1 -1
- package/dist/cjs/factories.d.ts.map +1 -1
- package/dist/cjs/factories.js +7 -1
- package/dist/cjs/factories.js.map +1 -1
- package/dist/cjs/measurement-util.d.ts.map +1 -1
- package/dist/cjs/measurement-util.js.map +1 -1
- package/dist/cjs/scripts/is-local-network-ready.js.map +1 -1
- package/dist/cjs/scripts/mnemonic.js.map +1 -1
- package/dist/cjs/tools/multi-delegation-data-gen/utils/files.d.ts.map +1 -1
- package/dist/cjs/tools/multi-delegation-data-gen/utils/files.js.map +1 -1
- package/dist/cjs/tools/multi-delegation-data-gen/utils/terminal-progress-monitor.d.ts.map +1 -1
- package/dist/cjs/tools/multi-delegation-data-gen/utils/terminal-progress-monitor.js.map +1 -1
- package/dist/cjs/tools/multi-delegation-data-gen/utils/utils.d.ts.map +1 -1
- package/dist/cjs/tools/multi-delegation-data-gen/utils/utils.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/environment.d.ts.map +1 -1
- package/dist/esm/environment.js.map +1 -1
- package/dist/esm/factories.d.ts.map +1 -1
- package/dist/esm/factories.js +7 -1
- package/dist/esm/factories.js.map +1 -1
- package/dist/esm/measurement-util.d.ts.map +1 -1
- package/dist/esm/measurement-util.js.map +1 -1
- package/dist/esm/scripts/is-local-network-ready.js.map +1 -1
- package/dist/esm/scripts/mnemonic.js.map +1 -1
- package/dist/esm/tools/multi-delegation-data-gen/utils/files.d.ts.map +1 -1
- package/dist/esm/tools/multi-delegation-data-gen/utils/files.js.map +1 -1
- package/dist/esm/tools/multi-delegation-data-gen/utils/terminal-progress-monitor.d.ts.map +1 -1
- package/dist/esm/tools/multi-delegation-data-gen/utils/terminal-progress-monitor.js.map +1 -1
- package/dist/esm/tools/multi-delegation-data-gen/utils/utils.d.ts.map +1 -1
- package/dist/esm/tools/multi-delegation-data-gen/utils/utils.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/docker-compose.yml +4 -0
- package/jest.config.js +0 -1
- package/local-network/scripts/common.sh +19 -0
- package/local-network/scripts/make-babbage.sh +2 -1
- package/local-network/scripts/mint-handles.sh +2 -18
- package/local-network/scripts/mint-tokens.sh +2 -18
- package/local-network/scripts/mnemonic_keys.sh +0 -0
- package/local-network/scripts/setup-wallets.sh +2 -17
- package/local-network/templates/babbage/submit-api-config.json +115 -0
- package/package.json +27 -29
- package/src/environment.ts +2 -6
- package/src/factories.ts +11 -5
- package/src/measurement-util.ts +1 -4
- package/src/scripts/is-local-network-ready.ts +1 -3
- package/src/scripts/mnemonic.ts +1 -3
- package/src/tools/multi-delegation-data-gen/utils/files.ts +1 -3
- package/src/tools/multi-delegation-data-gen/utils/terminal-progress-monitor.ts +2 -6
- package/src/tools/multi-delegation-data-gen/utils/utils.ts +1 -3
- package/test/artillery/StakePoolSearch.ts +5 -16
- package/test/artillery/artillery.ts +20 -61
- package/test/artillery/wallet-restoration/WalletRestoration.ts +1 -3
- package/test/artillery/wallet-restoration/queries.ts +1 -3
- package/test/artillery/wallet-restoration/types.ts +1 -3
- package/test/load-test-custom/stake-pool-search/stake-pool-search.test.ts +1 -3
- package/test/load-test-custom/wallet-init/wallet-init.test.ts +10 -1
- package/test/load-test-custom/wallet-restoration/wallet-restoration.test.ts +1 -4
- package/test/local-network/register-pool.test.ts +24 -14
- package/test/long-running/cache-invalidation.test.ts +7 -4
- package/test/long-running/multisig-wallet/MultiSigTx.ts +117 -0
- package/test/long-running/multisig-wallet/MultiSigWallet.ts +491 -0
- package/test/long-running/multisig-wallet/multisig-delegation-rewards.test.ts +318 -0
- package/test/projection/offline-fork.test.ts +6 -6
- package/test/projection/single-tenant-utxo.test.ts +1 -1
- package/test/providers/StakePoolProvider.test.ts +22 -17
- package/test/wallet/PersonalWallet/delegation.test.ts +6 -3
- package/test/wallet/PersonalWallet/handle.test.ts +2 -1
- package/test/wallet/PersonalWallet/mint.test.ts +2 -1
- package/test/wallet/PersonalWallet/multiAddress.test.ts +2 -1
- package/test/wallet/PersonalWallet/multisignature.test.ts +4 -2
- package/test/wallet/PersonalWallet/nft.test.ts +2 -1
- package/test/web-extension/extension/ui.ts +2 -8
- package/test/load-testing/tx-submit-load.test.ts +0 -341
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { Cardano } from '@cardano-sdk/core';
|
|
3
|
-
import { ChildProcess, fork } from 'child_process';
|
|
4
|
-
import { InitializeTxResult } from '@cardano-sdk/tx-construction';
|
|
5
|
-
import { ObservableWallet } from '@cardano-sdk/wallet';
|
|
6
|
-
import { RabbitMQContainer } from '../../../cardano-services/test/TxSubmit/rabbitmq/docker';
|
|
7
|
-
import { ServiceNames } from '@cardano-sdk/cardano-services';
|
|
8
|
-
import { createLogger } from '@cardano-sdk/util-dev';
|
|
9
|
-
import { filter, firstValueFrom } from 'rxjs';
|
|
10
|
-
import { getEnv, submitAndConfirm, walletVariables } from '../../src';
|
|
11
|
-
import { getWallet } from '../../src/factories';
|
|
12
|
-
import JSONBig from 'json-bigint';
|
|
13
|
-
import path from 'path';
|
|
14
|
-
|
|
15
|
-
// Verify environment.
|
|
16
|
-
const env = getEnv([
|
|
17
|
-
...walletVariables,
|
|
18
|
-
'OGMIOS_URL',
|
|
19
|
-
'START_LOCAL_HTTP_SERVER',
|
|
20
|
-
'TRANSACTIONS_NUMBER',
|
|
21
|
-
'TX_SUBMIT_HTTP_URL',
|
|
22
|
-
'WORKER_PARALLEL_TRANSACTION'
|
|
23
|
-
]);
|
|
24
|
-
|
|
25
|
-
interface TestOptions {
|
|
26
|
-
directlyToOgmios?: boolean;
|
|
27
|
-
parallel?: boolean;
|
|
28
|
-
withRunningWorker?: boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
interface TestReport extends TestOptions {
|
|
32
|
-
timeBeforeSubmitTxs: number;
|
|
33
|
-
timeAfterWorkerStarted: number;
|
|
34
|
-
timeAfterTxsInMempool: number;
|
|
35
|
-
timeAfterTxsInBlockchain: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
interface TestWallet {
|
|
39
|
-
address: Cardano.PaymentAddress;
|
|
40
|
-
coins: bigint;
|
|
41
|
-
wallet: ObservableWallet;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const logger = createLogger({ env: process.env.TL_LEVEL ? process.env : { ...process.env, TL_LEVEL: 'info' } });
|
|
45
|
-
|
|
46
|
-
let commonArgs: string[];
|
|
47
|
-
|
|
48
|
-
const runCli = (args: string[], startedString: string) =>
|
|
49
|
-
new Promise<ChildProcess>((resolve, reject) => {
|
|
50
|
-
const proc = fork(path.join(__dirname, '..', '..', '..', 'cardano-services', 'dist', 'cjs', 'cli.js'), args, {
|
|
51
|
-
stdio: 'pipe'
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const logChunk = (method: typeof logger.info, chunk: string) => {
|
|
55
|
-
for (const line of chunk.split('\n')) {
|
|
56
|
-
if (line) {
|
|
57
|
-
let msg = line;
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
({ msg } = JSON.parse(line));
|
|
61
|
-
// eslint-disable-next-line no-empty
|
|
62
|
-
} catch {}
|
|
63
|
-
|
|
64
|
-
if (!msg.includes('\u001B[')) method(`${args[0]}: ${msg}`);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
proc.stderr!.once('data', (data) => reject(new Error(data.toString())));
|
|
70
|
-
proc.stderr!.on('data', (data) => logChunk(logger.error.bind(logger), data.toString()));
|
|
71
|
-
proc.stdout!.on('data', (data) => {
|
|
72
|
-
const chunk = data.toString();
|
|
73
|
-
|
|
74
|
-
logChunk(logger.info.bind(logger), chunk);
|
|
75
|
-
if (chunk.includes(startedString)) resolve(proc);
|
|
76
|
-
});
|
|
77
|
-
proc.once('error', reject);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
const stopProc = (proc: ChildProcess) =>
|
|
81
|
-
new Promise<void>((resolve) => (proc?.kill() ? proc.on('close', resolve) : resolve()));
|
|
82
|
-
|
|
83
|
-
let rabbitmqUrl: URL;
|
|
84
|
-
let serverProc: ChildProcess;
|
|
85
|
-
let workerProc: ChildProcess;
|
|
86
|
-
|
|
87
|
-
const startServer = async (options: TestOptions = {}) => {
|
|
88
|
-
if (env.START_LOCAL_HTTP_SERVER)
|
|
89
|
-
serverProc = await runCli(
|
|
90
|
-
[
|
|
91
|
-
'start-provider-server',
|
|
92
|
-
'--api-url',
|
|
93
|
-
env.TX_SUBMIT_HTTP_URL,
|
|
94
|
-
...(options.directlyToOgmios ? [] : ['--use-queue', 'true']),
|
|
95
|
-
...commonArgs,
|
|
96
|
-
ServiceNames.TxSubmit
|
|
97
|
-
],
|
|
98
|
-
'[HttpServer] Started'
|
|
99
|
-
);
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
const startWorker = async (options: TestOptions = {}) => {
|
|
103
|
-
workerProc = await runCli(
|
|
104
|
-
[
|
|
105
|
-
'start-worker',
|
|
106
|
-
...commonArgs,
|
|
107
|
-
...(options.parallel ? ['--parallel', 'true', '--parallel-txs', env.WORKER_PARALLEL_TRANSACTION.toString()] : [])
|
|
108
|
-
],
|
|
109
|
-
'"msg":"TxSubmitWorker: starting'
|
|
110
|
-
);
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const stopServer = () => stopProc(serverProc);
|
|
114
|
-
const stopWorker = () => stopProc(workerProc);
|
|
115
|
-
|
|
116
|
-
const grace = (time: number) => `${time.toString().padStart(5, ' ')}ms`;
|
|
117
|
-
|
|
118
|
-
const waitForTxInBlockchain = async (wallet: ObservableWallet, txId: Cardano.TransactionId) => {
|
|
119
|
-
logger.info(`Waiting for tx ${txId} in blockchain...`);
|
|
120
|
-
await firstValueFrom(
|
|
121
|
-
wallet.transactions.history$.pipe(filter((txs) => txs.filter((tx) => tx.id === txId).length === 1))
|
|
122
|
-
);
|
|
123
|
-
logger.info(`Tx ${txId} in blockchain`);
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
describe('load', () => {
|
|
127
|
-
const container = new RabbitMQContainer('rabbitmq-load-test');
|
|
128
|
-
const testReports: TestReport[] = [];
|
|
129
|
-
const testWallets: TestWallet[] = [];
|
|
130
|
-
|
|
131
|
-
const prepareWallet = async (idx: number) => {
|
|
132
|
-
const walletEnv = getEnv(walletVariables, {
|
|
133
|
-
override: { TX_SUBMIT_PROVIDER_PARAMS: JSON.stringify({ baseUrl: env.TX_SUBMIT_HTTP_URL }) }
|
|
134
|
-
});
|
|
135
|
-
const { wallet } = await getWallet({ env: walletEnv, idx, logger, name: `Test Wallet ${idx}` });
|
|
136
|
-
const { address } = (await firstValueFrom(wallet.addresses$))[0];
|
|
137
|
-
logger.info(`Got wallet idx: ${idx} - address: ${address}`);
|
|
138
|
-
|
|
139
|
-
logger.debug(`Waiting to settle wallet ${idx} status`);
|
|
140
|
-
await firstValueFrom(wallet.syncStatus.isSettled$.pipe(filter((isSettled) => isSettled)));
|
|
141
|
-
logger.debug(`Wallet ${idx} status settled`);
|
|
142
|
-
|
|
143
|
-
testWallets.push({ address, coins: 0n, wallet });
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
const prepareWallets = async () => {
|
|
147
|
-
const promises: Promise<void>[] = [];
|
|
148
|
-
|
|
149
|
-
logger.info('Preparing wallets...');
|
|
150
|
-
|
|
151
|
-
for (let i = 0; i < env.TRANSACTIONS_NUMBER; ++i) promises.push(prepareWallet(i));
|
|
152
|
-
|
|
153
|
-
await Promise.all(promises);
|
|
154
|
-
|
|
155
|
-
logger.info('Wallets prepared');
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
const refreshWallets = async () => {
|
|
159
|
-
for (const testWallet of testWallets)
|
|
160
|
-
testWallet.coins = (await firstValueFrom(testWallet.wallet.balance.utxo.available$)).coins;
|
|
161
|
-
|
|
162
|
-
// Sort wallets from the one with the highest coins to the one with the lower
|
|
163
|
-
testWallets.sort((a, b) => Number(b.coins - a.coins));
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
const fragmentWhenRequired = async (options: TestOptions) => {
|
|
167
|
-
await refreshWallets();
|
|
168
|
-
|
|
169
|
-
const toRefill: Cardano.PaymentAddress[] = [];
|
|
170
|
-
const { wallet } = testWallets[0];
|
|
171
|
-
|
|
172
|
-
for (let i = 0; i < env.TRANSACTIONS_NUMBER; ++i)
|
|
173
|
-
if (testWallets[i].coins < 2_000_000n) toRefill.push(testWallets[i].address);
|
|
174
|
-
|
|
175
|
-
if (toRefill.length === 0) {
|
|
176
|
-
logger.info('Fragmentation tx not required');
|
|
177
|
-
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const coins = testWallets[0].coins / BigInt(toRefill.length + 1);
|
|
182
|
-
|
|
183
|
-
if (coins < 2_000_000n) throw new Error('Not enough coins to perform the test');
|
|
184
|
-
|
|
185
|
-
const fragment = async () => {
|
|
186
|
-
const tx = await wallet.initializeTx({
|
|
187
|
-
outputs: new Set(toRefill.map((address) => ({ address, value: { coins } })))
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
logger.info(`Fragmentation tx: ${tx.hash}`);
|
|
191
|
-
await submitAndConfirm(wallet, await wallet.finalizeTx({ tx }));
|
|
192
|
-
logger.info('Fragmentation completed');
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
if (options.directlyToOgmios) await fragment();
|
|
196
|
-
else {
|
|
197
|
-
await Promise.all([startWorker(), fragment()]);
|
|
198
|
-
await stopWorker();
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
beforeAll(async () => {
|
|
203
|
-
jest.setTimeout(180_000);
|
|
204
|
-
|
|
205
|
-
({ rabbitmqUrl } = await container.start());
|
|
206
|
-
|
|
207
|
-
commonArgs = [
|
|
208
|
-
'--logger-min-severity',
|
|
209
|
-
'debug',
|
|
210
|
-
'--ogmios-url',
|
|
211
|
-
env.OGMIOS_URL,
|
|
212
|
-
'--rabbitmq-url',
|
|
213
|
-
rabbitmqUrl.toString()
|
|
214
|
-
];
|
|
215
|
-
|
|
216
|
-
await startServer({ directlyToOgmios: true });
|
|
217
|
-
await prepareWallets();
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
afterAll(async () => {
|
|
221
|
-
logger.info(' Test result');
|
|
222
|
-
|
|
223
|
-
for (const report of testReports) {
|
|
224
|
-
const {
|
|
225
|
-
directlyToOgmios,
|
|
226
|
-
parallel,
|
|
227
|
-
withRunningWorker,
|
|
228
|
-
timeAfterTxsInBlockchain,
|
|
229
|
-
timeAfterTxsInMempool,
|
|
230
|
-
timeAfterWorkerStarted,
|
|
231
|
-
timeBeforeSubmitTxs
|
|
232
|
-
} = report;
|
|
233
|
-
|
|
234
|
-
const timeReport =
|
|
235
|
-
directlyToOgmios || withRunningWorker
|
|
236
|
-
? `submission -> mempool: ${grace(timeAfterTxsInMempool - timeBeforeSubmitTxs)}`
|
|
237
|
-
: `start worker -> mempool: ${grace(timeAfterTxsInMempool - timeAfterWorkerStarted)}`;
|
|
238
|
-
|
|
239
|
-
const workerDescription = `with${withRunningWorker ? ' ' : 'out'} running ${
|
|
240
|
-
parallel ? 'parallel' : 'serial '
|
|
241
|
-
} worker`;
|
|
242
|
-
|
|
243
|
-
logger.info(
|
|
244
|
-
` ${
|
|
245
|
-
directlyToOgmios ? 'directly to ogmios ' : workerDescription
|
|
246
|
-
} - ${timeReport} - mempool -> blockchain: ${grace(
|
|
247
|
-
timeAfterTxsInBlockchain - timeAfterTxsInMempool
|
|
248
|
-
)} - total: ${grace(timeAfterTxsInBlockchain - timeBeforeSubmitTxs)}`
|
|
249
|
-
);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
for (const { wallet } of testWallets) wallet.shutdown();
|
|
253
|
-
|
|
254
|
-
// Dependencies teardown parallelization
|
|
255
|
-
await Promise.all([container.stop(), stopServer()]);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
afterEach(stopWorker);
|
|
259
|
-
|
|
260
|
-
const performTest = async (options: TestOptions) => {
|
|
261
|
-
const { directlyToOgmios, parallel, withRunningWorker } = options;
|
|
262
|
-
const submitPromises: Promise<void>[] = [];
|
|
263
|
-
const txIds: Cardano.TransactionId[] = [];
|
|
264
|
-
let timeAfterWorkerStarted = 0;
|
|
265
|
-
let timeBeforeSubmitTxs = 0;
|
|
266
|
-
|
|
267
|
-
logger.info(`Starting test with options: ${JSON.stringify({ directlyToOgmios, parallel, withRunningWorker })}`);
|
|
268
|
-
|
|
269
|
-
await fragmentWhenRequired(options);
|
|
270
|
-
|
|
271
|
-
const startWorkerForTest = async () => {
|
|
272
|
-
if (!directlyToOgmios) await startWorker(options);
|
|
273
|
-
timeAfterWorkerStarted = Date.now();
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
const finalizeAndSubmit = async (wallet: ObservableWallet, tx: InitializeTxResult) => {
|
|
277
|
-
try {
|
|
278
|
-
await wallet.submitTx(await wallet.finalizeTx({ tx }));
|
|
279
|
-
logger.info(`Submitted tx: ${tx.hash}`);
|
|
280
|
-
} catch (error) {
|
|
281
|
-
logger.error(JSONBig.stringify(tx), error);
|
|
282
|
-
throw error;
|
|
283
|
-
}
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
const submitTransactions = async () => {
|
|
287
|
-
timeBeforeSubmitTxs = Date.now();
|
|
288
|
-
|
|
289
|
-
for (let i = 0; i < env.TRANSACTIONS_NUMBER; ++i) {
|
|
290
|
-
const { address, wallet } = testWallets[i];
|
|
291
|
-
const coins = 1_000_000n + BigInt(i);
|
|
292
|
-
const tx = await wallet.initializeTx({ outputs: new Set([{ address, value: { coins } }]) });
|
|
293
|
-
logger.info(`Initializing tx idx ${i}: ${tx.hash}`);
|
|
294
|
-
|
|
295
|
-
submitPromises.push(finalizeAndSubmit(wallet, tx));
|
|
296
|
-
txIds.push(tx.hash);
|
|
297
|
-
}
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
if (withRunningWorker) {
|
|
301
|
-
await startWorkerForTest();
|
|
302
|
-
await submitTransactions();
|
|
303
|
-
} else {
|
|
304
|
-
await submitTransactions();
|
|
305
|
-
await startWorkerForTest();
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
await expect(Promise.all(submitPromises)).resolves.not.toThrow();
|
|
309
|
-
const timeAfterTxsInMempool = Date.now();
|
|
310
|
-
|
|
311
|
-
await Promise.all(txIds.map((txId, i) => waitForTxInBlockchain(testWallets[i].wallet, txId)));
|
|
312
|
-
|
|
313
|
-
testReports.push({
|
|
314
|
-
...options,
|
|
315
|
-
timeAfterTxsInBlockchain: Date.now(),
|
|
316
|
-
timeAfterTxsInMempool,
|
|
317
|
-
timeAfterWorkerStarted,
|
|
318
|
-
timeBeforeSubmitTxs
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
logger.info(`Completed test with options: ${JSON.stringify({ directlyToOgmios, parallel, withRunningWorker })}`);
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
describe('directly to ogmios', () => {
|
|
325
|
-
afterAll(stopServer);
|
|
326
|
-
|
|
327
|
-
it('without queue', async () => {
|
|
328
|
-
if (env.TRANSACTIONS_NUMBER < 30) await performTest({ directlyToOgmios: true });
|
|
329
|
-
else logger.info('Skipping directly to ogmios test due to transaction number > 30');
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
describe('using queue', () => {
|
|
334
|
-
beforeAll(() => startServer({}));
|
|
335
|
-
|
|
336
|
-
it('without running serial worker', async () => await performTest({}));
|
|
337
|
-
it('with running serial worker', async () => await performTest({ withRunningWorker: true }));
|
|
338
|
-
it('without running parallel worker', async () => await performTest({ parallel: true }));
|
|
339
|
-
it('with running parallel worker', async () => await performTest({ parallel: true, withRunningWorker: true }));
|
|
340
|
-
});
|
|
341
|
-
});
|