# Copyright (C) 2019 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")

perfetto_unittest_source_set("test_support") {
  testonly = true
  public_deps = [
    "../../../include/perfetto/test:test_support",
    "../core:test_support",
  ]
  deps = [
    "../../../gn:default_deps",
    "../../../gn:gtest_and_gmock",
    "../../../protos/perfetto/trace:cpp",
    "../../../protos/perfetto/trace:lite",
    "../../../protos/perfetto/trace:zero",
    "../../../protos/perfetto/trace/ftrace:cpp",
    "../../../protos/perfetto/trace/track_event:lite",
    "../../base",
    "../../base:test_support",
    "../core",
    "../core:service",
    "../core:test_support",
  ]
  sources = [
    "aligned_buffer_test.cc",
    "aligned_buffer_test.h",
    "fake_packet.cc",
    "fake_packet.h",
    "test_shared_memory.cc",
    "test_shared_memory.h",
    "traced_value_test_support.cc",
  ]

  # These tests rely on test_task_runner.h which
  # has no implementation for Windows or NaCL.
  if (!is_win && !is_nacl) {
    sources += [
      "mock_consumer.cc",
      "mock_consumer.h",
      "mock_producer.cc",
      "mock_producer.h",
      "mock_producer_endpoint.h",
    ]
  }
}

if (enable_perfetto_ipc && enable_perfetto_system_consumer) {
  perfetto_unittest_source_set("tracing_integration_test") {
    testonly = true
    deps = [
      ":test_support",
      "../../../gn:default_deps",
      "../../../gn:gtest_and_gmock",
      "../../base",
      "../../base:test_support",
      "../core:service",
      "../ipc/consumer",
      "../ipc/producer",
      "../ipc/service",
    ]
    sources = [ "tracing_integration_test.cc" ]

    # TODO(primiano): remove the build_with_chromium conditional once the root
    # //BUILD.gn:libperfetto (in chromium) stops adding tracing:platform_fake.
    # The problem is the following: in chrome builds we end up with duplicate
    # symbol definitions in the test because both platorm (impl and fake) are
    # present: impl added here and fake coming from chromium's base (full path:
    # perfetto_unittests -> //(chromium)base:test_support -> //(chromium)base
    # -> libperfetto -> platform_fake.
    if (!build_with_chromium) {
      deps += [
        "..:client_api_without_backends",
        "..:platform_impl",
      ]
      sources += [ "platform_unittest.cc" ]
    }
  }
}

if (enable_perfetto_integration_tests) {
  source_set("client_api_integrationtests") {
    testonly = true
    deps = [
      ":api_test_support",
      "../:client_api",
      "../:platform_impl",
      "../../../:libperfetto_client_experimental",
      "../../../gn:default_deps",
      "../../../gn:gtest_and_gmock",
      "../../../include/perfetto/tracing/core",
      "../../../protos/perfetto/common:cpp",
      "../../../protos/perfetto/common:zero",
      "../../../protos/perfetto/config/track_event:cpp",
      "../../../protos/perfetto/trace:cpp",
      "../../../protos/perfetto/trace:zero",
      "../../../protos/perfetto/trace/gpu:cpp",
      "../../../protos/perfetto/trace/gpu:zero",
      "../../../protos/perfetto/trace/interned_data:cpp",
      "../../../protos/perfetto/trace/interned_data:zero",
      "../../../protos/perfetto/trace/profiling:cpp",
      "../../../protos/perfetto/trace/track_event:cpp",
      "../../base",
    ]
    sources = [
      "api_integrationtest.cc",
      "api_integrationtest_main.cc",
      "tracing_module.cc",
      "tracing_module.h",
      "tracing_module2.cc",
      "tracing_module3.cc",
      "tracing_module_categories.h",
    ]
  }

  # api_test_support needs to be self-contained and not leak any other perfetto
  # deps. See comment in api_test_support.h
  source_set("api_test_support") {
    testonly = true
    deps = [
      "../../..:libperfetto_client_experimental",
      "../../../gn:default_deps",
      "../../base",
      "../../tracing:client_api_without_backends",
    ]

    # The system tracing backend requires IPC support.
    if (enable_perfetto_ipc) {
      deps += [ "../../../test:test_helper" ]
    }
    sources = [
      "api_test_support.cc",
      "api_test_support.h",
    ]
  }
}
