# Copyright 2020 The Chromium OS 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("//common-mk/mojom_bindings_generator.gni")
import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":federated_service",
    ":install_dbus_config_file",
    ":install_dbus_service_activation_config",
    ":install_seccomp_policy",
    ":install_upstart_conf",
  ]
  if (use.test) {
    deps += [ ":federated_service_test" ]
  }
}

pkg_config("federated_common_pkg_deps") {
  pkg_deps = [
    "absl",
    "libbrillo",
    "libchrome",
    "libdlcservice-client",
    "libmojo",
    "libsession_manager-client",
    "libshill-client",
    "libshill-dbus-client",
    "sqlite3",
    "system_api",
  ]
}

generate_mojom_bindings("federated_mojo_bindings") {
  mojo_root = "${platform2_root}"
  sources = [
    "mojom/example.mojom",
    "mojom/federated_service.mojom",
  ]
}

proto_library("tf_example_proto") {
  proto_in_dir = "./protos"
  proto_out_dir = "federated/protos/"
  sources = [
    "${proto_in_dir}/example.proto",
    "${proto_in_dir}/feature.proto",
  ]
}

proto_library("cros_event_proto") {
  proto_in_dir = "${sysroot}/usr/include/fcp"
  proto_out_dir = "federated/protos/"
  sources = [ "${proto_in_dir}/cros_events.proto" ]
}

static_library("federated_common") {
  sources = [
    "daemon.cc",
    "device_status_monitor.cc",
    "example_database.cc",
    "federated_library.cc",
    "federated_metadata.cc",
    "federated_service_impl.cc",
    "federated_session.cc",
    "network_status_training_condition.cc",
    "power_supply_training_condition.cc",
    "scheduler.cc",
    "session_manager_proxy.cc",
    "storage_manager.cc",
    "utils.cc",
  ]
  defines = [ "USE_LOCAL_FEDERATED_SERVER=${use.local_federated_server}" ]
  all_dependent_configs = [ ":federated_common_pkg_deps" ]
  pkg_deps = [ "protobuf" ]
  deps = [
    ":cros_event_proto",
    ":federated_mojo_bindings",
    ":tf_example_proto",
  ]
}

executable("federated_service") {
  sources = [ "main.cc" ]
  install_path = "bin"
  deps = [ ":federated_common" ]
}

install_config("install_upstart_conf") {
  sources = [ "init/federated-service.conf" ]
  install_path = "/etc/init"
}

install_config("install_seccomp_policy") {
  sources =
      [ "seccomp/federated_service-seccomp-" + getenv("ARCH") + ".policy" ]
  install_path = "/usr/share/policy"
  outputs = [ "federated_service-seccomp.policy" ]
}

install_config("install_dbus_config_file") {
  sources = [ "dbus/org.chromium.Federated.conf" ]
  install_path = "/etc/dbus-1/system.d"
}

install_config("install_dbus_service_activation_config") {
  sources = [ "dbus/org.chromium.Federated.service" ]
  install_path = "/usr/share/dbus-1/system-services"
}

if (use.test) {
  pkg_config("libchrome_test_config") {
    pkg_deps = [
      "libchrome-test",
      "libsession_manager-client-test",
    ]
  }
  executable("federated_service_test") {
    sources = [
      "device_status_monitor_test.cc",
      "example_database_test.cc",
      "federated_service_impl_test.cc",
      "mock_example_database.cc",
      "network_status_training_condition_test.cc",
      "power_supply_training_condition_test.cc",
      "session_manager_proxy_test.cc",
      "storage_manager_test.cc",
      "test_utils.cc",
      "testrunner.cc",
      "utils_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":libchrome_test_config",
    ]
    run_test = true
    deps = [ ":federated_common" ]
  }
}
