# Copyright (C) 2018 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("//build_overrides/build.gni")
import("../gn/fuzzer.gni")
import("../gn/perfetto.gni")

source_set("end_to_end_integrationtests") {
  testonly = true
  deps = [
    ":test_helper",
    "../gn:default_deps",
    "../gn:gtest_and_gmock",
    "../include/perfetto/ext/ipc",
    "../include/perfetto/ext/traced",
    "../include/perfetto/protozero",
    "../protos/perfetto/config:cpp",
    "../protos/perfetto/config:zero",
    "../protos/perfetto/config/power:zero",
    "../protos/perfetto/trace:cpp",
    "../protos/perfetto/trace:zero",
    "../protos/perfetto/trace/ftrace:cpp",
    "../protos/perfetto/trace/power:cpp",
    "../src/base:base",
    "../src/base:test_support",
    "../src/traced/probes/ftrace",
  ]

  # These binaries are requires by the cmdline tests, which invoke perfetto
  # and trigger_perfetto via Subprocess.
  data_deps = [
    "../src/perfetto_cmd:perfetto",
    "../src/perfetto_cmd:trigger_perfetto",
  ]

  sources = [ "end_to_end_integrationtest.cc" ]
  if (start_daemons_for_testing) {
    cflags = [ "-DPERFETTO_START_DAEMONS_FOR_TESTING" ]

    # In CTS mode we use /syste/bin/perfetto for the cmdline tests and the
    # perfetto_cmd is not required. Outside of CTS mode, instead, we need to
    # build the cmdline code as part of the test executable.
    deps += [
      "../src/perfetto_cmd",
      "../src/perfetto_cmd:trigger_perfetto_cmd",
    ]
  }
}

executable("client_api_example") {
  sources = [ "client_api_example.cc" ]
  deps = [
    "..:libperfetto_client_experimental",
    "../gn:default_deps",
    "../include/perfetto/tracing",
    "../protos/perfetto/config/gpu:zero",
    "../protos/perfetto/trace:zero",
    "../protos/perfetto/trace/gpu:zero",
  ]
}

perfetto_fuzzer_test("end_to_end_shared_memory_fuzzer") {
  sources = [ "end_to_end_shared_memory_fuzzer.cc" ]
  testonly = true
  deps = [
    ":test_helper",
    "../gn:default_deps",
    "../protos/perfetto/trace:zero",
    "../src/base:test_support",
    "../src/protozero",
    "../src/tracing/core",
    "../src/tracing/ipc/producer",
    "../src/tracing/ipc/service",
  ]
}

perfetto_fuzzer_test("producer_socket_fuzzer") {
  sources = [ "producer_socket_fuzzer.cc" ]
  testonly = true
  deps = [
    ":test_helper",
    "../gn:default_deps",
    "../protos/perfetto/trace:zero",
    "../src/base:test_support",
  ]
}

source_set("test_helper") {
  testonly = true
  public_deps = [
    "../protos/perfetto/trace:cpp",
    "../src/tracing/ipc/consumer",
    "../src/tracing/ipc/producer",
    "../src/tracing/ipc/service",
  ]
  deps = [
    "../gn:default_deps",
    "../include/perfetto/ext/traced",
    "../protos/perfetto/config:cpp",
    "../protos/perfetto/trace:zero",
    "../src/base:test_support",
    "../src/traced/probes:probes_src",
    "../src/tracing/ipc:common",
  ]
  sources = [
    "fake_producer.cc",
    "fake_producer.h",
    "test_helper.cc",
    "test_helper.h",
  ]
  if (start_daemons_for_testing) {
    cflags = [ "-DPERFETTO_START_DAEMONS_FOR_TESTING" ]
  }
}

if (enable_perfetto_benchmarks) {
  source_set("end_to_end_benchmarks") {
    testonly = true
    deps = [
      ":test_helper",
      "../gn:benchmark",
      "../gn:default_deps",
      "../gn:gtest_and_gmock",
      "../include/perfetto/ext/traced",
      "../protos/perfetto/config:cpp",
      "../protos/perfetto/trace:cpp",
      "../protos/perfetto/trace:zero",
      "../src/base:test_support",
    ]
    sources = [ "end_to_end_benchmark.cc" ]
    if (start_daemons_for_testing) {
      cflags = [ "-DPERFETTO_START_DAEMONS_FOR_TESTING" ]
    }
  }

  source_set("benchmark_main") {
    testonly = true
    deps = [
      "../gn:benchmark",
      "../gn:default_deps",
    ]
    sources = [ "benchmark_main.cc" ]
  }
}  # if (enable_perfetto_benchmarks)

if (perfetto_build_with_android || (is_android && perfetto_build_standalone)) {
  # This is used only in-tree builds. It's built in standalone builds just to
  # get build coverage.
  static_library("perfetto_gtest_logcat_printer") {
    testonly = true
    complete_static_lib = true
    sources = [ "gtest_logcat_printer.cc" ]
    deps = [
      "../gn:default_deps",
      "../gn:gtest_and_gmock",
    ]
  }
}
