# 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', '')