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 42*da37f006SHeiko Schocher if self.u_boot_console.config.buildconfig['config_version_variable'] == 'y': 43*da37f006SHeiko Schocher with self.u_boot_console.disable_check('main_signon'): 44*da37f006SHeiko Schocher response = self.u_boot_console.run_command('printenv') 45*da37f006SHeiko Schocher else: 465ab097abSStephen Warren response = self.u_boot_console.run_command('printenv') 475ab097abSStephen Warren self.env = {} 485ab097abSStephen Warren for l in response.splitlines(): 495ab097abSStephen Warren if not '=' in l: 505ab097abSStephen Warren continue 515ab097abSStephen Warren (var, value) = l.strip().split('=', 1) 525ab097abSStephen Warren self.env[var] = value 535ab097abSStephen Warren 545ab097abSStephen Warren def get_existent_var(self): 55e8debf39SStephen Warren """Return the name of an environment variable that exists. 565ab097abSStephen Warren 575ab097abSStephen Warren Args: 585ab097abSStephen Warren None. 595ab097abSStephen Warren 605ab097abSStephen Warren Returns: 615ab097abSStephen Warren The name of an environment variable. 62e8debf39SStephen Warren """ 635ab097abSStephen Warren 645ab097abSStephen Warren for var in self.env: 655ab097abSStephen Warren return var 665ab097abSStephen Warren 675ab097abSStephen Warren def get_non_existent_var(self): 68e8debf39SStephen Warren """Return the name of an environment variable that does not exist. 695ab097abSStephen Warren 705ab097abSStephen Warren Args: 715ab097abSStephen Warren None. 725ab097abSStephen Warren 735ab097abSStephen Warren Returns: 745ab097abSStephen Warren The name of an environment variable. 75e8debf39SStephen Warren """ 765ab097abSStephen Warren 775ab097abSStephen Warren n = 0 785ab097abSStephen Warren while True: 795ab097abSStephen Warren var = 'test_env_' + str(n) 805ab097abSStephen Warren if var not in self.env: 815ab097abSStephen Warren return var 825ab097abSStephen Warren n += 1 835ab097abSStephen Warren 84636f38d8SStephen Warrenste = None 85636f38d8SStephen Warren@pytest.fixture(scope='function') 865ab097abSStephen Warrendef state_test_env(u_boot_console): 87e8debf39SStephen Warren """pytest fixture to provide a StateTestEnv object to tests.""" 885ab097abSStephen Warren 89636f38d8SStephen Warren global ste 90636f38d8SStephen Warren if not ste: 91636f38d8SStephen Warren ste = StateTestEnv(u_boot_console) 92636f38d8SStephen Warren return ste 935ab097abSStephen Warren 945ab097abSStephen Warrendef unset_var(state_test_env, var): 95e8debf39SStephen Warren """Unset an environment variable. 965ab097abSStephen Warren 975ab097abSStephen Warren This both executes a U-Boot shell command and updates a StateTestEnv 985ab097abSStephen Warren object. 995ab097abSStephen Warren 1005ab097abSStephen Warren Args: 101db261f00SStephen Warren state_test_env: The StateTestEnv object to update. 1025ab097abSStephen Warren var: The variable name to unset. 1035ab097abSStephen Warren 1045ab097abSStephen Warren Returns: 1055ab097abSStephen Warren Nothing. 106e8debf39SStephen Warren """ 1075ab097abSStephen Warren 1085ab097abSStephen Warren state_test_env.u_boot_console.run_command('setenv %s' % var) 1095ab097abSStephen Warren if var in state_test_env.env: 1105ab097abSStephen Warren del state_test_env.env[var] 1115ab097abSStephen Warren 1125ab097abSStephen Warrendef set_var(state_test_env, var, value): 113e8debf39SStephen Warren """Set an environment variable. 1145ab097abSStephen Warren 1155ab097abSStephen Warren This both executes a U-Boot shell command and updates a StateTestEnv 1165ab097abSStephen Warren object. 1175ab097abSStephen Warren 1185ab097abSStephen Warren Args: 119db261f00SStephen Warren state_test_env: The StateTestEnv object to update. 1205ab097abSStephen Warren var: The variable name to set. 1215ab097abSStephen Warren value: The value to set the variable to. 1225ab097abSStephen Warren 1235ab097abSStephen Warren Returns: 1245ab097abSStephen Warren Nothing. 125e8debf39SStephen Warren """ 1265ab097abSStephen Warren 1275ab097abSStephen Warren state_test_env.u_boot_console.run_command('setenv %s "%s"' % (var, value)) 1285ab097abSStephen Warren state_test_env.env[var] = value 1295ab097abSStephen Warren 1305ab097abSStephen Warrendef validate_empty(state_test_env, var): 131e8debf39SStephen Warren """Validate that a variable is not set, using U-Boot shell commands. 1325ab097abSStephen Warren 1335ab097abSStephen Warren Args: 1345ab097abSStephen Warren var: The variable name to test. 1355ab097abSStephen Warren 1365ab097abSStephen Warren Returns: 1375ab097abSStephen Warren Nothing. 138e8debf39SStephen Warren """ 1395ab097abSStephen Warren 1405ab097abSStephen Warren response = state_test_env.u_boot_console.run_command('echo $%s' % var) 1415ab097abSStephen Warren assert response == '' 1425ab097abSStephen Warren 1435ab097abSStephen Warrendef validate_set(state_test_env, var, value): 144e8debf39SStephen Warren """Validate that a variable is set, using U-Boot shell commands. 1455ab097abSStephen Warren 1465ab097abSStephen Warren Args: 1475ab097abSStephen Warren var: The variable name to test. 1485ab097abSStephen Warren value: The value the variable is expected to have. 1495ab097abSStephen Warren 1505ab097abSStephen Warren Returns: 1515ab097abSStephen Warren Nothing. 152e8debf39SStephen Warren """ 1535ab097abSStephen Warren 1545ab097abSStephen Warren # echo does not preserve leading, internal, or trailing whitespace in the 1555ab097abSStephen Warren # value. printenv does, and hence allows more complete testing. 1565ab097abSStephen Warren response = state_test_env.u_boot_console.run_command('printenv %s' % var) 1575ab097abSStephen Warren assert response == ('%s=%s' % (var, value)) 1585ab097abSStephen Warren 1595ab097abSStephen Warrendef test_env_echo_exists(state_test_env): 160e8debf39SStephen Warren """Test echoing a variable that exists.""" 1615ab097abSStephen Warren 1625ab097abSStephen Warren var = state_test_env.get_existent_var() 1635ab097abSStephen Warren value = state_test_env.env[var] 1645ab097abSStephen Warren validate_set(state_test_env, var, value) 1655ab097abSStephen Warren 1665ab097abSStephen Warrendef test_env_echo_non_existent(state_test_env): 167e8debf39SStephen Warren """Test echoing a variable that doesn't exist.""" 1685ab097abSStephen Warren 1695ab097abSStephen Warren var = state_test_env.set_var 1705ab097abSStephen Warren validate_empty(state_test_env, var) 1715ab097abSStephen Warren 1725ab097abSStephen Warrendef test_env_printenv_non_existent(state_test_env): 173e8debf39SStephen Warren """Test printenv error message for non-existant variables.""" 1745ab097abSStephen Warren 1755ab097abSStephen Warren var = state_test_env.set_var 1765ab097abSStephen Warren c = state_test_env.u_boot_console 1775ab097abSStephen Warren with c.disable_check('error_notification'): 1785ab097abSStephen Warren response = c.run_command('printenv %s' % var) 1795ab097abSStephen Warren assert(response == '## Error: "%s" not defined' % var) 1805ab097abSStephen Warren 1815ab097abSStephen Warrendef test_env_unset_non_existent(state_test_env): 182e8debf39SStephen Warren """Test unsetting a nonexistent variable.""" 1835ab097abSStephen Warren 1845ab097abSStephen Warren var = state_test_env.get_non_existent_var() 1855ab097abSStephen Warren unset_var(state_test_env, var) 1865ab097abSStephen Warren validate_empty(state_test_env, var) 1875ab097abSStephen Warren 1885ab097abSStephen Warrendef test_env_set_non_existent(state_test_env): 189e8debf39SStephen Warren """Test set a non-existant variable.""" 1905ab097abSStephen Warren 1915ab097abSStephen Warren var = state_test_env.set_var 1925ab097abSStephen Warren value = 'foo' 1935ab097abSStephen Warren set_var(state_test_env, var, value) 1945ab097abSStephen Warren validate_set(state_test_env, var, value) 1955ab097abSStephen Warren 1965ab097abSStephen Warrendef test_env_set_existing(state_test_env): 197e8debf39SStephen Warren """Test setting an existant variable.""" 1985ab097abSStephen Warren 1995ab097abSStephen Warren var = state_test_env.set_var 2005ab097abSStephen Warren value = 'bar' 2015ab097abSStephen Warren set_var(state_test_env, var, value) 2025ab097abSStephen Warren validate_set(state_test_env, var, value) 2035ab097abSStephen Warren 2045ab097abSStephen Warrendef test_env_unset_existing(state_test_env): 205e8debf39SStephen Warren """Test unsetting a variable.""" 2065ab097abSStephen Warren 2075ab097abSStephen Warren var = state_test_env.set_var 2085ab097abSStephen Warren unset_var(state_test_env, var) 2095ab097abSStephen Warren validate_empty(state_test_env, var) 2105ab097abSStephen Warren 2115ab097abSStephen Warrendef test_env_expansion_spaces(state_test_env): 212e8debf39SStephen Warren """Test expanding a variable that contains a space in its value.""" 2135ab097abSStephen Warren 2145ab097abSStephen Warren var_space = None 2155ab097abSStephen Warren var_test = None 2165ab097abSStephen Warren try: 2175ab097abSStephen Warren var_space = state_test_env.get_non_existent_var() 2185ab097abSStephen Warren set_var(state_test_env, var_space, ' ') 2195ab097abSStephen Warren 2205ab097abSStephen Warren var_test = state_test_env.get_non_existent_var() 2215ab097abSStephen Warren value = ' 1${%(var_space)s}${%(var_space)s} 2 ' % locals() 2225ab097abSStephen Warren set_var(state_test_env, var_test, value) 2235ab097abSStephen Warren value = ' 1 2 ' 2245ab097abSStephen Warren validate_set(state_test_env, var_test, value) 2255ab097abSStephen Warren finally: 2265ab097abSStephen Warren if var_space: 2275ab097abSStephen Warren unset_var(state_test_env, var_space) 2285ab097abSStephen Warren if var_test: 2295ab097abSStephen Warren unset_var(state_test_env, var_test) 230