/**
 * Mocha 4 no longer forces exit of a process after tests end, so if a setTimeout() or anything
 * else is keeping node running, tests will hang after finishing.
 *
 * This helper module, always included via mocha.opts, ensures we print something if that happens.
 * We use why-is-node-running module to print something informative.
 */

/* global after */

const whyIsNodeRunning = require('why-is-node-running');

function report() {
  whyIsNodeRunning();
  console.warn("*******************************************************");
  console.warn("Something above prevented node from exiting on its own.");
  console.warn("*******************************************************");
  // We want to exit, but process.exit(1) doesn't work, since mocha catches it and insists on
  // exiting with the test status result (which may be 0, and we need to indicate failure).
  process.kill(process.pid, 'SIGTERM');
}

after(() => {
  // --no-exit|-E flag is interpreted by mocha-webdriver library to start REPL on failure, and we
  // do NOT want to output a big dump about that.
  const noexit = process.argv.includes("--no-exit") || process.argv.includes('-E');
  if (noexit) {
    console.log("report-why-tests-hang silenced with --no-exit flag");
  } else {
    // If still hanging after 5s after tests finish, say something. Unref() ensures that THIS
    // timeout doesn't itself keep node from exiting.
    setTimeout(report, 5000).unref();
  }
});
