summaryrefslogtreecommitdiff
path: root/test/py/tests/test_saveenv.py
blob: 7faa3bdf93de934edf2d24f931d0e1dace672fb9 (plain)
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', '')