# 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("//mojo/public/tools/bindings/mojom.gni")
import("//testing/test.gni")

source_set("common") {
  sources = [
    "binding_set.h",
    "interface_ptr_set.h",
    "strong_binding_set.h",
  ]

  deps = [
    "//base",
    "//mojo/public/cpp/bindings",
  ]
}

source_set("tests") {
  testonly = true

  sources = [
    "binding_set_unittest.cc",
    "callback_binding_unittest.cc",
    "interface_ptr_set_unittest.cc",
    "strong_binding_set_unittest.cc",
  ]

  deps = [
    ":common",
    ":test_interfaces",
    "//base",
    "//mojo/message_pump",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/public/cpp/system",
    "//testing/gtest",
  ]
}

test("mojo_common_unittests") {
  deps = [
    ":tests",
    "//mojo/converters/array_string:tests",
    "//mojo/converters/base:tests",
    "//mojo/converters/url:tests",
    "//mojo/data_pipe_utils:tests",
    "//mojo/edk/test:run_all_unittests",
    "//mojo/environment:chromium",
    "//mojo/message_pump:tests",
  ]
}

mojom("test_interfaces") {
  testonly = true
  sources = [
    "test_interfaces.mojom",
  ]
}

source_set("tracing_impl") {
  sources = [
    "trace_provider_impl.cc",
    "trace_provider_impl.h",
    "tracing_impl.cc",
    "tracing_impl.h",
  ]

  deps = [
    "//base",
    "//mojo/public/cpp/application",
    "//mojo/public/cpp/bindings",
    "//mojo/services/tracing/interfaces",
  ]
}
