mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-16 09:54:35 +00:00
test/py: saveenv: Add a test for saveenv command
Add test case for saveenv command in non-JTAG bootmode which saves the u-boot environment variables in persistent storage. Signed-off-by: Love Kumar <love.kumar@amd.com>
This commit is contained in:
parent
0c8b1b29c6
commit
4eff1145bc
1 changed files with 137 additions and 0 deletions
137
test/py/tests/test_saveenv.py
Normal file
137
test/py/tests/test_saveenv.py
Normal file
|
@ -0,0 +1,137 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# (C) Copyright 2023, Advanced Micro Devices, Inc.
|
||||
|
||||
"""
|
||||
Note: This test doesn't rely on boardenv_* configuration value but they can
|
||||
change test behavior.
|
||||
|
||||
For example:
|
||||
|
||||
# Setup env__saveenv_test_skip to True if saveenv test is not possible or
|
||||
# desired and should be skipped.
|
||||
env__saveenv_test_skip = True
|
||||
|
||||
# Setup env__saveenv_test to set the bootmode if 'modeboot' u-boot environment
|
||||
# variable is not set. Test will be skipped if bootmode is not set in both
|
||||
# places i.e, boardenv and modeboot u-boot environment variable
|
||||
env__saveenv_test = {
|
||||
'bootmode': 'qspiboot',
|
||||
}
|
||||
|
||||
# This test will be also skipped if the bootmode is detected to JTAG.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import random
|
||||
import ipaddress
|
||||
import string
|
||||
import uuid
|
||||
|
||||
# Setup the env
|
||||
def setup_saveenv_env(u_boot_console):
|
||||
if u_boot_console.config.env.get('env__saveenv_test_skip', False):
|
||||
pytest.skip('saveenv test is not enabled')
|
||||
|
||||
output = u_boot_console.run_command('echo $modeboot')
|
||||
if output:
|
||||
bootmode = output
|
||||
else:
|
||||
f = u_boot_console.config.env.get('env__saveenv_test', None)
|
||||
if not f:
|
||||
pytest.skip('bootmode cannot be determined')
|
||||
bootmode = f.get('bootmode', 'jtagboot')
|
||||
|
||||
if 'jtag' in bootmode:
|
||||
pytest.skip('skipping saveenv test due to jtag bootmode')
|
||||
|
||||
# Check return code
|
||||
def ret_code(u_boot_console):
|
||||
return u_boot_console.run_command('echo $?')
|
||||
|
||||
# Verify env variable
|
||||
def check_env(u_boot_console, var_name, var_value):
|
||||
if var_value:
|
||||
output = u_boot_console.run_command(f'printenv {var_name}')
|
||||
var_value = str(var_value)
|
||||
if (var_value.startswith("'") and var_value.endswith("'")) or (
|
||||
var_value.startswith('"') and var_value.endswith('"')
|
||||
):
|
||||
var_value = var_value.split(var_value[-1])[1]
|
||||
assert var_value in output
|
||||
assert ret_code(u_boot_console).endswith('0')
|
||||
else:
|
||||
u_boot_console.p.send(f'printenv {var_name}\n')
|
||||
output = u_boot_console.p.expect(['not defined'])
|
||||
assert output == 0
|
||||
assert ret_code(u_boot_console).endswith('1')
|
||||
|
||||
# Set env variable
|
||||
def set_env(u_boot_console, var_name, var_value):
|
||||
u_boot_console.run_command(f'setenv {var_name} {var_value}')
|
||||
assert ret_code(u_boot_console).endswith('0')
|
||||
check_env(u_boot_console, var_name, var_value)
|
||||
|
||||
@pytest.mark.buildconfigspec('cmd_saveenv')
|
||||
@pytest.mark.buildconfigspec('hush_parser')
|
||||
def test_saveenv(u_boot_console):
|
||||
"""Test the saveenv command in non-JTAG bootmode.
|
||||
It saves the U-Boot environment in persistent storage.
|
||||
"""
|
||||
setup_saveenv_env(u_boot_console)
|
||||
|
||||
# Set env for random mac address
|
||||
rand_mac = '%02x:%02x:%02x:%02x:%02x:%02x' % (
|
||||
random.randint(0, 255),
|
||||
random.randint(0, 255),
|
||||
random.randint(0, 255),
|
||||
random.randint(0, 255),
|
||||
random.randint(0, 255),
|
||||
random.randint(0, 255),
|
||||
)
|
||||
set_env(u_boot_console, 'mac_addr', rand_mac)
|
||||
|
||||
# Set env for random IPv4 address
|
||||
rand_ipv4 = ipaddress.IPv4Address._string_from_ip_int(
|
||||
random.randint(0, ipaddress.IPv4Address._ALL_ONES)
|
||||
)
|
||||
set_env(u_boot_console, 'ipv4_addr', rand_ipv4)
|
||||
|
||||
# Set env for random IPv6 address
|
||||
rand_ipv6 = ipaddress.IPv6Address._string_from_ip_int(
|
||||
random.randint(0, ipaddress.IPv6Address._ALL_ONES)
|
||||
)
|
||||
set_env(u_boot_console, 'ipv6_addr', rand_ipv6)
|
||||
|
||||
# Set env for random number
|
||||
rand_num = random.randrange(1, 10**9)
|
||||
set_env(u_boot_console, 'num_var', rand_num)
|
||||
|
||||
# Set env for uuid
|
||||
uuid_str = uuid.uuid4().hex.lower()
|
||||
set_env(u_boot_console, 'uuid_var', uuid_str)
|
||||
|
||||
# Set env for random string including special characters
|
||||
sc = "!#%&()*+,-./:;<=>?@[\\]^_`{|}~"
|
||||
rand_str = ''.join(
|
||||
random.choices(' ' + string.ascii_letters + sc + string.digits, k=300)
|
||||
)
|
||||
set_env(u_boot_console, 'str_var', f'"{rand_str}"')
|
||||
|
||||
# Set env for empty string
|
||||
set_env(u_boot_console, 'empty_var', '')
|
||||
|
||||
# Save the env variables
|
||||
u_boot_console.run_command('saveenv')
|
||||
assert ret_code(u_boot_console).endswith('0')
|
||||
|
||||
# Reboot
|
||||
u_boot_console.run_command('reset', wait_for_reboot=True)
|
||||
|
||||
# Verify the saved env variables
|
||||
check_env(u_boot_console, 'mac_addr', rand_mac)
|
||||
check_env(u_boot_console, 'ipv4_addr', rand_ipv4)
|
||||
check_env(u_boot_console, 'ipv6_addr', rand_ipv6)
|
||||
check_env(u_boot_console, 'num_var', rand_num)
|
||||
check_env(u_boot_console, 'uuid_var', uuid_str)
|
||||
check_env(u_boot_console, 'str_var', rand_str)
|
||||
check_env(u_boot_console, 'empty_var', '')
|
Loading…
Add table
Reference in a new issue