# coop: Link Play "Local Connection" between our native builds (docs/coop-step1.md, docs/coop-step1c.md). Portable C11; builds on its own too:
# cmake -S src/coop -B <dir> && cmake --build <dir> && ctest --test-dir <dir>
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
  cmake_minimum_required(VERSION 3.20)
  project(coop LANGUAGES C)
  enable_testing()
endif()

add_library(coop STATIC coop_ldn.c coop_vnet.c coop_mpnet.c coop_plat.c coop_disc.c coop_auth.c)
target_include_directories(coop PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
set_target_properties(coop PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF)
if(WIN32)
  target_compile_definitions(coop PRIVATE _CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN)
  target_link_libraries(coop PUBLIC ws2_32 ole32 iphlpapi)   # ole32: the network profiles, iphlpapi: the addresses (coop_plat.c)
else()
  find_package(Threads REQUIRED)
  target_link_libraries(coop PUBLIC Threads::Threads)
  target_compile_definitions(coop PRIVATE _POSIX_C_SOURCE=200809L _DEFAULT_SOURCE _DARWIN_C_SOURCE)
endif()
if(MSVC OR CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
  target_compile_options(coop PRIVATE /W4)
else()
  target_compile_options(coop PRIVATE -Wall -Wextra -Wno-unused-parameter)
endif()

# Hosts and stations in one process over loopback, and hostile peers made of raw sockets (it uses the module's internals: coop_int.h).
# DNS-SD on this machine's LAN only on request: COOP_TEST_MDNS=1, or `coop_tests mdns`
# Step 1d adds crypto (the published vectors), inet (internet play) and relay (tools/coop-relay built in, on loopback only)
add_executable(coop_tests tests/coop_test.c ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/coop-relay/coop_relay.c)
target_include_directories(coop_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/coop-relay)
target_link_libraries(coop_tests PRIVATE coop)
set_target_properties(coop_tests PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF)
if(WIN32)
  target_compile_definitions(coop_tests PRIVATE _CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN)
else()
  target_compile_definitions(coop_tests PRIVATE _POSIX_C_SOURCE=200809L _DEFAULT_SOURCE _DARWIN_C_SOURCE)
endif()
add_test(NAME coop.loopback COMMAND coop_tests config addr txt loopback)
add_test(NAME coop.lan COMMAND coop_tests lan)
add_test(NAME coop.hostile COMMAND coop_tests hostile)
add_test(NAME coop.crypto COMMAND coop_tests crypto)
add_test(NAME coop.inet COMMAND coop_tests inet)
add_test(NAME coop.relay COMMAND coop_tests relay)
set_tests_properties(coop.loopback coop.lan coop.hostile coop.crypto coop.inet coop.relay PROPERTIES TIMEOUT 120)
