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

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

import "dart:async";
import "dart:io";
import "dart:convert" show json;
import "package:path/path.dart" as p;
import "package:async_helper/async_helper.dart";

/// Root directory of generated files.
/// Path contains trailing slash.
/// Each configuration gets its own sub-directory.
Directory fileRoot;

/// Shared HTTP server serving the files in [httpFiles].
/// Each configuration gets its own "sub-dir" entry in `httpFiles`.
HttpServer httpServer;

/// Directory structure served by HTTP server.
Map<String, dynamic> httpFiles = {};

/// List of configurations.
List<Configuration> configurations = [];

/// Collection of failing tests and their failure messages.
///
/// Each test may fail in more than one way.
var failingTests = <String, List<String>>{};

main() async {
  asyncStart();
  await setUp();

  await runTests(); //                         //# 01: ok
  await runTests([spawn]); //                  //# 02: ok
  await runTests([spawn, spawn]); //           //# 03: ok
  await runTests([spawnUriInherit]); //        //# 04: ok
  await runTests([spawnUriInherit, spawn]); // //# 05: ok
  await runTests([spawn, spawnUriInherit]); // //# 06: ok

  // Test that spawning a new VM with file paths instead of URIs as arguments
  // gives the same URIs in the internal values.
  await runTests([asPath]); //                 //# 07: ok

  // Test that spawnUri can reproduce the behavior of VM command line parameters
  // exactly.
  // (Don't run all configuration combinations in the same test, so
  // unroll the configurations into multiple groups and run each group
  // as its own multitest.
  {
    var groupCount = 8;
    var groups = new List.generate(8, (_) => []);
    for (int i = 0; i < configurations.length; i++) {
      groups[i % groupCount].add(configurations[i]);
    }
    var group = -1;
    group = 0; //                              //# 10: ok
    group = 1; //                              //# 11: ok
    group = 2; //                              //# 12: ok
    group = 3; //                              //# 13: ok
    group = 4; //                              //# 14: ok
    group = 5; //                              //# 15: ok
    group = 6; //                              //# 16: ok
    group = 7; //                              //# 17: ok
    if (group >= 0) {
      for (var other in groups[group]) {
        await runTests([spawnUriOther(other)]);
      }
    }
  }

  await tearDown();

  if (failingTests.isNotEmpty) {
    print("Errors found in tests:");
    failingTests.forEach((test, actual) {
      print("$test:\n  ${actual.join("\n  ")}");
    });
    exit(255);
  }

  asyncEnd();
}

/// Test running the test of the configuration through [Isolate.spawn].
///
/// This should not change the expected results compared to running it
/// directly.
Configuration spawn(Configuration conf) {
  return conf.update(
      description: conf.description + "/spawn",
      main: "spawnMain",
      newArgs: [conf.mainType],
      expect: null);
}

/// Tests running a spawnUri on top of the configuration before testing.
///
/// The `spawnUri` call has no explicit root or config parameter, and
/// shouldn't search for one, so it implicitly inherits the current isolate's
/// actual root or configuration.
Configuration spawnUriInherit(Configuration conf) {
  if (conf.expect["iroot"] == null &&
      conf.expect["iconf"] == null &&
      conf.expect["pconf"] != null) {
    // This means that the specified configuration file didn't exist.
    // spawning a new URI to "inherit" that will actually do an automatic
    // package resolution search with results that are unpredictable.
    // That behavior will be tested in a setting where we have more control over
    // the files around the spawned URI.
    return null;
  }
  return conf.update(
      description: conf.description + "/spawnUri-inherit",
      main: "spawnUriMain",
      // encode null parameters as "-". Windows fails if using empty string.
      newArgs: [
        conf.mainFile,
        "-",
        "-",
        "false"
      ],
      expect: {
        "proot": conf.expect["iroot"],
        "pconf": conf.expect["iconf"],
      });
}

