'use strict'; require('../common'); const fs = require('fs'); const cp = require('child_process'); const path = require('path'); const tmpdir = require('../common/tmpdir'); tmpdir.refresh(); const LOG_FILE = path.join(tmpdir.path, 'tick-processor.log'); const RETRY_TIMEOUT = 150; function runTest(test) { const proc = cp.spawn(process.execPath, [ '--no_logfile_per_isolate', '--logfile=-', '--prof', '-pe', test.code ], { stdio: [ 'ignore', 'pipe', 'inherit' ] }); let ticks = ''; proc.stdout.on('data', (chunk) => ticks += chunk); // Try to match after timeout setTimeout(() => { match(test.pattern, proc, () => ticks, test.profProcessFlags); }, RETRY_TIMEOUT); } function match(pattern, parent, ticks, flags = []) { // Store current ticks log fs.writeFileSync(LOG_FILE, ticks()); const proc = cp.spawn(process.execPath, [ '--prof-process', '--call-graph-size=10', ...flags, LOG_FILE ], { stdio: [ 'ignore', 'pipe', 'inherit' ] }); let out = ''; proc.stdout.on('data', (chunk) => out += chunk); proc.stdout.once('end', () => { proc.once('exit', () => { fs.unlinkSync(LOG_FILE); // Retry after timeout if (!pattern.test(out)) return setTimeout(() => match(pattern, parent, ticks), RETRY_TIMEOUT); parent.stdout.removeAllListeners(); parent.kill(); }); proc.stdout.removeAllListeners(); proc.kill(); }); } exports.runTest = runTest;