# 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/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",
    "//services/viz: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",
    ]
  }
}
