# 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_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_unit_test/test.gni")

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

pw_source_set("pw_transfer") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":context",
    ":proto.raw_rpc",
    "$dir_pw_containers:intrusive_list",
    dir_pw_assert,
    dir_pw_result,
    dir_pw_status,
    dir_pw_stream,
  ]
  deps = [
    ":proto.pwpb",
    dir_pw_log,
  ]
  public = [
    "public/pw_transfer/handler.h",
    "public/pw_transfer/transfer.h",
  ]
  sources = [
    "client_connection.cc",
    "public/pw_transfer/internal/client_connection.h",
    "public/pw_transfer/internal/server_context.h",
    "server_context.cc",
    "transfer.cc",
  ]
}

pw_source_set("client") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":proto.raw_rpc",
    "$dir_pw_sync:lock_annotations",
    "$dir_pw_sync:mutex",
    dir_pw_assert,
    dir_pw_function,
    dir_pw_stream,
    dir_pw_work_queue,
  ]
  deps = [
    ":context",
    ":proto.pwpb",
    dir_pw_log,
  ]
  public = [ "public/pw_transfer/client.h" ]
  sources = [
    "client.cc",
    "client_context.cc",
    "public/pw_transfer/internal/client_context.h",
  ]
}

pw_source_set("context") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    dir_pw_bytes,
    dir_pw_result,
    dir_pw_status,
    dir_pw_stream,
  ]
  deps = [
    ":proto.pwpb",
    dir_pw_protobuf,
    dir_pw_varint,
  ]
  sources = [
    "chunk.cc",
    "chunk_data_buffer.cc",
    "context.cc",
    "public/pw_transfer/internal/chunk.h",
    "public/pw_transfer/internal/chunk_data_buffer.h",
    "public/pw_transfer/internal/context.h",
  ]
  friend = [ ":*" ]
}

pw_source_set("test_helpers") {
  public_deps = [
    ":context",
    dir_pw_containers,
  ]
  sources = [ "pw_transfer_private/chunk_testing.h" ]
  friend = [ ":*" ]
  visibility = [ ":*" ]
}

pw_proto_library("proto") {
  sources = [ "transfer.proto" ]
  python_package = "py"
  prefix = "pw_transfer"
}

pw_test_group("tests") {
  tests = [
    ":client_test",
    ":handler_test",
    ":transfer_test",
  ]
}

pw_test("handler_test") {
  sources = [ "handler_test.cc" ]
  deps = [ ":pw_transfer" ]
}

pw_test("transfer_test") {
  sources = [ "transfer_test.cc" ]
  deps = [
    ":proto.pwpb",
    ":pw_transfer",
    ":test_helpers",
    "$dir_pw_rpc/raw:test_method_context",
  ]
}

pw_test("client_test") {
  sources = [ "client_test.cc" ]
  deps = [
    ":client",
    ":test_helpers",
    "$dir_pw_rpc/raw:client_testing",
  ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  inputs = [
    "transfer.proto",
    "read.svg",
    "write.svg",
  ]
}

pw_proto_library("test_server_proto") {
  sources = [ "test_server.proto" ]
  prefix = "pw_transfer_test"
  deps = [ "$dir_pw_protobuf:common_protos" ]
}

pw_executable("test_rpc_server") {
  sources = [ "test_rpc_server.cc" ]
  deps = [
    ":pw_transfer",
    ":test_server_proto.raw_rpc",
    "$dir_pw_rpc/system_server",
    "$dir_pw_rpc/system_server:socket",
    "$dir_pw_stream:std_file_stream",
    dir_pw_log,
  ]
}
