[U-Boot] [PATCH v3 0/7] add inital SF tests
Liam Beguin
liambeguin at gmail.com
Wed Mar 14 02:03:00 UTC 2018
Hi all,
This is the inital step to adding tests for the SF subsystem plus very
minor fixes. It is based on work I found on the mailing list[1].
For now, it doesn't do much but I plan on adding code to reset the flash
to its initial state (based on an env flag) and more code to test the
`sf protect` subcommand (which is the main goal of this series).
I'm sending it now to make sure it's headed in the right direction.
Base on Stephen's comment[2], I haven't added the radomized features.
I'll see how this iteration goes and maybe add it later.
Changes since v2:
- remove double blank lines
- in sf_prepare, fix the way `speed` is read from env__sf_config
- in sf_prepare, fix assert of env__sf_config['offset']
- in sf_prepare, do not fail if env__sf_config['crc32'] == 0
- in sf_{read,update}, `pattern` is in bytes. Make sure md/mw use the
right sizes.
- in sf_{read,update}, rename `crc_read` to `crc_pattern` when
appropriate
- add missing pytest.mark on test_sf_update
Changes since v1:
- remove unnecessary skip flag from environment
- move crc32() to u_boot_utils.py and add extra checks
- rewrite sf_prepare to return a dict of parameter
- use assert instead of pytest.fail
- remove verbose from sf_prepare()
- update documentation
- improve readability
- use ' consistently instead of "
- use sf_read() in test_sf_read()
- rename crc variables
- add speed parameter with optional random range
- allow `sf read` to write at 0x00
Thanks,
Liam Beguin
[ 1 ] https://patchwork.ozlabs.org/patch/623061/
[ 2 ] https://lists.denx.de/pipermail/u-boot/2018-March/321688.html
Liam Beguin (7):
spi: spi_flash: do not fail silently on bad user input
cmd: sf: fix map_physmem check
test/py: README: fix typo
test/py: README: add HOSTNAME to PYTHONPATH
test/py: do not import pytest multiple times
test/py: add generic CRC32 function
test/py: add spi_flash tests
cmd/sf.c | 2 +-
drivers/mtd/spi/spi_flash.c | 2 +-
test/py/README.md | 6 +-
test/py/tests/test_sf.py | 217 ++++++++++++++++++++++++++++++++++++++++++++
test/py/u_boot_utils.py | 24 ++++-
5 files changed, 245 insertions(+), 6 deletions(-)
create mode 100644 test/py/tests/test_sf.py
base-commit: f95ab1fb6e37f0601f397091bb011edf7a98b890
Published-As: https://github.com/Liambeguin/u-boot/releases/tag/test_sf-v3
interdiff vs v2:
diff --git a/test/py/tests/test_sf.py b/test/py/tests/test_sf.py
index 0cc2a60e68d4..8bd1623ff303 100644
--- a/test/py/tests/test_sf.py
+++ b/test/py/tests/test_sf.py
@@ -7,7 +7,6 @@ import pytest
import random
import u_boot_utils
-
"""
Note: This test relies on boardenv_* containing configuration values to define
which SPI Flash areas are available for testing. Without this, this test will
@@ -45,7 +44,6 @@ env__sf_configs = (
)
"""
-
def sf_prepare(u_boot_console, env__sf_config):
"""Check global state of the SPI Flash before running any test.
@@ -63,10 +61,11 @@ def sf_prepare(u_boot_console, env__sf_config):
probe_id = env__sf_config.get('id', 0)
speed = env__sf_config.get('speed', 0)
- if isinstance(speed, list) and len(speed) == 2:
- sf_params['speed'] = random.randint(speed[0], speed[1])
- else:
+ if isinstance(speed, int):
sf_params['speed'] = speed
+ else:
+ assert len(speed) == 2, "If speed is a list, it must have 2 entries"
+ sf_params['speed'] = random.randint(speed[0], speed[1])
cmd = 'sf probe %d %d' % (probe_id, sf_params['speed'])
@@ -87,7 +86,7 @@ def sf_prepare(u_boot_console, env__sf_config):
sf_params['total_size'] = int(m.group(1))
sf_params['total_size'] *= 1024 * 1024
- assert env__sf_config['offset'] is not None, \
+ assert 'offset' in env__sf_config, \
'\'offset\' is required for this test.'
sf_params['len'] = env__sf_config.get('len', sf_params['erase_size'])
@@ -97,12 +96,11 @@ def sf_prepare(u_boot_console, env__sf_config):
'erase length not multiple of erase size.'
assert not (env__sf_config.get('writeable', False) and
- env__sf_config.get('crc32', False)), \
- 'Cannot check crc32 on writeable sections'
+ 'crc32' in env__sf_config), \
+ 'Cannot check crc32 on writeable sections'
return sf_params
-
def sf_read(u_boot_console, env__sf_config, sf_params):
"""Helper function used to read and compute the CRC32 value of a section of
SPI Flash memory.
@@ -120,26 +118,25 @@ def sf_read(u_boot_console, env__sf_config, sf_params):
addr = sf_params['ram_base']
offset = env__sf_config['offset']
count = sf_params['len']
- pattern = random.randint(0, 0xFFFFFFFF)
+ pattern = random.randint(0, 0xFF)
crc_expected = env__sf_config.get('crc32', None)
- cmd = 'mw.b %08x %08x %x' % (addr, pattern, count)
+ cmd = 'mw.b %08x %02x %x' % (addr, pattern, count)
u_boot_console.run_command(cmd)
- crc_read = u_boot_utils.crc32(u_boot_console, addr, count)
+ crc_pattern = u_boot_utils.crc32(u_boot_console, addr, count)
if crc_expected:
- assert crc_read != crc_expected
+ assert crc_pattern != crc_expected
cmd = 'sf read %08x %08x %x' % (addr, offset, count)
response = u_boot_console.run_command(cmd)
assert 'Read: OK' in response, 'Read operation failed'
crc_readback = u_boot_utils.crc32(u_boot_console, addr, count)
- assert crc_read != crc_readback, 'sf read did not update RAM content.'
+ assert crc_pattern != crc_readback, 'sf read did not update RAM content.'
if crc_expected:
assert crc_readback == crc_expected
return crc_readback
-
def sf_update(u_boot_console, env__sf_config, sf_params):
"""Helper function used to update a section of SPI Flash memory.
@@ -155,18 +152,17 @@ def sf_update(u_boot_console, env__sf_config, sf_params):
addr = sf_params['ram_base']
offset = env__sf_config['offset']
count = sf_params['len']
- pattern = int(random.random() * 0xFFFFFFFF)
+ pattern = int(random.random() * 0xFF)
- cmd = 'mw.b %08x %08x %x' % (addr, pattern, count)
+ cmd = 'mw.b %08x %02x %x' % (addr, pattern, count)
u_boot_console.run_command(cmd)
- crc_read = u_boot_utils.crc32(u_boot_console, addr, count)
+ crc_pattern = u_boot_utils.crc32(u_boot_console, addr, count)
cmd = 'sf update %08x %08x %x' % (addr, offset, count)
u_boot_console.run_command(cmd)
crc_readback = sf_read(u_boot_console, env__sf_config, sf_params)
- assert crc_readback == crc_read
-
+ assert crc_readback == crc_pattern
@pytest.mark.buildconfigspec('cmd_sf')
@pytest.mark.buildconfigspec('cmd_crc32')
@@ -175,7 +171,6 @@ def test_sf_read(u_boot_console, env__sf_config):
sf_params = sf_prepare(u_boot_console, env__sf_config)
sf_read(u_boot_console, env__sf_config, sf_params)
-
@pytest.mark.buildconfigspec('cmd_sf')
@pytest.mark.buildconfigspec('cmd_crc32')
@pytest.mark.buildconfigspec('cmd_memory')
@@ -188,7 +183,6 @@ def test_sf_read_twice(u_boot_console, env__sf_config):
assert crc1 == crc2, 'CRC32 of two successive read operation do not match'
-
@pytest.mark.buildconfigspec('cmd_sf')
@pytest.mark.buildconfigspec('cmd_crc32')
@pytest.mark.buildconfigspec('cmd_memory')
@@ -205,15 +199,15 @@ def test_sf_erase(u_boot_console, env__sf_config):
output = u_boot_console.run_command(cmd)
assert 'Erased: OK' in output, 'Erase operation failed'
- cmd = 'mw.b %08x ffffffff %x' % (addr, count)
+ cmd = 'mw.b %08x ff %x' % (addr, count)
u_boot_console.run_command(cmd)
crc_ffs = u_boot_utils.crc32(u_boot_console, addr, count)
crc_read = sf_read(u_boot_console, env__sf_config, sf_params)
assert crc_ffs == crc_read, 'Unexpected CRC32 after erase operation.'
-
@pytest.mark.buildconfigspec('cmd_sf')
+ at pytest.mark.buildconfigspec('cmd_crc32')
@pytest.mark.buildconfigspec('cmd_memory')
def test_sf_update(u_boot_console, env__sf_config):
if not env__sf_config.get('writeable', False):
--
2.16.1.72.g5be1f00a9a70
More information about the U-Boot
mailing list