Explorar o código

Merge branch 'test/move_sdio_to_pytest_app' into 'master'

sdio: move sdio related test case to it's own pytest app

Closes IDF-5501 and IDFCI-1377

See merge request espressif/esp-idf!19314
morris %!s(int64=3) %!d(string=hai) anos
pai
achega
f080d647cc

+ 1 - 2
.gitlab/ci/dependencies/dependencies.yml

@@ -134,9 +134,8 @@ build:integration_test:
     - - bt        # example_test_005
       - wifi      # example_test_002, example_test*wifi*
       - ethernet  # example_test*ethernet*
-      - sdio      # UT_044, UT_045
+      - sdio      # component_ut_pytest_esp32_sdio
       - usb       # USB Device & Host tests
-      - spi_multi # UT_C2_SPI_DUAL
       - adc       # component_ut_pytest_esp32x_adc
       - i154
   patterns:

+ 2 - 25
.gitlab/ci/rules.yml

@@ -229,9 +229,9 @@
   - "components/esp_netif/**/*"
   - "components/lwip/**/*"
 
-# for jobs: UT_044, UT_045
+# for jobs: component_ut_pytest_esp32_sdio
 .patterns-unit_test-sdio: &patterns-unit_test-sdio
-  - "components/esp_serial_slave_link/**/*"
+  - "components/hal/**/*"
   - "components/driver/**/*"
   - "components/sdmmc/**/*"
 
@@ -243,13 +243,6 @@
   - "examples/peripherals/usb/host/**/**/**/*"
   - "examples/peripherals/usb/device/**/**/*"
 
-# for job: unit_test-spi_multi which has only one runner
-.patterns-unit_test-spi_multi: &patterns-unit_test-spi_multi
-  - "components/esp_serial_slave_link/**/*"
-  - "components/driver/**/*"
-  - "components/hal/**/*"
-  - "examples/peripherals/spi_slave*/**/*"
-
 # for jobs: component_ut_pytest_esp32x_adc:
 .patterns-component_ut-adc: &patterns-component_ut-adc
   - "components/esp_adc/**/*"
@@ -1294,8 +1287,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:build:unit_test:
   rules:
@@ -1327,8 +1318,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:build:unit_test-esp32:
   rules:
@@ -1354,8 +1343,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:build:unit_test-esp32c2:
   rules:
@@ -1380,8 +1367,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:build:unit_test-esp32c3:
   rules:
@@ -1406,8 +1391,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:build:unit_test-esp32c6:
   rules:
@@ -1432,8 +1415,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:build:unit_test-esp32s2:
   rules:
@@ -1458,8 +1439,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:build:unit_test-esp32s3:
   rules:
@@ -1484,8 +1463,6 @@
       changes: *patterns-unit_test
     - <<: *if-dev-push
       changes: *patterns-unit_test-sdio
-    - <<: *if-dev-push
-      changes: *patterns-unit_test-spi_multi
 
 .rules:labels-protected:lan8720:
   rules:

+ 8 - 17
.gitlab/ci/target-test.yml

@@ -322,6 +322,14 @@ component_ut_pytest_esp32_adc:
     - build_pytest_components_esp32
   tags: [ esp32, adc ]
 
+component_ut_pytest_esp32_sdio:
+  extends:
+    - .pytest_components_dir_template
+    - .rules:test:unit_test-esp32-sdio
+  needs:
+    - build_pytest_components_esp32
+  tags: [ esp32, sdio_master_slave ]
+
 component_ut_pytest_esp32_ip101:
   extends:
     - .pytest_components_dir_template
@@ -1061,23 +1069,6 @@ UT_043:
     - UT_T1_32kXTAL
     - psram
 
-UT_044:
-  extends:
-    - .unit_test_esp32_template
-    - .rules:test:unit_test-esp32-sdio
-  tags:
-    - ESP32_IDF
-    - UT_SDIO
-
-UT_045:
-  extends:
-    - .unit_test_esp32_template
-    - .rules:test:unit_test-esp32-sdio
-  tags:
-    - ESP32_IDF
-    - UT_SDIO
-    - psram
-
 UT_S2_SDSPI:
   extends: .unit_test_esp32s2_template
   tags:

+ 6 - 0
components/driver/.build-test-rules.yml

@@ -63,6 +63,12 @@ components/driver/test_apps/rs485:
       temporary: true
       reason: lack of runners
 
+components/driver/test_apps/sdio:
+  disable:
+    - if: SOC_SDIO_SLAVE_SUPPORTED != 1
+      temporary: true
+      reason: Not supported.
+
 components/driver/test_apps/sdm:
   disable:
     - if: SOC_SDM_SUPPORTED != 1

+ 10 - 0
components/driver/test_apps/sdio/CMakeLists.txt

@@ -0,0 +1,10 @@
+# This is the project CMakeLists.txt file for the test subproject
+cmake_minimum_required(VERSION 3.16)
+
+set(EXTRA_COMPONENT_DIRS
+    "$ENV{IDF_PATH}/tools/unit-test-app/components"
+    "$ENV{IDF_PATH}/components/driver/test_apps/components"
+)
+
+include($ENV{IDF_PATH}/tools/cmake/project.cmake)
+project(sdio_test)

