# 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("//third_party/protobuf/proto_library.gni")

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.h",
    "string_util.cc",
    "string_util.h",
    "values_util.cc",
    "values_util.h",
    "util.cc",
    "util.h",
  ]

  defines = [
    "DBUS_IMPLEMENTATION",
  ]

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

  direct_dependent_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",
  ]

  deps = [
    ":dbus",
    "//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",
    "run_all_unittests.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: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",
  ]

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