# Copyright 2020 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.

# gn-format disable
import("//build_overrides/pigweed.gni")

import("$dir_pw_bloat/bloat.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")
config("default_config") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

pw_source_set("server") {
  public_configs = [ ":default_config" ]
  public_deps = [
    ":protos_pwpb",
    "$dir_pw_containers:intrusive_list",
    dir_pw_assert,
    dir_pw_span,
    dir_pw_status,
  ]
  deps = [ dir_pw_log ]
  public = [
    "public/pw_rpc/channel.h",
    "public/pw_rpc/server.h",
    "public/pw_rpc/server_context.h",
    "public/pw_rpc/service.h",
  ]
  sources = [
    "base_server_writer.cc",
    "channel.cc",
    "packet.cc",
    "public/pw_rpc/internal/base_server_writer.h",
    "public/pw_rpc/internal/call.h",
    "public/pw_rpc/internal/channel.h",
    "public/pw_rpc/internal/hash.h",
    "public/pw_rpc/internal/method.h",
    "public/pw_rpc/internal/packet.h",
    "public/pw_rpc/internal/server.h",
    "server.cc",
    "service.cc",
  ]
  friend = [ "./*" ]
}

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

# Provides the public RPC service definition (but not implementation). Can be
# used to expose global service registration without depending on the complete
# RPC library.
# TODO(hepler): Remove this unnecessary alias.
group("service") {
  deps = [ ":server" ]
}

# RPC server that uses Nanopb to encode and decode protobufs. RPCs use Nanopb
# structs as their requests and responses.
# TODO(hepler): Remove this unnecessary alias.
group("nanopb_server") {
  deps = [ ":server" ]
}

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

pw_proto_library("protos") {
  sources = [ "pw_rpc_protos/packet.proto" ]
}

pw_proto_library("echo_service_proto") {
  sources = [ "pw_rpc_protos/echo.proto" ]
  inputs = [ "pw_rpc_protos/echo.options" ]
}

# Source files for pw_protobuf's protoc plugin.
pw_input_group("nanopb_protoc_plugin") {
  inputs = [
    "py/pw_rpc/codegen_nanopb.py",
    "py/pw_rpc/plugin.py",
    "py/pw_rpc/ids.py",
  ]
  deps = [ "$dir_pw_protobuf:codegen_protoc_lib" ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  inputs = [
    "pw_rpc_protos/echo.proto",
    "pw_rpc_protos/packet.proto",
  ]
  group_deps = [ "nanopb: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_server_writer_test",
    ":channel_test",
    ":packet_test",
    ":server_test",
    ":service_test",
  ]
  group_deps = [ "nanopb:tests" ]
}

pw_proto_library("test_protos") {
  sources = [ "pw_rpc_test_protos/test.proto" ]
  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_test("hash_test") {
  deps = [ ":server" ]
  sources = [ "hash_test.cc" ]
}

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("server_test") {
  deps = [
    ":protos_pwpb",
    ":server",
    ":test_utils",
    dir_pw_assert,
  ]
  sources = [ "server_test.cc" ]
}
