// 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.
//
// Tests socket exceptions.

// @dart = 2.9

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

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

void clientSocketExceptionTest() {
  bool exceptionCaught = false;
  bool wrongExceptionCaught = false;

  ServerSocket.bind("127.0.0.1", 0).then((server) {
    Expect.isNotNull(server);
    int port = server.port;
    Socket.connect("127.0.0.1", port).then((client) {
      Expect.isNotNull(client);
      client.close();
      // First calls for which exceptions are note expected.
      try {
        client.close();
      } on SocketException catch (ex) {
        exceptionCaught = true;
      } catch (ex) {
        wrongExceptionCaught = true;
      }
      Expect.isFalse(exceptionCaught);
      Expect.isFalse(wrongExceptionCaught);
      try {
        client.destroy();
      } on SocketException catch (ex) {
        exceptionCaught = true;
      } catch (ex) {
        wrongExceptionCaught = true;
      }
      Expect.isFalse(exceptionCaught);
      Expect.isFalse(wrongExceptionCaught);
      try {
        List<int> buffer = new List<int>(10);
        client.add(buffer);
      } on StateError catch (ex) {
        exceptionCaught = true;
      } catch (ex) {
        wrongExceptionCaught = true;
      }
      Expect.isTrue(exceptionCaught);
      Expect.isFalse(wrongExceptionCaught);

      // From here exceptions are expected.
      exceptionCaught = false;
      try {
        client.port;
      } on SocketException catch (ex) {
        exceptionCaught = true;
      } catch (ex) {
        wrongExceptionCaught = true;
      }
      Expect.isTrue(exceptionCaught);
      Expect.isFalse(wrongExceptionCaught);
      exceptionCaught = false;
      try {
        client.remotePort;
      } on SocketException catch (ex) {
        exceptionCaught = true;
      } catch (ex) {
        wrongExceptionCaught = true;
      }
      Expect.isTrue(exceptionCaught);
      Expect.isFalse(wrongExceptionCaught);
      exceptionCaught = false;
      try {
        client.address;
      } on SocketException catch (ex) {
        exceptionCaught = true;
      } catch (ex) {
        wrongExceptionCaught = true;
      }
      Expect.isTrue(exceptionCaught);
      Expect.isFalse(wrongExceptionCaught);
      exceptionCaught = false;
      try {
        client.remoteAddress;
      } on SocketException catch (ex) {
        exceptionCaught = true;
      } catch (ex) {
        wrongExceptionCaught = true;
      }
      Expect.isTrue(exceptionCaught);
      Expect.isFalse(wrongExceptionCaught);

      server.close();
    });
  });
}

main() {
  asyncStart();
  clientSocketExceptionTest();
  asyncEnd();
}
