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