[v5,17/17] test/py: add a test for uefi firmware update capsule of raw image

Message ID 20200803054355.17356-18-takahiro.akashi@linaro.org
State New
Headers show
Series
  • efi_loader: add capsule update support
Related show

Commit Message

AKASHI Takahiro Aug. 3, 2020, 5:43 a.m.
The test can run on sandbox build and it attempts to execute a firmware
update via a capsule-on-disk, using a raw image capsule,
CONFIG_EFI_CAPSULE_RAW.

To run this test successfully, you need configure U-Boot specifically;
See test_capsule_firmware.py for requirements, and hence it won't run
on Travis CI.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

---
 test/py/tests/test_efi_capsule/conftest.py    |  3 +
 .../test_efi_capsule/test_capsule_firmware.py | 63 +++++++++++++++++++
 2 files changed, 66 insertions(+)

-- 
2.27.0

Comments

Heinrich Schuchardt Aug. 28, 2020, 4:07 a.m. | #1
On 8/3/20 7:43 AM, AKASHI Takahiro wrote:
> The test can run on sandbox build and it attempts to execute a firmware

> update via a capsule-on-disk, using a raw image capsule,

> CONFIG_EFI_CAPSULE_RAW.

>

> To run this test successfully, you need configure U-Boot specifically;

> See test_capsule_firmware.py for requirements, and hence it won't run

> on Travis CI.

>


git format-patch results in the same filename for patch 16 and 17.

You subject lines are simply too long. How about:

"test/py: test for raw image capsule"

Best regards

Heinrich

> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

> ---

>  test/py/tests/test_efi_capsule/conftest.py    |  3 +

>  .../test_efi_capsule/test_capsule_firmware.py | 63 +++++++++++++++++++

>  2 files changed, 66 insertions(+)

>

> diff --git a/test/py/tests/test_efi_capsule/conftest.py b/test/py/tests/test_efi_capsule/conftest.py

> index 4e7c36f04ba5..4544a24d5351 100644

> --- a/test/py/tests/test_efi_capsule/conftest.py

> +++ b/test/py/tests/test_efi_capsule/conftest.py

> @@ -51,6 +51,9 @@ def efi_capsule_data(request, u_boot_config):

>          check_call('cd %s; %s/tools/mkeficapsule --fit uboot_bin_env.itb --version 1 --index 1 Test01' %

>                     (data_dir, u_boot_config.build_dir),

>                     shell=True)

> +        check_call('cd %s; %s/tools/mkeficapsule --raw u-boot.bin.new --version 1 --index 1 Test02' %

> +                   (data_dir, u_boot_config.build_dir),

> +                   shell=True)

>

>          # Create a disk image with EFI system partition

>          check_call('virt-make-fs --partition=gpt --size=+1M --type=vfat %s %s' %

> 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 1673a4877778..2b2c7baa7ba6 100644

> --- a/test/py/tests/test_efi_capsule/test_capsule_firmware.py

> +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware.py

> @@ -15,6 +15,7 @@ from defs import *

>

>  @pytest.mark.boardspec('sandbox')

>  @pytest.mark.buildconfigspec('efi_capsule_firmware_fit')

> +@pytest.mark.buildconfigspec('efi_capsule_firmware_raw')

>  @pytest.mark.buildconfigspec('efi_capsule_on_disk')

>  @pytest.mark.buildconfigspec('dfu')

>  @pytest.mark.buildconfigspec('dfu_sf')

> @@ -176,3 +177,65 @@ class TestEfiCapsuleFirmwareFit(object):

>                  'sf read 4000000 150000 10',

>                  'md.b 4000000 10'])

>              assert 'u-boot-env:New' in ''.join(output)

> +

> +    def test_efi_capsule_fw3(

> +            self, u_boot_config, u_boot_console, efi_capsule_data):

> +        """

> +        Test Case 3 - Update U-Boot on SPI Flash, raw image format

> +                      0x100000-0x150000: U-Boot binary (but dummy)

> +        """

> +        # "-T" (or "-D") is required to enable spi flash on sandbox

> +        u_boot_console.restart_uboot_with_flags('-T')

> +

> +        disk_img = efi_capsule_data

> +        with u_boot_console.log.section('Test Case 3-a, before reboot'):

> +            output = u_boot_console.run_command_list([

> +                'host bind 0 %s' % disk_img,

> +                'efidebug boot add 1 TEST host 0:1 /helloworld.efi ""',

> +                'efidebug boot order 1',

> +                'env set -e -nv -bs -rt OsIndications =0x0000000000000004',

> +                'env set dfu_alt_info sf 0:0=u-boot-bin raw 0x100000 0x50000\;u-boot-env raw 0x150000 0x200000',

> +                'env save'])

