Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 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', '') |