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

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/module_config.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_chrono/backend.gni")
import("$dir_pw_docgen/docs.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_log_rpc_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

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

# TODO: b/297280281 - Windows+gcc+mingw-w64 thinks that some variables are not
# always initialized. This is a toolchain bug, not a real issue.
config("disable_warning") {
  cflags = [ "-Wno-maybe-uninitialized" ]
}

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

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

pw_source_set("log_service") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_rpc/log_service.h" ]
  sources = [ "log_service.cc" ]
  deps = [
    ":log_config",
    "$dir_pw_log",
    "$dir_pw_log:protos.pwpb",
  ]
  public_deps = [
    ":rpc_log_drain",
    "$dir_pw_log:protos.raw_rpc",
  ]
}

pw_source_set("log_filter_service") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_rpc/log_filter_service.h" ]
  sources = [ "log_filter_service.cc" ]
  deps = [
    "$dir_pw_log",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf",
  ]
  public_deps = [
    ":log_filter",
    "$dir_pw_log:protos.raw_rpc",
    "$dir_pw_protobuf:bytes_utils",
  ]
}

pw_source_set("log_filter") {
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_log_rpc/log_filter.h",
    "public/pw_log_rpc/log_filter_map.h",
  ]
  sources = [ "log_filter.cc" ]
  deps = [ "$dir_pw_log" ]
  public_deps = [
    ":config",
    "$dir_pw_assert",
    "$dir_pw_bytes",
    "$dir_pw_containers:vector",
    "$dir_pw_log",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf",
    "$dir_pw_status",
    dir_pw_span,
  ]
}

pw_source_set("rpc_log_drain") {
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_log_rpc/rpc_log_drain.h",
    "public/pw_log_rpc/rpc_log_drain_map.h",
  ]
  sources = [ "rpc_log_drain.cc" ]
  public_deps = [
    ":config",
    ":log_filter",
    "$dir_pw_assert",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_function",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log:protos.raw_rpc",
    "$dir_pw_multisink",
    "$dir_pw_protobuf",
    "$dir_pw_result",
    "$dir_pw_status",
    "$dir_pw_sync:lock_annotations",
    "$dir_pw_sync:mutex",
    dir_pw_span,
  ]
}

pw_source_set("rpc_log_drain_thread") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_rpc/rpc_log_drain_thread.h" ]
  public_deps = [
    ":log_service",
    ":rpc_log_drain",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_multisink",
    "$dir_pw_result",
    "$dir_pw_rpc/raw:server_api",
    "$dir_pw_status",
    "$dir_pw_sync:timed_thread_notification",
    "$dir_pw_thread:thread",
  ]
  if (current_os == "win") {
    public_configs += [ ":disable_warning" ]
  }
}

pw_source_set("test_utils") {
  # TODO: b/303282642 - Remove this testonly
  testonly = pw_unit_test_TESTONLY

  public_deps = [
    "$dir_pw_bytes",
    "$dir_pw_containers:vector",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_protobuf",
    "$dir_pw_unit_test",
  ]
  deps = [
    "$dir_pw_log",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf:bytes_utils",
  ]
  public = [ "pw_log_rpc_private/test_utils.h" ]
  sources = [ "test_utils.cc" ]
  visibility = [ ":*" ]
}

pw_test("log_service_test") {
  enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != ""
  sources = [ "log_service_test.cc" ]
  deps = [
    ":log_filter",
    ":log_service",
    ":test_utils",
    "$dir_pw_containers:vector",
    "$dir_pw_log",
    "$dir_pw_log:proto_utils",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_protobuf",
    "$dir_pw_protobuf:bytes_utils",
    "$dir_pw_result",
    "$dir_pw_rpc/raw:test_method_context",
    "$dir_pw_status",
  ]

  # TODO: https://pwbug.dev/325509758 - Doesn't work on the Pico yet; hangs
  # indefinitely.
  if (pw_build_EXECUTABLE_TARGET_TYPE == "pico_executable") {
    enable_if = false
  }
}

pw_test("log_filter_service_test") {
  sources = [ "log_filter_service_test.cc" ]
  deps = [
    ":log_filter",
    ":log_filter_service",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf",
    "$dir_pw_protobuf:bytes_utils",
    "$dir_pw_result",
    "$dir_pw_rpc/raw:test_method_context",
    "$dir_pw_status",
  ]

  # TODO: https://pwbug.dev/325509758 - Doesn't work on the Pico yet; hangs
  # indefinitely.
  if (pw_build_EXECUTABLE_TARGET_TYPE == "pico_executable") {
    enable_if = false
  }
}

pw_test("log_filter_test") {
  sources = [ "log_filter_test.cc" ]
  deps = [
    ":log_filter",
    "$dir_pw_log",
    "$dir_pw_log:proto_utils",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_result",
    "$dir_pw_status",
  ]

  # TODO: https://pwbug.dev/325509758 - Doesn't work on the Pico yet; hangs
  # indefinitely.
  if (pw_build_EXECUTABLE_TARGET_TYPE == "pico_executable") {
    enable_if = false
  }
}

pw_test("rpc_log_drain_test") {
  enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != ""
  sources = [ "rpc_log_drain_test.cc" ]
  deps = [
    ":log_filter",
    ":log_service",
    ":rpc_log_drain",
    ":test_utils",
    "$dir_pw_bytes",
    "$dir_pw_log:proto_utils",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_multisink",
    "$dir_pw_protobuf",
    "$dir_pw_rpc:common",
    "$dir_pw_rpc/raw:fake_channel_output",
    "$dir_pw_rpc/raw:server_api",
    "$dir_pw_rpc/raw:test_method_context",
    "$dir_pw_status",
    "$dir_pw_sync:mutex",
  ]

  # TODO: https://pwbug.dev/325509758 - Doesn't work on the Pico yet; hangs
  # indefinitely.
  if (pw_build_EXECUTABLE_TARGET_TYPE == "pico_executable") {
    enable_if = false
  }
}

# TODO(cachinchilla): update docs.
pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}

pw_test_group("tests") {
  tests = [
    ":log_filter_test",
    ":log_filter_service_test",
    ":log_service_test",
    ":rpc_log_drain_test",
  ]
}