/// Tests running a spawnUri with an explicit configuration different
/// from the original configuration.
///
/// Duplicates the explicit parameters as arguments to the spawned isolate.
ConfigurationTransformer spawnUriOther(Configuration other) {
  return (Configuration conf) {
    bool search = (other.config == null) && (other.root == null);
    return conf.update(
        description: "${conf.description} -spawnUri-> ${other.description}",
        main: "spawnUriMain",
        newArgs: [
          other.mainFile,
          other.config ?? "-",
          other.root ?? "-",
          "$search"
        ],
        expect: other.expect);
  };
}

/// Convert command line parameters to file paths.
///
/// This only works on the command line, not with `spawnUri`.
Configuration asPath(Configuration conf) {
  bool change = false;

  String toPath(String string) {
    if (string == null) return null;
    if (string.startsWith("file:")) {
      change = true;
      return new File.fromUri(Uri.parse(string)).path;
    }
    return string;
  }

  var mainFile = toPath(conf.mainFile);
  var root = toPath(conf.root);
  var config = toPath(conf.config);
  if (!change) return null;
  return conf.update(
      description: conf.description + "/as path",
      mainFile: mainFile,
      root: root,
      config: config);
}

/// --------------------------------------------------------------

Future setUp() async {
  fileRoot = createTempDir();
  // print("FILES: $fileRoot");
  httpServer = await startServer(httpFiles);
  // print("HTTPS: ${httpServer.address.address}:${httpServer.port}");
  createConfigurations();
}

Future tearDown() async {
  fileRoot.deleteSync(recursive: true);
  await httpServer.close();
}

typedef Configuration ConfigurationTransformer(Configuration conf);

Future runTests([List<ConfigurationTransformer> transformations]) async {
  outer:
  for (var config in configurations) {
    if (transformations != null) {
      for (int i = transformations.length - 1; i >= 0; i--) {
        config = transformations[i](config);
        if (config == null) {
          continue outer; // Can be used to skip some tests.
        }
      }
    }
    await testConfiguration(config);
  }
}

