# 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-${libbase_ver}",
    "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") {
  new_fd_bindings = true
  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" ]
  }
}
