# 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",
    "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.
static_library("test_support") {
  testonly = true
  sources = [
    "mock_bus.cc",
    "mock_bus.h",
    "mock_exported_object.cc",
    "mock_exported_object.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",
  ]

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