# 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("../../gn/fuzzer.gni")
import("../../gn/perfetto.gni")
import("../../gn/perfetto_host_executable.gni")
import("../../gn/test.gni")
import("../../gn/wasm.gni")

# Prevent that this file is accidentally included in embedder builds.
assert(enable_perfetto_trace_processor)

# The library which eases processing of Perfetto traces by exposing reading
# friendly APIs.
if (enable_perfetto_trace_processor_sqlite) {
  static_library("trace_processor") {
    complete_static_lib = true
    deps = [
      ":lib",
    ]
  }
}

if (enable_perfetto_ui) {
  wasm_lib("trace_processor_wasm") {
    name = "trace_processor"
    deps = [
      ":lib",
      "../../gn:default_deps",
      "../base",
      "rpc:wasm_bridge",
    ]
  }
}

source_set("protozero_to_text") {
  sources = [
    "importers/proto/track_event.descriptor.h",
    "protozero_to_text.cc",
    "protozero_to_text.h",
  ]
  deps = [
    ":descriptors",
    "../../gn:default_deps",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/trace/track_event:zero",
    "../base",
    "../protozero:protozero",
  ]
}

source_set("descriptors") {
  sources = [
    "descriptors.cc",
    "descriptors.h",
  ]
  deps = [
    "../../gn:default_deps",
    "../../include/perfetto/trace_processor",
    "../../protos/perfetto/common:zero",
    "../base",
    "../protozero:protozero",
  ]
}