// Creates a combination of configurations for running the Dart VM.
//
// The combinations covers most configurations of implicit and explicit
// package configurations over both file: and http: file sources.
// It also specifies the expected values of the following for a VM
// run in that configuration.
//
// * `Process.packageRoot`
// * `Process.packageConfig`
// * `Isolate.packageRoot`
// * `Isolate.packageRoot`
// * `Isolate.resolvePackageUri` of various inputs.
// * A variable defined in a library loaded using a `package:` URI.
//
// The configurations all have URIs as `root`, `config` and `mainFile` strings,
// have empty argument lists and `mainFile` points to the `main.dart` file.
void createConfigurations() {
  add(String description, String mainDir,
      {String root, String config, Map file, Map http, Map expect}) {
    var id = freshName("conf");

    file ??= {};
    http ??= {};

    // Fix-up paths.
    String fileUri = fileRoot.uri.resolve("$id/").toString();
    String httpUri =
        "http://${httpServer.address.address}:${httpServer.port}/$id/";

    String fixPath(String path) {
      return path?.replaceAllMapped(fileHttpRegexp, (match) {
        if (path.startsWith("%file/", match.start)) return fileUri;
        return httpUri;
      });
    }

    void fixPaths(Map dirs) {
      for (var name in dirs.keys) {
        var value = dirs[name];
        if (value is Map) {
          Map subDir = value;
          fixPaths(subDir);
        } else {
          var newValue = fixPath(value);
          if (newValue != value) dirs[name] = newValue;
        }
      }
    }

    if (!mainDir.endsWith("/")) mainDir += "/";
    // Insert main files into the main-dir map.
    Map mainDirMap;
    {
      if (mainDir.startsWith("%file/")) {
        mainDirMap = file;
      } else {
        mainDirMap = http;
      }
      var parts = mainDir.split('/');
      for (int i = 1; i < parts.length - 1; i++) {
        var dirName = parts[i];
        mainDirMap = mainDirMap[dirName] ?? (mainDirMap[dirName] = {});
      }
    }

    mainDirMap["main"] = testMain;
    mainDirMap["spawnMain"] = spawnMain.replaceAll("%mainDir/", mainDir);
    mainDirMap["spawnUriMain"] = spawnUriMain;

    mainDir = fixPath(mainDir);
    root = fixPath(root);
    config = fixPath(config);
    fixPaths(file);
    fixPaths(http);
    // These expectations are default. If not overridden the value will be
    // expected to be null. That is, you can't avoid testing the actual
    // value of these, you can only change what value to expect.
    // For values not included here (commented out), the result is not tested
    // unless a value (maybe null) is provided.
    fixPaths(expect);

    expect = {
      "pconf": null,
      "proot": null,
      "iconf": null,
      "iroot": null,
      "foo": null,
      "foo/": null,
      "foo/bar": null,
      "foo.x": "qux",
      "bar/bar": null,
      "relative": "relative/path",
      "nonpkg": "http://example.org/file"
    }..addAll(expect ?? const {});

    // Add http files to the http server.
    if (http.isNotEmpty) {
      httpFiles[id] = http;
    }
    // Add file files to the file system.
    if (file.isNotEmpty) {
      createFiles(fileRoot, id, file);
    }

    configurations.add(new Configuration(
        description: description,
        root: root,
        config: config,
        mainFile: mainDir + "main.dart",
        args: const [],
        expect: expect));
  }

  // The `test` function can generate file or http resources.
  // It replaces "%file/" with URI of the root directory of generated files and
  // "%http/" with the URI of the HTTP server's root in appropriate contexts
  // (all file contents and parameters).

  // Tests that only use one scheme to access files.
  for (var scheme in ["file", "http"]) {
    /// Run a test in the current scheme.
    ///
    /// The files are served either through HTTP or in a local directory.
    /// Use "%$scheme/" to refer to the root of the served files.
    addScheme(description, main, {expect, files, args, root, config}) {
      add("$scheme/$description", main,
          expect: expect,
          root: root,
          config: config,
          file: (scheme == "file") ? files : null,
          http: (scheme == "http") ? files : null);
    }

    {
      // No parameters, no .packages files or packages/ dir.
      // A "file:" source realizes there is no configuration and can't resolve
      // any packages, but a "http:" source assumes a "packages/" directory.
      addScheme("no resolution", "%$scheme/",
          files: {},
          expect: (scheme == "file")
              ? {"foo.x": null}
              : {
                  "iroot": "%http/packages/",
                  "foo": "%http/packages/foo",
                  "foo/": "%http/packages/foo/",
                  "foo/bar": "%http/packages/foo/bar",
                  "foo.x": null,
                  "bar/bar": "%http/packages/bar/bar",
                });
    }

    {
      // No parameters, no .packages files,
      // packages/ dir exists and is detected.
      var files = {"packages": fooPackage};
      addScheme("implicit packages dir", "%$scheme/", files: files, expect: {
        "iroot": "%$scheme/packages/",
        "foo": "%$scheme/packages/foo",
        "foo/": "%$scheme/packages/foo/",
        "foo/bar": "%$scheme/packages/foo/bar",
        "bar/bar": "%$scheme/packages/bar/bar",
      });
    }

    {
      // No parameters, no .packages files in current dir, but one in parent,
      // packages/ dir exists and is used.
      //
      // Should not detect the .packages file in parent directory.
      // That file is empty, so if it is used, the system cannot resolve "foo".
      var files = {
        "sub": {"packages": fooPackage},
        ".packages": ""
      };
      addScheme(
          "implicit packages dir overrides parent .packages", "%$scheme/sub/",
          files: files,
          expect: {
            "iroot": "%$scheme/sub/packages/",
            "foo": "%$scheme/sub/packages/foo",
            "foo/": "%$scheme/sub/packages/foo/",
            "foo/bar": "%$scheme/sub/packages/foo/bar",
            // "foo.x": "qux",  // Blocked by issue http://dartbug.com/26482
            "bar/bar": "%$scheme/sub/packages/bar/bar",
          });
    }

    {
      // No parameters, a .packages file next to entry is found and used.
      // A packages/ directory is ignored.
      var files = {
        ".packages": "foo:pkgs/foo/",
        "packages": {},
        "pkgs": fooPackage
      };
      addScheme("implicit .packages file", "%$scheme/", files: files, expect: {
        "iconf": "%$scheme/.packages",
        "foo/": "%$scheme/pkgs/foo/",
        "foo/bar": "%$scheme/pkgs/foo/bar",
      });
    }

    {
      // No parameters, a .packages file in parent dir, no packages/ dir.
      // With a file: URI, find the .packages file.
      // WIth a http: URI, assume a packages/ dir.
      var files = {"sub": {}, ".packages": "foo:pkgs/foo/", "pkgs": fooPackage};
      addScheme(".packages file in parent", "%$scheme/sub/",
          files: files,
          expect: (scheme == "file")
              ? {
                  "iconf": "%file/.packages",
                  "foo/": "%file/pkgs/foo/",
                  "foo/bar": "%file/pkgs/foo/bar",
                }
              : {
                  "iroot": "%http/sub/packages/",
                  "foo": "%http/sub/packages/foo",
                  "foo/": "%http/sub/packages/foo/",
                  "foo/bar": "%http/sub/packages/foo/bar",
                  "foo.x": null,
                  "bar/bar": "%http/sub/packages/bar/bar",
                });
    }

    {
      // Specified package root that doesn't exist.
      // Ignores existing .packages file and packages/ dir.
      addScheme("explicit root not there", "%$scheme/",
          files: {
            "packages": fooPackage,
            ".packages": "foo:%$scheme/packages/"
          },
          root: "%$scheme/notthere/",
          expect: {
            "proot": "%$scheme/notthere/",
            "iroot": "%$scheme/notthere/",
            "foo": "%$scheme/notthere/foo",
            "foo/": "%$scheme/notthere/foo/",
            "foo/bar": "%$scheme/notthere/foo/bar",
            "foo.x": null,
            "bar/bar": "%$scheme/notthere/bar/bar",
          });
    }

    {
      // Specified package config that doesn't exist.
      // Ignores existing .packages file and packages/ dir.
      addScheme("explicit config not there", "%$scheme/",
          files: {".packages": "foo:packages/foo/", "packages": fooPackage},
          config: "%$scheme/.notthere",
          expect: {
            "pconf": "%$scheme/.notthere",
            "iconf": null, //   <- Only there if actually loaded (unspecified).
            "foo/": null,
            "foo/bar": null,
            "foo.x": null,
          });
    }

    {
      // Specified package root with no trailing slash.
      // The Platform.packageRoot and Isolate.packageRoot has a trailing slash.
      var files = {
        ".packages": "foo:packages/foo/",
        "packages": {},
        "pkgs": fooPackage
      };
      addScheme("explicit package root, no slash", "%$scheme/",
          files: files,
          root: "%$scheme/pkgs",
          expect: {
            "proot": "%$scheme/pkgs/",
            "iroot": "%$scheme/pkgs/",
            "foo": "%$scheme/pkgs/foo",
            "foo/": "%$scheme/pkgs/foo/",
            "foo/bar": "%$scheme/pkgs/foo/bar",
            "bar/bar": "%$scheme/pkgs/bar/bar",
          });
    }

    {
      // Specified package root with trailing slash.
      var files = {
        ".packages": "foo:packages/foo/",
        "packages": {},
        "pkgs": fooPackage
      };
      addScheme("explicit package root, slash", "%$scheme/",
          files: files,
          root: "%$scheme/pkgs",
          expect: {
            "proot": "%$scheme/pkgs/",
            "iroot": "%$scheme/pkgs/",
            "foo": "%$scheme/pkgs/foo",
            "foo/": "%$scheme/pkgs/foo/",
            "foo/bar": "%$scheme/pkgs/foo/bar",
            "bar/bar": "%$scheme/pkgs/bar/bar",
          });
    }

    {
      // Specified package config.
      var files = {
        ".packages": "foo:packages/foo/",
        "packages": {},
        ".pkgs": "foo:pkgs/foo/",
        "pkgs": fooPackage
      };
      addScheme("explicit package config file", "%$scheme/",
          files: files,
          config: "%$scheme/.pkgs",
          expect: {
            "pconf": "%$scheme/.pkgs",
            "iconf": "%$scheme/.pkgs",
            "foo/": "%$scheme/pkgs/foo/",
            "foo/bar": "%$scheme/pkgs/foo/bar",
          });
    }

    {
      // Specified package config as data: URI.
      // The package config can be specified as a data: URI.
      // (In that case, relative URI references in the config file won't work).
      var files = {
        ".packages": "foo:packages/foo/",
        "packages": {},
        "pkgs": fooPackage
      };
      var dataUri = "data:,foo:%$scheme/pkgs/foo/\n";
      addScheme("explicit data: config file", "%$scheme/",
          files: files,
          config: dataUri,
          expect: {
            "pconf": dataUri,
            "iconf": dataUri,
            "foo/": "%$scheme/pkgs/foo/",
            "foo/bar": "%$scheme/pkgs/foo/bar",
          });
    }
  }

  // Tests where there are files on both http: and file: sources.

  for (var entryScheme in const ["file", "http"]) {
    for (var pkgScheme in const ["file", "http"]) {
      // Package root.
      if (entryScheme != pkgScheme) {
        // Package dir and entry point on different schemes.
        var files = {};
        var https = {};
        (entryScheme == "file" ? files : https)["main"] = testMain;
        (pkgScheme == "file" ? files : https)["pkgs"] = fooPackage;
        add("$pkgScheme pkg/$entryScheme main", "%$entryScheme/",
            file: files,
            http: https,
            root: "%$pkgScheme/pkgs/",
            expect: {
              "proot": "%$pkgScheme/pkgs/",
              "iroot": "%$pkgScheme/pkgs/",
              "foo": "%$pkgScheme/pkgs/foo",
              "foo/": "%$pkgScheme/pkgs/foo/",
              "foo/bar": "%$pkgScheme/pkgs/foo/bar",
              "bar/bar": "%$pkgScheme/pkgs/bar/bar",
              "foo.x": "qux",
            });
      }
      // Package config. The configuration file may also be on either source.
      for (var configScheme in const ["file", "http"]) {
        // Don't do the boring stuff!
        if (entryScheme == configScheme && entryScheme == pkgScheme) continue;
        // Package config, packages and entry point not all on same scheme.
        var files = {};
        var https = {};
        (entryScheme == "file" ? files : https)["main"] = testMain;
        (configScheme == "file" ? files : https)[".pkgs"] =
            "foo:%$pkgScheme/pkgs/foo/\n";
        (pkgScheme == "file" ? files : https)["pkgs"] = fooPackage;
        add("$pkgScheme pkg/$configScheme config/$entryScheme main",
            "%$entryScheme/",
            file: files,
            http: https,
            config: "%$configScheme/.pkgs",
            expect: {
              "pconf": "%$configScheme/.pkgs",
              "iconf": "%$configScheme/.pkgs",
              "foo/": "%$pkgScheme/pkgs/foo/",
              "foo/bar": "%$pkgScheme/pkgs/foo/bar",
              "foo.x": "qux",
            });
      }
    }
  }
}

