// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

/// @assertion Future<InternetAddress> reverse()
/// Perform a reverse dns lookup on the address, creating a new [InternetAddress]
/// where the host field set to the result.
/// @description Checks that host name is set correctly.
/// @author iarkh@unipro.ru


import "../../../Utils/expect.dart";
import "dart:async";
import 'dart:io' show Platform, InternetAddress;

check(InternetAddress address) {
  Future<InternetAddress> hosts =
      new InternetAddress(address.address).reverse();
  hosts.then((host) {
    Expect.equals(address.address, host.address);
    Expect.equals(address.type, host.type);
    if(host.host != "localhost") {
      Expect.equals(Platform.localHostname, host.host);
    }
  }, onError: (e) { Expect.fail("Unexpected error appeared: $e"); });
}

main() {
  Future<List<InternetAddress>> list = InternetAddress.lookup("localhost");
  list.then((addresses) {
    addresses.forEach((InternetAddress addr) {
      check(addr);
    });
  }, onError: (e) { Expect.fail("Unexpected error appeared: $e"); });
}
