# Copyright (C) 2024 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("../../../gn/fuzzer.gni")
import("../../../gn/perfetto.gni")
import("../../../gn/test.gni")

source_set("service") {
  public_deps = [
    "..:common",
    "../../../include/perfetto/ext/base",
    "../../../include/perfetto/ext/tracing/core",
  ]
  deps = [
    "../../../gn:default_deps",
    "../../../include/perfetto/tracing",
    "../../../protos/perfetto/common:zero",
    "../../../protos/perfetto/config:zero",
    "../../../protos/perfetto/trace:zero",
    "../../../protos/perfetto/trace/perfetto:zero",  # For MetatraceWriter.
    "../../android_stats",
    "../../base",
    "../../base:clock_snapshots",
    "../../base:version",
    "../../protozero/filtering:message_filter",
    "../../protozero/filtering:string_filter",
    "../core",
  ]
  sources = [
    "clock.cc",
    "clock.h",
    "dependencies.h",
    "histogram.h",
    "metatrace_writer.cc",
    "metatrace_writer.h",
    "packet_stream_validator.cc",
    "packet_stream_validator.h",
    "random.cc",
    "random.h",
    "trace_buffer.cc",
    "trace_buffer.h",
    "tracing_service_impl.cc",
    "tracing_service_impl.h",
  ]
  if (is_android && perfetto_build_with_android) {
    deps += [
      "../../android_internal:headers",
      "../../android_internal:lazy_library_loader",
    ]
  }
}

if (enable_perfetto_zlib) {
  source_set("zlib_compressor") {
    deps = [
      "../../../gn:default_deps",
      "../../../gn:zlib",
      "../../../include/perfetto/tracing",
      "../core",
    ]
    sources = [
      "zlib_compressor.cc",
      "zlib_compressor.h",
    ]
  }
}

perfetto_unittest_source_set("unittests") {
  testonly = true
  deps = [
    ":service",
    "../../../gn:default_deps",
    "../../../gn:gtest_and_gmock",
    "../../../protos/perfetto/trace:cpp",
    "../../../protos/perfetto/trace:zero",
    "../../../protos/perfetto/trace/ftrace:cpp",
    "../../../protos/perfetto/trace/perfetto:cpp",
    "../../../src/protozero/filtering:bytecode_generator",
    "../../base",
    "../../base:test_support",
    "../core",
    "../test:test_support",
  ]

  if (enable_perfetto_zlib) {
    deps += [
      ":zlib_compressor",
      "../../../gn:zlib",
    ]
  }

  sources = [
    "histogram_unittest.cc",
    "packet_stream_validator_unittest.cc",
    "trace_buffer_unittest.cc",
  ]

  if (enable_perfetto_zlib) {
    sources += [ "zlib_compressor_unittest.cc" ]
  }

  # These tests rely on test_task_runner.h which
  # has no Windows implementation.
  if (!is_win) {
    sources += [ "tracing_service_impl_unittest.cc" ]
  }
}

if (enable_perfetto_benchmarks) {
  source_set("benchmarks") {
    testonly = true
    deps = [
      ":service",
      "../../../gn:benchmark",
      "../../../gn:default_deps",
      "../../../protos/perfetto/trace:zero",
      "../../../protos/perfetto/trace/ftrace:zero",
      "../../protozero",
      "../core",
    ]
    sources = [ "packet_stream_validator_benchmark.cc" ]
  }
}

perfetto_fuzzer_test("packet_stream_validator_fuzzer") {
  sources = [ "packet_stream_validator_fuzzer.cc" ]
  deps = [
    ":service",
    "../../../gn:default_deps",
  ]
}
