# 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/facade.gni")
import("$dir_pw_build/module_config.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_unit_test/test.gni")
import("backend.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_thread_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

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

pw_source_set("config") {
  public_deps = [ pw_thread_CONFIG ]
  public = [ "public/pw_thread/config.h" ]
  public_configs = [ ":public_include_path" ]
  visibility = [ ":*" ]
}

pw_facade("id") {
  backend = pw_thread_ID_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/id.h" ]
}

pw_facade("sleep") {
  backend = pw_thread_SLEEP_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/sleep.h" ]
  public_deps = [
    "$dir_pw_chrono:system_clock",
    "$dir_pw_preprocessor",
  ]
  sources = [ "sleep.cc" ]
}

pw_facade("thread") {
  backend = pw_thread_THREAD_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_thread/detached_thread.h",
    "public/pw_thread/thread.h",
  ]
  public_deps = [
    ":id",
    ":thread_core",
    dir_pw_function,
  ]
  sources = [ "thread.cc" ]
}

pw_source_set("deprecated_or_new_thread_function") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/deprecated_or_new_thread_function.h" ]
  public_deps = [ dir_pw_function ]
}

pw_test("deprecated_or_new_thread_function_test") {
  sources = [ "deprecated_or_new_thread_function_test.cc" ]
  deps = [ ":deprecated_or_new_thread_function" ]
}

pw_facade("test_thread_context") {
  backend = pw_thread_TEST_THREAD_CONTEXT_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/test_thread_context.h" ]
}

pw_source_set("thread_core") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/thread_core.h" ]
}

pw_facade("thread_iteration") {
  backend = pw_thread_THREAD_ITERATION_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/thread_iteration.h" ]
  public_deps = [
    ":thread_info",
    "$dir_pw_function",
    "$dir_pw_status",
  ]
}

pw_facade("yield") {
  backend = pw_thread_YIELD_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/yield.h" ]
  public_deps = [ "$dir_pw_preprocessor" ]
  sources = [ "yield.cc" ]
}

pw_source_set("snapshot") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    "$dir_pw_thread:protos.pwpb",
    dir_pw_bytes,
    dir_pw_function,
    dir_pw_protobuf,
    dir_pw_status,
  ]
  public = [ "public/pw_thread/snapshot.h" ]
  sources = [ "snapshot.cc" ]
  deps = [
    ":config",
    dir_pw_log,
  ]
}

pw_source_set("thread_info") {
  public_configs = [ ":public_include_path" ]
  public_deps = [ dir_pw_span ]
  public = [ "public/pw_thread/thread_info.h" ]
  deps = [ ":config" ]
}

pw_source_set("thread_snapshot_service") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/thread_snapshot_service.h" ]
  public_deps = [
    ":protos.pwpb",
    ":protos.raw_rpc",
    ":thread_info",
    "$dir_pw_rpc/raw:server_api",
    "$dir_pw_status:pw_status",
  ]
  sources = [
    "pw_thread_private/thread_snapshot_service.h",
    "thread_snapshot_service.cc",
  ]
  deps = [
    ":config",
    ":thread_iteration",
    "$dir_pw_log",
    "$dir_pw_protobuf",
    "$dir_pw_rpc/raw:server_api",
    "$dir_pw_span",
    "$dir_pw_status:pw_status",
  ]
}

pw_test_group("tests") {
  tests = [
    ":deprecated_or_new_thread_function_test",
    ":id_facade_test",
    ":sleep_facade_test",
    ":thread_info_test",
    ":yield_facade_test",
    ":test_thread_context_facade_test",
    ":thread_snapshot_service_test",
  ]
}

pw_test("test_thread_context_facade_test") {
  # TODO: b/317922402 - On Windows, this test can easily hang indefinitely.
  # Disable on Windows until we can test with the native Windows SDK libraries
  # for threading.
  enable_if = pw_thread_TEST_THREAD_CONTEXT_BACKEND != "" && current_os != "win"
  sources = [ "test_thread_context_facade_test.cc" ]
  deps = [
    ":test_thread_context",
    ":thread",
    "$dir_pw_sync:binary_semaphore",
  ]
}

pw_test("id_facade_test") {
  enable_if = pw_thread_ID_BACKEND != ""
  sources = [ "id_facade_test.cc" ]
  deps = [ ":id" ]
}

pw_test("thread_snapshot_service_test") {
  enable_if = pw_thread_THREAD_ITERATION_BACKEND != ""
  sources = [
    "pw_thread_private/thread_snapshot_service.h",
    "thread_snapshot_service_test.cc",
  ]
  deps = [
    ":protos.pwpb",
    ":thread_iteration",
    "$dir_pw_protobuf",
    "$dir_pw_span",
    "$dir_pw_sync:thread_notification",
    "$dir_pw_thread:thread_info",
    "$dir_pw_thread:thread_snapshot_service",
  ]

  # 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("sleep_facade_test") {
  enable_if = pw_thread_SLEEP_BACKEND != "" && pw_thread_ID_BACKEND != ""
  sources = [
    "sleep_facade_test.cc",
    "sleep_facade_test_c.c",
  ]
  deps = [
    ":id",
    ":sleep",
    "$dir_pw_chrono:system_clock",
  ]
}

pw_source_set("non_portable_test_thread_options") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/non_portable_test_thread_options.h" ]
  public_deps = [ ":thread" ]
}

# To instantiate this facade test based on a selected backend to provide
# test_threads you can create a pw_test target which depends on this
# pw_source_set and a pw_source_set which provides the implementation of
# test_threads. See "$dir_pw_thread_stl:thread_backend_test" as an example.
pw_source_set("thread_facade_test") {
  testonly = pw_unit_test_TESTONLY
  sources = [ "thread_facade_test.cc" ]
  deps = [
    ":id",
    ":non_portable_test_thread_options",
    ":sleep",
    ":thread",
    "$dir_pw_sync:binary_semaphore",
    dir_pw_unit_test,
  ]
}

pw_test("thread_info_test") {
  sources = [ "thread_info_test.cc" ]
  deps = [
    ":thread_info",
    dir_pw_span,
  ]
}

pw_test("yield_facade_test") {
  enable_if = pw_thread_YIELD_BACKEND != "" && pw_thread_ID_BACKEND != ""
  sources = [
    "yield_facade_test.cc",
    "yield_facade_test_c.c",
  ]
  deps = [
    ":id",
    ":yield",
  ]
}

pw_proto_library("protos") {
  sources = [
    "pw_thread_protos/thread.proto",
    "pw_thread_protos/thread_snapshot_service.proto",
  ]
  deps = [ "$dir_pw_tokenizer:proto" ]
}

pw_doc_group("docs") {
  inputs =
      [ "$dir_pw_thread_stl/public/pw_thread_stl/test_thread_context_native.h" ]
  sources = [
    "backends.rst",
    "docs.rst",
  ]
}
