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

function check(addressType, cb) {
  const server = net.createServer(function(client) {
    client.end();
    server.close();
    cb && cb();
  });

  const address = addressType === 4 ? common.localhostIPv4 : '::1';
  server.listen(0, address, common.mustCall(function() {
    net.connect({
      port: this.address().port,
      host: 'localhost',
      family: addressType,
      lookup: lookup
    }).on('lookup', common.mustCall(function(err, ip, type) {
      assert.strictEqual(err, null);
      assert.strictEqual(address, ip);
      assert.strictEqual(type, addressType);
    }));
  }));

  function lookup(host, dnsopts, cb) {
    dnsopts.family = addressType;
    if (addressType === 4) {
      process.nextTick(function() {
        cb(null, common.localhostIPv4, 4);
      });
    } else {
      process.nextTick(function() {
        cb(null, '::1', 6);
      });
    }
  }
}

check(4, function() {
  common.hasIPv6 && check(6);
});