// ---------------------------------------------------------
// Helper functionality.

var fileHttpRegexp = new RegExp(r"%(?:file|http)/");

// Executes a test in a configuration.
//
// The test must specify which main file to use
// (`main`, `spawnMain` or `spawnUriMain`)
// and any arguments which will be used by `spawnMain` and `spawnUriMain`.
//
// The [expect] map may be used to override the expectations of the
// configuration on a value-by-value basis. Passing, e.g., `{"pconf": null}`
// will override only the `pconf` (`Platform.packageConfig`) expectation.
Future testConfiguration(Configuration conf) async {
  print("-- ${conf.description}");
  var description = conf.description;
  try {
    var output = await execDart(conf.mainFile,
        root: conf.root, config: conf.config, scriptArgs: conf.args);
    match(json.decode(output), conf.expect, description, output);
  } catch (e, s) {
    // Unexpected error calling execDart or parsing the result.
    // Report it and continue.
    print("ERROR running $description: $e\n$s");
    failingTests.putIfAbsent(description, () => []).add("$e");
  }
}

/// Test that the output of running testMain matches the expectations.
///
/// The output is a string which is parse as a JSON literal.
/// The resulting map is always mapping strings to strings, or possibly `null`.
/// The expectations can have non-string values other than null,
/// they are `toString`'ed  before being compared (so the caller can use a URI
/// or a File/Directory directly as an expectation).
void match(Map actuals, Map expectations, String desc, String actualJson) {
  for (var key in expectations.keys) {
    var expectation = expectations[key]?.toString();
    var actual = actuals[key];
    if (expectation != actual) {
      print("ERROR: $desc: $key: Expected: <$expectation> Found: <$actual>");
      failingTests
          .putIfAbsent(desc, () => [])
          .add("$key: $expectation != $actual");
    }
  }
}

