# Copyright 2018 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/chromecast_build.gni")
import("//services/service_manager/public/service_manifest.gni")

# There should be only one tracing service. It is currently
# in the browser process. So, only //content/browser should link to this target.
# Others modules should only need the public targets.
source_set("lib") {
  sources = [
    "agent_registry.cc",
    "agent_registry.h",
    "coordinator.cc",
    "coordinator.h",
    "recorder.cc",
    "recorder.h",
    "tracing_service.cc",
    "tracing_service.h",
  ]

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  public_deps = [
    "//base",
    "//mojo/public/cpp/bindings",
    "//services/tracing/public/cpp",
  ]

  if (is_mac || is_linux || is_android || is_win) {
    sources += [
      "perfetto/json_trace_exporter.cc",
      "perfetto/json_trace_exporter.h",
      "perfetto/perfetto_service.cc",
      "perfetto/perfetto_service.h",
      "perfetto/perfetto_tracing_coordinator.cc",
      "perfetto/perfetto_tracing_coordinator.h",
      "perfetto/producer_host.cc",
      "perfetto/producer_host.h",
    ]

    deps = [
      "//third_party/perfetto/protos/perfetto/trace/chrome:minimal_complete_lite",
    ]

    public_deps += [ "//third_party/perfetto:libperfetto" ]
  }

  if (is_chromecast) {
    defines = [ "IS_CHROMECAST" ]
  }
}

service_manifest("manifest") {
  name = "tracing"
  source = "manifest.json"
}

source_set("tests") {
  testonly = true

  sources = [
    "agent_registry_unittest.cc",
    "coordinator_unittest.cc",
    "public/cpp/trace_event_agent_unittest.cc",
    "recorder_unittest.cc",
    "test_util.cc",
    "test_util.h",
  ]

  if (is_mac || is_linux || is_android) {
    sources += [
      "public/cpp/perfetto/trace_event_data_source_unittest.cc",
      "public/cpp/perfetto/traced_value_proto_writer_unittest.cc",
    ]
  }

  if (!is_android) {
    sources += [ "tracing_service_unittest.cc" ]
  }

  deps = [
    ":lib",
    "//base",
    "//base/test:test_support",
    "//mojo/public/cpp/bindings",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/cpp/test:test_support",
    "//services/service_manager/public/mojom",
    "//services/tracing:lib",
    "//testing/gmock",
    "//testing/gtest",
  ]

  if (is_mac || is_linux || is_android) {
    sources += [
      "perfetto/json_trace_exporter_unittest.cc",
      "perfetto/perfetto_integration_unittest.cc",
      "perfetto/test_utils.cc",
      "perfetto/test_utils.h",
    ]

    deps += [
      "//third_party/perfetto/include/perfetto/protozero:protozero",
      "//third_party/perfetto/protos/perfetto/common:lite",
      "//third_party/perfetto/protos/perfetto/trace:lite",
      "//third_party/perfetto/protos/perfetto/trace/chrome:lite",
    ]
  }

  if (is_chromecast) {
    defines = [ "IS_CHROMECAST" ]
  }
}