source_set("storage_minimal") {
  sources = [
    "args_tracker.cc",
    "args_tracker.h",
    "binder_tracker.cc",
    "binder_tracker.h",
    "chunked_trace_reader.h",
    "clock_tracker.cc",
    "clock_tracker.h",
    "destructible.cc",
    "destructible.h",
    "event_tracker.cc",
    "event_tracker.h",
    "forwarding_trace_parser.cc",
    "forwarding_trace_parser.h",
    "ftrace_utils.h",
    "gzip_trace_parser.cc",
    "gzip_trace_parser.h",
    "heap_profile_tracker.cc",
    "heap_profile_tracker.h",
    "importers/ftrace/ftrace_descriptors.h",
    "importers/ftrace/ftrace_module.cc",
    "importers/ftrace/ftrace_module.h",
    "importers/ftrace/ftrace_parser.h",
    "importers/ftrace/ftrace_tokenizer.h",
    "importers/ftrace/sched_event_tracker.h",
    "importers/fuchsia/fuchsia_provider_view.h",
    "importers/proto/args_table_utils.cc",
    "importers/proto/args_table_utils.h",
    "importers/proto/chrome_compositor_scheduler_state.descriptor.h",
    "importers/proto/packet_sequence_state.h",
    "importers/proto/proto_importer_module.cc",
    "importers/proto/proto_importer_module.h",
    "importers/proto/proto_incremental_state.h",
    "importers/proto/proto_trace_parser.cc",
    "importers/proto/proto_trace_parser.h",
    "importers/proto/proto_trace_tokenizer.cc",
    "importers/proto/proto_trace_tokenizer.h",
    "importers/proto/track_event_module.cc",
    "importers/proto/track_event_module.h",
    "importers/proto/track_event_parser.cc",
    "importers/proto/track_event_parser.h",
    "importers/proto/track_event_tokenizer.cc",
    "importers/proto/track_event_tokenizer.h",
    "importers/systrace/systrace_parser.h",
    "importers/systrace/systrace_trace_parser.h",
    "metadata.h",
    "process_tracker.cc",
    "process_tracker.h",
    "slice_tracker.cc",
    "slice_tracker.h",
    "stack_profile_tracker.cc",
    "stack_profile_tracker.h",
    "stats.h",
    "syscall_tracker.h",
    "timestamped_trace_piece.h",
    "trace_blob_view.h",
    "trace_parser.h",
    "trace_processor_context.cc",
    "trace_processor_context.h",
    "trace_processor_storage.cc",
    "trace_processor_storage_impl.cc",
    "trace_processor_storage_impl.h",
    "trace_sorter.cc",
    "trace_sorter.h",
    "trace_storage.cc",
    "trace_storage.h",
    "track_tracker.cc",
    "track_tracker.h",
    "variadic.h",
    "virtual_destructors.cc",
  ]

  deps = [
    ":descriptors",
    "../../gn:default_deps",
    "../../gn:zlib",
    "../base",
    "../protozero",
    "containers",
    "tables",
  ]
  public_deps = [
    "../../include/perfetto/trace_processor:storage",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/config:zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/android:zero",
    "../../protos/perfetto/trace/chrome:zero",
    "../../protos/perfetto/trace/ftrace:zero",
    "../../protos/perfetto/trace/interned_data:zero",
    "../../protos/perfetto/trace/perfetto:zero",
    "../../protos/perfetto/trace/power:zero",
    "../../protos/perfetto/trace/profiling:zero",
    "../../protos/perfetto/trace/ps:zero",
    "../../protos/perfetto/trace/sys_stats:zero",
    "../../protos/perfetto/trace/track_event:zero",
  ]
  if (enable_perfetto_trace_processor_json_import) {
    sources += [
      "importers/json/json_trace_parser.cc",
      "importers/json/json_trace_parser.h",
      "importers/json/json_trace_tokenizer.cc",
      "importers/json/json_trace_tokenizer.h",
      "importers/json/json_trace_utils.cc",
      "importers/json/json_trace_utils.h",
    ]
    deps += [ "../../gn:jsoncpp" ]
  }
  if (enable_perfetto_trace_processor_ftrace) {
    sources += [
      "importers/ftrace/ftrace_descriptors.cc",
      "importers/ftrace/ftrace_module_impl.cc",
      "importers/ftrace/ftrace_parser.cc",
      "importers/ftrace/ftrace_tokenizer.cc",
      "importers/ftrace/sched_event_tracker.cc",
      "importers/systrace/systrace_parser.cc",
      "importers/systrace/systrace_trace_parser.cc",
    ]
  }
  if (enable_perfetto_trace_processor_ftrace ||
      enable_perfetto_trace_processor_fuchsia) {
    sources += [ "ftrace_utils.cc" ]
  }
  if (enable_perfetto_trace_processor_fuchsia) {
    sources += [
      "importers/fuchsia/fuchsia_provider_view.cc",
      "importers/fuchsia/fuchsia_trace_parser.cc",
      "importers/fuchsia/fuchsia_trace_parser.h",
      "importers/fuchsia/fuchsia_trace_tokenizer.cc",
      "importers/fuchsia/fuchsia_trace_tokenizer.h",
      "importers/fuchsia/fuchsia_trace_utils.cc",
      "importers/fuchsia/fuchsia_trace_utils.h",
    ]
  }
  if (enable_perfetto_trace_processor_syscalls) {
    sources += [
      "syscall_tracker.cc",
      "syscalls_aarch32.h",
      "syscalls_aarch64.h",
      "syscalls_armeabi.h",
      "syscalls_x86_64.h",
    ]
  }
}

source_set("storage_full") {
  sources = [
    "importers/proto/android_probes_module.cc",
    "importers/proto/android_probes_module.h",
    "importers/proto/android_probes_parser.cc",
    "importers/proto/android_probes_parser.h",
    "importers/proto/graphics_event_module.cc",
    "importers/proto/graphics_event_module.h",
    "importers/proto/graphics_event_parser.cc",
    "importers/proto/graphics_event_parser.h",
    "importers/proto/heap_graph_module.cc",
    "importers/proto/heap_graph_module.h",
    "importers/proto/heap_graph_tracker.cc",
    "importers/proto/heap_graph_tracker.h",
    "importers/proto/heap_graph_walker.cc",
    "importers/proto/heap_graph_walker.h",
    "importers/proto/system_probes_module.cc",
    "importers/proto/system_probes_module.h",
    "importers/proto/system_probes_parser.cc",
    "importers/proto/system_probes_parser.h",
    "importers/proto/vulkan_memory_tracker.cc",
    "importers/proto/vulkan_memory_tracker.h",
    "register_additional_modules.cc",
    "register_additional_modules.h",
  ]
  public_deps = [
    ":storage_minimal",
  ]
  deps = [
    "../../include/perfetto/ext/traced:sys_stats_counters",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/android:zero",
    "../../protos/perfetto/trace/gpu:zero",
    "../../protos/perfetto/trace/interned_data:zero",
    "../protozero",
  ]
  if (enable_perfetto_trace_processor_json) {
    public_deps += [ "../../gn:jsoncpp" ]
  }

  # Include these sources only if they are not already included in
  # storage_minimal.
  # TODO(khokhlov): Remove this 'if' when modules that use this tracker are
  # migrated to storage_full.
  if (!enable_perfetto_trace_processor_syscalls) {
    sources += [
      "syscall_tracker.cc",
      "syscalls_aarch32.h",
      "syscalls_aarch64.h",
      "syscalls_armeabi.h",
      "syscalls_x86_64.h",
    ]
  }
}

