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

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--no-enable-isolate-groups

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

class FromMainIsolate {
  String toString() => 'from main isolate';
  int get fld => 10;
}

func1Child(args) {
  var receivePort = new ReceivePort();
  var sendPort = args[0];
  sendPort.send(receivePort.sendPort);
  receivePort.listen((msg) {
    Expect.isTrue(msg is FromMainIsolate);
    Expect.equals(10, msg.fld);
    receivePort.close();
    sendPort.send("done");
  }, onError: (e) => print('$e'));
}

func2Child(args) {
  var receivePort = new ReceivePort();
  var sendPort = args[0];
  sendPort.send(receivePort.sendPort);
  receivePort.listen((msg) {
    Expect.isTrue(msg is SendPort);
    msg.send(new FromMainIsolate());
    receivePort.close();
  }, onError: (e) => print('$e'));
}

spawnFuncTest() {
  var receive1 = new ReceivePort();
  var receive2 = new ReceivePort();

  var spawnFunctionIsolate1SendPort;
  var spawnFunctionIsolate2SendPort;

  // First spawn the first isolate using spawnFunction, this isolate will
  // create a receivePort and send it's sendPort back and then it will just
  // sit there listening for a message from the second isolate spawned
  // using spawnFunction.
  asyncStart();
  return Isolate.spawn(func1Child, [receive1.sendPort]).then((isolate) {
    receive1.listen((msg) {
      if (msg is SendPort) {
        spawnFunctionIsolate1SendPort = msg;

        // Now spawn the second isolate using spawnFunction, this isolate
        // will create a receivePort and send it's sendPort back and then
        // wait for the third isolate spawned using spawnUri to send it
        // a sendPort to which it will try and send a non "literal-like"
        // object.
        Isolate.spawn(func2Child, [receive2.sendPort]).then((isolate) {
          receive2.listen((msg) {
            spawnFunctionIsolate2SendPort = msg;
            receive2.close();

            // Now spawn an isolate using spawnUri and send these send
            // ports over to it. This isolate will send one of the
            // sendports over to the other.
            Isolate.spawnUri(
                Uri.parse('issue_21398_child_isolate1.dart'),
                null,
                [spawnFunctionIsolate1SendPort, spawnFunctionIsolate2SendPort]);
          }, onError: (e) => print('$e'));
        });
      } else if (msg == "done") {
        receive1.close();
        asyncEnd();
      } else {
        Expect.fail("Invalid message received: $msg");
      }
    }, onError: (e) => print('$e'));
  });
}

uriChild(args) {
  var receivePort = new ReceivePort();
  var sendPort = args[0];
  sendPort.send(receivePort.sendPort);
  receivePort.listen((msg) {
    Expect.isTrue(msg is String);
    Expect.equals("Invalid Argument(s).", msg);
    receivePort.close();
    sendPort.send("done");
  }, onError: (e) => print('$e'));
}

spawnUriTest() {
  var receive1 = new ReceivePort();
  var receive2 = new ReceivePort();

  var spawnFunctionIsolateSendPort;
  var spawnUriIsolateSendPort;

  // First spawn the first isolate using spawnFunction, this isolate will
  // create a receivePort and send it's sendPort back and then it will just
  // sit there listening for a message from the second isolate spawned
  // using spawnFunction.
  asyncStart();
  Isolate.spawn(uriChild, [receive1.sendPort]).then((isolate) {
    receive1.listen((msg) {
      if (msg is SendPort) {
        spawnFunctionIsolateSendPort = msg;

        // Now spawn the second isolate using spawnUri, this isolate
        // will create a receivePort and send it's sendPort back and then
        // wait for the third isolate spawned using spawnUri to send it
        // a sendPort to which it will try and send a non "literal-like"
        // object.
        Isolate
            .spawnUri(Uri.parse('issue_21398_child_isolate11.dart'), [],
                receive2.sendPort)
            .then((isolate) {
          receive2.listen((msg) {
            spawnUriIsolateSendPort = msg;
            receive2.close();

            // Now spawn an isolate using spawnUri and send these send
            // ports over to it. This isolate will send one of the
            // sendports over to the other.
            Isolate.spawnUri(
                Uri.parse('issue_21398_child_isolate1.dart'),
                null,
                [spawnFunctionIsolateSendPort, spawnUriIsolateSendPort]);
          }, onError: (e) => print('$e'));
        });
      } else if (msg == "done") {
        receive1.close();
        asyncEnd();
      } else {
        Expect.fail("Invalid message received: $msg");
      }
    }, onError: (e) => print('$e'));
  });
}

main() {
  spawnFuncTest();
  spawnUriTest();
}
