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

include($ENV{PW_ROOT}/pw_build/pigweed.cmake)

pw_add_module_library(pw_rpc.pwpb.method
  SOURCES
    server_reader_writer.cc
  PUBLIC_DEPS
    pw_rpc.pwpb.common
    pw_rpc.server
  PRIVATE_DEPS
    pw_log
)

pw_add_module_library(pw_rpc.pwpb.method_union
  PUBLIC_DEPS
    pw_rpc.pwpb.method
    pw_rpc.raw
    pw_rpc.server
  PRIVATE_DEPS
    pw_log
)

pw_add_module_library(pw_rpc.pwpb.client
  PUBLIC_DEPS
    pw_function
    pw_rpc.pwpb.common
    pw_rpc.common
)

pw_add_module_library(pw_rpc.pwpb.common
  PUBLIC_DEPS
    pw_bytes
    pw_log
    pw_protobuf
    pw_rpc.common
)

pw_add_module_library(pw_rpc.pwpb.echo_service
  PUBLIC_DEPS
    pw_rpc.protos.pwpb_rpc
)

pw_add_module_library(pw_rpc.pwpb.client_testing
  PUBLIC_DEPS
    pw_rpc.client
    pw_rpc.raw
    pw_rpc.server
    pw_rpc.pwpb.common
    pw_rpc.protos.pwpb_rpc
    pw_rpc.test_protos.pwpb_rpc
    pw_rpc.test_utils
)

pw_add_module_library(pw_rpc.pwpb.client_server_testing
  PUBLIC_DEPS
    pw_rpc.pwpb.client_testing
    pw_rpc.client_server_testing
)

pw_add_module_library(pw_rpc.pwpb.client_server_testing_threaded
  PUBLIC_DEPS
    pw_rpc.pwpb.client_testing
    pw_rpc.client_server_testing_threaded
)

pw_add_test(pw_rpc.pwpb.client_call_test
  SOURCES
    client_call_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.client_reader_writer_test
  SOURCES
    client_reader_writer_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.client_server_context_test
  SOURCES
    client_server_context_test.cc
  DEPS
    pw_rpc.pwpb.client_server_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

if(("${pw_thread.thread_BACKEND}" STREQUAL "pw_thread_stl.thread") AND
   (NOT "${pw_sync.binary_semaphore_BACKEND}" STREQUAL
   "pw_sync.binary_semaphore.NO_BACKEND_SET") AND
   (NOT "${pw_sync.mutex_BACKEND}" STREQUAL
   "pw_sync.binary_semaphore.NO_BACKEND_SET"))
  pw_add_test(pw_rpc.pwpb.client_server_context_threaded_test
    SOURCES
      client_server_context_threaded_test.cc
    DEPS
      pw_rpc.pwpb.client_server_testing_threaded
      pw_sync.binary_semaphore
      pw_thread.test_threads
      pw_thread_stl.test_threads
      pw_thread.thread
    GROUPS
      modules
      pw_rpc.pwpb
  )
endif()

pw_add_test(pw_rpc.pwpb.codegen_test
  SOURCES
    codegen_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.fake_channel_output_test
  SOURCES
    fake_channel_output_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.method_test
  SOURCES
    method_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.method_info_test
  SOURCES
    method_info_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.method_lookup_test
  SOURCES
    method_lookup_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.method_union_test
  SOURCES
    method_union_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.echo_service_test
  SOURCES
    echo_service_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.serde_test
  SOURCES
    serde_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.server_callback_test
  SOURCES
    server_callback_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.server_reader_writer_test
  SOURCES
    server_reader_writer_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

pw_add_test(pw_rpc.pwpb.stub_generation_test
  SOURCES
    stub_generation_test.cc
  DEPS
    pw_rpc.pwpb.client_testing
  GROUPS
    modules
    pw_rpc.pwpb
)

# TODO(b/231950909) Test disabled as pw_work_queue lacks CMakeLists.txt
if((TARGET pw_work_queue.pw_work_queue) AND
   ("${pw_thread.thread_BACKEND}" STREQUAL "pw_thread_stl.thread") AND
   (NOT "${pw_sync.timed_thread_notification_BACKEND}" STREQUAL
   "pw_sync.timed_thread_notification.NO_BACKEND_SET"))
  pw_add_test(pw_rpc.pwpb.synchronous_call_test
    SOURCES
      synchronous_call_test.cc
    DEPS
      pw_rpc.pwpb.client_testing
      pw_rpc.synchronous_client_api
      pw_thread.thread
      pw_work_queue.pw_work_queue
      pw_work_queue.test_thread
      pw_work_queue.stl_test_thread
    GROUPS
      modules
      pw_rpc.pwpb
  )
endif()
