# 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")

component("common") {
  output_name = "mojo_common_lib"

  sources = [
    "binding_set.h",
    "common_type_converters.cc",
    "common_type_converters.h",
    "data_pipe_drainer.cc",
    "data_pipe_drainer.h",
    "data_pipe_file_utils.cc",
    "data_pipe_utils.cc",
    "data_pipe_utils.h",
    "data_pipe_utils_internal.h",
    "handle_watcher.cc",
    "handle_watcher.h",
    "interface_ptr_set.h",
    "message_pump_mojo.cc",
    "message_pump_mojo.h",
    "message_pump_mojo_handler.h",
    "task_tracker.cc",
    "task_tracker.h",
    "time_helper.cc",
    "time_helper.h",
  ]

  if (is_nacl) {
    sources -= [ "data_pipe_file_utils.cc" ]
  }

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//mojo/public/c/system",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/environment:environment",
    "//mojo/public/cpp/system",
    "//url",
  ]
}

test("mojo_common_unittests") {
  sources = [
    "binding_set_unittest.cc",
    "common_type_converters_unittest.cc",
    "data_pipe_utils_unittest.cc",
    "handle_watcher_unittest.cc",
    "interface_ptr_set_unittest.cc",
    "message_pump_mojo_unittest.cc",
    "task_tracker_unittest.cc",
  ]

  deps = [
    ":common",
    ":test_interfaces",
    "//base",
    "//base/test:test_support",
    "//base:message_loop_tests",
    "//mojo/edk/test:run_all_unittests",
    "//mojo/edk/test:test_support",
    "//mojo/environment:chromium",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/public/cpp/system",
    "//mojo/public/cpp/test_support:test_utils",
    "//testing/gtest",
    "//url",
  ]
}

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

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

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