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

// Test generating and running a simple precompiled snapshot of this script.

import 'dart:io';

main(List args) {
  if (args.length > 0 && args[0] == "--hello") {
    print("Hello");
    return;
  }

  var cc, cc_flags, shared, libname;
  if (Platform.isLinux) {
    cc = 'gcc';
    shared = '-shared';
    libname = 'libprecompiled.so';
  } else if (Platform.isMacOS) {
    cc = 'clang';
    shared = '-dynamiclib';
    libname = 'libprecompiled.dylib';
  } else {
    print("Test only supports Linux and Mac");
    return;
  }

  if (Platform.version.contains("x64")) {
    cc_flags = "-m64";
  } else if (Platform.version.contains("simarm64")) {
    cc_flags = "-m64";
  } else if (Platform.version.contains("simarm")) {
    cc_flags = "-m32";
  } else if (Platform.version.contains("simmips")) {
    cc_flags = "-m32";
  } else if (Platform.version.contains("arm")) {
    cc_flags = "";
  } else if (Platform.version.contains("mips")) {
    cc_flags = "-EL";
  } else {
    print("Architecture not supported: ${Platform.version}");
    return;
  }

  var dart_executable =
      Directory.current.path + Platform.pathSeparator + Platform.executable;
  Directory tmp;
  try {
    tmp = Directory.current.createTempSync("temp_precompilation_test");
    var result = Process.runSync(
       "${dart_executable}_no_snapshot",
       ["--gen-precompiled-snapshot", Platform.script.path],
       workingDirectory: tmp.path);
    if (result.exitCode != 0) {
      print(result.stdout);
      print(result.stderr);
      throw "Snapshot generation failed.";
    }

    // Check if gcc is present, and skip test if it is not.
    try {
      result = Process.runSync(
          cc,
          ["--version"],
          workingDirectory: tmp.path);
      if (result.exitCode != 0) {
        throw "$cc --version failed.";
      }
    } catch(e) {
      print("Skipping test because $cc is not present: $e");
      return;
    }

    result = Process.runSync(
        cc,
        [shared, cc_flags, "-nostartfiles", "-o", libname, "precompiled.S"],
        workingDirectory: tmp.path);
    if (result.exitCode != 0) {
      print(result.stdout);
      print(result.stderr);
      throw "Shared library creation failed!";
    }

    var ld_library_path = new String.fromEnvironment("LD_LIBRARY_PATH");
    ld_library_path = "${ld_library_path}:${tmp.path}";

    result = Process.runSync(
       "${dart_executable}_precompiled_runtime",
       ["--run-precompiled-snapshot", "ignored_script", "--hello"],
       workingDirectory: tmp.path,
       environment: {"LD_LIBRARY_PATH": ld_library_path});
    if (result.exitCode != 0) {
      print(result.stdout);
      print(result.stderr);
      throw "Precompiled binary failed.";
    }
    print(result.stdout);
    if (result.stdout != "Hello\n") {
      throw "Precompiled binary output mismatch.";
    }
  } finally {
    tmp?.deleteSync(recursive: true);
  }
}
