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

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

// Test that deferred libraries are supported from isolates other than the root
// isolate.

import 'dart:isolate';

main() {
  try {
    var receivePort = new RawReceivePort();
    var expectedMsg = "Deferred Loaded.";

    receivePort.handler = (msg) {
      if (msg != expectedMsg) {
        print("Test failed.");
        throw msg; // Fail the test if the message is not expected.
      }
      print('Test done.');
      receivePort.close();
    };

    var stopwatch = new Stopwatch()..start();
    Isolate.spawnUri(new Uri(path: 'deferred_in_isolate_app.dart'),
        [expectedMsg], [receivePort.sendPort]).then((isolate) {
      print('Isolate spawn: ${stopwatch.elapsedMilliseconds}ms');
    }).catchError((error) {
      print(error);
    });
  } catch (exception, stackTrace) {
    print('Test failed.');
    print(exception);
    print(stackTrace);
    rethrow;
  }
}
