# 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.

# 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.
import("//services/catalog/public/tools/catalog.gni")
import("//services/service_manager/public/cpp/service.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//services/service_manager/public/tools/test/service_test.gni")

source_set("lib") {
  sources = [
    "agent_registry.cc",
    "agent_registry.h",
    "coordinator.cc",
    "coordinator.h",
    "recorder.cc",
    "recorder.h",
    "tracing_service.cc",
    "tracing_service.h",
  ]

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

  if (is_mac || is_linux || is_android) {
    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" ]
  }
}

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

service("tracing") {
  sources = [
    "service_main.cc",
  ]

  deps = [
    ":lib",
    "//mojo/public/cpp/system",
  ]
}

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

  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:service_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",
    ]

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

  data_deps = [
    ":tracing",
  ]
}

service_manifest("unittest_manifest") {
  name = "tracing_unittests"
  source = "unittest_manifest.json"
}

catalog("tests_catalog") {
  testonly = true
  embedded_services = [ ":unittest_manifest" ]
  standalone_services = [ ":manifest" ]
}