const String improt = "import"; // Avoid multitest import rewriting.

/// Script that prints the current state and the result of resolving
/// a few package URIs. This script will be invoked in different settings,
/// and the result will be parsed and compared to the expectations.
const String testMain = """
$improt "dart:convert" show json;
$improt "dart:io" show Platform, Directory;
$improt "dart:isolate" show Isolate;
$improt "package:foo/foo.dart" deferred as foo;
main(_) async {
  String platformRoot = await Platform.packageRoot;
  String platformConfig = await Platform.packageConfig;
  Directory cwd = Directory.current;
  Uri script = Platform.script;
  Uri isolateRoot = await Isolate.packageRoot;
  Uri isolateConfig = await Isolate.packageConfig;
  Uri base = Uri.base;
  Uri res1 = await Isolate.resolvePackageUri(Uri.parse("package:foo"));
  Uri res2 = await Isolate.resolvePackageUri(Uri.parse("package:foo/"));
  Uri res3 = await Isolate.resolvePackageUri(Uri.parse("package:foo/bar"));
  Uri res4 = await Isolate.resolvePackageUri(Uri.parse("package:bar/bar"));
  Uri res5 = await Isolate.resolvePackageUri(Uri.parse("relative/path"));
  Uri res6 = await Isolate.resolvePackageUri(
      Uri.parse("http://example.org/file"));
  String fooX = await foo
    .loadLibrary()
    .timeout(const Duration(seconds: 1))
    .then((_) => foo.x, onError: (_) => null);
  print(json.encode({
    "cwd": cwd.path,
    "base": base?.toString(),
    "script": script?.toString(),
    "proot": platformRoot,
    "pconf": platformConfig,
    "iroot" : isolateRoot?.toString(),
    "iconf" : isolateConfig?.toString(),
    "foo": res1?.toString(),
    "foo/": res2?.toString(),
    "foo/bar": res3?.toString(),
    "foo.x": fooX?.toString(),
    "bar/bar": res4?.toString(),
    "relative": res5?.toString(),
    "nonpkg": res6?.toString(),
  }));
}
""";

