# Copyright 2018 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/generate-dbus-adaptors.gni")
import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":keygen",
    ":libsession_manager",
    ":session_manager",
    ":session_manager-adaptors",
  ]
  if (use.test) {
    deps += [ ":session_manager_test" ]
  }
  if (use.fuzzer) {
    deps += [
      ":login_manager_validator_utils_fuzzer",
      ":login_manager_validator_utils_policy_desc_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  # NOSORT
  pkg_deps = [
    "dbus-1",
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libchromeos-ui-${libbase_ver}",
    "libcontainer",
    "libcros_config",
    "libmetrics",
    "libminijail",
    "libpasswordprovider",
    "nss",

    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
    "vboot_host",
  ]

  if (use.fuzzer) {
    # Link against protobuf for fuzzers so we can use libprotobuf-mutator.
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }

  defines = [
    "OS_CHROMEOS",
    "USE_ARC_ADB_SIDELOADING=${use.arc_adb_sideloading}",
    "USE_CHEETS=${use.cheets}",
    "USE_NSS_CERTS",
    "USE_SYSTEMD=${use.systemd}",
    "USE_USER_SESSION_ISOLATION=${use.user_session_isolation}",
  ]
}

generate_dbus_adaptors("session_manager-adaptors") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/login_manager/dbus_adaptors"
  sources = [ "dbus_bindings/org.chromium.SessionManagerInterface.xml" ]
}

static_library("libsession_manager") {
  configs += [ ":target_defaults" ]
  sources = [
    "android_oci_wrapper.cc",
    "blob_util.cc",
    "browser_job.cc",
    "child_exit_dispatcher.cc",
    "child_exit_handler.cc",
    "child_job.cc",
    "chrome_features_service_client.cc",
    "chrome_setup.cc",
    "container_manager_interface.cc",
    "crossystem.cc",
    "crossystem_impl.cc",
    "cumulative_use_time_metric.cc",
    "dbus_util.cc",
    "device_local_account_manager.cc",
    "device_policy_service.cc",
    "file_checker.cc",
    "generator_job.cc",
    "key_generator.cc",
    "liveness_checker_impl.cc",
    "login_metrics.cc",
    "login_screen_storage.cc",
    "nss_util.cc",
    "owner_key_loss_mitigator.cc",
    "policy_key.cc",
    "policy_service.cc",
    "policy_store.cc",
    "regen_mitigator.cc",
    "resilient_policy_store.cc",
    "secret_util.cc",
    "server_backed_state_key_generator.cc",
    "session_manager_impl.cc",
    "session_manager_service.cc",
    "subprocess.cc",
    "system_utils_impl.cc",
    "systemd_unit_starter.cc",
    "upstart_signal_emitter.cc",
    "user_policy_service.cc",
    "user_policy_service_factory.cc",
    "validator_utils.cc",
    "vpd_process_impl.cc",
  ]
  if (use.arc_adb_sideloading) {
    sources += [ "arc_sideload_status.cc" ]
  } else {
    sources += [ "arc_sideload_status_stub.cc" ]
  }
  libs = [
    "bootstat",
    "installattributes",
    "policy",
  ]
  deps = [
    ":login_manager-login_screen_storage-protos",
    ":session_manager-adaptors",
    "//common-mk/external_dependencies:install_attributes-proto",
    "//common-mk/external_dependencies:policy-protos",
  ]
}

executable("keygen") {
  configs += [ ":target_defaults" ]
  sources = [
    "child_job.cc",
    "keygen.cc",
    "keygen_worker.cc",
    "nss_util.cc",
    "policy_key.cc",
    "system_utils_impl.cc",
  ]
}

executable("session_manager") {
  configs += [ ":target_defaults" ]
  sources = [ "session_manager_main.cc" ]
  libs = [
    "rootdev",
    "container",
  ]
  deps = [ ":libsession_manager" ]
}

if (use.test) {
  pkg_config("test_config") {
    pkg_deps = [
      "libbrillo-test",
      "libchrome-test-${libbase_ver}",
      "libcros_config",
    ]
  }
  executable("session_manager_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    sources = [
      "android_oci_wrapper_test.cc",
      "browser_job_test.cc",
      "child_exit_dispatcher_test.cc",
      "chrome_setup_test.cc",
      "cumulative_use_time_metric_test.cc",
      "device_local_account_manager_test.cc",
      "device_policy_service_test.cc",
      "fake_browser_job.cc",
      "fake_child_process.cc",
      "fake_container_manager.cc",
      "fake_crossystem.cc",
      "fake_generated_key_handler.cc",
      "fake_generator_job.cc",
      "fake_secret_util.cc",
      "key_generator_test.cc",
      "keygen_worker.cc",
      "liveness_checker_impl_test.cc",
      "login_metrics_test.cc",
      "login_screen_storage_test.cc",
      "mock_constructors.cc",
      "mock_nss_util.cc",
      "nss_util_test.cc",
      "policy_key_test.cc",
      "policy_service_test.cc",
      "policy_store_test.cc",
      "regen_mitigator_test.cc",
      "resilient_policy_store_test.cc",
      "server_backed_state_key_generator_test.cc",
      "session_manager_impl_test.cc",
      "session_manager_process_test.cc",
      "subprocess_test.cc",
      "system_utils_test.cc",
      "user_policy_service_test.cc",
      "validator_utils_test.cc",
    ]
    if (use.arc_adb_sideloading) {
      sources += [ "arc_sideload_status_test.cc" ]
    }
    defines = [ "UNIT_TEST" ]
    libs = [ "keyutils" ]
    deps = [
      ":libsession_manager",
      "//common-mk/testrunner",
    ]
  }
}

proto_library("login_manager-login_screen_storage-protos") {
  proto_in_dir = "proto"
  proto_out_dir = "include/login_manager/login_screen_storage"
  sources = [ "${proto_in_dir}/login_screen_storage_index.proto" ]
  standalone = true
}

if (use.fuzzer) {
  pkg_config("run_fuzzer_config") {
    pkg_deps = [ "libprotobuf-mutator" ]
  }

  executable("login_manager_validator_utils_policy_desc_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":run_fuzzer_config",
      ":target_defaults",
    ]
    deps = [ ":libsession_manager" ]
    sources = [ "fuzzers/validator_utils_policy_desc_fuzzer.cc" ]
  }

  executable("login_manager_validator_utils_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libsession_manager" ]
    sources = [ "fuzzers/validator_utils_fuzzer.cc" ]
  }
}
