# Copyright 2014 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.

# Keep in sync with targets in remoting/remoting_client.gypi.

import("//build/config/features.gni")
import("//remoting/webapp/build_template.gni")
import("//remoting/webapp/files.gni")

action("credits") {
  about_credits_file = "$target_gen_dir/credits.html"
  script = "//tools/licenses.py"
  depfile = "$target_gen_dir/$target_name.d"

  inputs = [
    "base/html/credits.tmpl",
    "base/html/credits_entry.tmpl",
  ]

  outputs = [
    about_credits_file,
  ]

  args = [
    "credits",
    rebase_path(about_credits_file, root_build_dir),
    "--file-template",
    rebase_path("base/html/credits.tmpl", root_build_dir),
    "--entry-template",
    rebase_path("base/html/credits_entry.tmpl", root_build_dir),
    "--depfile",
    rebase_path(depfile, root_build_dir),
  ]
}

desktop_remoting_webapp("webapp") {
  output_dir = "$root_build_dir/remoting/remoting-webapp.v2"
  zip_path = "$root_build_dir/remoting-webapp.v2.zip"
  extra_files = [ "crd/remoting_client_pnacl.nmf.jinja2" ]
}

copy("browser_test_resources") {
  sources = remoting_webapp_browsertest_main_html_extra_files
  outputs = [
    "$root_out_dir/remoting/browser_test_resources/{{source_file_part}}",
  ]
}

remoting_unit_test_out_dir = "$root_out_dir/remoting/unittests"

group("unit_tests") {
  data_deps = [
    ":blanketjs",
    ":unittest_html",
    ":js_files",
    ":qunit",
    ":sinonjs",
  ]
}

copy("js_files") {
  sources = webapp_js_files + remoting_webapp_unittests_all_files
  outputs = [
    "$remoting_unit_test_out_dir/{{source_file_part}}",
  ]
}

copy("blanketjs") {
  sources = [
    "//third_party/blanketjs/src/blanket.js",
    "//third_party/blanketjs/src/qunit_adapter.js",
  ]
  outputs = [
    "$remoting_unit_test_out_dir/blanketjs/{{source_file_part}}",
  ]
}

copy("sinonjs") {
  sources = [
    "//third_party/sinonjs/src/sinon-qunit.js",
    "//third_party/sinonjs/src/sinon.js",
  ]
  outputs = [
    "$remoting_unit_test_out_dir/sinonjs/{{source_file_part}}",
  ]
}

copy("qunit") {
  sources = [
    "//third_party/qunit/src/browser_test_harness.js",
    "//third_party/qunit/src/qunit.css",
    "//third_party/qunit/src/qunit.js",
  ]
  outputs = [
    "$remoting_unit_test_out_dir/qunit/{{source_file_part}}",
  ]
}

build_webapp_html("unittest_html") {
  html_template_file = remoting_webapp_unittests_template_main
  html_template_include_files = []
  js_files = remoting_webapp_unittests_all_js_files
  html_output = "$remoting_unit_test_out_dir/unittests.html"
  exclude_js = remoting_webapp_unittests_exclude_js_files
  instrument_js = webapp_js_files
}
