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

// Packages=none

import 'dart:io';
import 'dart:isolate';

import "package:foo/foo.dart";
import "package:bar/bar.dart";

var CONFIG_URI = "package:bar/spawned_packages/";

main([args, port]) async {
  if (port != null) {
    testCorrectBarPackage(port);
    return;
  }
  var p = new RawReceivePort();
  Isolate.spawnUri(Platform.script, [], p.sendPort,
      packageRoot: Uri.parse(CONFIG_URI));
  p.handler = (msg) {
    p.close();
    if (msg is! List) {
      print(msg.runtimeType);
      throw "Failure return from spawned isolate:\n\n$msg";
    }
    if (msg[0] != "Foo") {
      throw "Bad package config in child isolate: ${msg[0]}\n"
          "Expected: 'Foo'";
    }
    if (msg[1] != "Bar1") {
      throw "Package path not matching: ${msg[1]}\n"
          "Expected: 'Bar1'";
    }
    print("SUCCESS");
  };
  if (Bar.value != "Bar1") {
    throw "Spawning isolate package:bar invalid.";
  }
  print("Spawned isolate resolved $CONFIG_URI to: "
      "${await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI))}");
}

testCorrectBarPackage(port) async {
  try {
    var packageRootStr = Platform.packageRoot;
    var packageConfigStr = Platform.packageConfig;
    var packageConfig = await Isolate.packageConfig;
    var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI));
    print("Spawned isolate's package root flag: $packageRootStr");
    print("Spawned isolate's package config flag: $packageConfigStr");
    print("Spawned isolate's loaded package config: $packageConfig");
    print("Spawned isolate's resolved package path: $resolvedPkg");
    port.send([Foo.value, Bar.value]);
  } catch (e, s) {
    port.send("$e\n$s\n");
  }
}
