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

// Testing that Isolate.spawn copies the source code of the parent isolate,
// rather than rereading the parent's source URI.
// https://github.com/dart-lang/sdk/issues/6610

// Isolate structure:
//     Root 1 -> Branch 1 -> Leaf 1
//     /
//  main
//     \
//     Root 2 -> Branch 2 -> Leaf 2

library spawn_tests;

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

void main() {
  HttpServer.bind("127.0.0.1", 0).then((server) {
    var count = 0;
    server.listen((HttpRequest request) {
      ++count;
      request.response.write("""
        import 'dart:isolate';

        void main(_, SendPort port) {
          root(port);
        }

        void root(SendPort port) {
          port.send("Root ${count}");
          Isolate.spawn(branch, port);
        }

        void branch(SendPort port) {
          port.send("Branch ${count}");
          Isolate.spawn(leaf, port);
        }

        void leaf(SendPort port) {
          port.send("Leaf ${count}");
        }
      """);
      request.response.close();
    });

    ReceivePort port = new ReceivePort();
    var messageSet = Set();
    port.listen((message) {
      messageSet.add(message);
      if (messageSet.length >= 6) {
        server.close();
        port.close();
        Expect.setEquals([
          "Root 1",
          "Root 2",
          "Branch 1",
          "Branch 2",
          "Leaf 1",
          "Leaf 2",
        ], messageSet);
      }
    });

    Isolate.spawnUri(
        Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
    Isolate.spawnUri(
        Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
  });
}
