# Copyright 2018 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("//build/config/chrome_build.gni")
import("//chrome/process_version_rc_template.gni")
import("//testing/test.gni")

executable("notification_helper") {
  sources = [
    "notification_helper.cc",
    "notification_helper.rc",
    "notification_helper_crash_reporter_client.cc",
    "notification_helper_crash_reporter_client.h",
  ]

  configs -= [ "//build/config/win:console" ]
  configs += [ "//build/config/win:windowed" ]

  deps = [
    ":constants",
    ":lib",
    ":version_resources",
    "//base",
    "//build/win:default_exe_manifest",
    "//chrome/common:version_header",
    "//chrome/install_static:primary_module",
    "//components/crash/content/app",
    "//components/crash/content/app:crash_export_thunks",
    "//components/version_info:channel",
  ]

  libs = [ "runtimeobject.lib" ]
}

source_set("lib") {
  visibility = [ ":*" ]
  sources = [
    "com_server_module.cc",
    "com_server_module.h",
    "notification_activator.cc",
    "notification_activator.h",
    "notification_helper_util.cc",
    "notification_helper_util.h",
    "trace_util.cc",
    "trace_util.h",
  ]

  deps = [
    "//base",
    "//chrome/common:non_code_constants",
    "//chrome/install_static:install_static_util",
  ]
}

source_set("constants") {
  sources = [
    "notification_helper_constants.cc",
    "notification_helper_constants.h",
  ]
}

process_version_rc_template("version_resources") {
  sources = [
    "notification_helper_exe.ver",
  ]
  output = "$target_gen_dir/notification_helper_exe.rc"
}

test("notification_helper_unittests") {
  sources = [
    "com_server_module_unittest.cc",
    "notification_helper_process_unittest.cc",
    "run_all_unittests.cc",
  ]

  deps = [
    ":lib",
    "//base",
    "//base/test:test_support",
    "//chrome/install_static:install_static_util",
    "//chrome/install_static/test:test_support",
    "//chrome/installer/setup:lib",
    "//chrome/installer/util:with_no_strings",
    "//testing/gtest",
  ]

  data_deps = [
    ":notification_helper",
  ]

  libs = [ "runtimeobject.lib" ]
}
