xref: /rk3399_rockchip-uboot/test/py/tests/test_env.py (revision 5ab097abad7d6d2b6da2d0423b95803950831cc6)
1*5ab097abSStephen Warren# Copyright (c) 2015 Stephen Warren
2*5ab097abSStephen Warren# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
3*5ab097abSStephen Warren#
4*5ab097abSStephen Warren# SPDX-License-Identifier: GPL-2.0
5*5ab097abSStephen Warren
6*5ab097abSStephen Warren# Test operation of shell commands relating to environment variables.
7*5ab097abSStephen Warren
8*5ab097abSStephen Warrenimport pytest
9*5ab097abSStephen Warren
10*5ab097abSStephen Warren# FIXME: This might be useful for other tests;
11*5ab097abSStephen Warren# perhaps refactor it into ConsoleBase or some other state object?
12*5ab097abSStephen Warrenclass StateTestEnv(object):
13*5ab097abSStephen Warren    '''Container that represents the state of all U-Boot environment variables.
14*5ab097abSStephen Warren    This enables quick determination of existant/non-existant variable
15*5ab097abSStephen Warren    names.
16*5ab097abSStephen Warren    '''
17*5ab097abSStephen Warren
18*5ab097abSStephen Warren    def __init__(self, u_boot_console):
19*5ab097abSStephen Warren        '''Initialize a new StateTestEnv object.
20*5ab097abSStephen Warren
21*5ab097abSStephen Warren        Args:
22*5ab097abSStephen Warren            u_boot_console: A U-Boot console.
23*5ab097abSStephen Warren
24*5ab097abSStephen Warren        Returns:
25*5ab097abSStephen Warren            Nothing.
26*5ab097abSStephen Warren        '''
27*5ab097abSStephen Warren
28*5ab097abSStephen Warren        self.u_boot_console = u_boot_console
29*5ab097abSStephen Warren        self.get_env()
30*5ab097abSStephen Warren        self.set_var = self.get_non_existent_var()
31*5ab097abSStephen Warren
32*5ab097abSStephen Warren    def get_env(self):
33*5ab097abSStephen Warren        '''Read all current environment variables from U-Boot.
34*5ab097abSStephen Warren
35*5ab097abSStephen Warren        Args:
36*5ab097abSStephen Warren            None.
37*5ab097abSStephen Warren
38*5ab097abSStephen Warren        Returns:
39*5ab097abSStephen Warren            Nothing.
40*5ab097abSStephen Warren        '''
41*5ab097abSStephen Warren
42*5ab097abSStephen Warren        response = self.u_boot_console.run_command('printenv')
43*5ab097abSStephen Warren        self.env = {}
44*5ab097abSStephen Warren        for l in response.splitlines():
45*5ab097abSStephen Warren            if not '=' in l:
46*5ab097abSStephen Warren                continue
47*5ab097abSStephen Warren            (var, value) = l.strip().split('=', 1)
48*5ab097abSStephen Warren            self.env[var] = value
49*5ab097abSStephen Warren
50*5ab097abSStephen Warren    def get_existent_var(self):
51*5ab097abSStephen Warren        '''Return the name of an environment variable that exists.
52*5ab097abSStephen Warren
53*5ab097abSStephen Warren        Args:
54*5ab097abSStephen Warren            None.
55*5ab097abSStephen Warren
56*5ab097abSStephen Warren        Returns:
57*5ab097abSStephen Warren            The name of an environment variable.
58*5ab097abSStephen Warren        '''
59*5ab097abSStephen Warren
60*5ab097abSStephen Warren        for var in self.env:
61*5ab097abSStephen Warren            return var
62*5ab097abSStephen Warren
63*5ab097abSStephen Warren    def get_non_existent_var(self):
64*5ab097abSStephen Warren        '''Return the name of an environment variable that does not exist.
65*5ab097abSStephen Warren
66*5ab097abSStephen Warren        Args:
67*5ab097abSStephen Warren            None.
68*5ab097abSStephen Warren
69*5ab097abSStephen Warren        Returns:
70*5ab097abSStephen Warren            The name of an environment variable.
71*5ab097abSStephen Warren        '''
72*5ab097abSStephen Warren
73*5ab097abSStephen Warren        n = 0
74*5ab097abSStephen Warren        while True:
75*5ab097abSStephen Warren            var = 'test_env_' + str(n)
76*5ab097abSStephen Warren            if var not in self.env:
77*5ab097abSStephen Warren                return var
78*5ab097abSStephen Warren            n += 1
79*5ab097abSStephen Warren
80*5ab097abSStephen Warren@pytest.fixture(scope='module')
81*5ab097abSStephen Warrendef state_test_env(u_boot_console):
82*5ab097abSStephen Warren    '''pytest fixture to provide a StateTestEnv object to tests.'''
83*5ab097abSStephen Warren
84*5ab097abSStephen Warren    return StateTestEnv(u_boot_console)
85*5ab097abSStephen Warren
86*5ab097abSStephen Warrendef unset_var(state_test_env, var):
87*5ab097abSStephen Warren    '''Unset an environment variable.
88*5ab097abSStephen Warren
89*5ab097abSStephen Warren    This both executes a U-Boot shell command and updates a StateTestEnv
90*5ab097abSStephen Warren    object.
91*5ab097abSStephen Warren
92*5ab097abSStephen Warren    Args:
93*5ab097abSStephen Warren        state_test_env: The StateTestEnv object to updata.
94*5ab097abSStephen Warren        var: The variable name to unset.
95*5ab097abSStephen Warren
96*5ab097abSStephen Warren    Returns:
97*5ab097abSStephen Warren        Nothing.
98*5ab097abSStephen Warren    '''
99*5ab097abSStephen Warren
100*5ab097abSStephen Warren    state_test_env.u_boot_console.run_command('setenv %s' % var)
101*5ab097abSStephen Warren    if var in state_test_env.env:
102*5ab097abSStephen Warren        del state_test_env.env[var]
103*5ab097abSStephen Warren
104*5ab097abSStephen Warrendef set_var(state_test_env, var, value):
105*5ab097abSStephen Warren    '''Set an environment variable.
106*5ab097abSStephen Warren
107*5ab097abSStephen Warren    This both executes a U-Boot shell command and updates a StateTestEnv
108*5ab097abSStephen Warren    object.
109*5ab097abSStephen Warren
110*5ab097abSStephen Warren    Args:
111*5ab097abSStephen Warren        state_test_env: The StateTestEnv object to updata.
112*5ab097abSStephen Warren        var: The variable name to set.
113*5ab097abSStephen Warren        value: The value to set the variable to.
114*5ab097abSStephen Warren
115*5ab097abSStephen Warren    Returns:
116*5ab097abSStephen Warren        Nothing.
117*5ab097abSStephen Warren    '''
118*5ab097abSStephen Warren
119*5ab097abSStephen Warren    state_test_env.u_boot_console.run_command('setenv %s "%s"' % (var, value))
120*5ab097abSStephen Warren    state_test_env.env[var] = value
121*5ab097abSStephen Warren
122*5ab097abSStephen Warrendef validate_empty(state_test_env, var):
123*5ab097abSStephen Warren    '''Validate that a variable is not set, using U-Boot shell commands.
124*5ab097abSStephen Warren
125*5ab097abSStephen Warren    Args:
126*5ab097abSStephen Warren        var: The variable name to test.
127*5ab097abSStephen Warren
128*5ab097abSStephen Warren    Returns:
129*5ab097abSStephen Warren        Nothing.
130*5ab097abSStephen Warren    '''
131*5ab097abSStephen Warren
132*5ab097abSStephen Warren    response = state_test_env.u_boot_console.run_command('echo $%s' % var)
133*5ab097abSStephen Warren    assert response == ''
134*5ab097abSStephen Warren
135*5ab097abSStephen Warrendef validate_set(state_test_env, var, value):
136*5ab097abSStephen Warren    '''Validate that a variable is set, using U-Boot shell commands.
137*5ab097abSStephen Warren
138*5ab097abSStephen Warren    Args:
139*5ab097abSStephen Warren        var: The variable name to test.
140*5ab097abSStephen Warren        value: The value the variable is expected to have.
141*5ab097abSStephen Warren
142*5ab097abSStephen Warren    Returns:
143*5ab097abSStephen Warren        Nothing.
144*5ab097abSStephen Warren    '''
145*5ab097abSStephen Warren
146*5ab097abSStephen Warren    # echo does not preserve leading, internal, or trailing whitespace in the
147*5ab097abSStephen Warren    # value. printenv does, and hence allows more complete testing.
148*5ab097abSStephen Warren    response = state_test_env.u_boot_console.run_command('printenv %s' % var)
149*5ab097abSStephen Warren    assert response == ('%s=%s' % (var, value))
150*5ab097abSStephen Warren
151*5ab097abSStephen Warrendef test_env_echo_exists(state_test_env):
152*5ab097abSStephen Warren    '''Test echoing a variable that exists.'''
153*5ab097abSStephen Warren
154*5ab097abSStephen Warren    var = state_test_env.get_existent_var()
155*5ab097abSStephen Warren    value = state_test_env.env[var]
156*5ab097abSStephen Warren    validate_set(state_test_env, var, value)
157*5ab097abSStephen Warren
158*5ab097abSStephen Warrendef test_env_echo_non_existent(state_test_env):
159*5ab097abSStephen Warren    '''Test echoing a variable that doesn't exist.'''
160*5ab097abSStephen Warren
161*5ab097abSStephen Warren    var = state_test_env.set_var
162*5ab097abSStephen Warren    validate_empty(state_test_env, var)
163*5ab097abSStephen Warren
164*5ab097abSStephen Warrendef test_env_printenv_non_existent(state_test_env):
165*5ab097abSStephen Warren    '''Test printenv error message for non-existant variables.'''
166*5ab097abSStephen Warren
167*5ab097abSStephen Warren    var = state_test_env.set_var
168*5ab097abSStephen Warren    c = state_test_env.u_boot_console
169*5ab097abSStephen Warren    with c.disable_check('error_notification'):
170*5ab097abSStephen Warren        response = c.run_command('printenv %s' % var)
171*5ab097abSStephen Warren    assert(response == '## Error: "%s" not defined' % var)
172*5ab097abSStephen Warren
173*5ab097abSStephen Warrendef test_env_unset_non_existent(state_test_env):
174*5ab097abSStephen Warren    '''Test unsetting a nonexistent variable.'''
175*5ab097abSStephen Warren
176*5ab097abSStephen Warren    var = state_test_env.get_non_existent_var()
177*5ab097abSStephen Warren    unset_var(state_test_env, var)
178*5ab097abSStephen Warren    validate_empty(state_test_env, var)
179*5ab097abSStephen Warren
180*5ab097abSStephen Warrendef test_env_set_non_existent(state_test_env):
181*5ab097abSStephen Warren    '''Test set a non-existant variable.'''
182*5ab097abSStephen Warren
183*5ab097abSStephen Warren    var = state_test_env.set_var
184*5ab097abSStephen Warren    value = 'foo'
185*5ab097abSStephen Warren    set_var(state_test_env, var, value)
186*5ab097abSStephen Warren    validate_set(state_test_env, var, value)
187*5ab097abSStephen Warren
188*5ab097abSStephen Warrendef test_env_set_existing(state_test_env):
189*5ab097abSStephen Warren    '''Test setting an existant variable.'''
190*5ab097abSStephen Warren
191*5ab097abSStephen Warren    var = state_test_env.set_var
192*5ab097abSStephen Warren    value = 'bar'
193*5ab097abSStephen Warren    set_var(state_test_env, var, value)
194*5ab097abSStephen Warren    validate_set(state_test_env, var, value)
195*5ab097abSStephen Warren
196*5ab097abSStephen Warrendef test_env_unset_existing(state_test_env):
197*5ab097abSStephen Warren    '''Test unsetting a variable.'''
198*5ab097abSStephen Warren
199*5ab097abSStephen Warren    var = state_test_env.set_var
200*5ab097abSStephen Warren    unset_var(state_test_env, var)
201*5ab097abSStephen Warren    validate_empty(state_test_env, var)
202*5ab097abSStephen Warren
203*5ab097abSStephen Warrendef test_env_expansion_spaces(state_test_env):
204*5ab097abSStephen Warren    '''Test expanding a variable that contains a space in its value.'''
205*5ab097abSStephen Warren
206*5ab097abSStephen Warren    var_space = None
207*5ab097abSStephen Warren    var_test = None
208*5ab097abSStephen Warren    try:
209*5ab097abSStephen Warren        var_space = state_test_env.get_non_existent_var()
210*5ab097abSStephen Warren        set_var(state_test_env, var_space, ' ')
211*5ab097abSStephen Warren
212*5ab097abSStephen Warren        var_test = state_test_env.get_non_existent_var()
213*5ab097abSStephen Warren        value = ' 1${%(var_space)s}${%(var_space)s} 2 ' % locals()
214*5ab097abSStephen Warren        set_var(state_test_env, var_test, value)
215*5ab097abSStephen Warren        value = ' 1   2 '
216*5ab097abSStephen Warren        validate_set(state_test_env, var_test, value)
217*5ab097abSStephen Warren    finally:
218*5ab097abSStephen Warren        if var_space:
219*5ab097abSStephen Warren            unset_var(state_test_env, var_space)
220*5ab097abSStephen Warren        if var_test:
221*5ab097abSStephen Warren            unset_var(state_test_env, var_test)
222