# 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_build/module_config.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.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_transfer_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

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

pw_source_set("config") {
  public = [ "public/pw_transfer/internal/config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [
    "$dir_pw_chrono:system_timer",
    pw_transfer_CONFIG,
  ]
  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 = [
    ":context",
    ":proto.raw_rpc",
    "$dir_pw_sync:lock_annotations",
    "$dir_pw_sync:mutex",
    dir_pw_assert,
    dir_pw_function,
    dir_pw_stream,
  ]
  deps = [
    ":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 = [
    ":config",
    "$dir_pw_rpc:client",
    "$dir_pw_sync:interrupt_spin_lock",
    "$dir_pw_sync:lock_annotations",
    dir_pw_bytes,
    dir_pw_result,
    dir_pw_status,
    dir_pw_stream,
    dir_pw_work_queue,
  ]
  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 = [
    # TODO(pwbug/562): These tests flake in CQ as they're timed-based. Rewrite
    # them to access transfer internals and avoid sleeping.
    # ":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",
    "$dir_pw_thread:sleep",
    "$dir_pw_thread:thread",
  ]
}

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_thread:thread",
    dir_pw_log,
  ]
}
