'use strict';
const common = require('../common');

common.skipIfInspectorDisabled();

const assert = require('assert');
const helper = require('./inspector-helper.js');
const os = require('os');

const ip = pickIPv4Address();

if (!ip)
  common.skip('No IP address found');

function checkListResponse(instance, err, response) {
  assert.ifError(err);
  const res = response[0];
  const wsUrl = res['webSocketDebuggerUrl'];
  assert.ok(wsUrl);
  const match = wsUrl.match(/^ws:\/\/(.*):9229\/(.*)/);
  assert.strictEqual(ip, match[1]);
  assert.strictEqual(res['id'], match[2]);
  assert.strictEqual(ip, res['devtoolsFrontendUrl'].match(/.*ws=(.*):9229/)[1]);
  instance.childInstanceDone = true;
}

function checkError(instance, error) {
  // Some OSes will not allow us to connect
  if (error.code === 'EHOSTUNREACH') {
    common.printSkipMessage('Unable to connect to self');
  } else {
    throw error;
  }
  instance.childInstanceDone = true;
}

function runTests(instance) {
  instance
    .testHttpResponse(ip, '/json/list', checkListResponse.bind(null, instance),
                      checkError.bind(null, instance))
    .kill();
}

function pickIPv4Address() {
  for (const i of [].concat(...Object.values(os.networkInterfaces()))) {
    if (i.family === 'IPv4' && i.address !== '127.0.0.1')
      return i.address;
  }
}

helper.startNodeForInspectorTest(runTests, '--inspect-brk=0.0.0.0');