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

import("//build/config/nacl/config.gni")
import("//services/catalog/public/tools/catalog.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//testing/test.gni")

# Target that builders build.
group("all") {
  testonly = true

  deps = [
    ":mash_catalog",
    "//components/leveldb",
    "//mash/catalog_viewer",
    "//mash/example",
    "//mash/quick_launch",
    "//mash/runner",
    "//mash/session",
    "//mash/simple_wm",
    "//mash/task_viewer",
  ]

  # Build on platforms that support ash.
  if (is_chromeos) {
    deps += [
      "//ash/autoclick/mus:accessibility_autoclick",
      "//ash/mus/standalone:ash_standalone",
      "//ash/touch_hud/mus:touch_hud",
      "//mash:mash_unittests",
    ]
  }
}

# This is the catalog of services available to a standalone mash environment.
# Build //mash/runner to generate the runner executable.
catalog("catalog") {
  testonly = true

  standalone_services = [
    "//components/leveldb:manifest",
    "//mash/catalog_viewer:manifest",
    "//mash/quick_launch:manifest",
    "//mash/session:manifest",
    "//mash/task_viewer:manifest",
    "//services/ui:manifest",
    "//services/ui/demo:manifest",
    "//services/ui/ime/test_ime_driver:manifest",

    # TODO(rockot): It seems like a layering violation to have these service
    # names referenced here, but it's the most convenient thing to do for now,
    # and this is only for developers.
    #
    # Note that there are no build-time dependencies on the actual Chrome
    # binary implied by mash:all or other targets here. This only ensures that
    # if you have such a binary built, the runner will be able to locate it.
    "//chrome/app:chrome_content_browser_manifest",
    "//chrome/app:chrome_content_gpu_manifest",
    "//chrome/app:chrome_content_packaged_services_manifest_for_mash",
    "//chrome/app:chrome_content_plugin_manifest",
    "//chrome/app:chrome_content_renderer_manifest",
    "//chrome/app:chrome_content_utility_manifest",
  ]

  executable_overrides = [ "content_packaged_services:@EXE_DIR/chrome" ]

  catalog_deps = [ "//mash/example:catalog" ]

  if (is_chromeos) {
    standalone_services += [
      "//ash/mus:manifest",
      "//ash/mus/standalone:manifest",
    ]
  }

  if (is_linux && !is_android) {
    standalone_services += [ "//components/font_service:manifest" ]
  }

  if (enable_nacl) {
    standalone_services += [ "//components/nacl/loader:nacl_loader_manifest" ]
    if (is_win && target_cpu == "x86") {
      standalone_services += [ "//components/nacl/broker:nacl_broker_manifest" ]
    }
  }
}

copy("mash_catalog") {
  testonly = true
  sources = get_target_outputs(":catalog")
  outputs = [
    "$root_out_dir/mash_catalog.json",
  ]
  deps = [
    ":catalog",
  ]
}

if (is_chromeos) {
  # TODO(jamescook): Move these tests into //ash/mus.
  test("mash_unittests") {
    sources = [
      "test/mash_test_suite.cc",
      "test/mash_test_suite.h",
      "test/mash_unittests.cc",
    ]
    deps = [
      "//ash:test_support_without_content",
      "//ash/mus:resources",
      "//ash/mus:unittests",
      "//ash/public/cpp:ash_public_cpp",
      "//base",
      "//base/test:test_support",
      "//cc",
      "//cc:test_support",
      "//components/viz/service",
      "//mojo/edk/system",
      "//services/catalog:lib",
      "//ui/aura",
      "//ui/base",
      "//ui/compositor:test_support",
      "//ui/gl:test_support",
    ]
    data_deps = [
      ":mash_unittests_catalog_copy",
      "//ash/mus:resources",
    ]
  }

  service_manifest("unittests_manifest") {
    name = "mash_unittests"
    source = "unittests_manifest.json"
  }

  catalog("mash_unittests_catalog") {
    testonly = true

    embedded_services = [ ":unittests_manifest" ]

    catalog_deps = [ ":catalog" ]
  }

  copy("mash_unittests_catalog_copy") {
    testonly = true
    sources = get_target_outputs(":mash_unittests_catalog")
    outputs = [
      "${root_out_dir}/mash_unittests_catalog.json",
    ]
    deps = [
      ":mash_unittests_catalog",
    ]
  }
}
