# Copyright 2014 The Chromium Authors
# 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("//build/config/ui.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_result.cc",
    "dbus_result.h",
    "dbus_statistics.cc",
    "dbus_statistics.h",
    "error.cc",
    "error.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") {
  use_xvfb = use_xvfb_in_this_config

  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" ]
}
