# 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/perfetto.gni")
import("../../gn/proto_library.gni")
import("../protozero/protozero_library.gni")

source_set("test_support") {
  testonly = true
  deps = [
    ":ftrace_reader",
    "../../gn:default_deps",
    "../protozero",
  ]
  sources = [
    "test/cpu_reader_support.cc",
    "test/cpu_reader_support.h",
    "test/scattered_stream_delegate_for_testing.cc",
    "test/scattered_stream_delegate_for_testing.h",
    "test/scattered_stream_null_delegate.cc",
    "test/scattered_stream_null_delegate.h",
  ]
}

source_set("ftrace_reader_unittests") {
  testonly = true
  deps = [
    ":ftrace_reader",
    ":ftrace_reader_test_messages_lite",
    ":ftrace_reader_test_messages_zero",
    ":test_support",
    "../../gn:default_deps",
    "../../gn:gtest_deps",
    "../../protos/perfetto/trace/ftrace:lite",
  ]
  sources = [
    "cpu_reader_unittest.cc",
    "event_info_unittest.cc",
    "format_parser_unittest.cc",
    "ftrace_controller_unittest.cc",
    "proto_translation_table_unittest.cc",
  ]
}

ftrace_reader_test_proto_sources = [ "test/test_messages.proto" ]

protozero_library("ftrace_reader_test_messages_zero") {
  sources = ftrace_reader_test_proto_sources
  proto_in_dir = perfetto_root_path
  proto_out_dir = perfetto_root_path
  generator_plugin_options = "wrapper_namespace=pbzero"
}

proto_library("ftrace_reader_test_messages_lite") {
  generate_python = false
  sources = ftrace_reader_test_proto_sources
  proto_in_dir = perfetto_root_path
  proto_out_dir = perfetto_root_path
}

# These tests require access to a real ftrace implementation and must
# run with sudo.
source_set("ftrace_reader_integrationtests") {
  testonly = true
  deps = [
    ":ftrace_reader",
    ":test_support",
    "../../gn:default_deps",
    "../../gn:gtest_deps",
    "../../protos/perfetto/trace/ftrace:lite",
    "../base",
  ]
  sources = [
    "end_to_end_integrationtest.cc",
    "ftrace_procfs_integrationtest.cc",
  ]
}

source_set("ftrace_reader") {
  public_deps = [
    "../../gn:gtest_prod_config",
    "../../include/perfetto/ftrace_reader",
    "../../protos/perfetto/trace/ftrace:zero",
  ]
  deps = [
    "../../gn:default_deps",
    "../base",
    "../protozero",
  ]
  sources = [
    "cpu_reader.cc",
    "cpu_reader.h",
    "event_info.cc",
    "event_info.h",
    "event_info_constants.cc",
    "event_info_constants.h",
    "format_parser.cc",
    "ftrace_controller.cc",
    "ftrace_procfs.cc",
    "ftrace_procfs.h",
    "proto_translation_table.cc",
    "proto_translation_table.h",
  ]
}

if (!build_with_chromium) {
  source_set("ftrace_reader_benchmarks") {
    testonly = true
    deps = [
      ":ftrace_reader",
      ":test_support",
      "../../gn:default_deps",
      "//buildtools:benchmark",
    ]
    sources = [
      "cpu_reader_benchmark.cc",
    ]
  }
}
