text: '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;
  