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*7a8f8865SStephen Warren if self.u_boot_console.config.buildconfig.get( 43*7a8f8865SStephen Warren 'config_version_variable', 'n') == 'y': 44da37f006SHeiko Schocher with self.u_boot_console.disable_check('main_signon'): 45da37f006SHeiko Schocher response = self.u_boot_console.run_command('printenv') 46da37f006SHeiko Schocher else: 475ab097abSStephen Warren response = self.u_boot_console.run_command('printenv') 485ab097abSStephen Warren self.env = {} 495ab097abSStephen Warren for l in response.splitlines(): 505ab097abSStephen Warren if not '=' in l: 515ab097abSStephen Warren continue 525ab097abSStephen Warren (var, value) = l.strip().split('=', 1) 535ab097abSStephen Warren self.env[var] = value 545ab097abSStephen Warren 555ab097abSStephen Warren def get_existent_var(self): 56e8debf39SStephen Warren """Return the name of an environment variable that exists. 575ab097abSStephen Warren 585ab097abSStephen Warren Args: 595ab097abSStephen Warren None. 605ab097abSStephen Warren 615ab097abSStephen Warren Returns: 625ab097abSStephen Warren The name of an environment variable. 63e8debf39SStephen Warren """ 645ab097abSStephen Warren 655ab097abSStephen Warren for var in self.env: 665ab097abSStephen Warren return var 675ab097abSStephen Warren 685ab097abSStephen Warren def get_non_existent_var(self): 69e8debf39SStephen Warren """Return the name of an environment variable that does not exist. 705ab097abSStephen Warren 715ab097abSStephen Warren Args: 725ab097abSStephen Warren None. 735ab097abSStephen Warren 745ab097abSStephen Warren Returns: 755ab097abSStephen Warren The name of an environment variable. 76e8debf39SStephen Warren """ 775ab097abSStephen Warren 785ab097abSStephen Warren n = 0 795ab097abSStephen Warren while True: 805ab097abSStephen Warren var = 'test_env_' + str(n) 815ab097abSStephen Warren if var not in self.env: 825ab097abSStephen Warren return var 835ab097abSStephen Warren n += 1 845ab097abSStephen Warren 85636f38d8SStephen Warrenste = None 86636f38d8SStephen Warren@pytest.fixture(scope='function') 875ab097abSStephen Warrendef state_test_env(u_boot_console): 88e8debf39SStephen Warren """pytest fixture to provide a StateTestEnv object to tests.""" 895ab097abSStephen Warren 90636f38d8SStephen Warren global ste 91636f38d8SStephen Warren if not ste: 92636f38d8SStephen Warren ste = StateTestEnv(u_boot_console) 93636f38d8SStephen Warren return ste 945ab097abSStephen Warren 955ab097abSStephen Warrendef unset_var(state_test_env, var): 96e8debf39SStephen Warren """Unset an environment variable. 975ab097abSStephen Warren 985ab097abSStephen Warren This both executes a U-Boot shell command and updates a StateTestEnv 995ab097abSStephen Warren object. 1005ab097abSStephen Warren 1015ab097abSStephen Warren Args: 102db261f00SStephen Warren state_test_env: The StateTestEnv object to update. 1035ab097abSStephen Warren var: The variable name to unset. 1045ab097abSStephen Warren 1055ab097abSStephen Warren Returns: 1065ab097abSStephen Warren Nothing. 107e8debf39SStephen Warren """ 1085ab097abSStephen Warren 1095ab097abSStephen Warren state_test_env.u_boot_console.run_command('setenv %s' % var) 1105ab097abSStephen Warren if var in state_test_env.env: 1115ab097abSStephen Warren del state_test_env.env[var] 1125ab097abSStephen Warren 1135ab097abSStephen Warrendef set_var(state_test_env, var, value): 114e8debf39SStephen Warren """Set an environment variable. 1155ab097abSStephen Warren 1165ab097abSStephen Warren This both executes a U-Boot shell command and updates a StateTestEnv 1175ab097abSStephen Warren object. 1185ab097abSStephen Warren 1195ab097abSStephen Warren Args: 120db261f00SStephen Warren state_test_env: The StateTestEnv object to update. 1215ab097abSStephen Warren var: The variable name to set. 1225ab097abSStephen Warren value: The value to set the variable to. 1235ab097abSStephen Warren 1245ab097abSStephen Warren Returns: 1255ab097abSStephen Warren Nothing. 126e8debf39SStephen Warren """ 1275ab097abSStephen Warren 1285ab097abSStephen Warren state_test_env.u_boot_console.run_command('setenv %s "%s"' % (var, value)) 1295ab097abSStephen Warren state_test_env.env[var] = value 1305ab097abSStephen Warren 1315ab097abSStephen Warrendef validate_empty(state_test_env, var): 132e8debf39SStephen Warren """Validate that a variable is not set, using U-Boot shell commands. 1335ab097abSStephen Warren 1345ab097abSStephen Warren Args: 1355ab097abSStephen Warren var: The variable name to test. 1365ab097abSStephen Warren 1375ab097abSStephen Warren Returns: 1385ab097abSStephen Warren Nothing. 139e8debf39SStephen Warren """ 1405ab097abSStephen Warren 1415ab097abSStephen Warren response = state_test_env.u_boot_console.run_command('echo $%s' % var) 1425ab097abSStephen Warren assert response == '' 1435ab097abSStephen Warren 1445ab097abSStephen Warrendef validate_set(state_test_env, var, value): 145e8debf39SStephen Warren """Validate that a variable is set, using U-Boot shell commands. 1465ab097abSStephen Warren 1475ab097abSStephen Warren Args: 1485ab097abSStephen Warren var: The variable name to test. 1495ab097abSStephen Warren value: The value the variable is expected to have. 1505ab097abSStephen Warren 1515ab097abSStephen Warren Returns: 1525ab097abSStephen Warren Nothing. 153e8debf39SStephen Warren """ 1545ab097abSStephen Warren 1555ab097abSStephen Warren # echo does not preserve leading, internal, or trailing whitespace in the 1565ab097abSStephen Warren # value. printenv does, and hence allows more complete testing. 1575ab097abSStephen Warren response = state_test_env.u_boot_console.run_command('printenv %s' % var) 1585ab097abSStephen Warren assert response == ('%s=%s' % (var, value)) 1595ab097abSStephen Warren 1605ab097abSStephen Warrendef test_env_echo_exists(state_test_env): 161e8debf39SStephen Warren """Test echoing a variable that exists.""" 1625ab097abSStephen Warren 1635ab097abSStephen Warren var = state_test_env.get_existent_var() 1645ab097abSStephen Warren value = state_test_env.env[var] 1655ab097abSStephen Warren validate_set(state_test_env, var, value) 1665ab097abSStephen Warren 1675ab097abSStephen Warrendef test_env_echo_non_existent(state_test_env): 168e8debf39SStephen Warren """Test echoing a variable that doesn't exist.""" 1695ab097abSStephen Warren 1705ab097abSStephen Warren var = state_test_env.set_var 1715ab097abSStephen Warren validate_empty(state_test_env, var) 1725ab097abSStephen Warren 1735ab097abSStephen Warrendef test_env_printenv_non_existent(state_test_env): 174e8debf39SStephen Warren """Test printenv error message for non-existant variables.""" 1755ab097abSStephen Warren 1765ab097abSStephen Warren var = state_test_env.set_var 1775ab097abSStephen Warren c = state_test_env.u_boot_console 1785ab097abSStephen Warren with c.disable_check('error_notification'): 1795ab097abSStephen Warren response = c.run_command('printenv %s' % var) 1805ab097abSStephen Warren assert(response == '## Error: "%s" not defined' % var) 1815ab097abSStephen Warren 1825ab097abSStephen Warrendef test_env_unset_non_existent(state_test_env): 183e8debf39SStephen Warren """Test unsetting a nonexistent variable.""" 1845ab097abSStephen Warren 1855ab097abSStephen Warren var = state_test_env.get_non_existent_var() 1865ab097abSStephen Warren unset_var(state_test_env, var) 1875ab097abSStephen Warren validate_empty(state_test_env, var) 1885ab097abSStephen Warren 1895ab097abSStephen Warrendef test_env_set_non_existent(state_test_env): 190e8debf39SStephen Warren """Test set a non-existant variable.""" 1915ab097abSStephen Warren 1925ab097abSStephen Warren var = state_test_env.set_var 1935ab097abSStephen Warren value = 'foo' 1945ab097abSStephen Warren set_var(state_test_env, var, value) 1955ab097abSStephen Warren validate_set(state_test_env, var, value) 1965ab097abSStephen Warren 1975ab097abSStephen Warrendef test_env_set_existing(state_test_env): 198e8debf39SStephen Warren """Test setting an existant variable.""" 1995ab097abSStephen Warren 2005ab097abSStephen Warren var = state_test_env.set_var 2015ab097abSStephen Warren value = 'bar' 2025ab097abSStephen Warren set_var(state_test_env, var, value) 2035ab097abSStephen Warren validate_set(state_test_env, var, value) 2045ab097abSStephen Warren 2055ab097abSStephen Warrendef test_env_unset_existing(state_test_env): 206e8debf39SStephen Warren """Test unsetting a variable.""" 2075ab097abSStephen Warren 2085ab097abSStephen Warren var = state_test_env.set_var 2095ab097abSStephen Warren unset_var(state_test_env, var) 2105ab097abSStephen Warren validate_empty(state_test_env, var) 2115ab097abSStephen Warren 2125ab097abSStephen Warrendef test_env_expansion_spaces(state_test_env): 213e8debf39SStephen Warren """Test expanding a variable that contains a space in its value.""" 2145ab097abSStephen Warren 2155ab097abSStephen Warren var_space = None 2165ab097abSStephen Warren var_test = None 2175ab097abSStephen Warren try: 2185ab097abSStephen Warren var_space = state_test_env.get_non_existent_var() 2195ab097abSStephen Warren set_var(state_test_env, var_space, ' ') 2205ab097abSStephen Warren 2215ab097abSStephen Warren var_test = state_test_env.get_non_existent_var() 2225ab097abSStephen Warren value = ' 1${%(var_space)s}${%(var_space)s} 2 ' % locals() 2235ab097abSStephen Warren set_var(state_test_env, var_test, value) 2245ab097abSStephen Warren value = ' 1 2 ' 2255ab097abSStephen Warren validate_set(state_test_env, var_test, value) 2265ab097abSStephen Warren finally: 2275ab097abSStephen Warren if var_space: 2285ab097abSStephen Warren unset_var(state_test_env, var_space) 2295ab097abSStephen Warren if var_test: 2305ab097abSStephen Warren unset_var(state_test_env, var_test) 231