// 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.

library test;

import 'dart:async';
import 'dart:isolate';

var firstFunction;
var finishFunction;

void runFunctions() {
  try {
    firstFunction();
  } catch (e) {
    new Timer(Duration.ZERO, finishFunction);
    rethrow;
  }
}

void startTest(SendPort finishPort, replyPort) {
  firstFunction = () { throw new UnsupportedError("ignore exception"); };
  finishFunction = () { finishPort.send("done"); };
  new Timer(Duration.ZERO, runFunctions);
}

runTest() {
  port.receive(startTest);
}

bool globalErrorHandler(IsolateUnhandledException e) {
  return e.source is UnsupportedError && e.source.message == "ignore exception";
}

main() {
  var port = new ReceivePort();
  var timer;
  SendPort otherIsolate = spawnFunction(runTest, globalErrorHandler);
  otherIsolate.send(port.toSendPort());
  port.receive((msg, replyPort) { port.close(); timer.cancel(); });
  timer = new Timer(const Duration(seconds: 2), () { throw "failed"; });
}