> +

> +            # initialize content

> +            output = u_boot_console.run_command_list([

> +                'sf probe 0:0',

> +                'fatload host 0:1 4000000 %s/u-boot.bin.old' % CAPSULE_DATA_DIR,

> +                'sf write 4000000 100000 10',

> +                'sf read 5000000 100000 10',

> +                'md.b 5000000 10'])

> +            assert 'Old' in ''.join(output)

> +

> +            # place a capsule file

> +            output = u_boot_console.run_command_list([

> +                'fatload host 0:1 4000000 %s/Test02' % CAPSULE_DATA_DIR,

> +                'fatwrite host 0:1 4000000 %s/Test02 $filesize' % CAPSULE_INSTALL_DIR,

> +                'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])

> +            assert 'Test02' in ''.join(output)

> +

> +        # reboot

> +        u_boot_console.restart_uboot_with_flags('-T')

> +

> +        capsule_early = u_boot_config.buildconfig.get(

> +            'config_efi_capsule_on_disk_early')

> +        with u_boot_console.log.section('Test Case 3-b, after reboot'):

> +            if not capsule_early:

> +                output = u_boot_console.run_command_list([

> +                    'host bind 0 %s' % disk_img,

> +                    'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])

> +                assert 'Test02' in ''.join(output)

> +

> +                # need to run uefi command to initiate capsule handling

> +                output = u_boot_console.run_command(

> +                    'env print -e -all Capsule0000')

> +

> +            output = u_boot_console.run_command_list([

> +                '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([

> +                'sf probe 0:0',

> +                'sf read 4000000 100000 10',

> +                'md.b 4000000 10'])

> +            assert 'u-boot:New' in ''.join(output)

>
AKASHI Takahiro Aug. 31, 2020, 5:15 a.m. | #2
On Fri, Aug 28, 2020 at 06:07:10AM +0200, Heinrich Schuchardt wrote:
> On 8/3/20 7:43 AM, AKASHI Takahiro wrote:

> > The test can run on sandbox build and it attempts to execute a firmware

> > update via a capsule-on-disk, using a raw image capsule,

> > CONFIG_EFI_CAPSULE_RAW.

> >

> > To run this test successfully, you need configure U-Boot specifically;

> > See test_capsule_firmware.py for requirements, and hence it won't run

> > on Travis CI.

> >

> 

> git format-patch results in the same filename for patch 16 and 17.


Indeed, though the preceding index number will make them distinguishable.

> You subject lines are simply too long. How about:

> 

> "test/py: test for raw image capsule"


Okay, something like that.

-Takahiro Akashi

> Best regards

> 

> Heinrich

> 

> > Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

> > ---

> >  test/py/tests/test_efi_capsule/conftest.py    |  3 +

> >  .../test_efi_capsule/test_capsule_firmware.py | 63 +++++++++++++++++++

> >  2 files changed, 66 insertions(+)

> >

> > diff --git a/test/py/tests/test_efi_capsule/conftest.py b/test/py/tests/test_efi_capsule/conftest.py

> > index 4e7c36f04ba5..4544a24d5351 100644

> > --- a/test/py/tests/test_efi_capsule/conftest.py

> > +++ b/test/py/tests/test_efi_capsule/conftest.py

> > @@ -51,6 +51,9 @@ def efi_capsule_data(request, u_boot_config):

> >          check_call('cd %s; %s/tools/mkeficapsule --fit uboot_bin_env.itb --version 1 --index 1 Test01' %

> >                     (data_dir, u_boot_config.build_dir),

> >                     shell=True)

> > +        check_call('cd %s; %s/tools/mkeficapsule --raw u-boot.bin.new --version 1 --index 1 Test02' %

> > +                   (data_dir, u_boot_config.build_dir),

> > +                   shell=True)

> >

> >          # Create a disk image with EFI system partition

> >          check_call('virt-make-fs --partition=gpt --size=+1M --type=vfat %s %s' %

> > 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 1673a4877778..2b2c7baa7ba6 100644

> > --- a/test/py/tests/test_efi_capsule/test_capsule_firmware.py

> > +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware.py

> > @@ -15,6 +15,7 @@ from defs import *

> >

> >  @pytest.mark.boardspec('sandbox')

> >  @pytest.mark.buildconfigspec('efi_capsule_firmware_fit')

> > +@pytest.mark.buildconfigspec('efi_capsule_firmware_raw')

> >  @pytest.mark.buildconfigspec('efi_capsule_on_disk')

> >  @pytest.mark.buildconfigspec('dfu')

> >  @pytest.mark.buildconfigspec('dfu_sf')

> > @@ -176,3 +177,65 @@ class TestEfiCapsuleFirmwareFit(object):

> >                  'sf read 4000000 150000 10',

> >                  'md.b 4000000 10'])

> >              assert 'u-boot-env:New' in ''.join(output)

> > +

> > +    def test_efi_capsule_fw3(

> > +            self, u_boot_config, u_boot_console, efi_capsule_data):

> > +        """

> > +        Test Case 3 - Update U-Boot on SPI Flash, raw image format

> > +                      0x100000-0x150000: U-Boot binary (but dummy)

> > +        """

> > +        # "-T" (or "-D") is required to enable spi flash on sandbox

> > +        u_boot_console.restart_uboot_with_flags('-T')

> > +

> > +        disk_img = efi_capsule_data

> > +        with u_boot_console.log.section('Test Case 3-a, before reboot'):

> > +            output = u_boot_console.run_command_list([

> > +                'host bind 0 %s' % disk_img,

> > +                'efidebug boot add 1 TEST host 0:1 /helloworld.efi ""',

> > +                'efidebug boot order 1',

> > +                'env set -e -nv -bs -rt OsIndications =0x0000000000000004',

> > +                'env set dfu_alt_info sf 0:0=u-boot-bin raw 0x100000 0x50000\;u-boot-env raw 0x150000 0x200000',

> > +                'env save'])

> > +

> > +            # initialize content

> > +            output = u_boot_console.run_command_list([

> > +                'sf probe 0:0',

> > +                'fatload host 0:1 4000000 %s/u-boot.bin.old' % CAPSULE_DATA_DIR,

> > +                'sf write 4000000 100000 10',

> > +                'sf read 5000000 100000 10',

> > +                'md.b 5000000 10'])

> > +            assert 'Old' in ''.join(output)

> > +

> > +            # place a capsule file

> > +            output = u_boot_console.run_command_list([

> > +                'fatload host 0:1 4000000 %s/Test02' % CAPSULE_DATA_DIR,

> > +                'fatwrite host 0:1 4000000 %s/Test02 $filesize' % CAPSULE_INSTALL_DIR,

> > +                'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])

> > +            assert 'Test02' in ''.join(output)

> > +

> > +        # reboot

> > +        u_boot_console.restart_uboot_with_flags('-T')

> > +

> > +        capsule_early = u_boot_config.buildconfig.get(

> > +            'config_efi_capsule_on_disk_early')

> > +        with u_boot_console.log.section('Test Case 3-b, after reboot'):

> > +            if not capsule_early:

> > +                output = u_boot_console.run_command_list([

> > +                    'host bind 0 %s' % disk_img,

> > +                    'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])

> > +                assert 'Test02' in ''.join(output)

> > +

> > +                # need to run uefi command to initiate capsule handling

> > +                output = u_boot_console.run_command(

> > +                    'env print -e -all Capsule0000')

> > +

> > +            output = u_boot_console.run_command_list([

> > +                '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([

> > +                'sf probe 0:0',

> > +                'sf read 4000000 100000 10',

> > +                'md.b 4000000 10'])

> > +            assert 'u-boot:New' in ''.join(output)

> >

>
Heinrich Schuchardt Aug. 31, 2020, 11:45 a.m. | #3
On 28.08.20 06:07, Heinrich Schuchardt wrote:
> On 8/3/20 7:43 AM, AKASHI Takahiro wrote:

>> The test can run on sandbox build and it attempts to execute a firmware

>> update via a capsule-on-disk, using a raw image capsule,

>> CONFIG_EFI_CAPSULE_RAW.

>>

>> To run this test successfully, you need configure U-Boot specifically;

>> See test_capsule_firmware.py for requirements, and hence it won't run

>> on Travis CI.

>>

>

> git format-patch results in the same filename for patch 16 and 17.

>

> You subject lines are simply too long. How about:

>

> "test/py: test for raw image capsule"

>

> Best regards

>

> Heinrich

>

>> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

>> ---

>>  test/py/tests/test_efi_capsule/conftest.py    |  3 +

>>  .../test_efi_capsule/test_capsule_firmware.py | 63 +++++++++++++++++++

>>  2 files changed, 66 insertions(+)

>>

>> diff --git a/test/py/tests/test_efi_capsule/conftest.py b/test/py/tests/test_efi_capsule/conftest.py

>> index 4e7c36f04ba5..4544a24d5351 100644

>> --- a/test/py/tests/test_efi_capsule/conftest.py

>> +++ b/test/py/tests/test_efi_capsule/conftest.py

>> @@ -51,6 +51,9 @@ def efi_capsule_data(request, u_boot_config):

>>          check_call('cd %s; %s/tools/mkeficapsule --fit uboot_bin_env.itb --version 1 --index 1 Test01' %

>>                     (data_dir, u_boot_config.build_dir),

>>                     shell=True)

>> +        check_call('cd %s; %s/tools/mkeficapsule --raw u-boot.bin.new --version 1 --index 1 Test02' %

>> +                   (data_dir, u_boot_config.build_dir),

>> +                   shell=True)

>>

>>          # Create a disk image with EFI system partition

>>          check_call('virt-make-fs --partition=gpt --size=+1M --type=vfat %s %s' %

>> 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 1673a4877778..2b2c7baa7ba6 100644

>> --- a/test/py/tests/test_efi_capsule/test_capsule_firmware.py

>> +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware.py

>> @@ -15,6 +15,7 @@ from defs import *

>>

>>  @pytest.mark.boardspec('sandbox')

>>  @pytest.mark.buildconfigspec('efi_capsule_firmware_fit')

>> +@pytest.mark.buildconfigspec('efi_capsule_firmware_raw')

>>  @pytest.mark.buildconfigspec('efi_capsule_on_disk')

>>  @pytest.mark.buildconfigspec('dfu')

>>  @pytest.mark.buildconfigspec('dfu_sf')

>> @@ -176,3 +177,65 @@ class TestEfiCapsuleFirmwareFit(object):

>>                  'sf read 4000000 150000 10',

>>                  'md.b 4000000 10'])

>>              assert 'u-boot-env:New' in ''.join(output)

>> +

>> +    def test_efi_capsule_fw3(

>> +            self, u_boot_config, u_boot_console, efi_capsule_data):

>> +        """

>> +        Test Case 3 - Update U-Boot on SPI Flash, raw image format

>> +                      0x100000-0x150000: U-Boot binary (but dummy)

>> +        """

>> +        # "-T" (or "-D") is required to enable spi flash on sandbox

>> +        u_boot_console.restart_uboot_with_flags('-T')

>> +

>> +        disk_img = efi_capsule_data

>> +        with u_boot_console.log.section('Test Case 3-a, before reboot'):

>> +            output = u_boot_console.run_command_list([

>> +                'host bind 0 %s' % disk_img,

>> +                'efidebug boot add 1 TEST host 0:1 /helloworld.efi ""',

>> +                'efidebug boot order 1',

>> +                'env set -e -nv -bs -rt OsIndications =0x0000000000000004',

>> +                'env set dfu_alt_info sf 0:0=u-boot-bin raw 0x100000 0x50000\;u-boot-env raw 0x150000 0x200000',


Invalid escape sequence \;

Best regards

Heinrich

>> +                'env save'])

>> +

>> +            # initialize content

>> +            output = u_boot_console.run_command_list([

>> +                'sf probe 0:0',

>> +                'fatload host 0:1 4000000 %s/u-boot.bin.old' % CAPSULE_DATA_DIR,

>> +                'sf write 4000000 100000 10',

>> +                'sf read 5000000 100000 10',

>> +                'md.b 5000000 10'])

>> +            assert 'Old' in ''.join(output)

>> +

>> +            # place a capsule file

>> +            output = u_boot_console.run_command_list([

>> +                'fatload host 0:1 4000000 %s/Test02' % CAPSULE_DATA_DIR,

>> +                'fatwrite host 0:1 4000000 %s/Test02 $filesize' % CAPSULE_INSTALL_DIR,

>> +                'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])

>> +            assert 'Test02' in ''.join(output)

>> +

>> +        # reboot

>> +        u_boot_console.restart_uboot_with_flags('-T')

>> +

>> +        capsule_early = u_boot_config.buildconfig.get(

>> +            'config_efi_capsule_on_disk_early')

>> +        with u_boot_console.log.section('Test Case 3-b, after reboot'):

>> +            if not capsule_early:

>> +                output = u_boot_console.run_command_list([

>> +                    'host bind 0 %s' % disk_img,

>> +                    'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])

>> +                assert 'Test02' in ''.join(output)

>> +

>> +                # need to run uefi command to initiate capsule handling

>> +                output = u_boot_console.run_command(

>> +                    'env print -e -all Capsule0000')

>> +

>> +            output = u_boot_console.run_command_list([

>> +                '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([

>> +                'sf probe 0:0',

>> +                'sf read 4000000 100000 10',

>> +                'md.b 4000000 10'])

>> +            assert 'u-boot:New' in ''.join(output)

>>

>

Patch

diff --git a/test/py/tests/test_efi_capsule/conftest.py b/test/py/tests/test_efi_capsule/conftest.py
index 4e7c36f04ba5..4544a24d5351 100644
--- a/test/py/tests/test_efi_capsule/conftest.py
+++ b/test/py/tests/test_efi_capsule/conftest.py
@@ -51,6 +51,9 @@  def efi_capsule_data(request, u_boot_config):
         check_call('cd %s; %s/tools/mkeficapsule --fit uboot_bin_env.itb --version 1 --index 1 Test01' %
                    (data_dir, u_boot_config.build_dir),
                    shell=True)
+        check_call('cd %s; %s/tools/mkeficapsule --raw u-boot.bin.new --version 1 --index 1 Test02' %
+                   (data_dir, u_boot_config.build_dir),
+                   shell=True)
 
         # Create a disk image with EFI system partition
         check_call('virt-make-fs --partition=gpt --size=+1M --type=vfat %s %s' %
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 1673a4877778..2b2c7baa7ba6 100644
--- a/test/py/tests/test_efi_capsule/test_capsule_firmware.py
+++ b/test/py/tests/test_efi_capsule/test_capsule_firmware.py
@@ -15,6 +15,7 @@  from defs import *
 
 @pytest.mark.boardspec('sandbox')
 @pytest.mark.buildconfigspec('efi_capsule_firmware_fit')
+@pytest.mark.buildconfigspec('efi_capsule_firmware_raw')
 @pytest.mark.buildconfigspec('efi_capsule_on_disk')
 @pytest.mark.buildconfigspec('dfu')
 @pytest.mark.buildconfigspec('dfu_sf')
@@ -176,3 +177,65 @@  class TestEfiCapsuleFirmwareFit(object):
                 'sf read 4000000 150000 10',
                 'md.b 4000000 10'])
             assert 'u-boot-env:New' in ''.join(output)
+
+    def test_efi_capsule_fw3(
+            self, u_boot_config, u_boot_console, efi_capsule_data):
+        """
+        Test Case 3 - Update U-Boot on SPI Flash, raw image format
+                      0x100000-0x150000: U-Boot binary (but dummy)
+        """
+        # "-T" (or "-D") is required to enable spi flash on sandbox
+        u_boot_console.restart_uboot_with_flags('-T')
+
+        disk_img = efi_capsule_data
+        with u_boot_console.log.section('Test Case 3-a, before reboot'):
+            output = u_boot_console.run_command_list([
+                'host bind 0 %s' % disk_img,
+                'efidebug boot add 1 TEST host 0:1 /helloworld.efi ""',
+                'efidebug boot order 1',
+                'env set -e -nv -bs -rt OsIndications =0x0000000000000004',
+                'env set dfu_alt_info sf 0:0=u-boot-bin raw 0x100000 0x50000\;u-boot-env raw 0x150000 0x200000',
+                'env save'])
+
+            # initialize content
+            output = u_boot_console.run_command_list([
+                'sf probe 0:0',
+                'fatload host 0:1 4000000 %s/u-boot.bin.old' % CAPSULE_DATA_DIR,
+                'sf write 4000000 100000 10',
+                'sf read 5000000 100000 10',
+                'md.b 5000000 10'])
+            assert 'Old' in ''.join(output)
+
+            # place a capsule file
+            output = u_boot_console.run_command_list([
+                'fatload host 0:1 4000000 %s/Test02' % CAPSULE_DATA_DIR,
+                'fatwrite host 0:1 4000000 %s/Test02 $filesize' % CAPSULE_INSTALL_DIR,
+                'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
+            assert 'Test02' in ''.join(output)
+
+        # reboot
+        u_boot_console.restart_uboot_with_flags('-T')
+
+        capsule_early = u_boot_config.buildconfig.get(
+            'config_efi_capsule_on_disk_early')
+        with u_boot_console.log.section('Test Case 3-b, after reboot'):
+            if not capsule_early:
+                output = u_boot_console.run_command_list([
+                    'host bind 0 %s' % disk_img,
+                    'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
+                assert 'Test02' in ''.join(output)
+
+                # need to run uefi command to initiate capsule handling
+                output = u_boot_console.run_command(
+                    'env print -e -all Capsule0000')
+
+            output = u_boot_console.run_command_list([
+                '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([
+                'sf probe 0:0',
+                'sf read 4000000 100000 10',
+                'md.b 4000000 10'])
+            assert 'u-boot:New' in ''.join(output)