| |
| # 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 |
| -lSupportTesting |
| -lTestUtils |
| nlunit-test |
| 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() |