# Copyright 2014 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/features.gni")
import("//testing/test.gni")
import("//third_party/protobuf/proto_library.gni")

assert(use_dbus)

component("dbus") {
  sources = [
    "bus.cc",
    "bus.h",
    "dbus_export.h",
    "dbus_statistics.cc",
    "dbus_statistics.h",
    "exported_object.cc",
    "exported_object.h",
    "file_descriptor.cc",
    "file_descriptor.h",
    "message.cc",
    "message.h",
    "object_manager.cc",
    "object_manager.h",
    "object_path.cc",
    "object_path.h",
    "object_proxy.cc",
    "object_proxy.h",
    "property.cc",
    "property.h",
    "scoped_dbus_error.cc",
    "scoped_dbus_error.h",
    "string_util.cc",
    "string_util.h",
    "util.cc",
    "util.h",
    "values_util.cc",
    "values_util.h",
  ]

  defines = [ "DBUS_IMPLEMENTATION" ]

  deps = [
    "//third_party/protobuf:protobuf_lite",
  ]
  public_deps = [
    "//base",
  ]

  public_configs = [ "//build/config/linux/dbus" ]
}

proto_library("test_proto") {
  sources = [
    "test_proto.proto",
  ]
}

# This target contains mocks that can be used to write unit tests without
# issuing actual D-Bus calls.
source_set("test_support") {
  testonly = true
  sources = [
    "mock_bus.cc",
    "mock_bus.h",
    "mock_exported_object.cc",
    "mock_exported_object.h",
    "mock_object_manager.cc",
    "mock_object_manager.h",
    "mock_object_proxy.cc",
    "mock_object_proxy.h",
  ]

  public_deps = [
    ":dbus",
  ]
  deps = [
    "//testing/gmock",
  ]

  configs += [ "//build/config/linux/dbus" ]
}

test("dbus_unittests") {
  sources = [
    "bus_unittest.cc",
    "dbus_statistics_unittest.cc",
    "end_to_end_async_unittest.cc",
    "end_to_end_sync_unittest.cc",
    "message_unittest.cc",
    "mock_unittest.cc",
    "object_manager_unittest.cc",
    "object_proxy_unittest.cc",
    "property_unittest.cc",
    "signal_sender_verification_unittest.cc",
    "string_util_unittest.cc",
    "test_service.cc",
    "test_service.h",
    "util_unittest.cc",
    "values_util_unittest.cc",
  ]

  deps = [
    ":dbus",
    ":test_proto",
    ":test_support",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/protobuf:protobuf_lite",
  ]

  configs += [ "//build/config/linux/dbus" ]
}

executable("dbus_test_server") {
  testonly = true
  sources = [
    "test_server.cc",
    "test_service.cc",
    "test_service.h",
  ]

  deps = [
    ":dbus",
    "//base",
    "//base/test:test_support",
    "//build/config/sanitizers:deps",
  ]

  configs += [ "//build/config/linux/dbus" ]
}
