find_package(CURL REQUIRED)

include(GoogleTest)

add_executable(xrdcl-http-unit-tests
  HeaderParserTest.cc
  ParseTimeoutTest.cc
  TapeTest.cc
)

target_link_libraries(xrdcl-http-unit-tests
  XrdClHttpObj XrdCl CURL::libcurl GTest::gtest_main)
target_include_directories(xrdcl-http-unit-tests
  PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")

gtest_discover_tests(xrdcl-http-unit-tests TEST_PREFIX XrdClHttp::
  PROPERTIES DISCOVERY_TIMEOUT 10)

# XrdClHttp integration tests depend on scitokens fixture for authentication
if(NOT BUILD_SCITOKENS)
  return()
endif()

find_program(OPENSSL_BIN openssl REQUIRED)

# All tests that only depend on the pure XrdCl interfaces and
# have no linkage against XrdClHttp
add_executable(xrdcl-test
  ChecksumTest.cc
  DeleteTest.cc
  MkcolTest.cc
  ReadTest.cc
  WriteTest.cc
)

# Tests depending on XrdClHttp linkage
add_executable(xrdcl-http-test
  CopyTest.cc
  VectorReadTest.cc
)

target_link_libraries(xrdcl-test XrdClHttpTransferTest GTest::gtest_main)
target_link_libraries(xrdcl-http-test XrdClHttpObj XrdClHttpTransferTest GTest::gtest_main)

gtest_add_tests(TARGET xrdcl-test TEST_LIST CurlClOnlyTests)
gtest_add_tests(TARGET xrdcl-http-test TEST_LIST CurlTests)

# The client picks up a grid proxy from $X509_USER_PROXY or /tmp/x509up_u<uid>
# and presents it to the servers, whose test CA cannot verify it, failing the
# TLS handshake. Point the client at a path that can never exist, so that a
# proxy belonging to the user running the tests is never used.

set_tests_properties(${CurlTests} ${CurlClOnlyTests}
  PROPERTIES
    FIXTURES_REQUIRED
      XrdClHttp
    ENVIRONMENT
      "ENV_FILE=${CMAKE_BINARY_DIR}/tests/curl/setup.sh;XRD_PLUGINCONFDIR=${CMAKE_BINARY_DIR}/tests/curl/client.plugins.d;X509_USER_PROXY=/dev/null/x509"
)

######################################
# Integration tests.
######################################
add_test(NAME XrdClHttp::setup
  COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/setup.sh" curl)

set_tests_properties(XrdClHttp::setup
  PROPERTIES
    FIXTURES_SETUP
      XrdClHttp
    ENVIRONMENT
      "OPENSSL_BIN=${OPENSSL_BIN};BINARY_DIR=${CMAKE_BINARY_DIR};SOURCE_DIR=${CMAKE_SOURCE_DIR}"
)

add_test(NAME XrdClHttp::teardown
  COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/teardown.sh" curl)

set_tests_properties(XrdClHttp::teardown
  PROPERTIES
    FIXTURES_CLEANUP
      XrdClHttp
    ENVIRONMENT
      "BINARY_DIR=${CMAKE_BINARY_DIR}"
)

add_test(NAME XrdClHttp::test
  COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/test.sh" curl)

add_bats_test(XrdClHttp::tape tape.bats)

list(APPEND CURL_TEST_LOGS ${CMAKE_BINARY_DIR}/tests/curl/origin.log)
list(APPEND CURL_TEST_LOGS ${CMAKE_BINARY_DIR}/tests/curl/cache.log)
list(APPEND CURL_TEST_LOGS ${CMAKE_BINARY_DIR}/tests/curl/client.log)

set_tests_properties(XrdClHttp::test
  PROPERTIES
    FIXTURES_REQUIRED
      XrdClHttp
    ENVIRONMENT
      "BINARY_DIR=${CMAKE_BINARY_DIR}"
    ATTACHED_FILES_ON_FAIL
      "${CURL_TEST_LOGS}"
)

set_tests_properties(XrdClHttp::tape
  PROPERTIES
    FIXTURES_REQUIRED
      XrdClHttp
    ATTACHED_FILES_ON_FAIL
      "${CURL_TEST_LOGS}"
)
