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

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

# This build file should not be leaked into all embedders. Only select
# projects should be depending on our IPC layer.
assert(perfetto_build_with_ipc_layer)

source_set("ipc") {
  public_configs = [ "../../gn:default_config" ]
  public_deps = [
    "../../include/perfetto/ipc",
    "../base:unix_socket",
  ]
  deps = [
    ":wire_protocol",
    "../../gn:default_deps",
    "../base",
  ]
  sources = [
    "buffered_frame_deserializer.cc",
    "client_impl.cc",
    "deferred.cc",
    "host_impl.cc",
    "host_impl.h",
    "service_proxy.cc",
    "virtual_destructors.cc",
  ]
}

perfetto_fuzzer_test("buffered_frame_deserializer_fuzzer") {
  sources = [
    "buffered_frame_deserializer_fuzzer.cc",
  ]
  deps = [
    ":ipc",
    ":wire_protocol",
    "../../gn:default_deps",
  ]
}

source_set("unittests") {
  testonly = true
  deps = [
    ":ipc",
    ":test_messages",
    ":wire_protocol",
    "../../gn:default_deps",
    "../../gn:gtest_deps",
    "../base",
    "../base:test_support",
  ]
  sources = [
    "buffered_frame_deserializer_unittest.cc",
    "client_impl_unittest.cc",
    "deferred_unittest.cc",
    "host_impl_unittest.cc",
    "test/ipc_integrationtest.cc",
  ]
}

proto_library("wire_protocol") {
  generate_python = false
  sources = [
    "wire_protocol.proto",
  ]
  proto_in_dir = perfetto_root_path
  proto_out_dir = perfetto_root_path
}

ipc_library("test_messages") {
  sources = [
    "test/client_unittest_messages.proto",
    "test/deferred_unittest_messages.proto",
    "test/greeter_service.proto",
  ]
  proto_in_dir = perfetto_root_path
  proto_out_dir = perfetto_root_path
}
