[PATCH] test/py: efi_capsule: Handle expected reset after capsule on disk

Heinrich Schuchardt xypron.glpk at gmx.de
Tue Feb 15 14:52:48 CET 2022


On 2/15/22 14:51, Heinrich Schuchardt wrote:
> On 2/15/22 10:09, Masami Hiramatsu wrote:
>> Hi Heinrich,
>>
>> I and Takahiro found that the capsule update test case and test 
>> framework didn't expect that a command can reboot the sandbox and the 
>> sandbox can reboot while booting, which happens when my "Reset system 
>> after CapsuleUpdate on disk" patch applied.
>> This patch fixes those issues.
> 
> Gitlab CI testing does not pass. So this series has to be reworked.

Sorry I missed that you put a new patch into the old series. I will retest.

Best regards

Heinrich

> 
> Best regards
> 
> Heinrich
> 
>>
>> Thank you,
>>
>>
>> 2022年2月15日(火) 18:05 Masami Hiramatsu <masami.hiramatsu at linaro.org 
>> <mailto:masami.hiramatsu at linaro.org>>:
>>
>>     Since now the capsule_on_disk will restart the u-boot sandbox right
>>     after the capsule update, if CONFIG_EFI_CAPSULE_ON_DISK_EARLY=y, the
>>     boot with a new capsule file will repeat reboot sequence. On the
>>     other hand, if CONFIG_EFI_CAPSULE_ON_DISK_EARLY=n, the 'env print -e'
>>     command will execute the capsule update on disk and reboot.
>>
>>     Thus this update the uboot_console for those 2 cases;
>>
>>       - restart_uboot(): Add expect_earlyreset optional parameter so that
>>         it can handle the reboot while booting.
>>       - run_command(): Add wait_for_reboot optional parameter so that it
>>         can handle the reboot after executing a command.
>>
>>     And enable those options in the test_capsule_firmware.py test cases.
>>
>>     Signed-off-by: Masami Hiramatsu <masami.hiramatsu at linaro.org
>>     <mailto:masami.hiramatsu at linaro.org>>
>>     ---
>>       .../test_efi_capsule/test_capsule_firmware.py      |   39 ++++++--
>>       test/py/u_boot_console_base.py                     |   95
>>     +++++++++++++++-----
>>       test/py/u_boot_console_sandbox.py                  |    6 +
>>       3 files changed, 102 insertions(+), 38 deletions(-)
>>
>>     diff --git a/test/py/tests/test_efi_capsule/test_capsule_firmware.py
>>     b/test/py/tests/test_efi_capsule/test_capsule_firmware.py
>>     index 6e803f699f..a539134ec2 100644
>>     --- a/test/py/tests/test_efi_capsule/test_capsule_firmware.py
>>     +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware.py
>>     @@ -143,13 +143,14 @@ class TestEfiCapsuleFirmwareFit(object):
>>                       'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
>>                   assert 'Test01' in ''.join(output)
>>
>>     -        # reboot
>>     -        u_boot_console.restart_uboot()
>>     -
>>               capsule_early = u_boot_config.buildconfig.get(
>>                   'config_efi_capsule_on_disk_early')
>>               capsule_auth = u_boot_config.buildconfig.get(
>>                   'config_efi_capsule_authenticate')
>>     +
>>     +        # reboot
>>     +        u_boot_console.restart_uboot(expect_earlyreset = 
>> capsule_early)
>>     +
>>               with u_boot_console.log.section('Test Case 2-b, after
>>     reboot'):
>>                   if not capsule_early:
>>                       # make sure that dfu_alt_info exists even
>>     persistent variables
>>     @@ -162,7 +163,7 @@ class TestEfiCapsuleFirmwareFit(object):
>>
>>                       # need to run uefi command to initiate capsule
>>     handling
>>                       output = u_boot_console.run_command(
>>     -                    'env print -e Capsule0000')
>>     +                    'env print -e Capsule0000', wait_for_reboot = 
>> True)
>>
>>                   output = u_boot_console.run_command_list([
>>                       'host bind 0 %s' % disk_img,
>>     @@ -218,13 +219,14 @@ class TestEfiCapsuleFirmwareFit(object):
>>                       'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
>>                   assert 'Test02' in ''.join(output)
>>
>>     -        # reboot
>>     -        u_boot_console.restart_uboot()
>>     -
>>               capsule_early = u_boot_config.buildconfig.get(
>>                   'config_efi_capsule_on_disk_early')
>>               capsule_auth = u_boot_config.buildconfig.get(
>>                   'config_efi_capsule_authenticate')
>>     +
>>     +        # reboot
>>     +        u_boot_console.restart_uboot(expect_earlyreset = 
>> capsule_early)
>>     +
>>               with u_boot_console.log.section('Test Case 3-b, after
>>     reboot'):
>>                   if not capsule_early:
>>                       # make sure that dfu_alt_info exists even
>>     persistent variables
>>     @@ -237,7 +239,13 @@ class TestEfiCapsuleFirmwareFit(object):
>>
>>                       # need to run uefi command to initiate capsule
>>     handling
>>                       output = u_boot_console.run_command(
>>     -                    'env print -e Capsule0000')
>>     +                    'env print -e Capsule0000', wait_for_reboot = 
>> True)
>>     +
>>     +            output = u_boot_console.run_command_list([
>>     +                'env set dfu_alt_info "sf 0:0=u-boot-bin raw
>>     0x100000 0x50000;u-boot-env raw 0x150000 0x200000"',
>>     +                'host bind 0 %s' % disk_img,
>>     +                'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
>>     +            assert 'Test02' not in ''.join(output)
>>
>>                   output = u_boot_console.run_command_list(['efidebug
>>     capsule esrt'])
>>
>>     @@ -293,13 +301,14 @@ class TestEfiCapsuleFirmwareFit(object):
>>                       'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
>>                   assert 'Test03' in ''.join(output)
>>
>>     -        # reboot
>>     -        u_boot_console.restart_uboot()
>>     -
>>               capsule_early = u_boot_config.buildconfig.get(
>>                   'config_efi_capsule_on_disk_early')
>>               capsule_auth = u_boot_config.buildconfig.get(
>>                   'config_efi_capsule_authenticate')
>>     +
>>     +        # reboot
>>     +        u_boot_console.restart_uboot(expect_earlyreset = 
>> capsule_early)
>>     +
>>               with u_boot_console.log.section('Test Case 4-b, after
>>     reboot'):
>>                   if not capsule_early:
>>                       # make sure that dfu_alt_info exists even
>>     persistent variables
>>     @@ -312,7 +321,13 @@ class TestEfiCapsuleFirmwareFit(object):
>>
>>                       # need to run uefi command to initiate capsule
>>     handling
>>                       output = u_boot_console.run_command(
>>     -                    'env print -e Capsule0000')
>>     +                    'env print -e Capsule0000', wait_for_reboot = 
>> True)
>>     +
>>     +            output = u_boot_console.run_command_list([
>>     +                'env set dfu_alt_info "sf 0:0=u-boot-bin raw
>>     0x100000 0x50000;u-boot-env raw 0x150000 0x200000"',
>>     +                'host bind 0 %s' % disk_img,
>>     +                'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
>>     +            assert 'Test03' not in ''.join(output)
>>
>>                   output = u_boot_console.run_command_list(['efidebug
>>     capsule esrt'])
>>
>>     diff --git a/test/py/u_boot_console_base.py
>>     b/test/py/u_boot_console_base.py
>>     index 384fd53c65..e84f4d74ef 100644
>>     --- a/test/py/u_boot_console_base.py
>>     +++ b/test/py/u_boot_console_base.py
>>     @@ -140,7 +140,7 @@ class ConsoleBase(object):
>>               self.logstream.close()
>>
>>           def run_command(self, cmd, wait_for_echo=True, send_nl=True,
>>     -            wait_for_prompt=True):
>>     +            wait_for_prompt=True, wait_for_reboot=False):
>>               """Execute a command via the U-Boot console.
>>
>>               The command is always sent to U-Boot.
>>     @@ -168,6 +168,8 @@ class ConsoleBase(object):
>>                   wait_for_prompt: Boolean indicating whether to wait
>>     for the
>>                       command prompt to be sent by U-Boot. This
>>     typically occurs
>>                       immediately after the command has been executed.
>>     +            wait_for_reboot: Boolean indication whether to wait 
>> for the
>>     +                reboot U-Boot. If this is True, wait_for_prompt is
>>     ignored.
>>
>>               Returns:
>>                   If wait_for_prompt == False:
>>     @@ -202,11 +204,48 @@ class ConsoleBase(object):
>>                                           self.bad_pattern_ids[m - 1])
>>                   if not wait_for_prompt:
>>                       return
>>     -            m = self.p.expect([self.prompt_compiled] +
>>     self.bad_patterns)
>>     -            if m != 0:
>>     -                self.at_prompt = False
>>     -                raise Exception('Bad pattern found on console: ' +
>>     -                                self.bad_pattern_ids[m - 1])
>>     +            if wait_for_reboot:
>>     +                bcfg = self.config.buildconfig
>>     +                config_spl = bcfg.get('config_spl', 'n') == 'y'
>>     +                config_spl_serial = bcfg.get('config_spl_serial',
>>     +                                                 'n') == 'y'
>>     +                env_spl_skipped =
>>     self.config.env.get('env__spl_skipped',
>>     +                                                      False)
>>     +                env_spl2_skipped =
>>     self.config.env.get('env__spl2_skipped',
>>     +                                                       True)
>>     +                if config_spl and config_spl_serial and not
>>     env_spl_skipped:
>>     +                    m = self.p.expect([pattern_u_boot_spl_signon] +
>>     +                                      self.bad_patterns)
>>     +                    if m != 0:
>>     +                        raise Exception('Bad pattern found on SPL
>>     console: ' +
>>     +                                        self.bad_pattern_ids[m - 1])
>>     +                if not env_spl2_skipped:
>>     +                    m = self.p.expect([pattern_u_boot_spl2_signon] +
>>     +                                      self.bad_patterns)
>>     +                    if m != 0:
>>     +                        raise Exception('Bad pattern found on SPL2
>>     console: ' +
>>     +                                        self.bad_pattern_ids[m - 1])
>>     +                m = self.p.expect([pattern_u_boot_main_signon] +
>>     self.bad_patterns)
>>     +                if m != 0:
>>     +                    raise Exception('Bad pattern found on 
>> console: ' +
>>     +                                    self.bad_pattern_ids[m - 1])
>>     +                self.u_boot_version_string = self.p.after
>>     +                while True:
>>     +                    m = self.p.expect([self.prompt_compiled,
>>     +                        pattern_stop_autoboot_prompt] +
>>     self.bad_patterns)
>>     +                    if m == 0:
>>     +                        break
>>     +                    if m == 1:
>>     +                        self.p.send(' ')
>>     +                        continue
>>     +                    raise Exception('Bad pattern found on 
>> console: ' +
>>     +                                    self.bad_pattern_ids[m - 2])
>>     +            else:
>>     +                m = self.p.expect([self.prompt_compiled] +
>>     self.bad_patterns)
>>     +                if m != 0:
>>     +                    self.at_prompt = False
>>     +                    raise Exception('Bad pattern found on 
>> console: ' +
>>     +                                    self.bad_pattern_ids[m - 1])
>>                   self.at_prompt = True
>>                   self.at_prompt_logevt = self.logstream.logfile.cur_evt
>>                   # Only strip \r\n; space/TAB might be significant if
>>     testing
>>     @@ -321,7 +360,7 @@ class ConsoleBase(object):
>>               finally:
>>                   self.p.timeout = orig_timeout
>>
>>     -    def ensure_spawned(self):
>>     +    def ensure_spawned(self, expect_earlyreset=False):
>>               """Ensure a connection to a correctly running U-Boot 
>> instance.
>>
>>               This may require spawning a new Sandbox process or
>>     resetting target
>>     @@ -330,7 +369,8 @@ class ConsoleBase(object):
>>               This is an internal function and should not be called
>>     directly.
>>
>>               Args:
>>     -            None.
>>     +            expect_earlyreset: This boot is expected to be reset in
>>     early
>>     +                stage (before prompt). False by default.
>>
>>               Returns:
>>                   Nothing.
>>     @@ -357,22 +397,29 @@ class ConsoleBase(object):
>>                                                         False)
>>                   env_spl2_skipped =
>>     self.config.env.get('env__spl2_skipped',
>>                                                         True)
>>     -            if config_spl and config_spl_serial and not
>>     env_spl_skipped:
>>     -                m = self.p.expect([pattern_u_boot_spl_signon] +
>>     -                                  self.bad_patterns)
>>     +            if expect_earlyreset:
>>     +                loop_num = 2
>>     +            else:
>>     +                loop_num = 1
>>     +
>>     +            while loop_num > 0:
>>     +                loop_num -= 1
>>     +                if config_spl and config_spl_serial and not
>>     env_spl_skipped:
>>     +                    m = self.p.expect([pattern_u_boot_spl_signon] +
>>     +                                      self.bad_patterns)
>>     +                    if m != 0:
>>     +                        raise Exception('Bad pattern found on SPL
>>     console: ' +
>>     +                                        self.bad_pattern_ids[m - 1])
>>     +                if not env_spl2_skipped:
>>     +                    m = self.p.expect([pattern_u_boot_spl2_signon] +
>>     +                                      self.bad_patterns)
>>     +                    if m != 0:
>>     +                        raise Exception('Bad pattern found on SPL2
>>     console: ' +
>>     +                                        self.bad_pattern_ids[m - 1])
>>     +                m = self.p.expect([pattern_u_boot_main_signon] +
>>     self.bad_patterns)
>>                       if m != 0:
>>     -                    raise Exception('Bad pattern found on SPL
>>     console: ' +
>>     -                                    self.bad_pattern_ids[m - 1])
>>     -            if not env_spl2_skipped:
>>     -                m = self.p.expect([pattern_u_boot_spl2_signon] +
>>     -                                  self.bad_patterns)
>>     -                if m != 0:
>>     -                    raise Exception('Bad pattern found on SPL2
>>     console: ' +
>>     +                    raise Exception('Bad pattern found on 
>> console: ' +
>>                                           self.bad_pattern_ids[m - 1])
>>     -            m = self.p.expect([pattern_u_boot_main_signon] +
>>     self.bad_patterns)
>>     -            if m != 0:
>>     -                raise Exception('Bad pattern found on console: ' +
>>     -                                self.bad_pattern_ids[m - 1])
>>                   self.u_boot_version_string = self.p.after
>>                   while True:
>>                       m = self.p.expect([self.prompt_compiled,
>>     @@ -416,10 +463,10 @@ class ConsoleBase(object):
>>                   pass
>>               self.p = None
>>
>>     -    def restart_uboot(self):
>>     +    def restart_uboot(self, expect_earlyreset=False):
>>               """Shut down and restart U-Boot."""
>>               self.cleanup_spawn()
>>     -        self.ensure_spawned()
>>     +        self.ensure_spawned(expect_earlyreset)
>>
>>           def get_spawn_output(self):
>>               """Return the start-up output from U-Boot
>>     diff --git a/test/py/u_boot_console_sandbox.py
>>     b/test/py/u_boot_console_sandbox.py
>>     index 7e1eb0e0b4..9cd9ccad30 100644
>>     --- a/test/py/u_boot_console_sandbox.py
>>     +++ b/test/py/u_boot_console_sandbox.py
>>     @@ -57,11 +57,13 @@ class ConsoleSandbox(ConsoleBase):
>>               cmd += self.sandbox_flags
>>               return Spawn(cmd, cwd=self.config.source_dir)
>>
>>     -    def restart_uboot_with_flags(self, flags):
>>     +    def restart_uboot_with_flags(self, flags, 
>> expect_earlyreset=False):
>>               """Run U-Boot with the given command-line flags
>>
>>               Args:
>>                   flags: List of flags to pass, each a string
>>     +            expect_earlyreset: This boot is expected to be reset in
>>     early
>>     +                stage (before prompt). False by default.
>>
>>               Returns:
>>                   A u_boot_spawn.Spawn object that is attached to U-Boot.
>>     @@ -69,7 +71,7 @@ class ConsoleSandbox(ConsoleBase):
>>
>>               try:
>>                   self.sandbox_flags = flags
>>     -            return self.restart_uboot()
>>     +            return self.restart_uboot(expect_earlyreset)
>>               finally:
>>                   self.sandbox_flags = []
>>
>>
>>
>>
>> -- 
>> Masami Hiramatsu
> 



More information about the U-Boot mailing list