/// Script that spawns a new Isolate using Isolate.spawnUri.
///
/// Takes URI of target isolate, package config, package root and
/// automatic package resolution-flag parameters as command line arguments.
/// Any further arguments are forwarded to the spawned isolate.
const String spawnUriMain = """
$improt "dart:isolate";
$improt "dart:async";
main(args) async {
  Uri target = Uri.parse(args[0]);
  Uri config = (args[1] == "-") ? null : Uri.parse(args[1]);
  Uri root = (args[2] == "-") ? null : Uri.parse(args[2]);
  bool search = args[3] == "true";
  var restArgs = args.skip(4).toList();
  // Port keeps isolate alive until spawned isolate terminates.
  var port = new RawReceivePort();
  port.handler = (res) async {
    port.close();  // Close on exit or first error.
    if (res != null) {
      await new Future.error(res[0], new StackTrace.fromString(res[1]));
    }
  };
  Isolate.spawnUri(target, restArgs, null,
                   packageRoot: root, packageConfig: config,
                   automaticPackageResolution: search,
                   onError: port.sendPort, onExit: port.sendPort);
}
""";

/// Script that spawns a new Isolate using Isolate.spawn.
///
/// Uses the first argument to select which target to spawn.
/// Should be either "test", "uri" or "spawn".
const String spawnMain = """
$improt "dart:async";
$improt "dart:isolate";
$improt "%mainDir/main.dart" as test;
$improt "%mainDir/spawnUriMain.dart" as spawnUri;
main(List<String> args) async {
  // Port keeps isolate alive until spawned isolate terminates.
  var port = new RawReceivePort();
  port.handler = (res) async {
    port.close();  // Close on exit or first error.
    if (res != null) {
      await new Future.error(res[0], new StackTrace.fromString(res[1]));
    }
  };
  var arg = args.first;
  var rest = args.skip(1).toList();
  var target;
  if (arg == "main") {
    target = test.main;
  } else if (arg == "spawnUriMain") {
    target = spawnUri.main;
  } else {
    target = main;
  }
  Isolate.spawn(target, rest, onError: port.sendPort, onExit: port.sendPort);
}
""";

