// 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 "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

var events = [];

Future testSocketException() {
  var completer = new Completer();
  runZonedGuarded(() {
    Socket.connect("4", 1).then((Socket s) {
      Expect.fail("Socket should not be able to connect");
    });
  }, (err, s) {
    if (err is! SocketException) Expect.fail("Not expected error: $err");
    completer.complete("socket test, ok.");
    events.add("SocketException");
  });
  return completer.future;
}

Future testFileSystemException() {
  var completer = new Completer();
  runZonedGuarded(() {
    new File("lol it's not a file\n").openRead().listen(null);
  }, (err, s) {
    if (err is! FileSystemException) Expect.fail("Not expected error: $err");
    completer.complete("file test, ok.");
    events.add("FileSystemException");
  });
  return completer.future;
}

main() {
  // We keep a ReceivePort open until all tests are done. This way the VM will
  // hang if the callbacks are not invoked and the test will time out.
  asyncStart();
  testSocketException().then((_) => testFileSystemException()).then((_) {
    asyncEnd();
    Expect.listEquals(["SocketException", "FileSystemException"], events);
  });
}
