#[[
Copyright (c) 2025-2026 The Johns Hopkins University Applied Physics
Laboratory LLC.

This file is part of the Bundle Protocol Security Library (BSL).

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
    http://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.

This work was performed for the Jet Propulsion Laboratory, California
Institute of Technology, sponsored by the United States Government under
the prime contract 80NM0018D0004 between the Caltech and NASA under
subcontract 1700763.
]]

if(BUILD_UNITTEST OR BUILD_FUZZING)
  add_library(bsl_test_utils)
  target_sources(
      bsl_test_utils
      PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/TestUtils.h
             ${CMAKE_CURRENT_SOURCE_DIR}/DefaultScUtils.h
  )
  target_sources(
      bsl_test_utils
      PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/TestUtils.c
              ${CMAKE_CURRENT_SOURCE_DIR}/DefaultScUtils.c
  )
  set_target_properties(bsl_test_utils
      PROPERTIES
          VERSION ${CMAKE_PROJECT_VERSION}
          SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR}
  )
  target_link_libraries(bsl_test_utils PUBLIC bsl_front)
  target_link_libraries(bsl_test_utils PUBLIC bsl_dynamic)
  target_link_libraries(bsl_test_utils PUBLIC bsl_mock_bpa)
  target_include_directories(bsl_test_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
  
  install(
      TARGETS bsl_test_utils
      RUNTIME
          COMPONENT runtime
      LIBRARY
          COMPONENT runtime
          NAMELINK_COMPONENT devel
      ARCHIVE
          COMPONENT devel
  )
endif(BUILD_UNITTEST OR BUILD_FUZZING)

set(LIB_ORDERED bsl_mock_bpa bsl_crypto bsl_test_utils)

if(BUILD_UNITTEST AND NOT BUILD_FUZZING)
  set(UNITY_ROOT "${CMAKE_SOURCE_DIR}/deps/unity")
  find_package(unitytools)

  add_unity_test(SOURCE test_qcbor.c)
  target_link_libraries(test_qcbor PUBLIC ${LIB_ORDERED})
  
  add_unity_test(SOURCE test_TextUtil.c)
  target_link_libraries(test_TextUtil PUBLIC ${LIB_ORDERED})
  
  add_unity_test(SOURCE test_MockBPA_EID.c)
  target_link_libraries(test_MockBPA_EID PUBLIC ${LIB_ORDERED})
  
  add_unity_test(SOURCE test_MockBPA_Codecs.c)
  target_link_libraries(test_MockBPA_Codecs PUBLIC ${LIB_ORDERED})
  
  add_unity_test(SOURCE test_mock_bpa_crc.c)
  target_link_libraries(test_mock_bpa_crc PUBLIC ${LIB_ORDERED})
  
  add_unity_test(SOURCE test_mock_bpa_ctr.c)
  target_link_libraries(test_mock_bpa_ctr PUBLIC ${LIB_ORDERED})
  
  add_unity_test(SOURCE test_CryptoInterface.c)
  target_link_libraries(test_CryptoInterface PUBLIC ${LIB_ORDERED} OpenSSL::Crypto)

  add_unity_test(SOURCE test_AbsSecBlock.c)
  target_link_libraries(test_AbsSecBlock PUBLIC ${LIB_ORDERED})

  # Exercises the portion of the backend that interacts with the policy providers
  add_unity_test(SOURCE test_BackendSecurityContext.c)
  target_link_libraries(test_BackendSecurityContext PUBLIC ${LIB_ORDERED})

  # Exercises the portion of the backend that interacts with the security contexts
  add_unity_test(SOURCE test_BackendPolicyProvider.c)
  target_link_libraries(test_BackendPolicyProvider PUBLIC ${LIB_ORDERED})

  # Specific unit tests for ONLY the "Sample Policy Provider" module (Offered as example provider)
  add_unity_test(SOURCE test_SamplePolicyProvider.c)
  target_link_libraries(test_SamplePolicyProvider PUBLIC ${LIB_ORDERED})

  add_unity_test(SOURCE test_PolicyParser.c)
  target_link_libraries(test_PolicyParser PUBLIC ${LIB_ORDERED})
  install(
    DIRECTORY test_PolicyParser-data
    DESTINATION ${TEST_INSTALL_PREFIX}
    COMPONENT test
  )

  # Specific tests for ONLY the "Default Security Context" module (Implementation of RFC9173)
  add_unity_test(SOURCE test_DefaultSecurityContext.c)
  target_link_libraries(test_DefaultSecurityContext PUBLIC ${LIB_ORDERED})

  # Specific tests for ONLY the "COSE Context" module
  add_unity_test(SOURCE test_CoseContext.c)
  target_link_libraries(test_CoseContext PUBLIC ${LIB_ORDERED})

  # Exercises the MockBPA using the publicly exposed BSL front end
  add_unity_test(SOURCE test_PublicInterfaceImpl.c)
  target_link_libraries(test_PublicInterfaceImpl PUBLIC ${LIB_ORDERED})

  # Test user-specified dynamic mem mgmt callbacks
  add_unity_test(SOURCE test_DynamicMemCbs.c)
  target_link_libraries(test_DynamicMemCbs PUBLIC ${LIB_ORDERED})
endif(BUILD_UNITTEST AND NOT BUILD_FUZZING)

if(BUILD_FUZZING)
  add_fuzz_test(SOURCE fuzz_mock_bpa_eid_uri.cpp)
  target_link_libraries(fuzz_mock_bpa_eid_uri PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_mock_bpa_eid_cbor.cpp)
  target_link_libraries(fuzz_mock_bpa_eid_cbor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_mock_bpa_eidpat_text.cpp RUNS_COUNT 300000)
  target_link_libraries(fuzz_mock_bpa_eidpat_text PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_mock_bpa_bpv7_cbor.cpp RUNS_COUNT 300000)
  target_link_libraries(fuzz_mock_bpa_bpv7_cbor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_dynamic_asb_cbor.cpp RUNS_COUNT 2000000)
  target_link_libraries(fuzz_dynamic_asb_cbor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_CoseMsg_Mac0_cbor.cpp RUNS_COUNT 1000000)
  target_link_libraries(fuzz_CoseMsg_Mac0_cbor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_CoseMsg_Mac_cbor.cpp RUNS_COUNT 300000)
  target_link_libraries(fuzz_CoseMsg_Mac_cbor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_CoseMsg_Encrypt0_cbor.cpp RUNS_COUNT 1000000)
  target_link_libraries(fuzz_CoseMsg_Encrypt0_cbor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_CoseMsg_Encrypt_cbor.cpp RUNS_COUNT 500000)
  target_link_libraries(fuzz_CoseMsg_Encrypt_cbor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_CoseContext_bib_acceptor.cpp RUNS_COUNT 500000)
  target_link_libraries(fuzz_CoseContext_bib_acceptor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(SOURCE fuzz_CoseContext_bcb_acceptor.cpp RUNS_COUNT 200000)
  target_link_libraries(fuzz_CoseContext_bcb_acceptor PUBLIC ${LIB_ORDERED})

  add_fuzz_test(
    SOURCE fuzz_Crypto_KeyLoader_LoadJwkSet.cpp
    RUNS_COUNT 300000
    EXTRA_ARGS "-dict=libfuzzer-json.dict"
  )
  target_link_libraries(fuzz_Crypto_KeyLoader_LoadJwkSet PUBLIC ${LIB_ORDERED})

  add_fuzz_test(
    SOURCE fuzz_Crypto_KeyLoader_LoadCoseKeySet.cpp
    RUNS_COUNT 300000
  )
  target_link_libraries(fuzz_Crypto_KeyLoader_LoadCoseKeySet PUBLIC ${LIB_ORDERED})

  add_fuzz_test(
    SOURCE fuzz_PolicyParser_LoadFd.cpp
    RUNS_COUNT 300000
    EXTRA_ARGS "-dict=libfuzzer-json.dict"
  )
  target_link_libraries(fuzz_PolicyParser_LoadFd PUBLIC ${LIB_ORDERED})

endif(BUILD_FUZZING)
