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

group("tests") {
  testonly = true
  deps = [
    ":service_manager_unittests",
  ]
}

test("service_manager_unittests") {
  sources = [
    "background_service_manager_unittest.cc",
    "test_support_unittest.cc",
  ]

  deps = [
    ":interfaces",
    "//base",
    "//base/test:test_support",
    "//mojo/core/test:run_all_unittests",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/system",
    "//services/service_manager",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/cpp:unittests",
    "//services/service_manager/public/cpp/test:test_support",
    "//services/service_manager/public/mojom",
    "//services/service_manager/tests/connect",
    "//services/service_manager/tests/lifecycle",
    "//services/service_manager/tests/sandbox",
    "//services/service_manager/tests/service_manager",
    "//services/service_manager/tests/shutdown",
    "//testing/gtest",
  ]

  data_deps = [
    ":background_service_manager_test_service",
  ]

  if (!is_ios) {
    sources += [ "service_process_launcher_unittest.cc" ]

    data_deps += [ ":service_process_launcher_test_service" ]
  }
}

mojom("interfaces") {
  testonly = true
  sources = [
    "background.test-mojom",
    "test_support.test-mojom",
  ]
}

source_set("util") {
  sources = [
    "util.cc",
    "util.h",
  ]
  deps = [
    "//base",
    "//base:base_static",
    "//mojo/public/cpp/platform",
    "//mojo/public/cpp/system",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/cpp/service_executable:switches",
    "//services/service_manager/public/mojom",
  ]
}

service_executable("background_service_manager_test_service") {
  testonly = true

  sources = [
    "background_service_manager_test_service_main.cc",
  ]

  deps = [
    ":interfaces",
    "//base",
    "//mojo/public/cpp/bindings",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/mojom",
  ]
}

service_executable("service_process_launcher_test_service") {
  testonly = true

  sources = [
    "service_process_launcher_test_service_main.cc",
  ]
}
