diff --git a/.gitignore b/.gitignore index c256986ac..e855791af 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,8 @@ docs/man/ tools/unit-test-app/sdkconfig tools/unit-test-app/sdkconfig.old tools/unit-test-app/build +tools/unit-test-app/builds +tools/unit-test-app/output # AWS IoT Examples require device-specific certs/keys examples/protocols/aws_iot/*/main/certs/*.pem.* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index db061f4c2..ea5c5981b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -113,19 +113,17 @@ build_esp_idf_tests: <<: *build_template artifacts: paths: - - tools/unit-test-app/build/*.bin - - tools/unit-test-app/build/*.elf - - tools/unit-test-app/build/*.map - - tools/unit-test-app/build/download.config - - tools/unit-test-app/build/bootloader/*.bin + - tools/unit-test-app/output - components/idf_test/unit_test/TestCaseAll.yml - components/idf_test/unit_test/CIConfigs/*.yml expire_in: 6 mos script: - cd tools/unit-test-app - - make TESTS_ALL=1 - # cut last line in case make V=0/1 is set by default - - make print_flash_cmd | tail -n 1 > build/download.config + - make help # make sure kconfig tools are built in single process + - make ut-clean-all-configs + - export EXTRA_CFLAGS="-Werror -Werror=deprecated-declarations" + - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS} + - make ut-build-all-configs TESTS_ALL=1 - python tools/UnitTestParser.py .build_examples_template: &build_examples_template @@ -416,6 +414,9 @@ assign_test: dependencies: - build_esp_idf_tests - build_ssc + variables: + UT_BIN_PATH: "tools/unit-test-app/output" + OUTPUT_BIN_PATH: "test_bins/ESP32_IDF" artifacts: paths: - test_bins @@ -425,9 +426,10 @@ assign_test: before_script: *add_gitlab_key_before script: # first move test bins together: test_bins/CHIP_SDK/TestApp/bin_files - - mkdir -p test_bins/ESP32_IDF/UT - - cp -r tools/unit-test-app/build/* test_bins/ESP32_IDF/UT - - cp -r SSC/ssc_bin/* test_bins/ESP32_IDF + - mkdir -p $OUTPUT_BIN_PATH + # copy and rename folder name to "UT_config" + - for CONFIG in $(ls $UT_BIN_PATH); do cp -r "$UT_BIN_PATH/$CONFIG" "$OUTPUT_BIN_PATH/UT_$CONFIG"; done + - cp -r SSC/ssc_bin/* $OUTPUT_BIN_PATH # clone test script to assign tests - git clone $TEST_SCRIPT_REPOSITORY - cd auto_test_script @@ -512,42 +514,161 @@ UT_001_01: tags: - ESP32_IDF - UT_T1_1 + - UT_default UT_001_02: <<: *unit_test_template tags: - ESP32_IDF - UT_T1_1 + - UT_default UT_001_03: <<: *unit_test_template tags: - ESP32_IDF - UT_T1_1 + - UT_default UT_001_04: <<: *unit_test_template tags: - ESP32_IDF - UT_T1_1 + - UT_default UT_001_05: <<: *unit_test_template tags: - ESP32_IDF - UT_T1_SDMODE + - UT_default UT_001_06: <<: *unit_test_template tags: - ESP32_IDF - UT_T1_SPIMODE + - UT_default UT_001_07: <<: *unit_test_template tags: - ESP32_IDF - UT_T1_1 + - UT_default + +UT_001_08: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_default + +UT_002_01: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_release + +UT_002_02: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_release + +UT_002_03: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_release + +UT_002_04: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_release + +UT_002_05: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_SDMODE + - UT_release + +UT_002_06: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_SPIMODE + - UT_release + +UT_002_07: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_release + +UT_002_08: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_release + +UT_003_01: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_single_core + +UT_003_02: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_single_core + +UT_003_03: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_single_core + +UT_003_04: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_single_core + +UT_003_05: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_SDMODE + - UT_single_core + +UT_003_06: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_SPIMODE + - UT_single_core + +UT_003_07: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + - UT_single_core IT_001_01: <<: *test_template diff --git a/components/esp32/component.mk b/components/esp32/component.mk index e66cae3bc..590893a99 100644 --- a/components/esp32/component.mk +++ b/components/esp32/component.mk @@ -40,7 +40,7 @@ COMPONENT_ADD_LDFLAGS += $(COMPONENT_PATH)/libhal.a \ #The cache workaround also needs a c++ standard library recompiled with the workaround. ifdef CONFIG_SPIRAM_CACHE_WORKAROUND -COMPONENT_ADD_LDFLAGS += $(COMPONENT_PATH)/libstdcc++-cache-workaround.a +COMPONENT_ADD_LDFLAGS += $(COMPONENT_PATH)/libstdc++-psram-workaround.a endif ALL_LIB_FILES := $(patsubst %,$(COMPONENT_PATH)/lib/lib%.a,$(LIBS)) diff --git a/components/esp32/libstdcc++-cache-workaround.a b/components/esp32/libstdc++-psram-workaround.a similarity index 61% rename from components/esp32/libstdcc++-cache-workaround.a rename to components/esp32/libstdc++-psram-workaround.a index 2e57b43a1..5128ee54a 100644 Binary files a/components/esp32/libstdcc++-cache-workaround.a and b/components/esp32/libstdc++-psram-workaround.a differ diff --git a/components/esp32/sleep_modes.c b/components/esp32/sleep_modes.c index 6924b2ec2..6927716c6 100644 --- a/components/esp32/sleep_modes.c +++ b/components/esp32/sleep_modes.c @@ -231,16 +231,19 @@ esp_err_t esp_light_sleep_start() // Decide which power domains can be powered down uint32_t pd_flags = get_power_down_flags(); - // Decide if flash needs to be powered down; - // If it needs to be powered down, adjust sleep time + // Decide if VDD_SDIO needs to be powered down; + // If it needs to be powered down, adjust sleep time. const uint32_t flash_enable_time_us = VDD_SDIO_POWERUP_TO_FLASH_READ_US + CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY; + // Don't power down VDD_SDIO if pSRAM is used. +#ifndef CONFIG_SPIRAM_SUPPORT if (s_config.sleep_duration > FLASH_PD_MIN_SLEEP_TIME_US && - s_config.sleep_duration > flash_enable_time_us) { + s_config.sleep_duration > flash_enable_time_us) { pd_flags |= RTC_SLEEP_PD_VDDSDIO; s_config.sleep_duration -= flash_enable_time_us; } +#endif //CONFIG_SPIRAM_SUPPORT // Safety net: enable WDT in case exit from light sleep fails rtc_wdt_enable(1000); diff --git a/components/esp32/spiram.c b/components/esp32/spiram.c index 55e97859f..d07444a92 100644 --- a/components/esp32/spiram.c +++ b/components/esp32/spiram.c @@ -141,7 +141,7 @@ esp_err_t esp_spiram_reserve_dma_pool(size_t size) { dma_heap=heap_caps_malloc(size, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); if (!dma_heap) return ESP_ERR_NO_MEM; uint32_t caps[]={MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL, 0, MALLOC_CAP_8BIT|MALLOC_CAP_32BIT}; - return heap_caps_add_region_with_caps(caps, dma_heap, dma_heap+size-1); + return heap_caps_add_region_with_caps(caps, (intptr_t) dma_heap, (intptr_t) dma_heap+size-1); } size_t esp_spiram_get_size() diff --git a/components/esp32/test/component.mk b/components/esp32/test/component.mk index 745f8cb79..76f6f7132 100644 --- a/components/esp32/test/component.mk +++ b/components/esp32/test/component.mk @@ -12,4 +12,4 @@ test_tjpgd.o: test_tjpgd_logo.h test_tjpgd_logo.h: $(COMPONENT_PATH)/logo.jpg $(summary) XXD logo.jpg - $(Q) cd $(COMPONENT_PATH); xxd -i logo.jpg $(COMPONENT_BUILD_DIR)/test_tjpgd_logo.h + cd $(COMPONENT_PATH); xxd -i logo.jpg $(COMPONENT_BUILD_DIR)/test_tjpgd_logo.h diff --git a/components/esp32/test/test_delay.c b/components/esp32/test/test_delay.c index 7cecc0de7..b32299ec8 100644 --- a/components/esp32/test/test_delay.c +++ b/components/esp32/test/test_delay.c @@ -51,9 +51,11 @@ TEST_CASE("ets_delay produces correct delay on both CPUs", "[delay]") TEST_ASSERT( xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS) ); TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result); +#if portNUM_PROCESSORS == 2 xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void*) &args, 3, NULL, 1); TEST_ASSERT( xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS) ); TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result); +#endif ref_clock_deinit(); vSemaphoreDelete(args.done); @@ -72,9 +74,11 @@ TEST_CASE("vTaskDelay produces correct delay on both CPUs", "[delay]") TEST_ASSERT( xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS) ); TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result); +#if portNUM_PROCESSORS == 2 xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void*) &args, 3, NULL, 1); TEST_ASSERT( xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS) ); TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result); +#endif ref_clock_deinit(); vSemaphoreDelete(args.done); diff --git a/components/esp32/test/test_esp_timer.c b/components/esp32/test/test_esp_timer.c index 246aac9d8..65eb8f1e4 100644 --- a/components/esp32/test/test_esp_timer.c +++ b/components/esp32/test/test_esp_timer.c @@ -103,7 +103,7 @@ TEST_CASE("esp_timer produces correct delay", "[esp_timer]") esp_timer_delete(timer1); } -TEST_CASE("periodic ets_timer produces correct delays", "[esp_timer]") +TEST_CASE("periodic esp_timer produces correct delays", "[esp_timer]") { // no, we can't make this a const size_t (§6.7.5.2) #define NUM_INTERVALS 16 diff --git a/components/esp32/test/test_fastbus.c b/components/esp32/test/test_fastbus.c index 2b58c725b..dc5e5b312 100644 --- a/components/esp32/test/test_fastbus.c +++ b/components/esp32/test/test_fastbus.c @@ -104,7 +104,7 @@ TEST_CASE("Fast I/O bus test", "[hw][ignore]") TEST_ASSERT(0); } - PIN_PULLUP_DIS(PERIPHS_IO_MUX_SD_DATA3_U); + gpio_pullup_dis(10); PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA2_U, FUNC_SD_DATA2_U1RXD); PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA3_U, FUNC_SD_DATA3_U1TXD); diff --git a/components/esp32/test/test_fp.c b/components/esp32/test/test_fp.c index 1b88e9722..180999f9b 100644 --- a/components/esp32/test/test_fp.c +++ b/components/esp32/test/test_fp.c @@ -180,7 +180,7 @@ TEST_CASE("context switch saves FP registers", "[fp]") state.fail = 0; xTaskCreatePinnedToCore(tskTestFP, "tsk1", 2048, &state, 3, NULL, 0); xTaskCreatePinnedToCore(tskTestFP, "tsk2", 2048, &state, 3, NULL, 0); - xTaskCreatePinnedToCore(tskTestFP, "tsk3", 2048, &state, 3, NULL, 1); + xTaskCreatePinnedToCore(tskTestFP, "tsk3", 2048, &state, 3, NULL, portNUM_PROCESSORS - 1); xTaskCreatePinnedToCore(tskTestFP, "tsk4", 2048, &state, 3, NULL, 0); while (state.done != 4) { vTaskDelay(100 / portTICK_PERIOD_MS); diff --git a/components/esp32/test/test_intr_alloc.c b/components/esp32/test/test_intr_alloc.c index 23d9504d1..2eef456a5 100644 --- a/components/esp32/test/test_intr_alloc.c +++ b/components/esp32/test/test_intr_alloc.c @@ -274,7 +274,7 @@ TEST_CASE("allocate 2 handlers for a same source and remove the later one","[esp r=esp_intr_alloc(ETS_SPI2_INTR_SOURCE, ESP_INTR_FLAG_SHARED, int_handler1, &ctx, &handle1); TEST_ESP_OK(r); //try an invalid assign first - r=esp_intr_alloc(ETS_SPI2_INTR_SOURCE, NULL, int_handler2, NULL, &handle2); + r=esp_intr_alloc(ETS_SPI2_INTR_SOURCE, 0, int_handler2, NULL, &handle2); TEST_ASSERT_EQUAL_INT(r, ESP_ERR_NOT_FOUND ); //assign shared then r=esp_intr_alloc(ETS_SPI2_INTR_SOURCE, ESP_INTR_FLAG_SHARED, int_handler2, &ctx, &handle2); diff --git a/components/fatfs/test/test_fatfs_common.c b/components/fatfs/test/test_fatfs_common.c index a2f35c3db..ca27cdd4b 100644 --- a/components/fatfs/test/test_fatfs_common.c +++ b/components/fatfs/test/test_fatfs_common.c @@ -404,8 +404,10 @@ void test_fatfs_concurrent(const char* filename_prefix) printf("writing f1 and f2\n"); - xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, 1); + const int cpuid_0 = 0; + const int cpuid_1 = portNUM_PROCESSORS - 1; + xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, cpuid_1); xSemaphoreTake(args1.done, portMAX_DELAY); printf("f1 done\n"); @@ -421,10 +423,10 @@ void test_fatfs_concurrent(const char* filename_prefix) printf("reading f1 and f2, writing f3 and f4\n"); - xTaskCreatePinnedToCore(&read_write_task, "rw3", 2048, &args3, 3, NULL, 1); - xTaskCreatePinnedToCore(&read_write_task, "rw4", 2048, &args4, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, 1); + xTaskCreatePinnedToCore(&read_write_task, "rw3", 2048, &args3, 3, NULL, cpuid_1); + xTaskCreatePinnedToCore(&read_write_task, "rw4", 2048, &args4, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, cpuid_1); xSemaphoreTake(args1.done, portMAX_DELAY); printf("f1 done\n"); diff --git a/components/freertos/test/test_freertos.c b/components/freertos/test/test_freertos.c index 745e31a9a..1f9b159d0 100644 --- a/components/freertos/test/test_freertos.c +++ b/components/freertos/test/test_freertos.c @@ -164,7 +164,7 @@ static void uartRxInit(xQueueHandle q) { uint32_t reg_val; - PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U); + gpio_pullup_dis(1); PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD_U0RXD); PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD_U0TXD); diff --git a/components/freertos/test/test_freertos_isinisrcontext.c b/components/freertos/test/test_freertos_isinisrcontext.c index a163688cc..085e60ddb 100644 --- a/components/freertos/test/test_freertos_isinisrcontext.c +++ b/components/freertos/test/test_freertos_isinisrcontext.c @@ -46,7 +46,9 @@ TEST_CASE("xPortInIsrContext test", "[freertos]") { xTaskCreatePinnedToCore(testthread, "tst" , 4096, NULL, 3, NULL, 0); vTaskDelay(150 / portTICK_PERIOD_MS); +#if portNUM_PROCESSORS == 2 xTaskCreatePinnedToCore(testthread, "tst" , 4096, NULL, 3, NULL, 1); vTaskDelay(150 / portTICK_PERIOD_MS); +#endif } diff --git a/components/freertos/test/test_newlib_reent.c b/components/freertos/test/test_newlib_reent.c index e0ec4aa45..17346a697 100644 --- a/components/freertos/test/test_newlib_reent.c +++ b/components/freertos/test/test_newlib_reent.c @@ -50,7 +50,7 @@ TEST_CASE("Test for per-task non-reentrant tasks", "[freertos]") error = 0; xTaskCreatePinnedToCore(tskTestRand, "tsk1", 2048, (void *)100, 3, NULL, 0); xTaskCreatePinnedToCore(tskTestRand, "tsk2", 2048, (void *)200, 3, NULL, 0); - xTaskCreatePinnedToCore(tskTestRand, "tsk3", 2048, (void *)300, 3, NULL, 1); + xTaskCreatePinnedToCore(tskTestRand, "tsk3", 2048, (void *)300, 3, NULL, portNUM_PROCESSORS - 1); xTaskCreatePinnedToCore(tskTestRand, "tsk4", 2048, (void *)400, 3, NULL, 0); while (done != 4) { vTaskDelay(1000 / portTICK_PERIOD_MS); diff --git a/components/freertos/test/test_preemption.c b/components/freertos/test/test_preemption.c index 83ab49bf4..62625600c 100644 --- a/components/freertos/test/test_preemption.c +++ b/components/freertos/test/test_preemption.c @@ -72,6 +72,7 @@ TEST_CASE("Yield from lower priority task, same CPU", "[freertos]") } +#if portNUM_PROCESSORS == 2 TEST_CASE("Yield from lower priority task, other CPU", "[freertos]") { uint32_t trigger_ccount, yield_ccount, now_ccount, delta; @@ -106,3 +107,4 @@ TEST_CASE("Yield from lower priority task, other CPU", "[freertos]") vTaskDelete(sender_task); } } +#endif // portNUM_PROCESSORS == 2 diff --git a/components/freertos/test/test_ringbuf.c b/components/freertos/test/test_ringbuf.c index ac2e88fe5..84e115999 100644 --- a/components/freertos/test/test_ringbuf.c +++ b/components/freertos/test/test_ringbuf.c @@ -2,7 +2,7 @@ Test for multicore FreeRTOS ringbuffer. */ -#include +#include #include #include "rom/ets_sys.h" @@ -16,11 +16,8 @@ #include "soc/uart_reg.h" #include "soc/dport_reg.h" #include "soc/io_mux_reg.h" +#include "esp_intr_alloc.h" -#include -#include - -void ets_isr_unmask(uint32_t unmask); static RingbufHandle_t rb; typedef enum { @@ -32,6 +29,8 @@ typedef enum { static volatile testtype_t testtype; +intr_handle_t s_intr_handle; + static void task1(void *arg) { testtype_t oldtest; @@ -50,14 +49,14 @@ static void task1(void *arg) printf("Test %d: Timeout on send!\n", (int)testtype); } if (testtype == TST_MOSTLYEMPTY) { - vTaskDelay(1000 / portTICK_PERIOD_MS); + vTaskDelay(300 / portTICK_PERIOD_MS); } } //Send NULL event to stop other side. r = xRingbufferSend(rb, NULL, 0, 10000 / portTICK_PERIOD_MS); } while (oldtest == testtype) { - vTaskDelay(1000 / portTICK_PERIOD_MS); + vTaskDelay(300 / portTICK_PERIOD_MS); } } } @@ -85,12 +84,12 @@ static void task2(void *arg) vRingbufferReturnItem(rb, buf); } if (testtype == TST_MOSTLYFILLED) { - vTaskDelay(1000 / portTICK_PERIOD_MS); + vTaskDelay(300 / portTICK_PERIOD_MS); } } } while (oldtest == testtype) { - vTaskDelay(1000 / portTICK_PERIOD_MS); + vTaskDelay(300 / portTICK_PERIOD_MS); } } } @@ -138,24 +137,16 @@ static void uartIsrHdl(void *arg) static void uartRxInit() { - uint32_t reg_val; - PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U); - PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD_U0RXD); - PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD_U0TXD); - -// reg_val = READ_PERI_REG(UART_CONF1(0)); - reg_val = (1 << UART_RXFIFO_FULL_THRHD_S); - WRITE_PERI_REG(UART_CONF1_REG(0), reg_val); + WRITE_PERI_REG(UART_CONF1_REG(0), 1 << UART_RXFIFO_FULL_THRHD_S); CLEAR_PERI_REG_MASK(UART_INT_ENA_REG(0), UART_TXFIFO_EMPTY_INT_ENA | UART_RXFIFO_TOUT_INT_ENA); SET_PERI_REG_MASK(UART_INT_ENA_REG(0), UART_RXFIFO_FULL_INT_ENA); - printf("Enabling int %d\n", ETS_UART0_INUM); - DPORT_REG_SET_FIELD(DPORT_PRO_UART_INTR_MAP_REG, DPORT_PRO_UART_INTR_MAP, ETS_UART0_INUM); - DPORT_REG_SET_FIELD(DPORT_PRO_UART1_INTR_MAP_REG, DPORT_PRO_UART1_INTR_MAP, ETS_UART0_INUM); - - xt_set_interrupt_handler(ETS_UART0_INUM, uartIsrHdl, NULL); - xt_ints_on(1 << ETS_UART0_INUM); + ESP_ERROR_CHECK(esp_intr_alloc(ETS_UART0_INTR_SOURCE, 0, &uartIsrHdl, NULL, &s_intr_handle)); +} +static void uartRxDeinit() +{ + esp_intr_free(s_intr_handle); } static void testRingbuffer(int type) @@ -166,31 +157,32 @@ static void testRingbuffer(int type) testtype = TST_MOSTLYFILLED; - xTaskCreatePinnedToCore(task1 , "tskone" , 2048, NULL, 3, &th[0], 0); - xTaskCreatePinnedToCore(task2 , "tsktwo" , 2048, NULL, 3, &th[1], 0); + xTaskCreatePinnedToCore(task1, "tskone", 2048, NULL, 3, &th[0], 0); + xTaskCreatePinnedToCore(task2, "tsktwo", 2048, NULL, 3, &th[1], 0); uartRxInit(); printf("Press 'r' to read an event in isr, any other key to write one.\n"); printf("Test: mostlyfilled; putting 10 items in ringbuff ASAP, reading 1 a second\n"); - vTaskDelay(15000 / portTICK_PERIOD_MS); + vTaskDelay(5000 / portTICK_PERIOD_MS); printf("Test: mostlyempty; putting 10 items in ringbuff @ 1/sec, reading as fast as possible\n"); testtype = TST_MOSTLYEMPTY; - vTaskDelay(15000 / portTICK_PERIOD_MS); + vTaskDelay(5000 / portTICK_PERIOD_MS); //Shut down all the tasks for (i = 0; i < 2; i++) { vTaskDelete(th[i]); } - xt_ints_off(1 << ETS_UART0_INUM); + vRingbufferDelete(rb); + uartRxDeinit(); } // TODO: split this thing into separate orthogonal tests -TEST_CASE("FreeRTOS ringbuffer test, no splitting items", "[freertos][ignore]") +TEST_CASE("FreeRTOS ringbuffer test, no splitting items", "[freertos]") { testRingbuffer(0); } -TEST_CASE("FreeRTOS ringbuffer test, w/ splitting items", "[freertos][ignore]") +TEST_CASE("FreeRTOS ringbuffer test, w/ splitting items", "[freertos]") { testRingbuffer(1); } diff --git a/components/freertos/test/test_spinlocks.c b/components/freertos/test/test_spinlocks.c index 2ddbb07f8..68880ce93 100644 --- a/components/freertos/test/test_spinlocks.c +++ b/components/freertos/test/test_spinlocks.c @@ -62,6 +62,8 @@ TEST_CASE("portMUX recursive locks (no contention)", "[freertos]") BENCHMARK_END("no contention recursive"); } +#if portNUM_PROCESSORS == 2 + static volatile int shared_value; static portMUX_TYPE shared_mux; static xSemaphoreHandle done_sem; @@ -130,4 +132,5 @@ TEST_CASE("portMUX high contention", "[freertos]") TEST_ASSERT_EQUAL_INT(REPEAT_OPS * TOTAL_TASKS, shared_value); } +#endif // portNUM_PROCESSORS == 2 diff --git a/components/heap/test/test_heap_trace.c b/components/heap/test/test_heap_trace.c index 31b6f5882..ccec5daf7 100644 --- a/components/heap/test/test_heap_trace.c +++ b/components/heap/test/test_heap_trace.c @@ -8,13 +8,14 @@ #include #include #include -#include "esp_heap_trace.h" #include "sdkconfig.h" #include "unity.h" #ifdef CONFIG_HEAP_TRACING // only compile in heap tracing tests if tracing is enabled +#include "esp_heap_trace.h" + TEST_CASE("heap trace leak check", "[heap]") { heap_trace_record_t recs[8]; diff --git a/components/libsodium/test/component.mk b/components/libsodium/test/component.mk index 6e7c3bc7a..75a54ae81 100644 --- a/components/libsodium/test/component.mk +++ b/components/libsodium/test/component.mk @@ -25,9 +25,10 @@ COMPONENT_OBJS := test_sodium.o # Run each test case from test_sodium.c as CASENAME_xmain(). define sodium_testcase -# this generates 'warning "main" redefined' warnings at -# runtime. Only solution involves patching libsodium's cmptest.h +# This would generate 'warning "main" redefined' warnings at runtime, which are +# silenced here. Only other solution involves patching libsodium's cmptest.h. $(LS_TESTDIR)/$(1).o: CFLAGS+=-Dxmain=$(1)_xmain -Dmain=$(1)_main +$(LS_TESTDIR)/$(1).o: CPPFLAGS+=-Wp,-w ote: COMPONENT_OBJS += $(LS_TESTDIR)/$(1).o endef diff --git a/components/newlib/test/test_time.c b/components/newlib/test/test_time.c index a230a220b..8cf9bc6c3 100644 --- a/components/newlib/test/test_time.c +++ b/components/newlib/test/test_time.c @@ -11,6 +11,8 @@ #include "sdkconfig.h" +#if portNUM_PROCESSORS == 2 + // https://github.com/espressif/arduino-esp32/issues/120 TEST_CASE("Reading RTC registers on APP CPU doesn't affect clock", "[newlib]") { @@ -48,3 +50,4 @@ TEST_CASE("Reading RTC registers on APP CPU doesn't affect clock", "[newlib]") TEST_ASSERT_TRUE(xSemaphoreTake(done, 5000 / portTICK_RATE_MS)); } +#endif // portNUM_PROCESSORS == 2 diff --git a/components/partition_table/Makefile.projbuild b/components/partition_table/Makefile.projbuild index 97819aa8d..ddcd8471b 100644 --- a/components/partition_table/Makefile.projbuild +++ b/components/partition_table/Makefile.projbuild @@ -19,8 +19,9 @@ ifneq ("$(CONFIG_PARTITION_TABLE_FILENAME)","") ifndef PARTITION_TABLE_CSV_PATH # Path to partition CSV file is relative to project path for custom -# partition CSV files, but relative to component dir otherwise.$ +# partition CSV files, but relative to component dir otherwise. PARTITION_TABLE_ROOT := $(call dequote,$(if $(CONFIG_PARTITION_TABLE_CUSTOM),$(PROJECT_PATH),$(COMPONENT_PATH))) +quote := " PARTITION_TABLE_CSV_PATH := $(call dequote,$(abspath $(PARTITION_TABLE_ROOT)/$(subst $(quote),,$(CONFIG_PARTITION_TABLE_FILENAME)))) endif diff --git a/components/soc/esp32/include/soc/soc.h b/components/soc/esp32/include/soc/soc.h index 0e633821f..fe8a69b38 100644 --- a/components/soc/esp32/include/soc/soc.h +++ b/components/soc/esp32/include/soc/soc.h @@ -296,11 +296,12 @@ #define SOC_DMA_HIGH 0x40000000 // Region of memory that is byte-accessible. See esp_ptr_byte_accessible(). -#define SOC_BYTE_ACCESSIBLE_LOW 0x3FFAE000 +#define SOC_BYTE_ACCESSIBLE_LOW 0x3FF90000 #define SOC_BYTE_ACCESSIBLE_HIGH 0x40000000 -//Region of memory that is internal, as in on the same silicon die as the ESP32 CPUs (excluding RTC data region, that's checked separately.) See esp_ptr_internal(). -#define SOC_MEM_INTERNAL_LOW 0x3F400000 +//Region of memory that is internal, as in on the same silicon die as the ESP32 CPUs +//(excluding RTC data region, that's checked separately.) See esp_ptr_internal(). +#define SOC_MEM_INTERNAL_LOW 0x3FF90000 #define SOC_MEM_INTERNAL_HIGH 0x400C2000 diff --git a/components/spi_flash/cache_utils.c b/components/spi_flash/cache_utils.c index 6da7b47e1..53a0caf8e 100644 --- a/components/spi_flash/cache_utils.c +++ b/components/spi_flash/cache_utils.c @@ -287,6 +287,9 @@ static void IRAM_ATTR spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_sta IRAM_ATTR bool spi_flash_cache_enabled() { - return DPORT_REG_GET_BIT(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_CACHE_ENABLE) - && DPORT_REG_GET_BIT(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_CACHE_ENABLE); + bool result = (DPORT_REG_GET_BIT(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_CACHE_ENABLE) != 0); +#if portNUM_PROCESSORS == 2 + result = result && (DPORT_REG_GET_BIT(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_CACHE_ENABLE) != 0); +#endif + return result; } diff --git a/components/spi_flash/flash_ops.c b/components/spi_flash/flash_ops.c index afb8f407b..991b7deae 100644 --- a/components/spi_flash/flash_ops.c +++ b/components/spi_flash/flash_ops.c @@ -230,9 +230,9 @@ esp_err_t IRAM_ATTR spi_flash_write(size_t dst, const void *srcv, size_t size) /* If src buffer is 4-byte aligned as well and is not in a region that requires cache access to be enabled, we * can write directly without buffering in RAM. */ #ifdef ESP_PLATFORM - bool direct_write = ( (uintptr_t) srcc >= 0x3FFAE000 - && (uintptr_t) srcc < 0x40000000 - && ((uintptr_t) srcc + mid_off) % 4 == 0 ); + bool direct_write = esp_ptr_internal(srcc) + && esp_ptr_byte_accessible(srcc) + && ((uintptr_t) srcc + mid_off) % 4 == 0; #else bool direct_write = true; #endif @@ -395,18 +395,38 @@ esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size) size_t pad_right_src = (src + pad_left_size + mid_size) & ~3U; size_t pad_right_off = (pad_right_src - src); size_t pad_right_size = (size - pad_right_off); + +#ifdef ESP_PLATFORM + bool direct_read = esp_ptr_internal(dstc) + && esp_ptr_byte_accessible(dstc) + && ((uintptr_t) dstc + dst_mid_off) % 4 == 0; +#else + bool direct_read = true; +#endif if (mid_size > 0) { uint32_t mid_remaining = mid_size; uint32_t mid_read = 0; while (mid_remaining > 0) { uint32_t read_size = MIN(mid_remaining, MAX_READ_CHUNK); - rc = esp_rom_spiflash_read(src + src_mid_off + mid_read, (uint32_t *) (dstc + dst_mid_off + mid_read), read_size); + uint32_t read_buf[8]; + uint8_t *read_dst_final = dstc + dst_mid_off + mid_read; + uint8_t *read_dst = read_dst_final; + if (!direct_read) { + read_size = MIN(read_size, sizeof(read_buf)); + read_dst = (uint8_t *) read_buf; + } + rc = esp_rom_spiflash_read(src + src_mid_off + mid_read, + (uint32_t *) read_dst, read_size); if (rc != ESP_ROM_SPIFLASH_RESULT_OK) { goto out; } mid_remaining -= read_size; mid_read += read_size; - if (mid_remaining > 0) { + if (!direct_read) { + spi_flash_guard_end(); + memcpy(read_dst_final, read_buf, read_size); + spi_flash_guard_start(); + } else if (mid_remaining > 0) { /* Drop guard momentarily, allows other tasks to preempt */ spi_flash_guard_end(); spi_flash_guard_start(); @@ -419,7 +439,13 @@ esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size) * Note that the shift can be left (src_mid_off < dst_mid_off) or right. */ if (src_mid_off != dst_mid_off) { + if (!direct_read) { + spi_flash_guard_end(); + } memmove(dstc + src_mid_off, dstc + dst_mid_off, mid_size); + if (!direct_read) { + spi_flash_guard_start(); + } } } if (pad_left_size > 0) { @@ -429,7 +455,13 @@ esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size) goto out; } COUNTER_ADD_BYTES(read, 4); + if (!direct_read) { + spi_flash_guard_end(); + } memcpy(dstc, ((uint8_t *) &t) + (4 - pad_left_size), pad_left_size); + if (!direct_read) { + spi_flash_guard_start(); + } } if (pad_right_size > 0) { uint32_t t[2]; @@ -439,7 +471,13 @@ esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size) goto out; } COUNTER_ADD_BYTES(read, read_size); + if (!direct_read) { + spi_flash_guard_end(); + } memcpy(dstc + pad_right_off, t, pad_right_size); + if (!direct_read) { + spi_flash_guard_start(); + } } out: spi_flash_guard_end(); diff --git a/components/spi_flash/test/test_read_write.c b/components/spi_flash/test/test_read_write.c index 147e4c3c9..8b1061b96 100644 --- a/components/spi_flash/test/test_read_write.c +++ b/components/spi_flash/test/test_read_write.c @@ -27,6 +27,7 @@ #include "../cache_utils.h" #include "soc/timer_group_struct.h" #include "soc/timer_group_reg.h" +#include "esp_heap_caps.h" /* Base offset in flash for tests. */ static size_t start; @@ -217,3 +218,51 @@ TEST_CASE("Test spi_flash_write", "[spi_flash]") ESP_ERROR_CHECK(spi_flash_write(start, (char *) 0x40078000, 16)); ESP_ERROR_CHECK(spi_flash_write(start, (char *) 0x40080000, 16)); } + +#ifdef CONFIG_SPIRAM_SUPPORT + +TEST_CASE("spi_flash_read can read into buffer in external RAM", "[spi_flash]") +{ + uint8_t* buf_ext = (uint8_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + TEST_ASSERT_NOT_NULL(buf_ext); + + uint8_t* buf_int = (uint8_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + TEST_ASSERT_NOT_NULL(buf_int); + + TEST_ESP_OK(spi_flash_read(0x1000, buf_int, SPI_FLASH_SEC_SIZE)); + TEST_ESP_OK(spi_flash_read(0x1000, buf_ext, SPI_FLASH_SEC_SIZE)); + + TEST_ASSERT_EQUAL(0, memcmp(buf_ext, buf_int, SPI_FLASH_SEC_SIZE)); + free(buf_ext); + free(buf_int); +} + +TEST_CASE("spi_flash_write can write from external RAM buffer", "[spi_flash]") +{ + uint32_t* buf_ext = (uint32_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + TEST_ASSERT_NOT_NULL(buf_ext); + + srand(0); + for (size_t i = 0; i < SPI_FLASH_SEC_SIZE / sizeof(uint32_t); i++) + { + uint32_t val = rand(); + buf_ext[i] = val; + } + + uint8_t* buf_int = (uint8_t*) heap_caps_malloc(SPI_FLASH_SEC_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + TEST_ASSERT_NOT_NULL(buf_int); + + /* Write to flash from buf_ext */ + const esp_partition_t *part = get_test_data_partition(); + TEST_ESP_OK(spi_flash_erase_range(part->address, SPI_FLASH_SEC_SIZE)); + TEST_ESP_OK(spi_flash_write(part->address, buf_ext, SPI_FLASH_SEC_SIZE)); + + /* Read back to buf_int and compare */ + TEST_ESP_OK(spi_flash_read(part->address, buf_int, SPI_FLASH_SEC_SIZE)); + TEST_ASSERT_EQUAL(0, memcmp(buf_ext, buf_int, SPI_FLASH_SEC_SIZE)); + + free(buf_ext); + free(buf_int); +} + +#endif // CONFIG_SPIRAM_SUPPORT diff --git a/components/spi_flash/test/test_spi_flash.c b/components/spi_flash/test/test_spi_flash.c index f3bd3dc10..e47cdf840 100644 --- a/components/spi_flash/test/test_spi_flash.c +++ b/components/spi_flash/test/test_spi_flash.c @@ -157,7 +157,7 @@ TEST_CASE("spi flash functions can run along with IRAM interrupts", "[spi_flash] timer_enable_intr(TIMER_GROUP_0, TIMER_0); timer_start(TIMER_GROUP_0, TIMER_0); - xTaskCreatePinnedToCore(read_task, "r", 2048, &read_arg, 3, NULL, 1); + xTaskCreatePinnedToCore(read_task, "r", 2048, &read_arg, 3, NULL, portNUM_PROCESSORS - 1); xSemaphoreTake(read_arg.done, portMAX_DELAY); timer_pause(TIMER_GROUP_0, TIMER_0); diff --git a/components/spiffs/test/test_spiffs.c b/components/spiffs/test/test_spiffs.c index d60e4a54c..daf11ddc9 100644 --- a/components/spiffs/test/test_spiffs.c +++ b/components/spiffs/test/test_spiffs.c @@ -346,9 +346,10 @@ void test_spiffs_concurrent(const char* filename_prefix) read_write_test_arg_t args2 = READ_WRITE_TEST_ARG_INIT(names[1], 2); printf("writing f1 and f2\n"); - - xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, 1); + const int cpuid_0 = 0; + const int cpuid_1 = portNUM_PROCESSORS - 1; + xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, cpuid_1); xSemaphoreTake(args1.done, portMAX_DELAY); printf("f1 done\n"); @@ -364,10 +365,10 @@ void test_spiffs_concurrent(const char* filename_prefix) printf("reading f1 and f2, writing f3 and f4\n"); - xTaskCreatePinnedToCore(&read_write_task, "rw3", 2048, &args3, 3, NULL, 1); - xTaskCreatePinnedToCore(&read_write_task, "rw4", 2048, &args4, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, 1); + xTaskCreatePinnedToCore(&read_write_task, "rw3", 2048, &args3, 3, NULL, cpuid_1); + xTaskCreatePinnedToCore(&read_write_task, "rw4", 2048, &args4, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw1", 2048, &args1, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw2", 2048, &args2, 3, NULL, cpuid_1); xSemaphoreTake(args1.done, portMAX_DELAY); printf("f1 done\n"); diff --git a/components/wear_levelling/test/test_wl.c b/components/wear_levelling/test/test_wl.c index c7d29bb1a..8aa3e6f43 100644 --- a/components/wear_levelling/test/test_wl.c +++ b/components/wear_levelling/test/test_wl.c @@ -109,8 +109,10 @@ TEST_CASE("multiple tasks can access wl handle simultaneously", "[wear_levelling const size_t stack_size = 4096; printf("writing 1 and 2\n"); - xTaskCreatePinnedToCore(&read_write_task, "rw1", stack_size, &args1, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw2", stack_size, &args2, 3, NULL, 1); + const int cpuid_0 = 0; + const int cpuid_1 = portNUM_PROCESSORS - 1; + xTaskCreatePinnedToCore(&read_write_task, "rw1", stack_size, &args1, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw2", stack_size, &args2, 3, NULL, cpuid_1); xSemaphoreTake(args1.done, portMAX_DELAY); printf("f1 done\n"); @@ -125,10 +127,10 @@ TEST_CASE("multiple tasks can access wl handle simultaneously", "[wear_levelling read_write_test_arg_t args4 = READ_WRITE_TEST_ARG_INIT(3 * sector_size, 4, handle, sector_size/sizeof(uint32_t)); printf("reading 1 and 2, writing 3 and 4\n"); - xTaskCreatePinnedToCore(&read_write_task, "rw3", stack_size, &args3, 3, NULL, 1); - xTaskCreatePinnedToCore(&read_write_task, "rw4", stack_size, &args4, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw1", stack_size, &args1, 3, NULL, 0); - xTaskCreatePinnedToCore(&read_write_task, "rw2", stack_size, &args2, 3, NULL, 1); + xTaskCreatePinnedToCore(&read_write_task, "rw3", stack_size, &args3, 3, NULL, cpuid_1); + xTaskCreatePinnedToCore(&read_write_task, "rw4", stack_size, &args4, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw1", stack_size, &args1, 3, NULL, cpuid_0); + xTaskCreatePinnedToCore(&read_write_task, "rw2", stack_size, &args2, 3, NULL, cpuid_1); xSemaphoreTake(args1.done, portMAX_DELAY); printf("f1 done\n"); diff --git a/tools/unit-test-app/Makefile b/tools/unit-test-app/Makefile index 8ec75f82e..e4f05ec99 100644 --- a/tools/unit-test-app/Makefile +++ b/tools/unit-test-app/Makefile @@ -9,3 +9,96 @@ include $(IDF_PATH)/make/project.mk print_flash_cmd: echo $(ESPTOOL_WRITE_FLASH_OPTIONS) $(ESPTOOL_ALL_FLASH_ARGS) | sed -e 's:'$(PWD)/build/'::g' + +# List of unit-test-app configurations. +# Each file in configs/ directory defines a configuration. The format is the +# same as sdkconfig file. Configuration is applied on top of sdkconfig.defaults +# file from the project directory +CONFIG_NAMES := $(notdir $(wildcard configs/*)) + +# Per-config targets +CONFIG_BUILD_TARGETS := $(addprefix ut-build-,$(CONFIG_NAMES)) +CONFIG_CLEAN_TARGETS := $(addprefix ut-clean-,$(CONFIG_NAMES)) +CONFIG_APPLY_TARGETS := $(addprefix ut-apply-config-,$(CONFIG_NAMES)) + +# Build (intermediate) and output (artifact) directories +BUILDS_DIR := $(PROJECT_PATH)/builds +BINARIES_DIR := $(PROJECT_PATH)/output + +# This generates per-config targets (clean, build, apply-config). +define GenerateConfigTargets +# $(1) - configuration name +ut-clean-$(1): + rm -rf $$(BUILDS_DIR)/$(1) $$(BINARIES_DIR)/$(1) + +ut-build-$(1): $$(BINARIES_DIR)/$(1)/$$(PROJECT_NAME).bin + +ut-apply-config-$(1): + cat sdkconfig.defaults > sdkconfig + echo "" >> sdkconfig + cat configs/$(1) >> sdkconfig + $(call RunConf,conf --olddefconfig) +endef + +$(foreach config_name,$(CONFIG_NAMES), $(eval $(call GenerateConfigTargets,$(config_name)))) + +ut-build-all-configs: $(CONFIG_BUILD_TARGETS) +ut-clean-all-configs: $(CONFIG_CLEAN_TARGETS) + +# This target builds the configuration. It does not currently track dependencies, +# but is good enough for CI builds if used together with clean-all-configs. +# For local builds, use 'apply-config-NAME' target and then use normal 'all' +# and 'flash' targets. +$(BINARIES_DIR)/%/bootloader.bin \ +$(BINARIES_DIR)/%/$(PROJECT_NAME).elf \ +$(BINARIES_DIR)/%/$(PROJECT_NAME).map \ +$(BINARIES_DIR)/%/$(PROJECT_NAME).bin: configs/% + # Create build and output directories + mkdir -p $(BINARIES_DIR)/$*/bootloader + mkdir -p $(BUILDS_DIR)/$* + # Prepare configuration: top-level sdkconfig.defaults file plus the current configuration (configs/$*) + $(summary) CONFIG $(BUILDS_DIR)/$*/sdkconfig + rm -f $(BUILDS_DIR)/$*/sdkconfig + cat sdkconfig.defaults > $(BUILDS_DIR)/$*/sdkconfig.defaults + echo "" >> $(BUILDS_DIR)/$*/sdkconfig.defaults # in case there is no trailing newline in sdkconfig.defaults + cat configs/$* >> $(BUILDS_DIR)/$*/sdkconfig.defaults + # Build, tweaking paths to sdkconfig and sdkconfig.defaults + $(summary) BUILD_CONFIG $(BUILDS_DIR)/$* + $(MAKE) defconfig all \ + BUILD_DIR_BASE=$(BUILDS_DIR)/$* \ + SDKCONFIG=$(BUILDS_DIR)/$*/sdkconfig \ + SDKCONFIG_DEFAULTS=$(BUILDS_DIR)/$*/sdkconfig.defaults + $(MAKE) print_flash_cmd \ + BUILD_DIR_BASE=$(BUILDS_DIR)/$* \ + SDKCONFIG=$(BUILDS_DIR)/$*/sdkconfig \ + | sed -e 's:'$(BUILDS_DIR)/$*/'::g' \ + | tail -n 1 > $(BINARIES_DIR)/$*/download.config + # Copy files of interest to the output directory + cp $(BUILDS_DIR)/$*/bootloader/bootloader.bin $(BINARIES_DIR)/$*/bootloader/ + cp $(BUILDS_DIR)/$*/$(PROJECT_NAME).elf $(BINARIES_DIR)/$*/ + cp $(BUILDS_DIR)/$*/$(PROJECT_NAME).bin $(BINARIES_DIR)/$*/ + cp $(BUILDS_DIR)/$*/$(PROJECT_NAME).map $(BINARIES_DIR)/$*/ + cp $(BUILDS_DIR)/$*/partition_table*.bin $(BINARIES_DIR)/$*/ + cp $(BUILDS_DIR)/$*/sdkconfig $(BINARIES_DIR)/$*/ + + +ut-help: + @echo "Additional unit-test-app specific targets:" + @echo "" + @echo "make ut-build-NAME - Build unit-test-app with configuration provided in configs/NAME." + @echo " Build directory will be builds/NAME/, output binaries will be" + @echo " under output/NAME/" + @echo "make ut-clean-NAME - Remove build and output directories for configuration NAME." + @echo "" + @echo "make ut-build-all-configs - Build all configurations defined in configs/ directory." + @echo "" + @echo "make ut-apply-config-NAME - Generates configuration based on configs/NAME in sdkconfig" + @echo " file. After this, normal all/flash targets can be used." + @echo " Useful for development/debugging." + @echo "" + +help: ut-help + +.PHONY: ut-build-all-configs ut-clean-all-configs \ + $(CONFIG_BUILD_TARGETS) $(CONFIG_CLEAN_TARGETS) $(CONFIG_APPLY_TARGETS) \ + ut-help diff --git a/tools/unit-test-app/components/unity/unity_platform.c b/tools/unit-test-app/components/unity/unity_platform.c index 7b96ae4f3..f1c792e32 100644 --- a/tools/unit-test-app/components/unity/unity_platform.c +++ b/tools/unit-test-app/components/unity/unity_platform.c @@ -10,9 +10,12 @@ #include "esp_log.h" #include "soc/cpu.h" #include "esp_heap_caps.h" -#include "esp_heap_trace.h" #include "test_utils.h" +#ifdef CONFIG_HEAP_TRACING +#include "esp_heap_trace.h" +#endif + #define unity_printf ets_printf // Pointers to the head and tail of linked list of test description structs: diff --git a/tools/unit-test-app/configs/default b/tools/unit-test-app/configs/default new file mode 100644 index 000000000..bc5fdcd23 --- /dev/null +++ b/tools/unit-test-app/configs/default @@ -0,0 +1 @@ +# default config — nothing to set here diff --git a/tools/unit-test-app/configs/release b/tools/unit-test-app/configs/release new file mode 100644 index 000000000..6e178910f --- /dev/null +++ b/tools/unit-test-app/configs/release @@ -0,0 +1,2 @@ +CONFIG_OPTIMIZATION_LEVEL_RELEASE=y +CONFIG_OPTIMIZATION_ASSERTIONS_SILENT=y diff --git a/tools/unit-test-app/configs/single_core b/tools/unit-test-app/configs/single_core new file mode 100644 index 000000000..d9a4763e1 --- /dev/null +++ b/tools/unit-test-app/configs/single_core @@ -0,0 +1,2 @@ +CONFIG_MEMMAP_SMP=n +CONFIG_FREERTOS_UNICORE=y diff --git a/tools/unit-test-app/sdkconfig b/tools/unit-test-app/sdkconfig deleted file mode 100644 index d9315630b..000000000 --- a/tools/unit-test-app/sdkconfig +++ /dev/null @@ -1,478 +0,0 @@ -# -# Automatically generated file; DO NOT EDIT. -# Espressif IoT Development Framework Configuration -# - -# -# SDK tool configuration -# -CONFIG_TOOLPREFIX="xtensa-esp32-elf-" -CONFIG_PYTHON="python" -CONFIG_MAKE_WARN_UNDEFINED_VARIABLES=y - -# -# Bootloader config -# -CONFIG_LOG_BOOTLOADER_LEVEL_NONE= -CONFIG_LOG_BOOTLOADER_LEVEL_ERROR= -CONFIG_LOG_BOOTLOADER_LEVEL_WARN=y -CONFIG_LOG_BOOTLOADER_LEVEL_INFO= -CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG= -CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE= -CONFIG_LOG_BOOTLOADER_LEVEL=2 - -# -# Security features -# -CONFIG_SECURE_BOOT_ENABLED= -CONFIG_FLASH_ENCRYPTION_ENABLED= - -# -# Serial flasher config -# -CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0" -CONFIG_ESPTOOLPY_BAUD_115200B= -CONFIG_ESPTOOLPY_BAUD_230400B= -CONFIG_ESPTOOLPY_BAUD_921600B=y -CONFIG_ESPTOOLPY_BAUD_2MB= -CONFIG_ESPTOOLPY_BAUD_OTHER= -CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 -CONFIG_ESPTOOLPY_BAUD=921600 -CONFIG_ESPTOOLPY_COMPRESSED=y -CONFIG_FLASHMODE_QIO= -CONFIG_FLASHMODE_QOUT= -CONFIG_FLASHMODE_DIO=y -CONFIG_FLASHMODE_DOUT= -CONFIG_ESPTOOLPY_FLASHMODE="dio" -CONFIG_ESPTOOLPY_FLASHFREQ_80M= -CONFIG_ESPTOOLPY_FLASHFREQ_40M=y -CONFIG_ESPTOOLPY_FLASHFREQ_26M= -CONFIG_ESPTOOLPY_FLASHFREQ_20M= -CONFIG_ESPTOOLPY_FLASHFREQ="40m" -CONFIG_ESPTOOLPY_FLASHSIZE_1MB= -CONFIG_ESPTOOLPY_FLASHSIZE_2MB= -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y -CONFIG_ESPTOOLPY_FLASHSIZE_8MB= -CONFIG_ESPTOOLPY_FLASHSIZE_16MB= -CONFIG_ESPTOOLPY_FLASHSIZE="4MB" -CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y -CONFIG_ESPTOOLPY_BEFORE_RESET=y -CONFIG_ESPTOOLPY_BEFORE_NORESET= -CONFIG_ESPTOOLPY_BEFORE="default_reset" -CONFIG_ESPTOOLPY_AFTER_RESET=y -CONFIG_ESPTOOLPY_AFTER_NORESET= -CONFIG_ESPTOOLPY_AFTER="hard_reset" -CONFIG_MONITOR_BAUD_9600B= -CONFIG_MONITOR_BAUD_57600B= -CONFIG_MONITOR_BAUD_115200B=y -CONFIG_MONITOR_BAUD_230400B= -CONFIG_MONITOR_BAUD_921600B= -CONFIG_MONITOR_BAUD_2MB= -CONFIG_MONITOR_BAUD_OTHER= -CONFIG_MONITOR_BAUD_OTHER_VAL=115200 -CONFIG_MONITOR_BAUD=115200 - -# -# Partition Table -# -CONFIG_PARTITION_TABLE_SINGLE_APP= -CONFIG_PARTITION_TABLE_TWO_OTA= -CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partition_table_unit_test_app.csv" -CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000 -CONFIG_PARTITION_TABLE_FILENAME="partition_table_unit_test_app.csv" -CONFIG_APP_OFFSET=0x10000 - -# -# Compiler options -# -CONFIG_OPTIMIZATION_LEVEL_DEBUG=y -CONFIG_OPTIMIZATION_LEVEL_RELEASE= -CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y -CONFIG_OPTIMIZATION_ASSERTIONS_SILENT= -CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED= -CONFIG_CXX_EXCEPTIONS= - -# -# Component config -# - -# -# Application Level Tracing -# -CONFIG_ESP32_APPTRACE_DEST_TRAX= -CONFIG_ESP32_APPTRACE_DEST_NONE=y -CONFIG_ESP32_APPTRACE_ENABLE= -CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y - -# -# FreeRTOS SystemView Tracing -# -CONFIG_AWS_IOT_SDK= -CONFIG_BT_ENABLED= -CONFIG_BT_RESERVE_DRAM=0 - -# -# ESP32-specific -# -CONFIG_ESP32_DEFAULT_CPU_FREQ_80= -CONFIG_ESP32_DEFAULT_CPU_FREQ_160= -CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y -CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 -CONFIG_MEMMAP_SMP=y -CONFIG_SPIRAM_SUPPORT= -CONFIG_MEMMAP_TRACEMEM= -CONFIG_MEMMAP_TRACEMEM_TWOBANKS= -CONFIG_ESP32_TRAX= -CONFIG_TRACEMEM_RESERVE_DRAM=0x0 -CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH= -CONFIG_ESP32_ENABLE_COREDUMP_TO_UART= -CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y -CONFIG_ESP32_ENABLE_COREDUMP= -CONFIG_TWO_UNIVERSAL_MAC_ADDRESS= -CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y -CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 -CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2048 -CONFIG_MAIN_TASK_STACK_SIZE=4096 -CONFIG_IPC_TASK_STACK_SIZE=1024 -CONFIG_TIMER_TASK_STACK_SIZE=4096 -CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y -CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF= -CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR= -CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF= -CONFIG_NEWLIB_STDIN_LINE_ENDING_LF= -CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y -CONFIG_NEWLIB_NANO_FORMAT= -CONFIG_CONSOLE_UART_DEFAULT=y -CONFIG_CONSOLE_UART_CUSTOM= -CONFIG_CONSOLE_UART_NONE= -CONFIG_CONSOLE_UART_NUM=0 -CONFIG_CONSOLE_UART_BAUDRATE=115200 -CONFIG_ULP_COPROC_ENABLED=y -CONFIG_ULP_COPROC_RESERVE_MEM=512 -CONFIG_ESP32_PANIC_PRINT_HALT= -CONFIG_ESP32_PANIC_PRINT_REBOOT=y -CONFIG_ESP32_PANIC_SILENT_REBOOT= -CONFIG_ESP32_PANIC_GDBSTUB= -CONFIG_ESP32_DEBUG_OCDAWARE=y -CONFIG_INT_WDT=y -CONFIG_INT_WDT_TIMEOUT_MS=300 -CONFIG_INT_WDT_CHECK_CPU1=y -CONFIG_TASK_WDT= -CONFIG_BROWNOUT_DET=y -CONFIG_BROWNOUT_DET_LVL_SEL_0=y -CONFIG_BROWNOUT_DET_LVL_SEL_1= -CONFIG_BROWNOUT_DET_LVL_SEL_2= -CONFIG_BROWNOUT_DET_LVL_SEL_3= -CONFIG_BROWNOUT_DET_LVL_SEL_4= -CONFIG_BROWNOUT_DET_LVL_SEL_5= -CONFIG_BROWNOUT_DET_LVL_SEL_6= -CONFIG_BROWNOUT_DET_LVL_SEL_7= -CONFIG_BROWNOUT_DET_LVL=0 -CONFIG_ESP32_TIME_SYSCALL_USE_RTC= -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y -CONFIG_ESP32_TIME_SYSCALL_USE_FRC1= -CONFIG_ESP32_TIME_SYSCALL_USE_NONE= -CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y -CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL= -CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 -CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP32_XTAL_FREQ_40= -CONFIG_ESP32_XTAL_FREQ_26= -CONFIG_ESP32_XTAL_FREQ_AUTO=y -CONFIG_ESP32_XTAL_FREQ=0 -CONFIG_DISABLE_BASIC_ROM_CONSOLE= -CONFIG_NO_BLOBS= - -# -# Wi-Fi -# -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=0 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER= -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 -CONFIG_ESP32_WIFI_AMPDU_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 -CONFIG_ESP32_WIFI_RX_BA_WIN=6 -CONFIG_ESP32_WIFI_NVS_ENABLED=y - -# -# PHY -# -CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y -CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION= -CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 -CONFIG_ESP32_PHY_MAX_TX_POWER=20 - -# -# Ethernet -# -CONFIG_DMA_RX_BUF_NUM=10 -CONFIG_DMA_TX_BUF_NUM=10 -CONFIG_EMAC_L2_TO_L3_RX_BUF_MODE= -CONFIG_EMAC_TASK_PRIORITY=20 - -# -# FAT Filesystem support -# -CONFIG_FATFS_CODEPAGE_ASCII=y -CONFIG_FATFS_CODEPAGE_437= -CONFIG_FATFS_CODEPAGE_720= -CONFIG_FATFS_CODEPAGE_737= -CONFIG_FATFS_CODEPAGE_771= -CONFIG_FATFS_CODEPAGE_775= -CONFIG_FATFS_CODEPAGE_850= -CONFIG_FATFS_CODEPAGE_852= -CONFIG_FATFS_CODEPAGE_855= -CONFIG_FATFS_CODEPAGE_857= -CONFIG_FATFS_CODEPAGE_860= -CONFIG_FATFS_CODEPAGE_861= -CONFIG_FATFS_CODEPAGE_862= -CONFIG_FATFS_CODEPAGE_863= -CONFIG_FATFS_CODEPAGE_864= -CONFIG_FATFS_CODEPAGE_865= -CONFIG_FATFS_CODEPAGE_866= -CONFIG_FATFS_CODEPAGE_869= -CONFIG_FATFS_CODEPAGE_932= -CONFIG_FATFS_CODEPAGE_936= -CONFIG_FATFS_CODEPAGE_949= -CONFIG_FATFS_CODEPAGE_950= -CONFIG_FATFS_CODEPAGE=1 -CONFIG_FATFS_MAX_LFN=255 - -# -# FreeRTOS -# -CONFIG_FREERTOS_UNICORE= -CONFIG_FREERTOS_CORETIMER_0=y -CONFIG_FREERTOS_CORETIMER_1= -CONFIG_FREERTOS_HZ=1000 -CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y -CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE= -CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL= -CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y -CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y -CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y -CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3 -CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y -CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE= -CONFIG_FREERTOS_ASSERT_DISABLE= -CONFIG_FREERTOS_BREAK_ON_SCHEDULER_START_JTAG=y -CONFIG_ENABLE_MEMORY_DEBUG= -CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024 -CONFIG_FREERTOS_ISR_STACKSIZE=1536 -CONFIG_FREERTOS_LEGACY_HOOKS= -CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -CONFIG_SUPPORT_STATIC_ALLOCATION= -CONFIG_TIMER_TASK_PRIORITY=1 -CONFIG_TIMER_TASK_STACK_DEPTH=2048 -CONFIG_TIMER_QUEUE_LENGTH=10 -CONFIG_FREERTOS_DEBUG_INTERNALS= - -# -# Heap memory debugging -# -CONFIG_HEAP_POISONING_DISABLED= -CONFIG_HEAP_POISONING_LIGHT= -CONFIG_HEAP_POISONING_COMPREHENSIVE=y -CONFIG_HEAP_TRACING= - -# -# libsodium -# -CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y - -# -# Log output -# -CONFIG_LOG_DEFAULT_LEVEL_NONE= -CONFIG_LOG_DEFAULT_LEVEL_ERROR= -CONFIG_LOG_DEFAULT_LEVEL_WARN= -CONFIG_LOG_DEFAULT_LEVEL_INFO=y -CONFIG_LOG_DEFAULT_LEVEL_DEBUG= -CONFIG_LOG_DEFAULT_LEVEL_VERBOSE= -CONFIG_LOG_DEFAULT_LEVEL=3 -CONFIG_LOG_COLORS=y - -# -# LWIP -# -CONFIG_L2_TO_L3_COPY= -CONFIG_LWIP_MAX_SOCKETS=4 -CONFIG_LWIP_SO_REUSE= -CONFIG_LWIP_SO_RCVBUF= -CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1 -CONFIG_LWIP_IP_FRAG= -CONFIG_LWIP_IP_REASSEMBLY= -CONFIG_LWIP_STATS= -CONFIG_LWIP_ETHARP_TRUST_IP_MAC=y -CONFIG_TCPIP_RECVMBOX_SIZE=32 - -# -# TCP -# -CONFIG_TCP_MAXRTX=12 -CONFIG_TCP_SYNMAXRTX=6 -CONFIG_TCP_MSS=1436 -CONFIG_TCP_MSL=60000 -CONFIG_TCP_SND_BUF_DEFAULT=5744 -CONFIG_TCP_WND_DEFAULT=5744 -CONFIG_TCP_RECVMBOX_SIZE=6 -CONFIG_TCP_QUEUE_OOSEQ=y -CONFIG_TCP_OVERSIZE_MSS=y -CONFIG_TCP_OVERSIZE_QUARTER_MSS= -CONFIG_TCP_OVERSIZE_DISABLE= - -# -# UDP -# -CONFIG_UDP_RECVMBOX_SIZE=6 -CONFIG_LWIP_DHCP_DOES_ARP_CHECK= -CONFIG_TCPIP_TASK_STACK_SIZE=2048 -CONFIG_PPP_SUPPORT= - -# -# ICMP -# -CONFIG_LWIP_MULTICAST_PING= -CONFIG_LWIP_BROADCAST_PING= - -# -# mbedTLS -# -CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384 -CONFIG_MBEDTLS_DEBUG= -CONFIG_MBEDTLS_HARDWARE_AES=y -CONFIG_MBEDTLS_HARDWARE_MPI=y -CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y -CONFIG_MBEDTLS_HARDWARE_SHA=y -CONFIG_MBEDTLS_HAVE_TIME=y -CONFIG_MBEDTLS_HAVE_TIME_DATE= -CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y -CONFIG_MBEDTLS_TLS_SERVER_ONLY= -CONFIG_MBEDTLS_TLS_CLIENT_ONLY= -CONFIG_MBEDTLS_TLS_DISABLED= -CONFIG_MBEDTLS_TLS_SERVER=y -CONFIG_MBEDTLS_TLS_CLIENT=y -CONFIG_MBEDTLS_TLS_ENABLED=y - -# -# TLS Key Exchange Methods -# -CONFIG_MBEDTLS_PSK_MODES= -CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y -CONFIG_MBEDTLS_SSL_RENEGOTIATION=y -CONFIG_MBEDTLS_SSL_PROTO_SSL3= -CONFIG_MBEDTLS_SSL_PROTO_TLS1=y -CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y -CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y -CONFIG_MBEDTLS_SSL_PROTO_DTLS= -CONFIG_MBEDTLS_SSL_ALPN=y -CONFIG_MBEDTLS_SSL_SESSION_TICKETS=y - -# -# Symmetric Ciphers -# -CONFIG_MBEDTLS_AES_C=y -CONFIG_MBEDTLS_CAMELLIA_C= -CONFIG_MBEDTLS_DES_C= -CONFIG_MBEDTLS_RC4_DISABLED=y -CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT= -CONFIG_MBEDTLS_RC4_ENABLED= -CONFIG_MBEDTLS_BLOWFISH_C= -CONFIG_MBEDTLS_XTEA_C= -CONFIG_MBEDTLS_CCM_C=y -CONFIG_MBEDTLS_GCM_C=y -CONFIG_MBEDTLS_RIPEMD160_C= - -# -# Certificates -# -CONFIG_MBEDTLS_PEM_PARSE_C=y -CONFIG_MBEDTLS_PEM_WRITE_C=y -CONFIG_MBEDTLS_X509_CRL_PARSE_C=y -CONFIG_MBEDTLS_X509_CSR_PARSE_C=y -CONFIG_MBEDTLS_ECP_C=y -CONFIG_MBEDTLS_ECDH_C=y -CONFIG_MBEDTLS_ECDSA_C=y -CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y -CONFIG_MBEDTLS_ECP_NIST_OPTIM=y - -# -# OpenSSL -# -CONFIG_OPENSSL_DEBUG= -CONFIG_OPENSSL_ASSERT_DO_NOTHING=y -CONFIG_OPENSSL_ASSERT_EXIT= - -# -# PThreads -# -CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 -CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=2048 - -# -# SPI Flash driver -# -CONFIG_SPI_FLASH_ENABLE_COUNTERS= -CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y - -# -# SPIFFS Configuration -# -CONFIG_SPIFFS_MAX_PARTITIONS=3 - -# -# SPIFFS Cache Configuration -# -CONFIG_SPIFFS_CACHE=y -CONFIG_SPIFFS_CACHE_WR=y -CONFIG_SPIFFS_CACHE_STATS= -CONFIG_SPIFFS_PAGE_CHECK=y -CONFIG_SPIFFS_GC_MAX_RUNS=10 -CONFIG_SPIFFS_GC_STATS= -CONFIG_SPIFFS_OBJ_NAME_LEN=32 -CONFIG_SPIFFS_USE_MAGIC=y -CONFIG_SPIFFS_USE_MAGIC_LENGTH=y - -# -# Debug Configuration -# -CONFIG_SPIFFS_DBG= -CONFIG_SPIFFS_API_DBG= -CONFIG_SPIFFS_GC_DBG= -CONFIG_SPIFFS_CACHE_DBG= -CONFIG_SPIFFS_CHECK_DBG= -CONFIG_SPIFFS_TEST_VISUALISATION= - -# -# tcpip adapter -# -CONFIG_IP_LOST_TIMER_INTERVAL=120 - -# -# Wear Levelling -# -CONFIG_WL_SECTOR_SIZE_512= -CONFIG_WL_SECTOR_SIZE_4096=y -CONFIG_WL_SECTOR_SIZE=4096 diff --git a/tools/unit-test-app/sdkconfig.defaults b/tools/unit-test-app/sdkconfig.defaults new file mode 100644 index 000000000..00f2a865f --- /dev/null +++ b/tools/unit-test-app/sdkconfig.defaults @@ -0,0 +1,20 @@ +CONFIG_LOG_BOOTLOADER_LEVEL_WARN=y +CONFIG_ESPTOOLPY_BAUD_921600B=y +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=n +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partition_table_unit_test_app.csv" +CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000 +CONFIG_PARTITION_TABLE_FILENAME="partition_table_unit_test_app.csv" +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_XTAL_FREQ_AUTO=y +CONFIG_FREERTOS_HZ=1000 +CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3 +CONFIG_HEAP_POISONING_COMPREHENSIVE=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_SPI_FLASH_ENABLE_COUNTERS=y +CONFIG_ULP_COPROC_ENABLED=y +CONFIG_TASK_WDT=n diff --git a/tools/unit-test-app/tools/UnitTestParser.py b/tools/unit-test-app/tools/UnitTestParser.py index dd7f4417c..286468654 100644 --- a/tools/unit-test-app/tools/UnitTestParser.py +++ b/tools/unit-test-app/tools/UnitTestParser.py @@ -14,7 +14,6 @@ TEST_CASE_PATTERN = { "SDK": "ESP32_IDF", "level": "Unit", "execution time": 0, - "Test App": "UT", "auto test": "Yes", "category": "Function", "test point 1": "basic function", @@ -36,20 +35,31 @@ class Parser(object): TAG_PATTERN = re.compile("([^=]+)(=)?(.+)?") DESCRIPTION_PATTERN = re.compile("\[([^]\[]+)\]") + # file path (relative to idf path) + TAG_DEF_FILE = os.path.join("tools", "unit-test-app", "tools", "TagDefinition.yml") + MODULE_DEF_FILE = os.path.join("tools", "unit-test-app", "tools", "ModuleDefinition.yml") + MODULE_ARTIFACT_FILE = os.path.join("components", "idf_test", "ModuleDefinition.yml") + TEST_CASE_FILE = os.path.join("components", "idf_test", "unit_test", "TestCaseAll.yml") + UT_BIN_FOLDER = os.path.join("tools", "unit-test-app", "builds") + ELF_FILE = "unit-test-app.elf" + APP_NAME_PREFIX = "UT_" + def __init__(self, idf_path=os.getenv("IDF_PATH")): self.test_env_tags = {} self.unit_jobs = {} self.file_name_cache = {} self.idf_path = idf_path - self.tag_def = yaml.load(open(os.path.join(idf_path, "tools", "unit-test-app", "tools", - "TagDefinition.yml"), "r")) - self.module_map = yaml.load(open(os.path.join(idf_path, "tools", "unit-test-app", "tools", - "ModuleDefinition.yml"), "r")) + self.tag_def = yaml.load(open(os.path.join(idf_path, self.TAG_DEF_FILE), "r")) + self.module_map = yaml.load(open(os.path.join(idf_path, self.MODULE_DEF_FILE), "r")) + # used to check if duplicated test case names + self.test_case_names = set() + self.parsing_errors = [] - def parse_test_cases_from_elf(self, elf_file): + def parse_test_cases_from_elf(self, elf_file, app_name): """ - parse test cases from elf and save test cases to unit test folder + parse test cases from elf and save test cases need to be executed to unit test folder :param elf_file: elf file path + :param app_name: built unit test app name """ subprocess.check_output('xtensa-esp32-elf-objdump -t {} | grep \ test_desc > case_address.tmp'.format(elf_file), shell=True) @@ -71,25 +81,37 @@ class Parser(object): desc = table.get_string("any", desc_addr) file_name = table.get_string("any", file_name_addr) - tc = self.parse_one_test_case(name, desc, file_name) + tc = self.parse_one_test_case(name, desc, file_name, app_name) + + # check if duplicated case names + # we need to use it to select case, + # if duplicated IDs, Unity could select incorrect case to run + # and we need to check all cases no matter if it's going te be executed by CI + # also add app_name here, we allow same case for different apps + if (tc["summary"] + app_name) in self.test_case_names: + self.parsing_errors.append("duplicated test case ID: " + tc["summary"]) + else: + self.test_case_names.add(tc["summary"] + app_name) + if tc["CI ready"] == "Yes": # update test env list and the cases of same env list if tc["test environment"] in self.test_env_tags: self.test_env_tags[tc["test environment"]].append(tc["ID"]) else: self.test_env_tags.update({tc["test environment"]: [tc["ID"]]}) - test_cases.append(tc) + # only add cases need to be executed + test_cases.append(tc) os.remove("section_table.tmp") os.remove("case_address.tmp") - self.dump_test_cases(test_cases) + return test_cases def parse_case_properities(self, tags_raw): """ parse test case tags (properities) with the following rules: * first tag is always group of test cases, it's mandatory - * the rest tags should be [type=value]. + * the rest tags should be [type=value]. * if the type have default value, then [type] equal to [type=default_value]. * if the type don't don't exist, then equal to [type=omitted_value] default_value and omitted_value are defined in TagDefinition.yml @@ -123,21 +145,22 @@ class Parser(object): pass return p - def parse_one_test_case(self, name, description, file_name): + def parse_one_test_case(self, name, description, file_name, app_name): """ parse one test case :param name: test case name (summary) :param description: test case description (tag string) :param file_name: the file defines this test case + :param app_name: built unit test app name :return: parsed test case """ prop = self.parse_case_properities(description) - + idf_path = os.getenv("IDF_PATH") - + # use relative file path to IDF_PATH, to make sure file path is consist relative_file_path = os.path.relpath(file_name, idf_path) - + file_name_hash = int(hashlib.sha256(relative_file_path).hexdigest(), base=16) % 1000 if file_name_hash in self.file_name_cache: @@ -149,8 +172,10 @@ class Parser(object): self.module_map[prop["module"]]['sub module abbr'], file_name_hash, self.file_name_cache[file_name_hash]) + test_case = deepcopy(TEST_CASE_PATTERN) - test_case.update({"module": self.module_map[prop["module"]]['module'], + test_case.update({"Test App": self.APP_NAME_PREFIX + app_name, + "module": self.module_map[prop["module"]]['module'], "CI ready": "No" if prop["ignore"] == "Yes" else "Yes", "cmd set": ["IDFUnitTest/UnitTest", [name]], "ID": tc_id, @@ -166,15 +191,28 @@ class Parser(object): dump parsed test cases to YAML file for test bench input :param test_cases: parsed test cases """ - with open(os.path.join(self.idf_path, "components", "idf_test", "unit_test", "TestCaseAll.yml"), "wb+") as f: + with open(os.path.join(self.idf_path, self.TEST_CASE_FILE), "wb+") as f: yaml.dump({"test cases": test_cases}, f, allow_unicode=True, default_flow_style=False) def copy_module_def_file(self): """ copy module def file to artifact path """ - src = os.path.join(self.idf_path, "tools", "unit-test-app", "tools", "ModuleDefinition.yml") - dst = os.path.join(self.idf_path, "components", "idf_test") + src = os.path.join(self.idf_path, self.MODULE_DEF_FILE) + dst = os.path.join(self.idf_path, self.MODULE_ARTIFACT_FILE) shutil.copy(src, dst) + def parse_test_cases(self): + """ parse test cases from multiple built unit test apps """ + test_cases = [] + + test_app_folder = os.path.join(self.idf_path, self.UT_BIN_FOLDER) + test_apps = os.listdir(test_app_folder) + for app in test_apps: + elf_file = os.path.join(test_app_folder, app, self.ELF_FILE) + if os.path.exists(elf_file): + test_cases.extend(self.parse_test_cases_from_elf(elf_file, app)) + + self.dump_test_cases(test_cases) + def test_parser(): parser = Parser() @@ -210,12 +248,16 @@ def main(): test_parser() idf_path = os.getenv("IDF_PATH") - elf_path = os.path.join(idf_path, "tools", "unit-test-app", "build", "unit-test-app.elf") parser = Parser(idf_path) - parser.parse_test_cases_from_elf(elf_path) + parser.parse_test_cases() parser.copy_module_def_file() + if len(parser.parsing_errors) > 0: + for error in parser.parsing_errors: + print error + exit(-1) if __name__ == '__main__': main() +