if (enable_perfetto_trace_processor_json) {
  source_set("export_json") {
    sources = [
      "export_json.cc",
      "export_json.h",
    ]
    deps = [
      ":storage_minimal",
      "../../gn:default_deps",
      "../../gn:jsoncpp",
      "../base",
    ]
    public_deps = [
      "../../include/perfetto/ext/trace_processor:export_json",
    ]
  }
}

if (enable_perfetto_trace_processor_sqlite) {
  source_set("lib") {
    sources = [
      "android_logs_table.cc",
      "android_logs_table.h",
      "args_table.cc",
      "args_table.h",
      "cpu_profile_stack_sample_table.cc",
      "cpu_profile_stack_sample_table.h",
      "filtered_row_index.cc",
      "filtered_row_index.h",
      "gfp_flags.cc",
      "gfp_flags.h",
      "heap_profile_allocation_table.cc",
      "heap_profile_allocation_table.h",
      "instants_table.cc",
      "instants_table.h",
      "metadata_table.cc",
      "metadata_table.h",
      "process_table.cc",
      "process_table.h",
      "raw_table.cc",
      "raw_table.h",
      "read_trace.cc",
      "row_iterators.cc",
      "row_iterators.h",
      "sched_slice_table.h",
      "span_join_operator_table.cc",
      "span_join_operator_table.h",
      "sql_stats_table.cc",
      "sql_stats_table.h",
      "stack_profile_frame_table.cc",
      "stack_profile_frame_table.h",
      "stack_profile_mapping_table.cc",
      "stack_profile_mapping_table.h",
      "stats_table.cc",
      "stats_table.h",
      "storage_columns.cc",
      "storage_columns.h",
      "storage_schema.cc",
      "storage_schema.h",
      "storage_table.cc",
      "storage_table.h",
      "thread_table.cc",
      "thread_table.h",
      "trace_processor.cc",
      "trace_processor_impl.cc",
      "trace_processor_impl.h",
      "window_operator_table.cc",
      "window_operator_table.h",
    ]

    deps = [
      ":storage_full",
      "../../gn:default_deps",
      "../../gn:sqlite",
      "../../protos/perfetto/trace/ftrace:zero",
      "../base",
      "db:lib",
      "sqlite",
      "tables",
    ]
    public_deps = [
      "../../include/perfetto/trace_processor",
    ]
    if (enable_perfetto_trace_processor_ftrace) {
      sources += [ "sched_slice_table.cc" ]
    }
    if (enable_perfetto_trace_processor_metrics) {
      deps += [
        "../../protos/perfetto/metrics:zero",
        "../../protos/perfetto/metrics/android:zero",
        "metrics:lib",
      ]
    }
    if (enable_perfetto_trace_processor_json) {
      deps += [ ":export_json" ]
    }
  }
}

if (enable_perfetto_trace_processor_metrics) {  # shell requires metrics.
  perfetto_host_executable("trace_processor_shell") {
    deps = [
      ":lib",
      "../../gn:default_deps",
      "../../gn:protoc_lib",
      "../base",
      "metrics:lib",
    ]
    if (enable_perfetto_version_gen) {
      deps += [ "../../gn/standalone:gen_git_revision" ]
    }
    if (enable_perfetto_trace_processor_linenoise) {
      deps += [ "../../gn:linenoise" ]
    }
    if (enable_perfetto_trace_processor_httpd) {
      deps += [ "rpc:httpd" ]
    }
    sources = [
      "proto_to_json.cc",
      "proto_to_json.h",
      "trace_processor_shell.cc",
    ]
  }
}

