# 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("//components/nacl/features.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/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",
    "//services/viz:manifest",
  ]

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

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

  if (is_chromeos) {
    standalone_services += [
      "//ash:manifest",
      "//ash/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.
  test("mash_unittests") {
    sources = [
      "test/mash_test_suite.cc",
      "test/mash_test_suite.h",
      "test/mash_unittests.cc",
    ]
    deps = [
      "//ash:ash_service_resources",
      "//ash:mash_unittests",
      "//ash:test_support_without_content",
      "//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:ash_service_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",
    ]
  }
}
