# 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("//build/config/compiler/compiler.gni")
import("//services/tracing/public/cpp/stack_sampling/loader_lock_sampling.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

source_set("lib") {
  sources = [
    "perfetto/consumer_host.cc",
    "perfetto/consumer_host.h",
    "perfetto/perfetto_service.cc",
    "perfetto/perfetto_service.h",
    "perfetto/producer_host.cc",
    "perfetto/producer_host.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",
    "//third_party/perfetto:libperfetto",
    "//third_party/perfetto/protos/perfetto/config:lite",
  ]
}

source_set("privacy_check") {
  testonly = true

  sources = [
    "perfetto/privacy_filtered_fields-inl.h",
    "perfetto/privacy_filtering_check.cc",
    "perfetto/privacy_filtering_check.h",
  ]

  deps = [
    "//base",
    "//third_party/perfetto:libperfetto",
  ]
}

source_set("test_utils") {
  testonly = true

  sources = [
    "perfetto/test_utils.cc",
    "perfetto/test_utils.h",
  ]

  deps = [
    ":lib",
    "//testing/gtest",
    "//third_party/perfetto/protos/perfetto/common:lite",
    "//third_party/perfetto/protos/perfetto/trace:lite",
  ]

  if (is_posix) {
    sources += [
      "perfetto/system_test_utils.cc",
      "perfetto/system_test_utils.h",
    ]
  }
}

source_set("tests") {
  testonly = true

  sources = [
    "perfetto/consumer_host_unittest.cc",
    "perfetto/perfetto_integration_unittest.cc",
    "public/cpp/perfetto/java_heap_profiler/hprof_buffer_android_unittest.cc",
    "public/cpp/perfetto/java_heap_profiler/hprof_parser_android_unittest.cc",
    "public/cpp/perfetto/task_runner_unittest.cc",
    "public/cpp/perfetto/trace_event_data_source_unittest.cc",
    "public/cpp/perfetto/traced_value_proto_writer_unittest.cc",
    "public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc",
  ]

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

  deps = [
    ":lib",
    ":test_utils",
    "//base",
    "//base/test:test_support",
    "//mojo/public/cpp/bindings",
    "//services/tracing/public/cpp:buildflags",
    "//services/tracing/public/cpp/background_tracing:unit_tests",
    "//testing/gmock",
    "//testing/gtest",
    "//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",
    "//third_party/perfetto/protos/perfetto/trace/interned_data:lite",
    "//third_party/perfetto/protos/perfetto/trace/track_event:lite",
  ]

  if (is_posix) {
    sources += [ "perfetto/system_perfetto_unittest.cc" ]

    if (can_unwind_with_cfi_table && is_official_build) {
      sources +=
          [ "public/cpp/stack_sampling/stack_unwinder_android_unittest.cc" ]
      deps += [
        ":jni_headers",
        ":tracing_test_helper_java",
      ]
    }
  }

  if (enable_loader_lock_sampling) {
    sources +=
        [ "public/cpp/stack_sampling/loader_lock_sampler_win_unittest.cc" ]

    deps += [ ":loader_lock_sampler_test_strings" ]
    data_deps = [ ":loader_lock_sampler_test_dll" ]
  }
}

if (is_android) {
  generate_jni("jni_headers") {
    testonly = true
    sources = [ "android/test/src/org/chromium/tracing/UnwindTestHelper.java" ]
  }

  android_library("tracing_test_helper_java") {
    testonly = true
    deps = [ "//base:base_java" ]
    sources = [ "android/test/src/org/chromium/tracing/UnwindTestHelper.java" ]
  }
}

if (enable_loader_lock_sampling) {
  source_set("loader_lock_sampler_test_strings") {
    testonly = true

    sources = [
      "public/cpp/stack_sampling/loader_lock_sampler_test_strings.cc",
      "public/cpp/stack_sampling/loader_lock_sampler_test_strings.h",
    ]
  }

  loadable_module("loader_lock_sampler_test_dll") {
    testonly = true

    sources = [ "public/cpp/stack_sampling/loader_lock_sampler_test_dll.cc" ]

    deps = [ ":loader_lock_sampler_test_strings" ]
  }
}