/// A package directory containing only one package, "foo", with one file.
const Map fooPackage = const {
  "foo": const {"foo": "var x = 'qux';"}
};

/// Runs the Dart executable with the provided parameters.
///
/// Captures and returns the output.
Future<String> execDart(String script,
    {String root, String config, Iterable<String> scriptArgs}) async {
  var checked = false;
  assert((checked = true));
  // TODO: Find a way to change CWD before running script.
  var executable = Platform.executable;
  var args = [];
  if (checked) args.add("--checked");
  if (root != null) args.add("--package-root=$root");
  if (config != null) args.add("--packages=$config");
  args.add(script);
  if (scriptArgs != null) {
    args.addAll(scriptArgs);
  }
  return Process.run(executable, args).then((results) {
    if (results.exitCode != 0 || results.stderr.isNotEmpty) {
      throw results.stderr;
    }
    return results.stdout;
  });
}

/// Creates a number of files and subdirectories.
///
/// The [content] is the content of the directory itself. The map keys are
/// names and the values are either strings that represent Dart file contents
/// or maps that represent subdirectories.
void createFiles(Directory tempDir, String subDir, Map content) {
  Directory createDir(Directory base, String name) {
    Directory newDir = new Directory(p.join(base.path, name));
    newDir.createSync();
    return newDir;
  }

  void createTextFile(Directory base, String name, String content) {
    File newFile = new File(p.join(base.path, name));
    newFile.writeAsStringSync(content);
  }

  void createRecursive(Directory dir, Map map) {
    for (var name in map.keys) {
      var content = map[name];
      if (content is String) {
        // If the name starts with "." it's a .packages file, otherwise it's
        // a dart file. Those are the only files we care about in this test.
        createTextFile(
            dir, name.startsWith(".") ? name : name + ".dart", content);
      } else {
        assert(content is Map);
        var subdir = createDir(dir, name);
        createRecursive(subdir, content);
      }
    }
  }

  createRecursive(createDir(tempDir, subDir), content);
}

/// Start an HTTP server which serves a directory/file structure.
///
/// The directories and files are described by [files].
///
/// Each map key is an entry in a directory. A `Map` value is a sub-directory
/// and a `String` value is a text file.
/// The file contents are run through [fixPaths] to allow them to be self-
/// referential.
Future<HttpServer> startServer(Map files) async {
  return (await HttpServer.bind(InternetAddress.loopbackIPv4, 0))
    ..forEach((request) {
      var result = files;
      onFailure:
      {
        for (var part in request.uri.pathSegments) {
          if (part.endsWith(".dart")) {
            part = part.substring(0, part.length - 5);
          }
          if (result is Map) {
            result = result[part];
          } else {
            break onFailure;
          }
        }
        if (result is String) {
          request.response
            ..write(result)
            ..close();
          return;
        }
      }
      request.response
        ..statusCode = HttpStatus.notFound
        ..close();
    });
}

// Counter used to avoid reusing temporary file or directory names.
//
// Used when adding extra files to an existing directory structure,
// and when creating temporary directories.
//
// Some platform temporary-directory implementations are timer based,
// and creating two temp-dirs withing a short duration may cause a collision.
int tmpNameCounter = 0;

// Fresh file name.
String freshName([String base = "tmp"]) => "$base${tmpNameCounter++}";

