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

source_set("common") {
  sources = [
    "args_tracker.cc",
    "args_tracker.h",
    "args_translation_table.cc",
    "args_translation_table.h",
    "async_track_set_tracker.cc",
    "async_track_set_tracker.h",
    "chunked_trace_reader.h",
    "clock_converter.cc",
    "clock_converter.h",
    "clock_tracker.cc",
    "clock_tracker.h",
    "deobfuscation_mapping_table.cc",
    "deobfuscation_mapping_table.h",
    "event_tracker.cc",
    "event_tracker.h",
    "flow_tracker.cc",
    "flow_tracker.h",
    "global_args_tracker.cc",
    "global_args_tracker.h",
    "metadata_tracker.cc",
    "metadata_tracker.h",
    "process_tracker.cc",
    "process_tracker.h",
    "slice_tracker.cc",
    "slice_tracker.h",
    "slice_translation_table.cc",
    "slice_translation_table.h",
    "system_info_tracker.cc",
    "system_info_tracker.h",
    "trace_parser.cc",
    "track_tracker.cc",
    "track_tracker.h",
  ]
  public_deps = [
    ":trace_parser_hdr",
    "../../util:proto_to_args_parser",
    "../../util:protozero_to_text",
  ]
  deps = [
    ":parser_types",
    "../../../../gn:default_deps",
    "../../../../include/perfetto/trace_processor",
    "../../../../include/perfetto/trace_processor:basic_types",
    "../../../../protos/perfetto/common:zero",
    "../../../../protos/perfetto/trace:zero",
    "../../../../protos/perfetto/trace/profiling:zero",
    "../../../base",
    "../../storage",
    "../../types",
    "../fuchsia:fuchsia_record",
    "../systrace:systrace_line",
  ]
}

source_set("trace_parser_hdr") {
  sources = [ "trace_parser.h" ]
  deps = [ "../../../../gn:default_deps" ]
}

source_set("parser_types") {
  sources = [ "parser_types.h" ]
  deps = [
    "../../../../gn:default_deps",
    "../../../../include/perfetto/trace_processor:storage",
    "../../containers",
    "../proto:packet_sequence_state_generation_hdr",
  ]
}

source_set("unittests") {
  sources = [
    "args_translation_table_unittest.cc",
    "async_track_set_tracker_unittest.cc",
    "clock_converter_unittest.cc",
    "clock_tracker_unittest.cc",
    "deobfuscation_mapping_table_unittest.cc",
    "event_tracker_unittest.cc",
    "flow_tracker_unittest.cc",
    "process_tracker_unittest.cc",
    "slice_tracker_unittest.cc",
    "slice_translation_table_unittest.cc",
  ]
  testonly = true
  deps = [
    ":common",
    "../../../../gn:default_deps",
    "../../../../gn:gtest_and_gmock",
    "../../../../protos/perfetto/common:zero",
    "../../../../protos/perfetto/trace:zero",
    "../../../base",
    "../../storage",
    "../../types",
  ]
}