+ 2 - 0
components/driver/test_apps/sdio/README.md

@@ -0,0 +1,2 @@
+| Supported Targets | ESP32 |
+| ----------------- | ----- |

+ 13 - 0
components/driver/test_apps/sdio/main/CMakeLists.txt

@@ -0,0 +1,13 @@
+set(srcs
+    "test_app_main.c"
+    "test_sdio.c"
+    "test_sdmmc_sdspi_init.cpp"
+)
+
+# In order for the cases defined by `TEST_CASE` to be linked into the final elf,
+# the component can be registered as WHOLE_ARCHIVE
+idf_component_register(
+    SRCS ${srcs}
+    PRIV_REQUIRES test_utils test_driver_utils driver esp_timer sdmmc esp_serial_slave_link
+    WHOLE_ARCHIVE
+)

+ 48 - 0
components/driver/test_apps/sdio/main/test_app_main.c

@@ -0,0 +1,48 @@
+/*
+ * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "unity.h"
+#include "unity_test_utils.h"
+#include "esp_heap_caps.h"
+
+
+#define TEST_MEMORY_LEAK_THRESHOLD (200)
+
+static size_t before_free_8bit;
+static size_t before_free_32bit;
+
+void setUp(void)
+{
+    before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT);
+    before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT);
+}
+
+void tearDown(void)
+{
+    esp_reent_cleanup();    //clean up some of the newlib's lazy allocations
+    size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT);
+    size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT);
+    printf("\n");
+    unity_utils_check_leak(before_free_8bit, after_free_8bit, "8BIT", TEST_MEMORY_LEAK_THRESHOLD);
+    unity_utils_check_leak(before_free_32bit, after_free_32bit, "32BIT", TEST_MEMORY_LEAK_THRESHOLD);
+}
+
+void app_main(void)
+{
+    //  _____         _             _ _
+    // |_   _|__  ___| |_   ___  __| (_) ___
+    //   | |/ _ \/ __| __| / __|/ _` | |/ _ `.
+    //   | |  __/\__ \ |_  \__ \ (_| | | (_) |
+    //   |_|\___||___/\__| |___/\__,_|_|\___/
+
+    printf("     _____         _             _ _       \n");
+    printf("    |_   _|__  ___| |_   ___  __| (_) ___  \n");
+    printf("      | |/ _ \\/ __| __| / __|/ _` | |/ _ \\ \n");
+    printf("      | |  __/\\__ \\ |_  \\__ \\ (_| | | (_) |\n");
+    printf("      |_|\\___||___/\\__| |___/\\__,_|_|\\___/ \n");
+
+    unity_run_menu();
+}

+ 18 - 21
components/driver/test/test_sdio.c → components/driver/test_apps/sdio/main/test_sdio.c

@@ -7,17 +7,14 @@
 #include "unity.h"
 #include "test_utils.h"
 #include "test_spi_utils.h"
+#include "esp_serial_slave_link/essl_sdio.h"
 #include "esp_log.h"
+#include "sdmmc_cmd.h"
 #include "esp_timer.h"
-#include "soc/soc_caps.h"
 #include "ccomp_timer.h"
-#include "freertos/FreeRTOS.h"
-#include "freertos/task.h"
-
 #include "driver/spi_common.h"
 #include "driver/sdspi_host.h"
-#include "esp_serial_slave_link/essl_sdio.h"
-#include "sdmmc_cmd.h"
+#include "soc/soc_caps.h"
 
 #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3)
 
@@ -351,13 +348,13 @@ static void log_performance_tohost(uint32_t speed, const sdio_test_config_t* con
     if (!config->check_data) {
         switch (config->sdio_mode) {
         case SDIO_4BIT:
-            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_4BIT, "%d", speed);
+            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_4BIT, "%" PRIu32, speed);
             break;
         case SDIO_1BIT:
-            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_1BIT, "%d", speed);
+            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_1BIT, "%" PRIu32, speed);
             break;
         case SDIO_SPI:
-            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_SPI, "%d", speed);
+            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_SPI, "%" PRIu32, speed);
             break;
         }
     }
@@ -422,7 +419,7 @@ static void test_tp_tohost_master(essl_handle_t handle, const sdio_test_config_t
     int64_t end_us = esp_timer_get_time();
 
     uint32_t total_time_ms = (end_us - pre_us)/1000;
-    ESP_LOGI(MASTER_TAG, "test done, total time: %d ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length);
+    ESP_LOGI(MASTER_TAG, "test done, total time: %" PRIu32 " ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length);
 
     uint32_t throughput_byte_per_ms = expected_length / c_time_ms;
     ESP_LOGI(MASTER_TAG, "Throughput: compensated %.2lf MB/s, typical %.2lf MB/s",
@@ -437,13 +434,13 @@ static void log_performance_frhost(uint32_t speed, const sdio_test_config_t* con
     if (!config->check_data) {
         switch (config->sdio_mode) {
         case SDIO_4BIT:
-            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_4BIT, "%d", speed);
+            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_4BIT, "%" PRIu32, speed);
             break;
         case SDIO_1BIT:
-            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_1BIT, "%d", speed);
+            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_1BIT, "%" PRIu32, speed);
             break;
         case SDIO_SPI:
-            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_SPI, "%d", speed);
+            TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_SPI, "%" PRIu32, speed);
             break;
         }
     }
@@ -482,7 +479,7 @@ static void test_tp_frhost_master(essl_handle_t handle, const sdio_test_config_t
     int64_t end_us = esp_timer_get_time();
 
     uint32_t total_time_ms = (end_us - pre_us)/1000;
-    ESP_LOGI(MASTER_TAG, "test done, total time: %d ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length);
+    ESP_LOGI(MASTER_TAG, "test done, total time: %" PRIu32 " ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length);
 
     uint32_t throughput_byte_per_ms = expected_length / c_time_ms;
     ESP_LOGI(MASTER_TAG, "Throughput: compensated %.2lf MB/s, typical %.2lf MB/s",
@@ -734,15 +731,15 @@ void test_sdio_reset_slave(void)
 }
 
 
-TEST_CASE_MULTIPLE_DEVICES("sdio interrupt", "[sdio][test_env=UT_SDIO]", test_sdio_interrupt_master, test_sdio_interrupt_slave);
+TEST_CASE_MULTIPLE_DEVICES("sdio interrupt", "[sdio][test_env=sdio_master_slave]", test_sdio_interrupt_master, test_sdio_interrupt_slave);
 
-TEST_CASE_MULTIPLE_DEVICES("sdio register", "[sdio][test_env=UT_SDIO]", test_sdio_reg_master, test_sdio_interrupt_slave);
+TEST_CASE_MULTIPLE_DEVICES("sdio register", "[sdio][test_env=sdio_master_slave]", test_sdio_reg_master, test_sdio_interrupt_slave);
 
 #if !CONFIG_FREERTOS_UNICORE
-TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=UT_SDIO]", test_sdio_reset_master, test_sdio_reset_slave);
+TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=sdio_master_slave]", test_sdio_reset_master, test_sdio_reset_slave);
 #else
 //Currently there is weird issue on the runner, when tested with single core config, seems to relate to receiving
-TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=UT_SDIO][ignore]", test_sdio_reset_master, test_sdio_reset_slave);
+TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=sdio_master_slave][ignore]", test_sdio_reset_master, test_sdio_reset_slave);
 #endif
 
 
@@ -792,10 +789,10 @@ ptest_func_t frhost_slave = {
 PARAM_GROUP_DECLARE_TYPE(IO_MODE, sdio_test_config_t, test_cfg_array);
 
 #if !CONFIG_FREERTOS_UNICORE
-TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=UT_SDIO]", &frhost_master, &frhost_slave);
+TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=sdio_master_slave]", &frhost_master, &frhost_slave);
 #else
 //Currently there is weird issue on the runner, when tested with single core config, seems to relate to receiving
-TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=UT_SDIO][ignore]", &frhost_master, &frhost_slave);
+TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=sdio_master_slave][ignore]", &frhost_master, &frhost_slave);
 #endif
 
 ptest_func_t tohost_master = {
@@ -810,7 +807,7 @@ ptest_func_t tohost_slave = {
     .post_test = null_post,
 };
 
-TEST_MASTER_SLAVE(SDIO_TOHOST, test_cfg_array, "[sdio][timeout=180][test_env=UT_SDIO]", &tohost_master, &tohost_slave);
+TEST_MASTER_SLAVE(SDIO_TOHOST, test_cfg_array, "[sdio][timeout=180][test_env=sdio_master_slave]", &tohost_master, &tohost_slave);
 
 #endif //SOC_SDMMC_HOST_SUPPORTED && SOC_SDIO_SLAVE_SUPPORTED
 

+ 0 - 0
components/driver/test/test_sdmmc_sdspi_init.cpp → components/driver/test_apps/sdio/main/test_sdmmc_sdspi_init.cpp


+ 11 - 0
components/driver/test_apps/sdio/pytest_sdio.py

@@ -0,0 +1,11 @@
+# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
+# SPDX-License-Identifier: CC0-1.0
+
+import pytest
+
+
+@pytest.mark.esp32
+@pytest.mark.sdio_master_slave
+@pytest.mark.parametrize('count', [2,], indirect=True)
+def test_sdio_multi_dev(case_tester) -> None:        # type: ignore
+    case_tester.run_all_multi_dev_cases(reset=True)

+ 2 - 0
components/driver/test_apps/sdio/sdkconfig.defaults

@@ -0,0 +1,2 @@
+CONFIG_FREERTOS_HZ=1000
+CONFIG_ESP_TASK_WDT=n

+ 1 - 0
pytest.ini

@@ -75,6 +75,7 @@ markers =
   wifi_two_dut: tests should be run on runners which has two wifi duts connected.
   generic_multi_device: generic multiple devices whose corresponding gpio pins are connected to each other.
   twai_network: multiple runners form a TWAI network.
+  sdio_master_slave: Test sdio multi board.
 
   # host_test markers
   host_test: tests which shouldn not be built at the build stage, and instead built in host_test stage.