# Copyright (C) 2017 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/proto_library.gni")
import("../../../../gn/test.gni")

assert(target_os != "win")

# For use_libfuzzer.
if (perfetto_root_path == "//") {
  import("//gn/standalone/sanitizers/vars.gni")
} else {
  import("//build/config/sanitizers/sanitizers.gni")
}

source_set("test_support") {
  testonly = true
  deps = [
    ":ftrace",
    ":ftrace_procfs",
    "../../../../gn:default_deps",
    "../../../base:test_support",
    "../../../protozero",
  ]
  public_deps = [ "../../../protozero" ]

  sources = [
    "test/cpu_reader_support.cc",
    "test/cpu_reader_support.h",
  ]
}

perfetto_unittest_source_set("unittests") {
  testonly = true
  deps = [
    ":ftrace",
    ":ftrace_procfs",
    ":test_messages_cpp",
    ":test_messages_lite",
    ":test_messages_zero",
    ":test_support",
    "../../../../gn:default_deps",
    "../../../../gn:gtest_and_gmock",
    "../../../../protos/perfetto/trace:cpp",
    "../../../../protos/perfetto/trace/ftrace:cpp",
    "../../../../protos/perfetto/trace/ftrace:zero",
    "../../../base:test_support",
    "../../../tracing/test:test_support",
    "format_parser:unittests",
  ]

  sources = [
    "cpu_reader_unittest.cc",
    "cpu_stats_parser_unittest.cc",
    "event_info_unittest.cc",
    "ftrace_config_muxer_unittest.cc",
    "ftrace_config_unittest.cc",
    "ftrace_controller_unittest.cc",
    "ftrace_print_filter_unittest.cc",
    "ftrace_procfs_unittest.cc",
    "printk_formats_parser_unittest.cc",
    "proto_translation_table_unittest.cc",
    "vendor_tracepoints_unittest.cc",
  ]
}

perfetto_proto_library("test_messages_@TYPE@") {
  proto_generators = [
    "cpp",
    "lite",
    "zero",
  ]
  sources = [ "test/test_messages.proto" ]
  proto_path = perfetto_root_path
}

# These tests require access to a real ftrace implementation and must
# run with sudo.
source_set("integrationtests") {
  testonly = true
  deps = [
    ":ftrace",
    ":ftrace_procfs",
    ":test_support",
    "../../../../gn:default_deps",
    "../../../../gn:gtest_and_gmock",
    "../../../base",
    "../../../tracing/core",
  ]
  sources = [ "ftrace_procfs_integrationtest.cc" ]
}

source_set("ftrace") {
  public_deps = [
    "../../../../protos/perfetto/config/ftrace:cpp",
    "../../../../protos/perfetto/trace/ftrace:zero",
    "../../../tracing/core",
  ]
  deps = [
    ":ftrace_procfs",
    "..:data_source",
    "../../../../gn:default_deps",
    "../../../../include/perfetto/ext/traced",
    "../../../../protos/perfetto/common:zero",
    "../../../../protos/perfetto/trace:zero",
    "../../../../protos/perfetto/trace/interned_data:zero",
    "../../../../protos/perfetto/trace/profiling:zero",
    "../../../android_internal:lazy_library_loader",
    "../../../base",
    "../../../kallsyms",
    "../../../kernel_utils:syscall_table",
    "../../../protozero",
    "format_parser",
  ]
  sources = [
    "atrace_hal_wrapper.cc",
    "atrace_hal_wrapper.h",
    "atrace_wrapper.cc",
    "atrace_wrapper.h",
    "compact_sched.cc",
    "compact_sched.h",
    "cpu_reader.cc",
    "cpu_reader.h",
    "cpu_stats_parser.cc",
    "cpu_stats_parser.h",
    "event_info.cc",
    "event_info.h",
    "event_info_constants.cc",
    "event_info_constants.h",
    "ftrace_config_muxer.cc",
    "ftrace_config_muxer.h",
    "ftrace_config_utils.cc",
    "ftrace_config_utils.h",
    "ftrace_controller.cc",
    "ftrace_controller.h",
    "ftrace_data_source.cc",
    "ftrace_data_source.h",
    "ftrace_metadata.h",
    "ftrace_print_filter.cc",
    "ftrace_print_filter.h",
    "ftrace_stats.cc",
    "ftrace_stats.h",
    "printk_formats_parser.cc",
    "printk_formats_parser.h",
    "proto_translation_table.cc",
    "proto_translation_table.h",
    "vendor_tracepoints.cc",
    "vendor_tracepoints.h",
  ]
}

source_set("ftrace_procfs") {
  deps = [
    "../../../../gn:default_deps",
    "../../../base",
  ]
  sources = [
    "ftrace_procfs.cc",
    "ftrace_procfs.h",
  ]
}

if (enable_perfetto_benchmarks) {
  source_set("benchmarks") {
    testonly = true
    deps = [
      ":ftrace",
      ":test_support",
      "../../../../gn:benchmark",
      "../../../../gn:default_deps",
    ]
    sources = [ "cpu_reader_benchmark.cc" ]
  }
}

perfetto_fuzzer_test("cpu_reader_fuzzer") {
  testonly = true
  sources = [ "cpu_reader_fuzzer.cc" ]
  deps = [
    ":ftrace",
    ":test_support",
    "../../../../gn:default_deps",
  ]
}
