# Copyright 2016 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("//services/catalog/public/tools/catalog.gni")
import("//services/service_manager/public/cpp/service.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//testing/test.gni")

source_set("lifecycle") {
  testonly = true
  sources = [
    "lifecycle_unittest.cc",
  ]
  deps = [
    ":interfaces",
    "//base",
    "//base/test:test_support",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/cpp:service_test_support",
    "//services/service_manager/public/mojom",
    "//services/service_manager/runner/common",
    "//services/service_manager/tests:util",
  ]

  data_deps = [
    ":lifecycle_unittest_app",
    ":lifecycle_unittest_parent",
    ":lifecycle_unittest_exe",
    ":lifecycle_unittest_package",
  ]
}

mojom("interfaces") {
  sources = [
    "lifecycle_unittest.mojom",
  ]
}

service_manifest("manifest") {
  name = "lifecycle_unittest"
  source = "lifecycle_unittest_manifest.json"
}

service_manifest("lifecycle_unittest_package_app_a_manifest") {
  name = "lifecycle_unittest_package_app_a"
  source = "package_app_a_manifest.json"
}

service_manifest("lifecycle_unittest_package_app_b_manifest") {
  name = "lifecycle_unittest_package_app_b"
  source = "package_app_b_manifest.json"
}

source_set("app_client") {
  sources = [
    "app_client.cc",
    "app_client.h",
  ]
  deps = [
    ":interfaces",
    "//base",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/mojom",
  ]
}

service("lifecycle_unittest_package") {
  testonly = true
  sources = [
    "package.cc",
  ]
  deps = [
    ":app_client",
    ":interfaces",
    "//base",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/mojom",
  ]
}

service_manifest("lifecycle_unittest_package_manifest") {
  name = "lifecycle_unittest_package"
  source = "package_manifest.json"
  packaged_services = [
    ":lifecycle_unittest_package_app_a_manifest",
    ":lifecycle_unittest_package_app_b_manifest",
  ]
}

service("lifecycle_unittest_app") {
  testonly = true
  sources = [
    "app.cc",
  ]
  deps = [
    ":app_client",
    ":interfaces",
    "//base",
    "//services/service_manager/public/cpp",
  ]
}

service_manifest("lifecycle_unittest_app_manifest") {
  name = "lifecycle_unittest_app"
  source = "app_manifest.json"
}

service("lifecycle_unittest_parent") {
  testonly = true
  sources = [
    "parent.cc",
  ]
  deps = [
    ":interfaces",
    "//base",
    "//services/service_manager/public/cpp",
  ]
}

service_manifest("lifecycle_unittest_parent_manifest") {
  name = "lifecycle_unittest_parent"
  source = "parent_manifest.json"
}

executable("lifecycle_unittest_exe") {
  testonly = true
  sources = [
    "lifecycle_exe.cc",
  ]
  deps = [
    ":app_client",
    "//base",
    "//build/win:default_exe_manifest",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/cpp/standalone_service:main",
  ]
}

service_manifest("lifecycle_unittest_exe_manifest") {
  name = "lifecycle_unittest_exe"
  source = "exe_manifest.json"
}

catalog("catalog") {
  embedded_services = [ ":manifest" ]

  standalone_services = [
    ":lifecycle_unittest_app_manifest",
    ":lifecycle_unittest_exe_manifest",
    ":lifecycle_unittest_package_manifest",
    ":lifecycle_unittest_parent_manifest",
  ]
}
