All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heinrich Schuchardt <xypron.glpk@gmx.de>
To: Masahisa Kojima <masahisa.kojima@linaro.org>
Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>,
	Simon Glass <sjg@chromium.org>,
	Takahiro Akashi <takahiro.akashi@linaro.org>,
	Mark Kettenis <mark.kettenis@xs4all.nl>,
	u-boot@lists.denx.de
Subject: Re: [PATCH v16 10/10] test: unit test for eficonfig
Date: Mon, 5 Sep 2022 17:55:05 +0200	[thread overview]
Message-ID: <6bd28d43-5ce8-cd91-760f-6fdb58c798bd@gmx.de> (raw)
In-Reply-To: <20220905124803.2909-11-masahisa.kojima@linaro.org>

On 9/5/22 14:48, Masahisa Kojima wrote:
> Provide a unit test for the eficonfig command.
>
> Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org>
> Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
> ---
> Changes in v16:
> - call u_boot_console.restart_uboot() to clean the previous test state

The test is still failing:
https://source.denx.de/u-boot/custodians/u-boot-efi/-/jobs/492069/raw

The same can be seen when running 'make tests' locally.

Best regards

Heinrich

>
> Changes in v14:
> - update to support media device enumeration in eficonfig startup
> - move no block device test to the last test case
>
> Changes in v12:
> - update menu handling
>
> Changes in v11:
> - fix expected result when no BootOrder is defined
>
> Newly added in v10
>
>   configs/sandbox_defconfig                     |   1 +
>   test/py/tests/test_eficonfig/conftest.py      |  40 ++
>   .../py/tests/test_eficonfig/test_eficonfig.py | 354 ++++++++++++++++++
>   3 files changed, 395 insertions(+)
>   create mode 100644 test/py/tests/test_eficonfig/conftest.py
>   create mode 100644 test/py/tests/test_eficonfig/test_eficonfig.py
>
> diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
> index eba7bcbb48..48c60c606d 100644
> --- a/configs/sandbox_defconfig
> +++ b/configs/sandbox_defconfig
> @@ -93,6 +93,7 @@ CONFIG_CMD_LINK_LOCAL=y
>   CONFIG_CMD_ETHSW=y
>   CONFIG_CMD_BMP=y
>   CONFIG_CMD_BOOTCOUNT=y
> +CONFIG_CMD_EFICONFIG=y
>   CONFIG_CMD_EFIDEBUG=y
>   CONFIG_CMD_RTC=y
>   CONFIG_CMD_TIME=y
> diff --git a/test/py/tests/test_eficonfig/conftest.py b/test/py/tests/test_eficonfig/conftest.py
> new file mode 100644
> index 0000000000..f289df0362
> --- /dev/null
> +++ b/test/py/tests/test_eficonfig/conftest.py
> @@ -0,0 +1,40 @@
> +# SPDX-License-Identifier:      GPL-2.0+
> +
> +"""Fixture for UEFI eficonfig test
> +"""
> +
> +import os
> +import shutil
> +from subprocess import check_call
> +import pytest
> +
> +@pytest.fixture(scope='session')
> +def efi_eficonfig_data(u_boot_config):
> +    """Set up a file system to be used in UEFI "eficonfig" command
> +       tests
> +
> +    Args:
> +        u_boot_config -- U-boot configuration.
> +
> +    Return:
> +        A path to disk image to be used for testing
> +    """
> +    mnt_point = u_boot_config.persistent_data_dir + '/test_efi_eficonfig'
> +    image_path = u_boot_config.persistent_data_dir + '/efi_eficonfig.img'
> +
> +    shutil.rmtree(mnt_point, ignore_errors=True)
> +    os.mkdir(mnt_point, mode = 0o755)
> +
> +    with open(mnt_point + '/initrd-1.img', 'w', encoding = 'ascii') as file:
> +        file.write("initrd 1")
> +
> +    with open(mnt_point + '/initrd-2.img', 'w', encoding = 'ascii') as file:
> +        file.write("initrd 2")
> +
> +    shutil.copyfile(u_boot_config.build_dir + '/lib/efi_loader/initrddump.efi',
> +                    mnt_point + '/initrddump.efi')
> +
> +    check_call(f'virt-make-fs --partition=gpt --size=+1M --type=vfat {mnt_point} {image_path}',
> +               shell=True)
> +
> +    return image_path
> diff --git a/test/py/tests/test_eficonfig/test_eficonfig.py b/test/py/tests/test_eficonfig/test_eficonfig.py
> new file mode 100644
> index 0000000000..c1fe07eb8b
> --- /dev/null
> +++ b/test/py/tests/test_eficonfig/test_eficonfig.py
> @@ -0,0 +1,354 @@
> +# SPDX-License-Identifier:      GPL-2.0+
> +""" Unit test for UEFI menu-driven configuration
> +"""
> +
> +import pytest
> +import time
> +
> +@pytest.mark.boardspec('sandbox')
> +@pytest.mark.buildconfigspec('cmd_eficonfig')
> +@pytest.mark.buildconfigspec('cmd_bootefi_bootmgr')
> +def test_efi_eficonfig(u_boot_console, efi_eficonfig_data):
> +
> +    def send_user_input_and_wait(user_str, expect_str):
> +        time.sleep(0.1) # TODO: does not work correctly without sleep
> +        u_boot_console.run_command(cmd=user_str, wait_for_prompt=False,
> +                                   wait_for_echo=True, send_nl=False)
> +        u_boot_console.run_command(cmd='\x0d', wait_for_prompt=False,
> +                                   wait_for_echo=False, send_nl=False)
> +        if expect_str is not None:
> +            for i in expect_str:
> +                u_boot_console.p.expect([i])
> +
> +    def press_up_down_enter_and_wait(up_count, down_count, enter, expect_str):
> +        # press UP key
> +        for i in range(up_count):
> +            u_boot_console.run_command(cmd='\x1b\x5b\x41', wait_for_prompt=False,
> +                                       wait_for_echo=False, send_nl=False)
> +        # press DOWN key
> +        for i in range(down_count):
> +            u_boot_console.run_command(cmd='\x1b\x5b\x42', wait_for_prompt=False,
> +                                       wait_for_echo=False, send_nl=False)
> +        # press ENTER if requested
> +        if enter:
> +            u_boot_console.run_command(cmd='\x0d', wait_for_prompt=False,
> +                                       wait_for_echo=False, send_nl=False)
> +        # wait expected output
> +        if expect_str is not None:
> +            for i in expect_str:
> +                u_boot_console.p.expect([i])
> +
> +    def press_escape_key(wait_prompt):
> +        u_boot_console.run_command(cmd='\x1b', wait_for_prompt=wait_prompt, wait_for_echo=False, send_nl=False)
> +
> +    def press_enter_key(wait_prompt):
> +        u_boot_console.run_command(cmd='\x0d', wait_for_prompt=wait_prompt,
> +                                   wait_for_echo=False, send_nl=False)
> +
> +    def check_current_is_maintenance_menu():
> +        for i in ('UEFI Maintenance Menu', 'Add Boot Option', 'Edit Boot Option',
> +                  'Change Boot Order', 'Delete Boot Option', 'Quit'):
> +            u_boot_console.p.expect([i])
> +
> +    """ Unit test for "eficonfig" command
> +    The menu-driven interface is used to set up UEFI load options.
> +    The bootefi bootmgr loads initrddump.efi as a payload.
> +    The crc32 of the loaded initrd.img is checked
> +
> +    Args:
> +        u_boot_console -- U-Boot console
> +        efi__data -- Path to the disk image used for testing.
> +                     Test disk image has following files.
> +                         initrd-1.img
> +                         initrddump.efi
> +                         initrd-2.img
> +
> +    """
> +
> +    # Restart the system to clean the previous state
> +    u_boot_console.restart_uboot()
> +
> +    with u_boot_console.temporary_timeout(500):
> +        #
> +        # Test Case 1: Check the menu is displayed
> +        #
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +        for i in ('UEFI Maintenance Menu', 'Add Boot Option', 'Edit Boot Option',
> +                  'Change Boot Order', 'Delete Boot Option', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        # Select "Add Boot Option"
> +        press_enter_key(False)
> +        for i in ('Add Boot Option', 'Description:', 'File', 'Initrd File', 'Optional Data',
> +                  'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        press_escape_key(False)
> +        check_current_is_maintenance_menu()
> +        # return to U-Boot console
> +        press_escape_key(True)
> +
> +        #
> +        # Test Case 2: check auto generated media device entry
> +        #
> +
> +        # bind the test disk image for succeeding tests
> +        u_boot_console.run_command(cmd = f'host bind 0 {efi_eficonfig_data}')
> +
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +
> +        # Change the Boot Order
> +        press_up_down_enter_and_wait(0, 2, True, 'Quit')
> +        for i in ('host 0:1', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        # disable auto generated boot option for succeeding test
> +        u_boot_console.run_command(cmd=' ', wait_for_prompt=False,
> +                                       wait_for_echo=False, send_nl=False)
> +        # Save the BootOrder
> +        press_up_down_enter_and_wait(0, 1, True, None)
> +        check_current_is_maintenance_menu()
> +
> +        #
> +        # Test Case 3: Add first Boot Option and load it
> +        #
> +
> +        # Select 'Add Boot Option'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +
> +        # Press the enter key to select 'Description:' entry, then enter Description
> +        press_up_down_enter_and_wait(0, 0, True, 'enter description:')
> +        # Send Description user input, press ENTER key to complete
> +        send_user_input_and_wait('test 1', 'Quit')
> +
> +        # Set EFI image(initrddump.efi)
> +        press_up_down_enter_and_wait(0, 1, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 0, True, 'host 0:1')
> +        # Select 'host 0:1'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +        # Press down key to select "initrddump.efi" entry followed by the enter key
> +        press_up_down_enter_and_wait(0, 1, True, 'Quit')
> +
> +        # Set Initrd file(initrd-1.img)
> +        press_up_down_enter_and_wait(0, 2, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 0, True, 'host 0:1')
> +        # Select 'host 0:1'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +        # Press down key to select "initrd-1.img" entry followed by the enter key
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +
> +        # Set optional_data
> +        press_up_down_enter_and_wait(0, 3, True, 'Optional Data:')
> +        # Send Description user input, press ENTER key to complete
> +        send_user_input_and_wait('nocolor', None)
> +        for i in ('Description: test 1', 'File: host 0:1/initrddump.efi',
> +                  'Initrd File: host 0:1/initrd-1.img', 'Optional Data: nocolor', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +
> +        # Save the Boot Option
> +        press_up_down_enter_and_wait(0, 4, True, None)
> +        check_current_is_maintenance_menu()
> +
> +        # Check the newly added Boot Option is handled correctly
> +        # Return to U-Boot console
> +        press_escape_key(True)
> +        u_boot_console.run_command(cmd = 'bootefi bootmgr')
> +        response = u_boot_console.run_command(cmd = 'load', wait_for_echo=False)
> +        assert 'crc32: 0x181464af' in response
> +        u_boot_console.run_command(cmd = 'exit', wait_for_echo=False)
> +
> +        #
> +        # Test Case 4: Add second Boot Option and load it
> +        #
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +
> +        # Select 'Add Boot Option'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +
> +        # Press the enter key to select 'Description:' entry, then enter Description
> +        press_up_down_enter_and_wait(0, 0, True, 'enter description:')
> +        # Send Description user input, press ENTER key to complete
> +        send_user_input_and_wait('test 2', 'Quit')
> +
> +        # Set EFI image(initrddump.efi)
> +        press_up_down_enter_and_wait(0, 1, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 0, True, 'host 0:1')
> +        # Select 'host 0:1'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +        # Press down key to select "initrddump.efi" entry followed by the enter key
> +        press_up_down_enter_and_wait(0, 1, True, 'Quit')
> +
> +        # Set Initrd file(initrd-2.img)
> +        press_up_down_enter_and_wait(0, 2, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 0, True, 'host 0:1')
> +        # Select 'host 0:1'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +        # Press down key to select "initrd-2.img" entry followed by the enter key
> +        press_up_down_enter_and_wait(0, 2, True, 'Quit')
> +
> +        # Set optional_data
> +        press_up_down_enter_and_wait(0, 3, True, 'Optional Data:')
> +        # Send Description user input, press ENTER key to complete
> +        send_user_input_and_wait('nocolor', None)
> +        for i in ('Description: test 2', 'File: host 0:1/initrddump.efi',
> +                  'Initrd File: host 0:1/initrd-2.img', 'Optional Data: nocolor', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +
> +        # Save the Boot Option
> +        press_up_down_enter_and_wait(0, 4, True, 'Quit')
> +
> +        # Change the Boot Order
> +        press_up_down_enter_and_wait(0, 2, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 1, False, 'Quit')
> +        # move 'test 1' to the second entry
> +        u_boot_console.run_command(cmd='+', wait_for_prompt=False,
> +                                       wait_for_echo=False, send_nl=False)
> +        for i in ('test 2', 'test 1', 'host 0:1', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        # Save the BootOrder
> +        press_up_down_enter_and_wait(0, 3, True, None)
> +        check_current_is_maintenance_menu()
> +
> +        # Check the newly added Boot Option is handled correctly
> +        # Return to U-Boot console
> +        press_escape_key(True)
> +        u_boot_console.run_command(cmd = 'bootefi bootmgr')
> +        response = u_boot_console.run_command(cmd = 'load', wait_for_echo=False)
> +        assert 'crc32: 0x811d3515' in response
> +        u_boot_console.run_command(cmd = 'exit', wait_for_echo=False)
> +
> +        #
> +        # Test Case 5: Change BootOrder and load it
> +        #
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +
> +        # Change the Boot Order
> +        press_up_down_enter_and_wait(0, 2, True, None)
> +        # Check the curren BootOrder
> +        for i in ('test 2', 'test 1', 'host 0:1', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        # move 'test 2' to the second entry
> +        u_boot_console.run_command(cmd='-', wait_for_prompt=False,
> +                                       wait_for_echo=False, send_nl=False)
> +        for i in ('test 1', 'test 2', 'host 0:1', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        # Save the BootOrder
> +        press_up_down_enter_and_wait(0, 2, True, None)
> +        check_current_is_maintenance_menu()
> +
> +        # Return to U-Boot console
> +        press_escape_key(True)
> +        u_boot_console.run_command(cmd = 'bootefi bootmgr')
> +        response = u_boot_console.run_command(cmd = 'load', wait_for_echo=False)
> +        assert 'crc32: 0x181464af' in response
> +        u_boot_console.run_command(cmd = 'exit', wait_for_echo=False)
> +
> +        #
> +        # Test Case 6: Delete Boot Option(label:test 2)
> +        #
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +
> +        # Select 'Delete Boot Option'
> +        press_up_down_enter_and_wait(0, 3, True, None)
> +        # Check the current BootOrder
> +        for i in ('test 1', 'test 2', 'Quit'):
> +            u_boot_console.p.expect([i])
> +
> +        # Delete 'test 2'
> +        press_up_down_enter_and_wait(0, 1, True, None)
> +        for i in ('test 1', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        press_escape_key(False)
> +        check_current_is_maintenance_menu()
> +        # Return to U-Boot console
> +        press_escape_key(True)
> +
> +        #
> +        # Test Case 7: Edit Boot Option
> +        #
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +        # Select 'Edit Boot Option'
> +        press_up_down_enter_and_wait(0, 1, True, None)
> +        # Check the curren BootOrder
> +        for i in ('test 1', 'Quit'):
> +            u_boot_console.p.expect([i])
> +        press_up_down_enter_and_wait(0, 0, True, None)
> +        for i in ('Description: test 1', 'File: host 0:1/initrddump.efi',
> +                  'Initrd File: host 0:1/initrd-1.img', 'Optional Data: nocolor', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +
> +        # Press the enter key to select 'Description:' entry, then enter Description
> +        press_up_down_enter_and_wait(0, 0, True, 'enter description:')
> +        # Send Description user input, press ENTER key to complete
> +        send_user_input_and_wait('test 3', 'Quit')
> +
> +        # Set EFI image(initrddump.efi)
> +        press_up_down_enter_and_wait(0, 1, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 0, True, 'host 0:1')
> +        # Select 'host 0:1'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +        # Press down key to select "initrddump.efi" entry followed by the enter key
> +        press_up_down_enter_and_wait(0, 1, True, 'Quit')
> +
> +        # Set Initrd file(initrd-2.img)
> +        press_up_down_enter_and_wait(0, 2, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 0, True, 'host 0:1')
> +        # Select 'host 0:1'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +        # Press down key to select "initrd-1.img" entry followed by the enter key
> +        press_up_down_enter_and_wait(0, 2, True, 'Quit')
> +
> +        # Set optional_data
> +        press_up_down_enter_and_wait(0, 3, True, 'Optional Data:')
> +        # Send Description user input, press ENTER key to complete
> +        send_user_input_and_wait('', None)
> +        for i in ('Description: test 3', 'File: host 0:1/initrddump.efi',
> +                  'Initrd File: host 0:1/initrd-2.img', 'Optional Data:', 'Save', 'Quit'):
> +            u_boot_console.p.expect([i])
> +
> +        # Save the Boot Option
> +        press_up_down_enter_and_wait(0, 4, True, 'Quit')
> +        press_escape_key(False)
> +        check_current_is_maintenance_menu()
> +
> +        # Check the updated Boot Option is handled correctly
> +        # Return to U-Boot console
> +        press_escape_key(True)
> +        u_boot_console.run_command(cmd = 'bootefi bootmgr')
> +        response = u_boot_console.run_command(cmd = 'load', wait_for_echo=False)
> +        assert 'crc32: 0x811d3515' in response
> +        u_boot_console.run_command(cmd = 'exit', wait_for_echo=False)
> +
> +        #
> +        # Test Case 8: Delete Boot Option(label:test 3)
> +        #
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +
> +        # Select 'Delete Boot Option'
> +        press_up_down_enter_and_wait(0, 3, True, None)
> +        # Check the curren BootOrder
> +        for i in ('test 3', 'Quit'):
> +            u_boot_console.p.expect([i])
> +
> +        # Delete 'test 3'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +        press_escape_key(False)
> +        check_current_is_maintenance_menu()
> +        # Return to U-Boot console
> +        press_escape_key(True)
> +
> +        # remove the host device
> +        u_boot_console.run_command(cmd = f'host bind -r 0')
> +
> +        #
> +        # Test Case 9: No block device found
> +        #
> +        u_boot_console.run_command('eficonfig', wait_for_prompt=False)
> +
> +        # Select 'Add Boot Option'
> +        press_up_down_enter_and_wait(0, 0, True, 'Quit')
> +
> +        # Set EFI image
> +        press_up_down_enter_and_wait(0, 1, True, 'Quit')
> +        press_up_down_enter_and_wait(0, 0, True, 'No block device found!')
> +        press_escape_key(False)
> +        check_current_is_maintenance_menu()
> +        # Return to U-Boot console
> +        press_escape_key(True)


  reply	other threads:[~2022-09-05 15:55 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-05 12:47 [PATCH v16 00/10] enable menu-driven UEFI variable maintenance Masahisa Kojima
2022-09-05 12:47 ` [PATCH v16 01/10] eficonfig: menu-driven addition of UEFI boot option Masahisa Kojima
2022-09-05 12:47 ` [PATCH v16 02/10] eficonfig: add "Edit Boot Option" menu entry Masahisa Kojima
2022-09-05 12:47 ` [PATCH v16 03/10] menu: add KEY_PLUS, KEY_MINUS and KEY_SPACE handling Masahisa Kojima
2022-09-05 12:47 ` [PATCH v16 04/10] eficonfig: add "Delete Boot Option" menu entry Masahisa Kojima
2022-09-05 12:47 ` [PATCH v16 05/10] bootmenu: add removable media entries Masahisa Kojima
2022-09-05 12:47 ` [PATCH v16 06/10] eficonfig: scan media device in eficonfig startup Masahisa Kojima
2022-09-05 12:47 ` [PATCH v16 07/10] eficonfig: add "Change Boot Order" menu entry Masahisa Kojima
2022-09-05 12:48 ` [PATCH v16 08/10] doc:bootmenu: add description for UEFI boot support Masahisa Kojima
2022-09-05 12:48 ` [PATCH v16 09/10] doc:eficonfig: add documentation for eficonfig command Masahisa Kojima
2022-09-05 12:48 ` [PATCH v16 10/10] test: unit test for eficonfig Masahisa Kojima
2022-09-05 15:55   ` Heinrich Schuchardt [this message]
2022-09-06  1:30     ` Takahiro Akashi
2022-09-06  6:59       ` Masahisa Kojima

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6bd28d43-5ce8-cd91-760f-6fdb58c798bd@gmx.de \
    --to=xypron.glpk@gmx.de \
    --cc=ilias.apalodimas@linaro.org \
    --cc=mark.kettenis@xs4all.nl \
    --cc=masahisa.kojima@linaro.org \
    --cc=sjg@chromium.org \
    --cc=takahiro.akashi@linaro.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.