15ab097abSStephen Warren# Copyright (c) 2015 Stephen Warren 25ab097abSStephen Warren# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. 35ab097abSStephen Warren# 45ab097abSStephen Warren# SPDX-License-Identifier: GPL-2.0 55ab097abSStephen Warren 65ab097abSStephen Warren# Test operation of shell commands relating to environment variables. 75ab097abSStephen Warren 85ab097abSStephen Warrenimport pytest 95ab097abSStephen Warren 105ab097abSStephen Warren# FIXME: This might be useful for other tests; 115ab097abSStephen Warren# perhaps refactor it into ConsoleBase or some other state object? 125ab097abSStephen Warrenclass StateTestEnv(object): 13e8debf39SStephen Warren """Container that represents the state of all U-Boot environment variables. 145ab097abSStephen Warren This enables quick determination of existant/non-existant variable 155ab097abSStephen Warren names. 16e8debf39SStephen Warren """ 175ab097abSStephen Warren 185ab097abSStephen Warren def __init__(self, u_boot_console): 19e8debf39SStephen Warren """Initialize a new StateTestEnv object. 205ab097abSStephen Warren 215ab097abSStephen Warren Args: 225ab097abSStephen Warren u_boot_console: A U-Boot console. 235ab097abSStephen Warren 245ab097abSStephen Warren Returns: 255ab097abSStephen Warren Nothing. 26e8debf39SStephen Warren """ 275ab097abSStephen Warren 285ab097abSStephen Warren self.u_boot_console = u_boot_console 295ab097abSStephen Warren self.get_env() 305ab097abSStephen Warren self.set_var = self.get_non_existent_var() 315ab097abSStephen Warren 325ab097abSStephen Warren def get_env(self): 33e8debf39SStephen Warren """Read all current environment variables from U-Boot. 345ab097abSStephen Warren 355ab097abSStephen Warren Args: 365ab097abSStephen Warren None. 375ab097abSStephen Warren 385ab097abSStephen Warren Returns: 395ab097abSStephen Warren Nothing. 40e8debf39SStephen Warren """ 415ab097abSStephen Warren 425ab097abSStephen Warren response = self.u_boot_console.run_command('printenv') 435ab097abSStephen Warren self.env = {} 445ab097abSStephen Warren for l in response.splitlines(): 455ab097abSStephen Warren if not '=' in l: 465ab097abSStephen Warren continue 475ab097abSStephen Warren (var, value) = l.strip().split('=', 1) 485ab097abSStephen Warren self.env[var] = value 495ab097abSStephen Warren 505ab097abSStephen Warren def get_existent_var(self): 51e8debf39SStephen Warren """Return the name of an environment variable that exists. 525ab097abSStephen Warren 535ab097abSStephen Warren Args: 545ab097abSStephen Warren None. 555ab097abSStephen Warren 565ab097abSStephen Warren Returns: 575ab097abSStephen Warren The name of an environment variable. 58e8debf39SStephen Warren """ 595ab097abSStephen Warren 605ab097abSStephen Warren for var in self.env: 615ab097abSStephen Warren return var 625ab097abSStephen Warren 635ab097abSStephen Warren def get_non_existent_var(self): 64e8debf39SStephen Warren """Return the name of an environment variable that does not exist. 655ab097abSStephen Warren 665ab097abSStephen Warren Args: 675ab097abSStephen Warren None. 685ab097abSStephen Warren 695ab097abSStephen Warren Returns: 705ab097abSStephen Warren The name of an environment variable. 71e8debf39SStephen Warren """ 725ab097abSStephen Warren 735ab097abSStephen Warren n = 0 745ab097abSStephen Warren while True: 755ab097abSStephen Warren var = 'test_env_' + str(n) 765ab097abSStephen Warren if var not in self.env: 775ab097abSStephen Warren return var 785ab097abSStephen Warren n += 1 795ab097abSStephen Warren 80636f38d8SStephen Warrenste = None 81636f38d8SStephen Warren@pytest.fixture(scope='function') 825ab097abSStephen Warrendef state_test_env(u_boot_console): 83e8debf39SStephen Warren """pytest fixture to provide a StateTestEnv object to tests.""" 845ab097abSStephen Warren 85636f38d8SStephen Warren global ste 86636f38d8SStephen Warren if not ste: 87636f38d8SStephen Warren ste = StateTestEnv(u_boot_console) 88636f38d8SStephen Warren return ste 895ab097abSStephen Warren 905ab097abSStephen Warrendef unset_var(state_test_env, var): 91e8debf39SStephen Warren """Unset an environment variable. 925ab097abSStephen Warren 935ab097abSStephen Warren This both executes a U-Boot shell command and updates a StateTestEnv 945ab097abSStephen Warren object. 955ab097abSStephen Warren 965ab097abSStephen Warren Args: 97*db261f00SStephen Warren state_test_env: The StateTestEnv object to update. 985ab097abSStephen Warren var: The variable name to unset. 995ab097abSStephen Warren 1005ab097abSStephen Warren Returns: 1015ab097abSStephen Warren Nothing. 102e8debf39SStephen Warren """ 1035ab097abSStephen Warren 1045ab097abSStephen Warren state_test_env.u_boot_console.run_command('setenv %s' % var) 1055ab097abSStephen Warren if var in state_test_env.env: 1065ab097abSStephen Warren del state_test_env.env[var] 1075ab097abSStephen Warren 1085ab097abSStephen Warrendef set_var(state_test_env, var, value): 109e8debf39SStephen Warren """Set an environment variable. 1105ab097abSStephen Warren 1115ab097abSStephen Warren This both executes a U-Boot shell command and updates a StateTestEnv 1125ab097abSStephen Warren object. 1135ab097abSStephen Warren 1145ab097abSStephen Warren Args: 115*db261f00SStephen Warren state_test_env: The StateTestEnv object to update. 1165ab097abSStephen Warren var: The variable name to set. 1175ab097abSStephen Warren value: The value to set the variable to. 1185ab097abSStephen Warren 1195ab097abSStephen Warren Returns: 1205ab097abSStephen Warren Nothing. 121e8debf39SStephen Warren """ 1225ab097abSStephen Warren 1235ab097abSStephen Warren state_test_env.u_boot_console.run_command('setenv %s "%s"' % (var, value)) 1245ab097abSStephen Warren state_test_env.env[var] = value 1255ab097abSStephen Warren 1265ab097abSStephen Warrendef validate_empty(state_test_env, var): 127e8debf39SStephen Warren """Validate that a variable is not set, using U-Boot shell commands. 1285ab097abSStephen Warren 1295ab097abSStephen Warren Args: 1305ab097abSStephen Warren var: The variable name to test. 1315ab097abSStephen Warren 1325ab097abSStephen Warren Returns: 1335ab097abSStephen Warren Nothing. 134e8debf39SStephen Warren """ 1355ab097abSStephen Warren 1365ab097abSStephen Warren response = state_test_env.u_boot_console.run_command('echo $%s' % var) 1375ab097abSStephen Warren assert response == '' 1385ab097abSStephen Warren 1395ab097abSStephen Warrendef validate_set(state_test_env, var, value): 140e8debf39SStephen Warren """Validate that a variable is set, using U-Boot shell commands. 1415ab097abSStephen Warren 1425ab097abSStephen Warren Args: 1435ab097abSStephen Warren var: The variable name to test. 1445ab097abSStephen Warren value: The value the variable is expected to have. 1455ab097abSStephen Warren 1465ab097abSStephen Warren Returns: 1475ab097abSStephen Warren Nothing. 148e8debf39SStephen Warren """ 1495ab097abSStephen Warren 1505ab097abSStephen Warren # echo does not preserve leading, internal, or trailing whitespace in the 1515ab097abSStephen Warren # value. printenv does, and hence allows more complete testing. 1525ab097abSStephen Warren response = state_test_env.u_boot_console.run_command('printenv %s' % var) 1535ab097abSStephen Warren assert response == ('%s=%s' % (var, value)) 1545ab097abSStephen Warren 1555ab097abSStephen Warrendef test_env_echo_exists(state_test_env): 156e8debf39SStephen Warren """Test echoing a variable that exists.""" 1575ab097abSStephen Warren 1585ab097abSStephen Warren var = state_test_env.get_existent_var() 1595ab097abSStephen Warren value = state_test_env.env[var] 1605ab097abSStephen Warren validate_set(state_test_env, var, value) 1615ab097abSStephen Warren 1625ab097abSStephen Warrendef test_env_echo_non_existent(state_test_env): 163e8debf39SStephen Warren """Test echoing a variable that doesn't exist.""" 1645ab097abSStephen Warren 1655ab097abSStephen Warren var = state_test_env.set_var 1665ab097abSStephen Warren validate_empty(state_test_env, var) 1675ab097abSStephen Warren 1685ab097abSStephen Warrendef test_env_printenv_non_existent(state_test_env): 169e8debf39SStephen Warren """Test printenv error message for non-existant variables.""" 1705ab097abSStephen Warren 1715ab097abSStephen Warren var = state_test_env.set_var 1725ab097abSStephen Warren c = state_test_env.u_boot_console 1735ab097abSStephen Warren with c.disable_check('error_notification'): 1745ab097abSStephen Warren response = c.run_command('printenv %s' % var) 1755ab097abSStephen Warren assert(response == '## Error: "%s" not defined' % var) 1765ab097abSStephen Warren 1775ab097abSStephen Warrendef test_env_unset_non_existent(state_test_env): 178e8debf39SStephen Warren """Test unsetting a nonexistent variable.""" 1795ab097abSStephen Warren 1805ab097abSStephen Warren var = state_test_env.get_non_existent_var() 1815ab097abSStephen Warren unset_var(state_test_env, var) 1825ab097abSStephen Warren validate_empty(state_test_env, var) 1835ab097abSStephen Warren 1845ab097abSStephen Warrendef test_env_set_non_existent(state_test_env): 185e8debf39SStephen Warren """Test set a non-existant variable.""" 1865ab097abSStephen Warren 1875ab097abSStephen Warren var = state_test_env.set_var 1885ab097abSStephen Warren value = 'foo' 1895ab097abSStephen Warren set_var(state_test_env, var, value) 1905ab097abSStephen Warren validate_set(state_test_env, var, value) 1915ab097abSStephen Warren 1925ab097abSStephen Warrendef test_env_set_existing(state_test_env): 193e8debf39SStephen Warren """Test setting an existant variable.""" 1945ab097abSStephen Warren 1955ab097abSStephen Warren var = state_test_env.set_var 1965ab097abSStephen Warren value = 'bar' 1975ab097abSStephen Warren set_var(state_test_env, var, value) 1985ab097abSStephen Warren validate_set(state_test_env, var, value) 1995ab097abSStephen Warren 2005ab097abSStephen Warrendef test_env_unset_existing(state_test_env): 201e8debf39SStephen Warren """Test unsetting a variable.""" 2025ab097abSStephen Warren 2035ab097abSStephen Warren var = state_test_env.set_var 2045ab097abSStephen Warren unset_var(state_test_env, var) 2055ab097abSStephen Warren validate_empty(state_test_env, var) 2065ab097abSStephen Warren 2075ab097abSStephen Warrendef test_env_expansion_spaces(state_test_env): 208e8debf39SStephen Warren """Test expanding a variable that contains a space in its value.""" 2095ab097abSStephen Warren 2105ab097abSStephen Warren var_space = None 2115ab097abSStephen Warren var_test = None 2125ab097abSStephen Warren try: 2135ab097abSStephen Warren var_space = state_test_env.get_non_existent_var() 2145ab097abSStephen Warren set_var(state_test_env, var_space, ' ') 2155ab097abSStephen Warren 2165ab097abSStephen Warren var_test = state_test_env.get_non_existent_var() 2175ab097abSStephen Warren value = ' 1${%(var_space)s}${%(var_space)s} 2 ' % locals() 2185ab097abSStephen Warren set_var(state_test_env, var_test, value) 2195ab097abSStephen Warren value = ' 1 2 ' 2205ab097abSStephen Warren validate_set(state_test_env, var_test, value) 2215ab097abSStephen Warren finally: 2225ab097abSStephen Warren if var_space: 2235ab097abSStephen Warren unset_var(state_test_env, var_space) 2245ab097abSStephen Warren if var_test: 2255ab097abSStephen Warren unset_var(state_test_env, var_test) 226