From 24b13103c2f91b440e34e37448c8ff61cd9f9abf Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 31 Oct 2024 13:53:47 +0100 Subject: [PATCH] ci(lcd_qemu_rgb_panel): test example in CI --- .github/test_requirements.txt | 10 +++++ .github/workflows/build_and_run_apps.yml | 41 ++++++++++++------ .../examples/lcd_qemu_rgb_panel/README.md | 10 ++++- .../lcd_qemu_rgb_panel/doc/scatter_chart.png | Bin 0 -> 9783 bytes .../lcd_qemu_rgb_panel/main/Kconfig.projbuild | 7 +++ .../main/lcd_qemu_rgb_panel_main.c | 2 + .../lcd_qemu_rgb_panel/main/lvgl_demo_ui.c | 4 ++ .../pytest_lcd_qemu_rgb_panel.py | 31 +++++++++++++ .../examples/lcd_qemu_rgb_panel/sdkconfig.ci | 1 + pytest.ini | 1 + 10 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 .github/test_requirements.txt create mode 100644 esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/doc/scatter_chart.png create mode 100644 esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/pytest_lcd_qemu_rgb_panel.py create mode 100644 esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/sdkconfig.ci diff --git a/.github/test_requirements.txt b/.github/test_requirements.txt new file mode 100644 index 0000000000..581bb9c19c --- /dev/null +++ b/.github/test_requirements.txt @@ -0,0 +1,10 @@ +# Generic requirements for all tests +pytest-embedded==1.11.7 +pytest-embedded-serial-esp==1.11.7 +pytest-embedded-idf==1.11.7 +pytest-embedded-qemu==1.11.7 +pytest-custom_exit_code==0.3.0 + +# Test-specific requirements +cryptography==43.0.3 +pillow==10.3.0 diff --git a/.github/workflows/build_and_run_apps.yml b/.github/workflows/build_and_run_apps.yml index c993b1c892..6ee86f916d 100644 --- a/.github/workflows/build_and_run_apps.yml +++ b/.github/workflows/build_and_run_apps.yml @@ -72,10 +72,10 @@ jobs: fail-fast: false matrix: idf_ver: - - "release-v5.0" - - "release-v5.1" - - "release-v5.2" - - "release-v5.3" + # - "release-v5.0" + # - "release-v5.1" + # - "release-v5.2" + # - "release-v5.3" - "latest" parallel_index: [1,2,3,4,5] # Update --parallel-count below when changing this runs-on: ubuntu-22.04 @@ -122,27 +122,30 @@ jobs: fail-fast: false matrix: idf_ver: - - "release-v5.0" - - "release-v5.1" - - "release-v5.2" - - "release-v5.3" + # - "release-v5.0" + # - "release-v5.1" + # - "release-v5.2" + # - "release-v5.3" - "latest" runner: - - runs-on: "esp32" + - runs-on: '["self-hosted", "linux", "docker", "esp32"]' marker: "generic" target: "esp32" - - runs-on: "ESP32-ETHERNET-KIT" + - runs-on: '["self-hosted", "linux", "docker", "ESP32-ETHERNET-KIT"]' marker: "ethernet" target: "esp32" - - runs-on: "spi_nand_flash" + - runs-on: '["self-hosted", "linux", "docker", "spi_nand_flash"]' marker: "spi_nand_flash" target: "esp32" + - runs-on: '["ubuntu-22.04"]' + marker: "qemu" + target: "esp32" env: TEST_RESULT_NAME: test_results_${{ matrix.runner.target }}_${{ matrix.runner.marker }}_${{ matrix.idf_ver }} TEST_RESULT_FILE: test_results_${{ matrix.runner.target }}_${{ matrix.runner.marker }}_${{ matrix.idf_ver }}.xml - runs-on: [self-hosted, linux, docker, "${{ matrix.runner.runs-on }}"] + runs-on: ${{ fromjson(matrix.runner.runs-on) }} container: - image: python:3.11-bookworm + image: 'python:3.11-bookworm' options: --privileged # Privileged mode has access to serial ports steps: - uses: actions/checkout@v4 @@ -153,7 +156,17 @@ jobs: - name: Install Python packages env: PIP_EXTRA_INDEX_URL: "https://dl.espressif.com/pypi/" - run: pip install --prefer-binary cryptography pytest-embedded pytest-embedded-serial-esp pytest-embedded-idf pytest-custom_exit_code + run: python3 -m pip install --prefer-binary -r .github/test_requirements.txt + - name: Install QEMU + if: matrix.runner.marker == 'qemu' + env: + QEMU_VERSION: "esp-develop-9.0.0-20240606" + QEMU_ARCHIVE: "qemu-xtensa-softmmu-esp_develop_9.0.0_20240606-x86_64-linux-gnu.tar.xz" + run: | + curl -sSL -o ${QEMU_ARCHIVE} https://github.com/espressif/qemu/releases/download/${QEMU_VERSION}/${QEMU_ARCHIVE} + tar -xf ${QEMU_ARCHIVE} + rm ${QEMU_ARCHIVE} + echo "PATH=$PWD/qemu/bin" >> $GITHUB_PATH - name: Run apps run: | python3 .github/get_pytest_args.py --target=${{ matrix.runner.target }} -v 'build_info*.json' pytest-args.txt diff --git a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/README.md b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/README.md index 10f10a0213..847a2e4553 100644 --- a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/README.md +++ b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/README.md @@ -16,9 +16,12 @@ By default, the example will use the target internal RAM as the frame buffer. To ### Build and run -To build the example, run `idf.py build` command. +To build and run the example, run: +```shell +idf.py qemu -g monitor +``` -Please refer to the [QEMU Guide](https://github.com/espressif/esp-toolchain-docs/blob/main/qemu/README.md) for the detailed steps to setup and run the image. +Please refer to the [QEMU Guide](https://github.com/espressif/esp-toolchain-docs/blob/main/qemu/README.md) for more information on installing and running QEMU. ## Example Output @@ -34,3 +37,6 @@ I (55) example: Starting LVGL task I (65) example: Display LVGL Scatter Chart I (75) main_task: Returned from app_main() ``` + +The following image should be displayed: +![](doc/scatter_chart.png) diff --git a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/doc/scatter_chart.png b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/doc/scatter_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..8b526b14ca31f3bbada892ae90da660c5e5790a6 GIT binary patch literal 9783 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 ZoP=YK{nPw@;6fPamcGgLB0Z<){|R^uoOS>J literal 0 HcmV?d00001 diff --git a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/Kconfig.projbuild b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/Kconfig.projbuild index f318f9d3fc..b75f30e61b 100644 --- a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/Kconfig.projbuild +++ b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/Kconfig.projbuild @@ -6,4 +6,11 @@ menu "Example Configuration" help Use QEMU RGB panel dedicated framebuffer as the framebuffer for LVGL. + config EXAMPLE_QEMU_RGB_PANEL_STATIC + bool "Static UI (for testing)" + default "n" + help + If this option is enabled, example will not update the chart after + it was drawn. This option is used in CI when testing the example. + endmenu diff --git a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lcd_qemu_rgb_panel_main.c b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lcd_qemu_rgb_panel_main.c index 60d428d595..cfe463d0f8 100644 --- a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lcd_qemu_rgb_panel_main.c +++ b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lcd_qemu_rgb_panel_main.c @@ -173,4 +173,6 @@ void app_main(void) // Release the mutex example_lvgl_unlock(); } + + ESP_LOGI(TAG, "LVGL Scatter Chart displayed"); } diff --git a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lvgl_demo_ui.c b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lvgl_demo_ui.c index 429be09639..22a17bbc3e 100644 --- a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lvgl_demo_ui.c +++ b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/main/lvgl_demo_ui.c @@ -34,11 +34,13 @@ static void draw_event_cb(lv_event_t *e) } } +#ifndef CONFIG_EXAMPLE_QEMU_RGB_PANEL_STATIC static void add_data(lv_timer_t *timer) { lv_obj_t *chart = timer->user_data; lv_chart_set_next_value2(chart, lv_chart_get_series_next(chart, NULL), lv_rand(0, 200), lv_rand(0, 1000)); } +#endif //CONFIG_EXAMPLE_QEMU_RGB_PANEL_STATIC void example_lvgl_demo_ui(lv_disp_t *disp) { @@ -64,5 +66,7 @@ void example_lvgl_demo_ui(lv_disp_t *disp) lv_chart_set_next_value2(chart, ser, lv_rand(0, 200), lv_rand(0, 1000)); } +#ifndef CONFIG_EXAMPLE_QEMU_RGB_PANEL_STATIC lv_timer_create(add_data, 100, chart); +#endif } diff --git a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/pytest_lcd_qemu_rgb_panel.py b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/pytest_lcd_qemu_rgb_panel.py new file mode 100644 index 0000000000..436bbbb2f3 --- /dev/null +++ b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/pytest_lcd_qemu_rgb_panel.py @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 + +import pytest +import os +from pytest_embedded import Dut +import time +try: + from PIL import Image + from PIL import ImageChops +except ImportError: + Image = None + +@pytest.mark.qemu +@pytest.mark.parametrize('qemu_extra_args', ['-display sdl']) +@pytest.mark.parametrize('embedded_services', ['idf,qemu']) +def test_qemu_rgb_panel(dut: Dut) -> None: + if not Image: + pytest.fail('Pillow is not installed') + + dut.expect_exact('Install RGB LCD panel driver') + dut.expect_exact('LVGL Scatter Chart displayed') + time.sleep(2) + filename = 'scatter_chart.ppm' + dut.qemu.take_screenshot(filename) + + img = Image.open(filename) + ref_img = Image.open(os.path.join(os.path.dirname(__file__), 'doc', 'scatter_chart.png')) + + diff = ImageChops.difference(img, ref_img) + assert not diff.getbbox(), 'Images are different' diff --git a/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/sdkconfig.ci b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/sdkconfig.ci new file mode 100644 index 0000000000..bf5420639a --- /dev/null +++ b/esp_lcd_qemu_rgb/examples/lcd_qemu_rgb_panel/sdkconfig.ci @@ -0,0 +1 @@ +CONFIG_EXAMPLE_QEMU_RGB_PANEL_STATIC=y diff --git a/pytest.ini b/pytest.ini index 4ebe9e7d75..b272435aba 100644 --- a/pytest.ini +++ b/pytest.ini @@ -13,6 +13,7 @@ markers = generic: generic runner ethernet: ethernet runners spi_nand_flash: runner with SPI NAND flash connected + qemu: test runs in QEMU emulator # log related log_cli = True