Directory createTempDir() {
  return Directory.systemTemp.createTempSync(freshName("pftest-"));
}

typedef void ConfigUpdate(Configuration configuration);

/// The configuration for a single test.
class Configuration {
  /// The "description" of the test - a description of the set-up.
  final String description;

  /// The package root parameter passed to the Dart isolate.
  ///
  /// At most one of [root] and [config] should be supplied. If both are
  /// omitted, a VM will search for a packages file or dir.
  final String root;

  /// The package configuration file location passed to the Dart isolate.
  final String config;

  /// Path to the main file to run.
  final String mainFile;

  /// List of arguments to pass to the main function.
  final List<String> args;

  /// The expected values for `Platform.package{Root,Config}`,
  /// `Isolate.package{Root,Config}` and resolution of package URIs
  /// in a `foo` package.
  ///
  /// The results are found by running the `main.dart` file inside [mainDir].
  /// The tests can run this file after doing other `spawn` or `spawnUri` calls.
  final Map expect;

  Configuration(
      {this.description,
      this.root,
      this.config,
      this.mainFile,
      this.args,
      this.expect});

  // Gets the type of main file, one of `main`, `spawnMain` or `spawnUriMain`.
  String get mainType {
    var lastSlash = mainFile.lastIndexOf("/");
    if (lastSlash < 0) {
      // Assume it's a Windows path.
      lastSlash = mainFile.lastIndexOf(r"\");
    }
    var name = mainFile.substring(lastSlash + 1, mainFile.length - 5);
    assert(name == "main" || name == "spawnMain" || name == "spawnUriMain");
    return name;
  }

  String get mainPath {
    var lastSlash = mainFile.lastIndexOf("/");
    if (lastSlash < 0) {
      // Assume it's a Windows path.
      lastSlash = mainFile.lastIndexOf(r"\");
    }
    return mainFile.substring(0, lastSlash + 1);
  }

  /// Create a new configuration from the old one.
  ///
  /// [description] is new description.
  ///
  /// [main] is one of `main`, `spawnMain` or `spawnUriMain`, and changes
  /// the [Configuration.mainFile] to a different file in the same directory.
  ///
  /// [mainFile] overrides [Configuration.mainFile] completely, and ignores
  /// [main].
  ///
  /// [newArgs] are prepended to the existing [Configuration.args].
  ///
  /// [args] overrides [Configuration.args] completely and ignores [newArgs].
  ///
  /// [expect] overrides individual expectations.
  ///
  /// [root] and [config] overrides the existing values.
  Configuration update(
      {String description,
      String main,
      String mainFile,
      String root,
      String config,
      List<String> args,
      List<String> newArgs,
      Map expect}) {
    return new Configuration(
        description: description ?? this.description,
        root: root ?? this.root,
        config: config ?? this.config,
        mainFile: mainFile ??
            ((main == null) ? this.mainFile : "${this.mainPath}$main.dart"),
        args: args ??
            (<String>[]
              ..addAll(newArgs ?? const <String>[])
              ..addAll(this.args)),
        expect: expect == null ? this.expect : new Map.from(this.expect)
          ..addAll(expect ?? const {}));
  }

  // For debugging.
  String toString() {
    return "Configuration($description\n"
        "  root  : $root\n"
        "  config: $config\n"
        "  main  : $mainFile\n"
        "  args  : ${args.map((x) => '"$x"').join(" ")}\n"
        ") : expect {\n${expect.keys.map((k) =>
           '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
        "}";
  }
}

// Inserts the file with generalized [name] at [path] with [content].
//
// The [path] is a directory where the file is created. It must start with
// either '%file/' or '%http/' to select the structure to put it into.
//
// The [name] should not have a trailing ".dart" for Dart files. Any file
// not starting with "." is assumed to be a ".dart" file.
void insertFileAt(
    Map file, Map http, String path, String name, String content) {
  var parts = path.split('/').toList();
  var dir = (parts[0] == "%file") ? file : http;
  for (var i = 1; i < parts.length - 1; i++) {
    var entry = parts[i];
    dir = dir[entry] ?? (dir[entry] = {});
  }
  dir[name] = content;
}
