
# Defines a stand-alone elf unit test that can be executed in QEMU
#
# Parameters:
#    NAME    - the elf file name
#    LIBRARY - the library that contains the registered unit tests. 
#              for libASN1Tests.a use ASN1Tests as name.
#    EXTRA_LIBRAIRES - what else to add to link libraries, generally dependencies
#                      of $LIBRARY   
#
# The list ESP32_TEST_IMAGES keeps track of all output images that could
# be used for testing
#
# TODO: several paths are hard-coded here and could use some updates:
#      - always links to idf::main
#      - assumes esp-idf/chip/lib is where the built libraries reside
#      - assumes a "dummy.c" source exists to be able to "add_executable"
macro(esp32_unit_test)
    cmake_parse_arguments(
        UNIT_TEST
          ""                 # options
          "NAME;LIBRARY"     # one value arguments
          "EXTRA_LIBRARIES"  # multi value arguments
          ${ARGN}
    )

    ######################## Elf  binary #######################

    add_executable(${UNIT_TEST_NAME} dummy.c)

    target_link_directories(${UNIT_TEST_NAME} PUBLIC 
        ${CMAKE_CURRENT_BINARY_DIR}/esp-idf/chip/lib
    )

    target_link_libraries(${UNIT_TEST_NAME} PUBLIC
        idf::main 
        -Wl,--whole-archive ${UNIT_TEST_LIBRARY} -Wl,--no-whole-archive
        ${UNIT_TEST_EXTRA_LIBRARIES}
        -lVectorTlv
        -lTestUtils
        nlfaultinjection
    )

    add_dependencies(${UNIT_TEST_NAME} idf::main)
    add_dependencies(${UNIT_TEST_NAME} idf::chip)
    # TODO:
    #   - this does NOT properly handle dependencies  on UNIT_TEST_LIBRARY and such,
    #     so changes in the tests themselves will not re-gen

    idf_build_executable(${UNIT_TEST_NAME})

    ######################## flashable image #######################

    # This is very hacky: ESP build system will generate this, but only for the FIRST
    # executable that is used

    add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}.bin_timestamp"
      COMMAND ${ESPTOOLPY} elf2image ${ESPTOOLPY_FLASH_OPTIONS} ${esptool_elf2image_args}
          -o "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}.bin" "${UNIT_TEST_NAME}"
      COMMAND ${CMAKE_COMMAND} -E echo "Generated ${UNIT_TEST_NAME}.bin"
      COMMAND ${CMAKE_COMMAND} -E md5sum "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}" > "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}.bin_timestamp"
      DEPENDS ${UNIT_TEST_NAME}
      VERBATIM
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
      COMMENT "Generating binary image from ${UNIT_TEST_NAME}"
    )
    add_custom_target(gen_binary_${UNIT_TEST_NAME} ALL DEPENDS "${build_dir}/${UNIT_TEST_NAME}.bin_timestamp")


    ###################### Image executable in QEMU #################


    # A runnable image is a 4MB file with:
    #   bootloader at 0x1000
    #   partition table at 0x8000
    #   image at 0x10000
    add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}.img_timestamp"

      COMMAND dd if=/dev/zero bs=1024 count=4096 of=${UNIT_TEST_NAME}.img
      COMMAND dd if=${CMAKE_CURRENT_BINARY_DIR}/bootloader/bootloader.bin bs=1 seek=4096 of=${UNIT_TEST_NAME}.img conv=notrunc
      COMMAND dd if=${CMAKE_CURRENT_BINARY_DIR}/partition_table/partition-table.bin bs=1 seek=32768 of=${UNIT_TEST_NAME}.img conv=notrunc
      COMMAND dd if=${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}.bin bs=1 seek=65536 of=${UNIT_TEST_NAME}.img conv=notrunc

      COMMAND ${CMAKE_COMMAND} -E echo "Generated ${UNIT_TEST_NAME}.img"
      COMMAND ${CMAKE_COMMAND} -E md5sum "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}.img" > "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_TEST_NAME}.img_timestamp"

      DEPENDS gen_binary_${UNIT_TEST_NAME}
      VERBATIM
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
      COMMENT "Generating binary image from ${UNIT_TEST_NAME}"
    )
    add_custom_target(gen_image_${UNIT_TEST_NAME} ALL DEPENDS "${build_dir}/${UNIT_TEST_NAME}.img_timestamp")

    LIST(APPEND ESP32_TEST_IMAGES ${UNIT_TEST_NAME}.img)


    # IMAGE CAN BE RUN AS
    # $QEMU_ESP32 -nographic -no-reboot -machine esp32 -drive file=out/esp32-qemu-tests/testASN1.img,if=mtd,format=raw
endmacro()
