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

group("all") {
  deps = [
    ":dbus_adaptors_generator",
    ":dbus_proxies_generator",
    ":dlp",
  ]
  if (use.test) {
    deps += [ ":dlp_test" ]
  }
  if (use.fuzzer) {
    deps += [ ":dlp_adaptor_fuzzer" ]
  }
}

# D-Bus adaptors code generator.
generate_dbus_adaptors("dbus_adaptors_generator") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/dlp"
  sources = [ "dbus_bindings/org.chromium.Dlp.xml" ]
}

# D-Bus proxies code generator
generate_dbus_proxies("dbus_proxies_generator") {
  mock_output_file = "include/dlp/dbus-proxy-mocks.h"
  proxy_output_file = "include/dlp/dbus-proxies.h"
  sources = [ "dbus_bindings/org.chromium.DlpFilesPolicyService.xml" ]
}

pkg_config("target_defaults") {
  # NOSORT
  pkg_deps = [
    "dbus-1",
    "libbrillo",
    "libchrome",
    "libsession_manager-client",

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

  libs = [ "leveldb" ]

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

static_library("libdlp_static") {
  sources = [
    "dlp_adaptor.cc",
    "dlp_daemon.cc",
    "fanotify_reader_thread.cc",
    "fanotify_watcher.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":dlp_proto" ]
}

executable("dlp") {
  sources = [ "dlp.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libdlp_static" ]
}

proto_library("dlp_proto") {
  proto_in_dir = "./proto"
  proto_out_dir = "include/dlp"
  sources = [ "${proto_in_dir}/database.proto" ]
}

# Unit tests.
if (use.test) {
  pkg_config("dlp_test_config") {
    pkg_deps = [
      "libchrome",
      "libchrome-test",
    ]
  }
  executable("dlp_test") {
    sources = [
      "dlp_adaptor_test.cc",
      "dlp_adaptor_test_helper.cc",
      "dlp_adaptor_test_helper.h",

      # TODO(crbug.com/1223082) Rewrite fanotify_watcher tests to use mocked
      # fanotify as they are flaky otherwise.
      # "fanotify_watcher_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":dlp_test_config",
      ":target_defaults",
    ]
    defines = [ "UNIT_TEST" ]
    deps = [
      ":libdlp_static",
      "//common-mk/testrunner:testrunner",
    ]
  }
}

if (use.fuzzer) {
  pkg_config("config_fuzzer_pkg_deps") {
    pkg_deps = [ "libprotobuf-mutator" ]
  }
  executable("dlp_adaptor_fuzzer") {
    sources = [
      "dlp_adaptor_fuzzer.cc",
      "dlp_adaptor_test_helper.cc",
      "dlp_adaptor_test_helper.h",
    ]
    configs += [
      "//common-mk/common_fuzzer",
      "//common-mk:test",
      ":config_fuzzer_pkg_deps",
      ":target_defaults",
      ":local_proto_include",
    ]
    deps = [
      ":dlp_adaptor_fuzzer_proto",
      ":libdlp_static",
    ]
    pkg_deps = [ "libchrome-test" ]
  }
  config("local_proto_include") {
    include_dirs = [ "${sysroot}/usr/include/dlp/proto_bindings/" ]
  }
  proto_library("dlp_adaptor_fuzzer_proto") {
    proto_in_dir = "./proto"
    proto_out_dir = "include/dlp"
    proto_lib_dirs = [ "${sysroot}/usr/include/chromeos/dbus/dlp" ]
    configs = [ ":local_proto_include" ]
    sources = [ "${proto_in_dir}/dlp_fuzzer.proto" ]
  }
}
