# 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("//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_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") {
  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" ]
}
