# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Trusted code
if (!is_nacl) {
  # A simple shell for running untrusted binaries that talk to the Mojo
  # embedder. (No services.)
  executable("monacl_shell") {
    testonly = true
    sources = [
      "monacl_shell.cc",
    ]
    deps = [
      "//base:base",
      "//mojo/edk/system:system",
      "//nacl_bindings:monacl_sel",
    ]

    data_deps =
        [ "//nacl_bindings:irt_mojo(//build/toolchain/nacl:irt_${target_cpu})" ]
  }

  if (current_cpu == "x86" || current_cpu == "arm") {
    # Non-SFI NaCl currently supports x86-32 and ARMv7, but not anything 64-bit.
    # Additionally, PNaCl pexes assume 32-bit pointers.
    executable("monacl_shell_nonsfi") {
      testonly = true
      sources = [
        "monacl_shell_nonsfi.cc",
      ]
      deps = [
        ":irt_mojo_nonsfi",
        "//mojo/edk/system",
        "//native_client/src/nonsfi/loader:elf_loader",
      ]
    }
  }
}

group("monacl_shell_nonsfi_x86") {
  testonly = true
  deps = []
  if ((target_cpu == "x64" || target_cpu == "x86") && is_linux) {
    # Even when Mojo is built for x86-64 by default, we want to use x86-32
    # for running programs under Non-SFI NaCl.
    # The toolchain is hardcoded as 32-bit clang here -- although it must
    # be 32 bit (for nonsfi), it assumes clang. Ideally, the toolchain would
    # be defined as the 32 bit variant of whatever is being used (be it clang,
    # gcc, or something else).
    deps += [ ":monacl_shell_nonsfi(//build/toolchain/linux:clang_x86)" ]
  }
}

# Untrusted code
if (is_nacl) {
  # Unit test for the Mojo public API.
  executable("monacl_test") {
    testonly = true
    sources = [
      "//mojo/public/cpp/system/tests/core_unittest.cc",
      "//mojo/public/cpp/system/tests/macros_unittest.cc",
    ]
    deps = [
      "//mojo/public/c/system/tests:tests",
      "//mojo/public/cpp/system:system",
      "//mojo/public/platform/nacl:mojo",
      "//testing/gtest:gtest",
      "//testing/gtest:gtest_main",
    ]
  }

  group("mojo_nacl_tests_untrusted") {
    testonly = true
    deps = [
      ":monacl_test",
      "//examples/apptest",
      "//examples/wget",
      "//services/clipboard",
      "//services/clipboard:apptests",
      "//services/files:apptests",
      "//services/http_server",
      "//services/http_server:apptests",
      "//services/view_manager:mojo_view_manager_client_apptests",
      "//services/view_manager:view_manager_service_apptests",
      "//services/window_manager:window_manager_apptests",
      "//shell:apptests",
    ]
  }
}

static_library("irt_mojo_nonsfi") {
  sources = [
    "irt_mojo_nonsfi.cc",
    "irt_mojo_nonsfi.h",
    "nexe_launcher_nonsfi.cc",
  ]

  deps = [
    "//base",
    "//mojo/public/c/system",
    "//mojo/public/platform/nacl:mojo_irt_header",
    "//native_client/src/nonsfi/irt:irt_interfaces",
  ]
}

group("mojo_nacl") {
  deps = [
    "//services/nacl:nacl_content_handler",
  ]
}

group("mojo_nacl_nonsfi") {
  deps = [
    "//services/nacl:nacl_content_handler_nonsfi",
  ]
}

group("mojo_pnacl_tests") {
  testonly = true
  deps = [
    ":monacl_test(//build/toolchain/nacl:newlib_pnacl)",
  ]
}

action("translate_mojo_pnacl_tests_to_native") {
  testonly = true

  # Leaving default as linux for OSes which are similar to linux, but do
  # not self-identify as linux through host_os.
  nacl_toolchain_host_os = "linux"
  if (host_os == "mac") {
    nacl_toolchain_host_os = "mac"
  }
  script = rebase_path("//") + "native_client/toolchain/${nacl_toolchain_host_os}_x86/pnacl_newlib/bin/pydir/loader.py"
  input = rebase_path(root_build_dir) + "/newlib_pnacl/monacl_test.pexe"
  inputs = [
    input,
  ]
  output = "monacl_test_nonsfi.nexe"
  outputs = [
    "$root_out_dir/${output}",
  ]
  args = [
    "pnacl-translate",
    "$input",
    "-o",
    "$output",
    "-arch",
  ]
  if (target_cpu == "x86" || target_cpu == "x64") {
    args += [ "x86-32-nonsfi" ]
  } else if (target_cpu == "arm") {
    args += [ "arm-nonsfi" ]
  } else {
    assert(false, "Unrecognized target CPU for Non-SFI NaCl translation")
  }
  deps = [
    ":mojo_pnacl_tests",
  ]
}

action("prepend_shebang_to_nexe") {
  testonly = true

  script = rebase_path("//") + "mojo/public/tools/prepend.py"
  nexe_path = "$root_out_dir/monacl_test_nonsfi"
  input = "${nexe_path}.nexe"
  inputs = [
    input,
  ]
  output = "${nexe_path}.mojo"
  outputs = [
    output,
  ]

  line = "#!mojo mojo:nacl_content_handler_nonsfi"
  args = [
    "--input=" + rebase_path(input, root_build_dir),
    "--output=" + rebase_path(output, root_build_dir),
    "--line=$line",
  ]
  deps = [
    ":translate_mojo_pnacl_tests_to_native",
  ]
}

group("monacl_test_nonsfi_nexes") {
  testonly = true
  deps = [
    ":translate_mojo_pnacl_tests_to_native",
    ":prepend_shebang_to_nexe",
  ]
}

group("mojo_nacl_tests") {
  testonly = true
  deps = [
    ":mojo_nacl_tests_untrusted(//build/toolchain/nacl:clang_newlib_${current_cpu})",
    ":monacl_shell",
  ]
}

group("mojo_nacl_tests_nonsfi") {
  testonly = true
  deps = [
    ":monacl_shell_nonsfi_x86",
    ":monacl_test_nonsfi_nexes",
  ]
}