perfetto_unittest_source_set("unittests") {
  testonly = true
  sources = [
    "clock_tracker_unittest.cc",
    "event_tracker_unittest.cc",
    "forwarding_trace_parser_unittest.cc",
    "heap_profile_tracker_unittest.cc",
    "importers/proto/args_table_utils_unittest.cc",
    "importers/proto/heap_graph_walker_unittest.cc",
    "importers/proto/proto_trace_parser_unittest.cc",
    "importers/systrace/systrace_parser_unittest.cc",
    "process_tracker_unittest.cc",
    "protozero_to_text_unittests.cc",
    "slice_tracker_unittest.cc",
    "trace_sorter_unittest.cc",
  ]
  deps = [
    ":descriptors",
    ":protozero_to_text",
    ":storage_full",
    "../../gn:default_deps",
    "../../gn:gtest_and_gmock",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/trace:minimal_zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/android:zero",
    "../../protos/perfetto/trace/chrome:zero",
    "../../protos/perfetto/trace/ftrace:zero",
    "../../protos/perfetto/trace/gpu:zero",
    "../../protos/perfetto/trace/interned_data:zero",
    "../../protos/perfetto/trace/profiling:zero",
    "../../protos/perfetto/trace/ps:zero",
    "../../protos/perfetto/trace/sys_stats:zero",
    "../../protos/perfetto/trace/track_event:zero",
    "../base",
    "../protozero",
    "../protozero:testing_messages_zero",
    "containers:unittests",
    "db:unittests",
    "tables:unittests",
  ]
  if (enable_perfetto_trace_processor_sqlite) {
    sources += [
      "args_table_unittest.cc",
      "filtered_row_index_unittest.cc",
      "metadata_table_unittest.cc",
      "process_table_unittest.cc",
      "span_join_operator_table_unittest.cc",
    ]
    deps += [
      ":lib",
      "../../gn:sqlite",
      "sqlite",
      "sqlite:unittests",
    ]
  }
  if (enable_perfetto_trace_processor_json) {
    if (enable_perfetto_trace_processor_json_import) {
      sources += [
        "importers/json/json_trace_tokenizer_unittest.cc",
        "importers/json/json_trace_utils_unittest.cc",
      ]
      deps += [ "../../gn:jsoncpp" ]
    }
    if (!is_win) {
      # export_json_unittest.cc uses base::TempFile, which is not supported on
      # windows.
      sources += [ "export_json_unittest.cc" ]
      deps += [
        ":export_json",
        "../../gn:jsoncpp",
        "../../include/perfetto/ext/trace_processor:export_json",
      ]
    }
  }
  if (enable_perfetto_trace_processor_ftrace) {
    sources += [
      "ftrace_utils_unittest.cc",
      "sched_slice_table_unittest.cc",
      "thread_table_unittest.cc",
    ]
  }
  if (enable_perfetto_trace_processor_fuchsia) {
    sources += [ "importers/fuchsia/fuchsia_trace_utils_unittest.cc" ]
  }
  if (enable_perfetto_trace_processor_syscalls) {
    sources += [ "syscall_tracker_unittest.cc" ]
  }
}

source_set("integrationtests") {
  testonly = true
  sources = []
  deps = []
  if (enable_perfetto_trace_processor_sqlite) {
    sources += [ "trace_database_integrationtest.cc" ]
    deps += [
      ":lib",
      ":storage_full",
      "../../gn:default_deps",
      "../../gn:gtest_and_gmock",
      "../base",
      "../base:test_support",
      "sqlite",
    ]

    if (enable_perfetto_trace_processor_json_import) {
      deps += [ "../../gn:jsoncpp" ]
    }
  }
}

if (enable_perfetto_trace_processor_json) {
  source_set("storage_minimal_smoke_tests") {
    testonly = true
    sources = [
      "storage_minimal_smoke_test.cc",
    ]
    deps = [
      ":export_json",
      ":storage_minimal",
      "../../gn:default_deps",
      "../../gn:gtest_and_gmock",
      "../../gn:gtest_main",
      "../../gn:jsoncpp",
      "../base:test_support",
    ]
  }
}

perfetto_fuzzer_test("trace_processor_fuzzer") {
  testonly = true
  sources = [
    "trace_parsing_fuzzer.cc",
  ]
  deps = [
    ":storage_full",
    "../../gn:default_deps",
    "../base",
  ]
}
