// Copyright (c) 2013, 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

import "dart:async";
import "dart:io";
import "dart:typed_data";

import "package:expect/expect.dart";

void testHostAndPort() {
  ServerSocket.bind("::1", 0).then((server) {
    Socket.connect("::1", server.port).then((clientSocket) {
      server.listen((socket) {
        Expect.equals(socket.port, server.port);
        Expect.equals(clientSocket.port, socket.remotePort);
        Expect.equals(clientSocket.remotePort, socket.port);
        Expect.equals(socket.remoteAddress.address, "::1");
        Expect.equals(socket.remoteAddress.type, InternetAddressType.IPv6);
        Expect.listEquals(socket.remoteAddress.rawAddress,
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
        Expect.equals(clientSocket.remoteAddress.address, "::1");
        Expect.equals(
            clientSocket.remoteAddress.type, InternetAddressType.IPv6);
        Expect.listEquals(clientSocket.remoteAddress.rawAddress,
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
        socket.destroy();
        clientSocket.destroy();
        server.close();
      });
    });
  });
}

Future<void> testRawAddress() async {
  var list =
      Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
  var addr = '::1';
  var address = InternetAddress.fromRawAddress(list);
  Expect.equals(address.address, addr);
  var server = await ServerSocket.bind(address, 0);
  var client = await Socket.connect(address, server.port);
  var completer = Completer<void>();
  server.listen((socket) async {
    Expect.equals(socket.port, server.port);
    Expect.equals(client.port, socket.remotePort);
    Expect.equals(client.remotePort, socket.port);

    Expect.equals(client.remoteAddress, address);
    socket.destroy();
    client.destroy();
    await server.close();
    completer.complete();
  });
  await completer.future;
}

void main() async {
  testHostAndPort();
  await testRawAddress();
}
