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

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

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

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

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

source_set("filter_util") {
  testonly = true
  sources = [
    "filter_util.cc",
    "filter_util.h",
  ]
  deps = [
    ":bytecode_generator",
    ":bytecode_parser",
    "..:protozero",
    "../../../gn:default_deps",
    "../../../gn:protobuf_full",
    "../../base",
  ]
}

perfetto_unittest_source_set("unittests") {
  testonly = true
  deps = [
    ":bytecode_common",
    ":bytecode_generator",
    ":bytecode_parser",
    ":message_filter",
    "..:protozero",
    "../../../gn:default_deps",
    "../../../gn:gtest_and_gmock",
    "../../../protos/perfetto/trace:lite",
    "../../base",
    "../../base:test_support",
  ]
  sources = [
    "filter_bytecode_generator_unittest.cc",
    "filter_bytecode_parser_unittest.cc",
    "message_tokenizer_unittest.cc",
  ]

  # On chromium component build we cannot have a test target depening boh on
  # protobuf-full and protobuf-lite. Just skip those targets there.
  # See also https://crug.com/1210223 .
  if (perfetto_build_standalone || perfetto_build_with_android) {
    deps += [ ":filter_util" ]
    sources += [
      "filter_util_unittest.cc",
      "message_filter_unittest.cc",
    ]
  }
}

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

perfetto_fuzzer_test("protozero_bytecode_parser_fuzzer") {
  sources = [ "filter_bytecode_parser_fuzzer.cc" ]
  deps = [
    ":bytecode_parser",
    "..:protozero",
    "../../../gn:default_deps",
    "../../base",
  ]
}

perfetto_fuzzer_test("protozero_message_filter_fuzzer") {
  sources = [ "message_filter_fuzzer.cc" ]
  deps = [
    ":message_filter",
    "..:protozero",
    "../../../gn:default_deps",
    "../../base",
  ]
}
