# Copyright 2021 The Pigweed Authors
#
# 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
#
#     https://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("//build_overrides/pigweed.gni")

import("$dir_pw_bloat/bloat.gni")
import("$dir_pw_build/module_config.gni")
import("$dir_pw_build/python.gni")
import("$dir_pw_build/python_action.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_third_party/nanopb/nanopb.gni")
import("$dir_pw_unit_test/test.gni")

declare_args() {
  # The build target that overrides the default configuration options for this
  # module. This should point to a source set that provides defines through a
  # public config (which may -include a file or add defines directly).
  pw_rpc_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

config("public_include_path") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

pw_source_set("config") {
  sources = [ "public/pw_rpc/internal/config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [ pw_rpc_CONFIG ]
  visibility = [ "./*" ]
  friend = [ "./*" ]
}

pw_source_set("server") {
  public_configs = [ ":public_include_path" ]
  public_deps = [ ":common" ]
  deps = [ dir_pw_log ]
  public = [
    "public/pw_rpc/server.h",
    "public/pw_rpc/server_context.h",
    "public/pw_rpc/service.h",
  ]
  sources = [
    "base_server_writer.cc",
    "public/pw_rpc/internal/base_server_writer.h",
    "public/pw_rpc/internal/call.h",
    "public/pw_rpc/internal/hash.h",
    "public/pw_rpc/internal/method.h",
    "public/pw_rpc/internal/method_lookup.h",
    "public/pw_rpc/internal/method_union.h",
    "public/pw_rpc/internal/server.h",
    "server.cc",
    "service.cc",
  ]
  friend = [ "./*" ]
}

pw_source_set("client") {
  public_configs = [ ":public_include_path" ]
  public_deps = [ ":common" ]
  deps = [ dir_pw_log ]
  public = [
    "public/pw_rpc/client.h",
    "public/pw_rpc/internal/base_client_call.h",
  ]
  sources = [
    "base_client_call.cc",
    "client.cc",
  ]
}

# Classes shared by the server and client.
pw_source_set("common") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":protos.pwpb",
    "$dir_pw_containers:intrusive_list",
    dir_pw_assert,
    dir_pw_bytes,
    dir_pw_status,
  ]
  deps = [ dir_pw_log ]
  public = [ "public/pw_rpc/channel.h" ]
  sources = [
    "channel.cc",
    "packet.cc",
    "public/pw_rpc/internal/channel.h",
    "public/pw_rpc/internal/method_type.h",
    "public/pw_rpc/internal/packet.h",
  ]
  friend = [ "./*" ]
}

pw_source_set("synchronized_channel_output") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":common",
    "$dir_pw_sync:mutex",
  ]
  public = [ "public/pw_rpc/synchronized_channel_output.h" ]
}

pw_source_set("test_utils") {
  public = [
    "public/pw_rpc/internal/test_method.h",
    "pw_rpc_private/internal_test_utils.h",
    "pw_rpc_private/method_impl_tester.h",
  ]
  public_configs = [ ":private_includes" ]
  public_deps = [
    ":client",
    ":server",
  ]
  visibility = [ "./*" ]
}

config("private_includes") {
  include_dirs = [ "." ]
  visibility = [ ":*" ]
}

pw_proto_library("protos") {
  sources = [
    "pw_rpc_protos/echo.proto",
    "pw_rpc_protos/internal/packet.proto",
  ]
  inputs = [ "pw_rpc_protos/echo.options" ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  inputs = [
    "pw_rpc_protos/echo.proto",
    "pw_rpc_protos/internal/packet.proto",
  ]
  group_deps = [
    "nanopb:docs",
    "py:docs",
  ]
  report_deps = [ ":server_size" ]
}

pw_size_report("server_size") {
  title = "Pigweed RPC server size report"

  binaries = [
    {
      target = "size_report:server_only"
      base = "size_report:base"
      label = "Server by itself"
    },
  ]

  if (dir_pw_third_party_nanopb != "") {
    binaries += [
      {
        target = "size_report:server_with_echo_service"
        base = "size_report:base_with_nanopb"
        label = "Server with a registered nanopb EchoService"
      },
    ]
  }
}

pw_test_group("tests") {
  tests = [
    ":base_client_call_test",
    ":base_server_writer_test",
    ":channel_test",
    ":client_test",
    ":ids_test",
    ":packet_test",
    ":server_test",
    ":service_test",
  ]
  group_deps = [
    "nanopb:tests",
    "raw:tests",
  ]
}

pw_proto_library("test_protos") {
  sources = [ "pw_rpc_test_protos/test.proto" ]
  inputs = [ "pw_rpc_test_protos/test.options" ]
  visibility = [ "./*" ]
}

pw_test("base_server_writer_test") {
  deps = [
    ":server",
    ":test_utils",
  ]
  sources = [ "base_server_writer_test.cc" ]
}

pw_test("channel_test") {
  deps = [
    ":server",
    ":test_utils",
  ]
  sources = [ "channel_test.cc" ]
}

pw_python_action("generate_ids_test") {
  outputs = [ "$target_gen_dir/generated_ids_test.cc" ]
  script = "py/ids_test.py"
  args = [ "--generate-cc-test" ] + rebase_path(outputs)
  python_deps = [
    "$dir_pw_build/py",
    "py",
  ]
}

pw_test("ids_test") {
  deps = [
    ":generate_ids_test",
    ":server",
  ]
  sources = get_target_outputs(":generate_ids_test")
}

pw_test("packet_test") {
  deps = [
    ":server",
    dir_pw_bytes,
    dir_pw_protobuf,
  ]
  sources = [ "packet_test.cc" ]
}

pw_test("service_test") {
  deps = [
    ":protos.pwpb",
    ":server",
    dir_pw_assert,
  ]
  sources = [ "service_test.cc" ]
}

pw_test("client_test") {
  deps = [
    ":client",
    ":test_utils",
  ]
  sources = [ "client_test.cc" ]
}

pw_test("base_client_call_test") {
  deps = [
    ":client",
    ":test_utils",
  ]
  sources = [ "base_client_call_test.cc" ]
}

pw_test("server_test") {
  deps = [
    ":protos.pwpb",
    ":server",
    ":test_utils",
    dir_pw_assert,
  ]
  sources = [ "server_test.cc" ]
}
