# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.16)
project(opentelemetry-cpp-component-install-tests LANGUAGES CXX)

if(NOT INSTALL_TEST_CMAKE_OPTIONS)
  set(INSTALL_TEST_CMAKE_OPTIONS
      "-DCMAKE_CXX_STANDARD=14 -DCMAKE_BUILD_TYPE=Debug")
endif()

separate_arguments(INSTALL_TEST_CMAKE_OPTIONS)

message(
  STATUS "INSTALL_TEST_CMAKE_OPTIONS is set to ${INSTALL_TEST_CMAKE_OPTIONS}")

find_package(opentelemetry-cpp CONFIG REQUIRED)

message(
  STATUS
    "OPENTELEMETRY_CPP_COMPONENTS_INSTALLED = ${OPENTELEMETRY_CPP_COMPONENTS_INSTALLED}"
)

# Check that INSTALL_TEST_COMPONENTS is set and contains installed components
if(NOT INSTALL_TEST_COMPONENTS)
  message(
    STATUS
      "INSTALL_TEST_COMPONENTS is not set. Setting to OPENTELEMETRY_CPP_COMPONENTS_INSTALLED"
  )
  set(INSTALL_TEST_COMPONENTS ${OPENTELEMETRY_CPP_COMPONENTS_INSTALLED})
else()
  set(COMPONENTS_ARE_VALID TRUE)
  foreach(component ${INSTALL_TEST_COMPONENTS})
    if(NOT component IN_LIST OPENTELEMETRY_CPP_COMPONENTS_INSTALLED)
      message(
        ERROR
        " Component ${component} is not an installed opentelemetry-cpp component"
      )
      set(COMPONENTS_ARE_VALID FALSE)
    endif()
  endforeach()
  if(NOT COMPONENTS_ARE_VALID)
    message(FATAL_ERROR "INSTALL_TEST_COMPONENTS contains invalid components")
  endif()
endif()

message(STATUS "INSTALL_TEST_COMPONENTS = ${INSTALL_TEST_COMPONENTS}")

set(INSTALL_TEST_SRC_DIR "${CMAKE_SOURCE_DIR}/../src")

enable_testing()

# -----------------------------------------------------------
# CMake Usage tests for find_package(opentelemetry-cpp ...)
#
# 1. Test find_package with no components specified
# 2. Test find_package with components specified but not sorted in dependency
#    order
# 3. Test find_package with components specified but missing dependent components
# 4. Test find_package with components specified but including
#    unsupported/unknown components

add_test(
  NAME cmake-usage-no-components-test
  COMMAND
    ${CMAKE_COMMAND} --log-level=DEBUG -S
    ${CMAKE_SOURCE_DIR}/usage_tests/no_components -B
    build-cmake-usage-no-components-test
    "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${INSTALL_TEST_CMAKE_OPTIONS})

add_test(
  NAME cmake-usage-unsorted-components-test
  COMMAND
    ${CMAKE_COMMAND} --log-level=DEBUG -S
    ${CMAKE_SOURCE_DIR}/usage_tests/unsorted_components -B
    build-cmake-usage-unsorted-components-test
    "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${INSTALL_TEST_CMAKE_OPTIONS})

add_test(
  NAME cmake-usage-missing-components-test
  COMMAND
    ${CMAKE_COMMAND} --log-level=DEBUG -S
    ${CMAKE_SOURCE_DIR}/usage_tests/missing_components -B
    build-cmake-usage-missing-components-test
    "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${INSTALL_TEST_CMAKE_OPTIONS})

add_test(
  NAME cmake-usage-unsupported-components-test
  COMMAND
    ${CMAKE_COMMAND} --log-level=DEBUG -S
    ${CMAKE_SOURCE_DIR}/usage_tests/unsupported_components -B
    build-cmake-usage-unsupported-components-test
    "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${INSTALL_TEST_CMAKE_OPTIONS})

# -----------------------------------------------------------
# Test the full package install using legacy cmake build instructions
# find_package(opentelemetry-cpp CONFIG REQUIRED)

# Test cmake configuration
add_test(
  NAME full-package-cmake-config-test
  COMMAND
    ${CMAKE_COMMAND} --log-level=DEBUG -S ${CMAKE_SOURCE_DIR}/package_test -B
    build-full-package-test "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
    ${INSTALL_TEST_CMAKE_OPTIONS}
    "-DINSTALL_TEST_COMPONENTS=${INSTALL_TEST_COMPONENTS}"
    "-DINSTALL_TEST_SRC_DIR=${INSTALL_TEST_SRC_DIR}")

# Build the full package test executable
add_test(NAME full-package-build-test
         COMMAND ${CMAKE_COMMAND} --build
                 ${CMAKE_BINARY_DIR}/build-full-package-test --parallel)

# Run the full package test executable
add_test(NAME full-package-run-test
         COMMAND ${CMAKE_BINARY_DIR}/build-full-package-test/full_test)
# -----------------------------------------------------------

# -----------------------------------------------------------
# Loop over all the components to test
foreach(component ${INSTALL_TEST_COMPONENTS})
  # Test cmake configuration
  add_test(
    NAME component-${component}-cmake-config-test
    COMMAND
      ${CMAKE_COMMAND} --log-level=DEBUG -S
      ${CMAKE_SOURCE_DIR}/component_tests/${component} -B
      build-${component}-test "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
      ${INSTALL_TEST_CMAKE_OPTIONS}
      "-DINSTALL_TEST_SRC_DIR=${INSTALL_TEST_SRC_DIR}")

  # Build the component test executable
  add_test(NAME component-${component}-build-test
           COMMAND ${CMAKE_COMMAND} --build
                   ${CMAKE_BINARY_DIR}/build-${component}-test --parallel)

  # Run the component test executable
  add_test(
    NAME component-${component}-run-test
    COMMAND ${CMAKE_BINARY_DIR}/build-${component}-test/${component}_test)
endforeach()

set(OPENTELEMETRY_CPP_EXAMPLES_SRC_DIR "${CMAKE_SOURCE_DIR}/../../../examples")

# Configure the examples with the installed package
add_test(
  NAME examples-config-test
  COMMAND
    ${CMAKE_COMMAND} --log-level=DEBUG -S ${CMAKE_SOURCE_DIR}/examples_test -B
    examples-test "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
    ${INSTALL_TEST_CMAKE_OPTIONS}
    "-DOPENTELEMETRY_CPP_EXAMPLES_SRC_DIR=${OPENTELEMETRY_CPP_EXAMPLES_SRC_DIR}"
)

# Build the examples with the installed package
add_test(NAME examples-build-test
         COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/examples-test
                 --parallel)

# Run the examples
add_test(NAME examples-run-test
         COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/examples-test
                 ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)
