diff options
-rw-r--r-- | test/py/conftest.py | 44 | ||||
-rw-r--r-- | test/py/multiplexed_log.py | 122 | ||||
-rw-r--r-- | test/py/tests/test_000_version.py | 2 | ||||
-rw-r--r-- | test/py/tests/test_dfu.py | 32 | ||||
-rw-r--r-- | test/py/tests/test_env.py | 54 | ||||
-rw-r--r-- | test/py/tests/test_help.py | 2 | ||||
-rw-r--r-- | test/py/tests/test_hush_if_test.py | 10 | ||||
-rw-r--r-- | test/py/tests/test_md.py | 8 | ||||
-rw-r--r-- | test/py/tests/test_net.py | 24 | ||||
-rw-r--r-- | test/py/tests/test_sandbox_exit.py | 4 | ||||
-rw-r--r-- | test/py/tests/test_shell_basics.py | 10 | ||||
-rw-r--r-- | test/py/tests/test_sleep.py | 4 | ||||
-rw-r--r-- | test/py/tests/test_ums.py | 24 | ||||
-rw-r--r-- | test/py/tests/test_unknown_cmd.py | 4 | ||||
-rw-r--r-- | test/py/u_boot_console_base.py | 48 | ||||
-rw-r--r-- | test/py/u_boot_console_exec_attach.py | 12 | ||||
-rw-r--r-- | test/py/u_boot_console_sandbox.py | 20 | ||||
-rw-r--r-- | test/py/u_boot_spawn.py | 30 | ||||
-rw-r--r-- | test/py/u_boot_utils.py | 36 |
19 files changed, 245 insertions, 245 deletions
diff --git a/test/py/conftest.py b/test/py/conftest.py index c1f19cee65..a4e54c66ce 100644 --- a/test/py/conftest.py +++ b/test/py/conftest.py @@ -29,7 +29,7 @@ log = None console = None def mkdir_p(path): - '''Create a directory path. + """Create a directory path. This includes creating any intermediate/parent directories. Any errors caused due to already extant directories are ignored. @@ -39,7 +39,7 @@ def mkdir_p(path): Returns: Nothing. - ''' + """ try: os.makedirs(path) @@ -50,14 +50,14 @@ def mkdir_p(path): raise def pytest_addoption(parser): - '''pytest hook: Add custom command-line options to the cmdline parser. + """pytest hook: Add custom command-line options to the cmdline parser. Args: parser: The pytest command-line parser. Returns: Nothing. - ''' + """ parser.addoption('--build-dir', default=None, help='U-Boot build directory (O=)') @@ -73,14 +73,14 @@ def pytest_addoption(parser): help='Compile U-Boot before running tests') def pytest_configure(config): - '''pytest hook: Perform custom initialization at startup time. + """pytest hook: Perform custom initialization at startup time. Args: config: The pytest configuration. Returns: Nothing. - ''' + """ global log global console @@ -190,7 +190,7 @@ def pytest_configure(config): console = u_boot_console_exec_attach.ConsoleExecAttach(log, ubconfig) def pytest_generate_tests(metafunc): - '''pytest hook: parameterize test functions based on custom rules. + """pytest hook: parameterize test functions based on custom rules. If a test function takes parameter(s) (fixture names) of the form brd__xxx or env__xxx, the brd and env configuration dictionaries are consulted to @@ -202,7 +202,7 @@ def pytest_generate_tests(metafunc): Returns: Nothing. - ''' + """ subconfigs = { 'brd': console.config.brd, @@ -229,14 +229,14 @@ def pytest_generate_tests(metafunc): @pytest.fixture(scope='function') def u_boot_console(request): - '''Generate the value of a test's u_boot_console fixture. + """Generate the value of a test's u_boot_console fixture. Args: request: The pytest request. Returns: The fixture value. - ''' + """ console.ensure_spawned() return console @@ -247,7 +247,7 @@ tests_skipped = set() tests_passed = set() def pytest_itemcollected(item): - '''pytest hook: Called once for each test found during collection. + """pytest hook: Called once for each test found during collection. This enables our custom result analysis code to see the list of all tests that should eventually be run. @@ -257,12 +257,12 @@ def pytest_itemcollected(item): Returns: Nothing. - ''' + """ tests_not_run.add(item.name) def cleanup(): - '''Clean up all global state. + """Clean up all global state. Executed (via atexit) once the entire test process is complete. This includes logging the status of all tests, and the identity of any failed @@ -273,7 +273,7 @@ def cleanup(): Returns: Nothing. - ''' + """ if console: console.close() @@ -295,7 +295,7 @@ def cleanup(): atexit.register(cleanup) def setup_boardspec(item): - '''Process any 'boardspec' marker for a test. + """Process any 'boardspec' marker for a test. Such a marker lists the set of board types that a test does/doesn't support. If tests are being executed on an unsupported board, the test is @@ -306,7 +306,7 @@ def setup_boardspec(item): Returns: Nothing. - ''' + """ mark = item.get_marker('boardspec') if not mark: @@ -323,7 +323,7 @@ def setup_boardspec(item): pytest.skip('board not supported') def setup_buildconfigspec(item): - '''Process any 'buildconfigspec' marker for a test. + """Process any 'buildconfigspec' marker for a test. Such a marker lists some U-Boot configuration feature that the test requires. If tests are being executed on an U-Boot build that doesn't @@ -334,7 +334,7 @@ def setup_buildconfigspec(item): Returns: Nothing. - ''' + """ mark = item.get_marker('buildconfigspec') if not mark: @@ -344,7 +344,7 @@ def setup_buildconfigspec(item): pytest.skip('.config feature not enabled') def pytest_runtest_setup(item): - '''pytest hook: Configure (set up) a test item. + """pytest hook: Configure (set up) a test item. Called once for each test to perform any custom configuration. This hook is used to skip the test if certain conditions apply. @@ -354,14 +354,14 @@ def pytest_runtest_setup(item): Returns: Nothing. - ''' + """ log.start_section(item.name) setup_boardspec(item) setup_buildconfigspec(item) def pytest_runtest_protocol(item, nextitem): - '''pytest hook: Called to execute a test. + """pytest hook: Called to execute a test. This hook wraps the standard pytest runtestprotocol() function in order to acquire visibility into, and record, each test function's result. @@ -372,7 +372,7 @@ def pytest_runtest_protocol(item, nextitem): Returns: A list of pytest reports (test result data). - ''' + """ reports = runtestprotocol(item, nextitem=nextitem) failed = None diff --git a/test/py/multiplexed_log.py b/test/py/multiplexed_log.py index 5059bbfb99..c2a3b89536 100644 --- a/test/py/multiplexed_log.py +++ b/test/py/multiplexed_log.py @@ -14,12 +14,12 @@ import subprocess mod_dir = os.path.dirname(os.path.abspath(__file__)) class LogfileStream(object): - '''A file-like object used to write a single logical stream of data into + """A file-like object used to write a single logical stream of data into a multiplexed log file. Objects of this type should be created by factory - functions in the Logfile class rather than directly.''' + functions in the Logfile class rather than directly.""" def __init__(self, logfile, name, chained_file): - '''Initialize a new object. + """Initialize a new object. Args: logfile: The Logfile object to log to. @@ -29,26 +29,26 @@ class LogfileStream(object): Returns: Nothing. - ''' + """ self.logfile = logfile self.name = name self.chained_file = chained_file def close(self): - '''Dummy function so that this class is "file-like". + """Dummy function so that this class is "file-like". Args: None. Returns: Nothing. - ''' + """ pass def write(self, data, implicit=False): - '''Write data to the log stream. + """Write data to the log stream. Args: data: The data to write tot he file. @@ -60,33 +60,33 @@ class LogfileStream(object): Returns: Nothing. - ''' + """ self.logfile.write(self, data, implicit) if self.chained_file: self.chained_file.write(data) def flush(self): - '''Flush the log stream, to ensure correct log interleaving. + """Flush the log stream, to ensure correct log interleaving. Args: None. Returns: Nothing. - ''' + """ self.logfile.flush() if self.chained_file: self.chained_file.flush() class RunAndLog(object): - '''A utility object used to execute sub-processes and log their output to + """A utility object used to execute sub-processes and log their output to a multiplexed log file. Objects of this type should be created by factory - functions in the Logfile class rather than directly.''' + functions in the Logfile class rather than directly.""" def __init__(self, logfile, name, chained_file): - '''Initialize a new object. + """Initialize a new object. Args: logfile: The Logfile object to log to. @@ -96,18 +96,18 @@ class RunAndLog(object): Returns: Nothing. - ''' + """ self.logfile = logfile self.name = name self.chained_file = chained_file def close(self): - '''Clean up any resources managed by this object.''' + """Clean up any resources managed by this object.""" pass def run(self, cmd, cwd=None, ignore_errors=False): - '''Run a command as a sub-process, and log the results. + """Run a command as a sub-process, and log the results. Args: cmd: The command to execute. @@ -120,7 +120,7 @@ class RunAndLog(object): Returns: Nothing. - ''' + """ msg = "+" + " ".join(cmd) + "\n" if self.chained_file: @@ -163,13 +163,13 @@ class RunAndLog(object): raise exception class SectionCtxMgr(object): - '''A context manager for Python's "with" statement, which allows a certain + """A context manager for Python's "with" statement, which allows a certain portion of test code to be logged to a separate section of the log file. Objects of this type should be created by factory functions in the Logfile - class rather than directly.''' + class rather than directly.""" def __init__(self, log, marker): - '''Initialize a new object. + """Initialize a new object. Args: log: The Logfile object to log to. @@ -177,7 +177,7 @@ class SectionCtxMgr(object): Returns: Nothing. - ''' + """ self.log = log self.marker = marker @@ -189,18 +189,18 @@ class SectionCtxMgr(object): self.log.end_section(self.marker) class Logfile(object): - '''Generates an HTML-formatted log file containing multiple streams of - data, each represented in a well-delineated/-structured fashion.''' + """Generates an HTML-formatted log file containing multiple streams of + data, each represented in a well-delineated/-structured fashion.""" def __init__(self, fn): - '''Initialize a new object. + """Initialize a new object. Args: fn: The filename to write to. Returns: Nothing. - ''' + """ self.f = open(fn, "wt") self.last_stream = None @@ -217,7 +217,7 @@ class Logfile(object): """) def close(self): - '''Close the log file. + """Close the log file. After calling this function, no more data may be written to the log. @@ -226,7 +226,7 @@ class Logfile(object): Returns: Nothing. - ''' + """ self.f.write("""\ </tt> @@ -241,7 +241,7 @@ class Logfile(object): "".join(chr(c) for c in range(127, 256))) def _escape(self, data): - '''Render data format suitable for inclusion in an HTML document. + """Render data format suitable for inclusion in an HTML document. This includes HTML-escaping certain characters, and translating control characters to a hexadecimal representation. @@ -251,7 +251,7 @@ class Logfile(object): Returns: An escaped version of the data. - ''' + """ data = data.replace(chr(13), "") data = "".join((c in self._nonprint) and ("%%%02x" % ord(c)) or @@ -260,14 +260,14 @@ class Logfile(object): return data def _terminate_stream(self): - '''Write HTML to the log file to terminate the current stream's data. + """Write HTML to the log file to terminate the current stream's data. Args: None. Returns: Nothing. - ''' + """ self.cur_evt += 1 if not self.last_stream: @@ -280,7 +280,7 @@ class Logfile(object): self.last_stream = None def _note(self, note_type, msg): - '''Write a note or one-off message to the log file. + """Write a note or one-off message to the log file. Args: note_type: The type of note. This must be a value supported by the @@ -289,7 +289,7 @@ class Logfile(object): Returns: Nothing. - ''' + """ self._terminate_stream() self.f.write("<div class=\"" + note_type + "\">\n<pre>") @@ -297,14 +297,14 @@ class Logfile(object): self.f.write("\n</pre></div>\n") def start_section(self, marker): - '''Begin a new nested section in the log file. + """Begin a new nested section in the log file. Args: marker: The name of the section that is starting. Returns: Nothing. - ''' + """ self._terminate_stream() self.blocks.append(marker) @@ -314,7 +314,7 @@ class Logfile(object): "\">Section: " + blk_path + "</div>\n") def end_section(self, marker): - '''Terminate the current nested section in the log file. + """Terminate the current nested section in the log file. This function validates proper nesting of start_section() and end_section() calls. If a mismatch is found, an exception is raised. @@ -324,7 +324,7 @@ class Logfile(object): Returns: Nothing. - ''' + """ if (not self.blocks) or (marker != self.blocks[-1]): raise Exception("Block nesting mismatch: \"%s\" \"%s\"" % @@ -337,7 +337,7 @@ class Logfile(object): self.blocks.pop() def section(self, marker): - '''Create a temporary section in the log file. + """Create a temporary section in the log file. This function creates a context manager for Python's "with" statement, which allows a certain portion of test code to be logged to a separate @@ -352,96 +352,96 @@ class Logfile(object): Returns: A context manager object. - ''' + """ return SectionCtxMgr(self, marker) def error(self, msg): - '''Write an error note to the log file. + """Write an error note to the log file. Args: msg: A message describing the error. Returns: Nothing. - ''' + """ self._note("error", msg) def warning(self, msg): - '''Write an warning note to the log file. + """Write an warning note to the log file. Args: msg: A message describing the warning. Returns: Nothing. - ''' + """ self._note("warning", msg) def info(self, msg): - '''Write an informational note to the log file. + """Write an informational note to the log file. Args: msg: An informational message. Returns: Nothing. - ''' + """ self._note("info", msg) def action(self, msg): - '''Write an action note to the log file. + """Write an action note to the log file. Args: msg: A message describing the action that is being logged. Returns: Nothing. - ''' + """ self._note("action", msg) def status_pass(self, msg): - '''Write a note to the log file describing test(s) which passed. + """Write a note to the log file describing test(s) which passed. Args: msg: A message describing passed test(s). Returns: Nothing. - ''' + """ self._note("status-pass", msg) def status_skipped(self, msg): - '''Write a note to the log file describing skipped test(s). + """Write a note to the log file describing skipped test(s). Args: msg: A message describing passed test(s). Returns: Nothing. - ''' + """ self._note("status-skipped", msg) def status_fail(self, msg): - '''Write a note to the log file describing failed test(s). + """Write a note to the log file describing failed test(s). Args: msg: A message describing passed test(s). Returns: Nothing. - ''' + """ self._note("status-fail", msg) def get_stream(self, name, chained_file=None): - '''Create an object to log a single stream's data into the log file. + """Create an object to log a single stream's data into the log file. This creates a "file-like" object that can be written to in order to write a single stream's data to the log file. The implementation will @@ -456,12 +456,12 @@ class Logfile(object): Returns: A file-like object. - ''' + """ return LogfileStream(self, name, chained_file) def get_runner(self, name, chained_file=None): - '''Create an object that executes processes and logs their output. + """Create an object that executes processes and logs their output. Args: name: The name of this sub-process. @@ -470,12 +470,12 @@ class Logfile(object): Returns: A RunAndLog object. - ''' + """ return RunAndLog(self, name, chained_file) def write(self, stream, data, implicit=False): - '''Write stream data into the log file. + """Write stream data into the log file. This function should only be used by instances of LogfileStream or RunAndLog. @@ -491,7 +491,7 @@ class Logfile(object): Returns: Nothing. - ''' + """ if stream != self.last_stream: self._terminate_stream() @@ -507,13 +507,13 @@ class Logfile(object): self.last_stream = stream def flush(self): - '''Flush the log stream, to ensure correct log interleaving. + """Flush the log stream, to ensure correct log interleaving. Args: None. Returns: Nothing. - ''' + """ self.f.flush() diff --git a/test/py/tests/test_000_version.py b/test/py/tests/test_000_version.py index d262f0534e..43a02e74f7 100644 --- a/test/py/tests/test_000_version.py +++ b/test/py/tests/test_000_version.py @@ -9,7 +9,7 @@ # command prompt. def test_version(u_boot_console): - '''Test that the "version" command prints the U-Boot version.''' + """Test that the "version" command prints the U-Boot version.""" # "version" prints the U-Boot sign-on message. This is usually considered # an error, so that any unexpected reboot causes an error. Here, this diff --git a/test/py/tests/test_dfu.py b/test/py/tests/test_dfu.py index 6c1a363b02..0f69eef66b 100644 --- a/test/py/tests/test_dfu.py +++ b/test/py/tests/test_dfu.py @@ -12,7 +12,7 @@ import os.path import pytest import u_boot_utils -''' +""" Note: This test relies on: a) boardenv_* to contain configuration values to define which USB ports are @@ -44,7 +44,7 @@ ACTION=="add", SUBSYSTEM=="block", SUBSYSTEMS=="usb", KERNELS=="3-13", MODE:="66 (You may wish to change the group ID instead of setting the permissions wide open. All that matters is that the user ID running the test can access the device.) -''' +""" # The set of file sizes to test. These values trigger various edge-cases such # as one less than, equal to, and one greater than typical USB max packet @@ -71,7 +71,7 @@ first_usb_dev_port = None @pytest.mark.buildconfigspec('cmd_dfu') def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): - '''Test the "dfu" command; the host system must be able to enumerate a USB + """Test the "dfu" command; the host system must be able to enumerate a USB device when "dfu" is running, various DFU transfers are tested, and the USB device must disappear when "dfu" is aborted. @@ -86,10 +86,10 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): Returns: Nothing. - ''' + """ def start_dfu(): - '''Start U-Boot's dfu shell command. + """Start U-Boot's dfu shell command. This also waits for the host-side USB enumeration process to complete. @@ -98,7 +98,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): Returns: Nothing. - ''' + """ fh = u_boot_utils.attempt_to_open_file( env__usb_dev_port['host_usb_dev_node']) @@ -120,7 +120,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): fh.close() def stop_dfu(ignore_errors): - '''Stop U-Boot's dfu shell command from executing. + """Stop U-Boot's dfu shell command from executing. This also waits for the host-side USB de-enumeration process to complete. @@ -133,7 +133,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): Returns: Nothing. - ''' + """ try: u_boot_console.log.action( @@ -148,7 +148,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): raise def run_dfu_util(alt_setting, fn, up_dn_load_arg): - '''Invoke dfu-util on the host. + """Invoke dfu-util on the host. Args: alt_setting: The DFU "alternate setting" identifier to interact @@ -159,7 +159,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): Returns: Nothing. - ''' + """ cmd = ['dfu-util', '-a', str(alt_setting), up_dn_load_arg, fn] if 'host_usb_port_path' in env__usb_dev_port: @@ -168,7 +168,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): u_boot_console.wait_for('Ctrl+C to exit ...') def dfu_write(alt_setting, fn): - '''Write a file to the target board using DFU. + """Write a file to the target board using DFU. Args: alt_setting: The DFU "alternate setting" identifier to interact @@ -177,12 +177,12 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): Returns: Nothing. - ''' + """ run_dfu_util(alt_setting, fn, '-D') def dfu_read(alt_setting, fn): - '''Read a file from the target board using DFU. + """Read a file from the target board using DFU. Args: alt_setting: The DFU "alternate setting" identifier to interact @@ -191,7 +191,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): Returns: Nothing. - ''' + """ # dfu-util fails reads/uploads if the host file already exists if os.path.exists(fn): @@ -199,7 +199,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): run_dfu_util(alt_setting, fn, '-U') def dfu_write_read_check(size): - '''Test DFU transfers of a specific size of data + """Test DFU transfers of a specific size of data This function first writes data to the board then reads it back and compares the written and read back data. Measures are taken to avoid @@ -210,7 +210,7 @@ def test_dfu(u_boot_console, env__usb_dev_port, env__dfu_config): Returns: Nothing. - ''' + """ test_f = u_boot_utils.PersistentRandomFile(u_boot_console, 'dfu_%d.bin' % size, size) diff --git a/test/py/tests/test_env.py b/test/py/tests/test_env.py index 557c3afe5c..651303f8cd 100644 --- a/test/py/tests/test_env.py +++ b/test/py/tests/test_env.py @@ -10,34 +10,34 @@ import pytest # FIXME: This might be useful for other tests; # perhaps refactor it into ConsoleBase or some other state object? class StateTestEnv(object): - '''Container that represents the state of all U-Boot environment variables. + """Container that represents the state of all U-Boot environment variables. This enables quick determination of existant/non-existant variable names. - ''' + """ def __init__(self, u_boot_console): - '''Initialize a new StateTestEnv object. + """Initialize a new StateTestEnv object. Args: u_boot_console: A U-Boot console. Returns: Nothing. - ''' + """ self.u_boot_console = u_boot_console self.get_env() self.set_var = self.get_non_existent_var() def get_env(self): - '''Read all current environment variables from U-Boot. + """Read all current environment variables from U-Boot. Args: None. Returns: Nothing. - ''' + """ response = self.u_boot_console.run_command('printenv') self.env = {} @@ -48,27 +48,27 @@ class StateTestEnv(object): self.env[var] = value def get_existent_var(self): - '''Return the name of an environment variable that exists. + """Return the name of an environment variable that exists. Args: None. Returns: The name of an environment variable. - ''' + """ for var in self.env: return var def get_non_existent_var(self): - '''Return the name of an environment variable that does not exist. + """Return the name of an environment variable that does not exist. Args: None. Returns: The name of an environment variable. - ''' + """ n = 0 while True: @@ -80,7 +80,7 @@ class StateTestEnv(object): ste = None @pytest.fixture(scope='function') def state_test_env(u_boot_console): - '''pytest fixture to provide a StateTestEnv object to tests.''' + """pytest fixture to provide a StateTestEnv object to tests.""" global ste if not ste: @@ -88,7 +88,7 @@ def state_test_env(u_boot_console): return ste def unset_var(state_test_env, var): - '''Unset an environment variable. + """Unset an environment variable. This both executes a U-Boot shell command and updates a StateTestEnv object. @@ -99,14 +99,14 @@ def unset_var(state_test_env, var): Returns: Nothing. - ''' + """ state_test_env.u_boot_console.run_command('setenv %s' % var) if var in state_test_env.env: del state_test_env.env[var] def set_var(state_test_env, var, value): - '''Set an environment variable. + """Set an environment variable. This both executes a U-Boot shell command and updates a StateTestEnv object. @@ -118,26 +118,26 @@ def set_var(state_test_env, var, value): Returns: Nothing. - ''' + """ state_test_env.u_boot_console.run_command('setenv %s "%s"' % (var, value)) state_test_env.env[var] = value def validate_empty(state_test_env, var): - '''Validate that a variable is not set, using U-Boot shell commands. + """Validate that a variable is not set, using U-Boot shell commands. Args: var: The variable name to test. Returns: Nothing. - ''' + """ response = state_test_env.u_boot_console.run_command('echo $%s' % var) assert response == '' def validate_set(state_test_env, var, value): - '''Validate that a variable is set, using U-Boot shell commands. + """Validate that a variable is set, using U-Boot shell commands. Args: var: The variable name to test. @@ -145,7 +145,7 @@ def validate_set(state_test_env, var, value): Returns: Nothing. - ''' + """ # echo does not preserve leading, internal, or trailing whitespace in the # value. printenv does, and hence allows more complete testing. @@ -153,20 +153,20 @@ def validate_set(state_test_env, var, value): assert response == ('%s=%s' % (var, value)) def test_env_echo_exists(state_test_env): - '''Test echoing a variable that exists.''' + """Test echoing a variable that exists.""" var = state_test_env.get_existent_var() value = state_test_env.env[var] validate_set(state_test_env, var, value) def test_env_echo_non_existent(state_test_env): - '''Test echoing a variable that doesn't exist.''' + """Test echoing a variable that doesn't exist.""" var = state_test_env.set_var validate_empty(state_test_env, var) def test_env_printenv_non_existent(state_test_env): - '''Test printenv error message for non-existant variables.''' + """Test printenv error message for non-existant variables.""" var = state_test_env.set_var c = state_test_env.u_boot_console @@ -175,14 +175,14 @@ def test_env_printenv_non_existent(state_test_env): assert(response == '## Error: "%s" not defined' % var) def test_env_unset_non_existent(state_test_env): - '''Test unsetting a nonexistent variable.''' + """Test unsetting a nonexistent variable.""" var = state_test_env.get_non_existent_var() unset_var(state_test_env, var) validate_empty(state_test_env, var) def test_env_set_non_existent(state_test_env): - '''Test set a non-existant variable.''' + """Test set a non-existant variable.""" var = state_test_env.set_var value = 'foo' @@ -190,7 +190,7 @@ def test_env_set_non_existent(state_test_env): validate_set(state_test_env, var, value) def test_env_set_existing(state_test_env): - '''Test setting an existant variable.''' + """Test setting an existant variable.""" var = state_test_env.set_var value = 'bar' @@ -198,14 +198,14 @@ def test_env_set_existing(state_test_env): validate_set(state_test_env, var, value) def test_env_unset_existing(state_test_env): - '''Test unsetting a variable.''' + """Test unsetting a variable.""" var = state_test_env.set_var unset_var(state_test_env, var) validate_empty(state_test_env, var) def test_env_expansion_spaces(state_test_env): - '''Test expanding a variable that contains a space in its value.''' + """Test expanding a variable that contains a space in its value.""" var_space = None var_test = None diff --git a/test/py/tests/test_help.py b/test/py/tests/test_help.py index 894f3b5f17..420090cf0d 100644 --- a/test/py/tests/test_help.py +++ b/test/py/tests/test_help.py @@ -4,6 +4,6 @@ # SPDX-License-Identifier: GPL-2.0 def test_help(u_boot_console): - '''Test that the "help" command can be executed.''' + """Test that the "help" command can be executed.""" u_boot_console.run_command('help') diff --git a/test/py/tests/test_hush_if_test.py b/test/py/tests/test_hush_if_test.py index cf4c3aeeb7..8b88425a65 100644 --- a/test/py/tests/test_hush_if_test.py +++ b/test/py/tests/test_hush_if_test.py @@ -95,7 +95,7 @@ subtests = ( ) def exec_hush_if(u_boot_console, expr, result): - '''Execute a shell "if" command, and validate its result.''' + """Execute a shell "if" command, and validate its result.""" cmd = 'if ' + expr + '; then echo true; else echo false; fi' response = u_boot_console.run_command(cmd) @@ -103,7 +103,7 @@ def exec_hush_if(u_boot_console, expr, result): @pytest.mark.buildconfigspec('sys_hush_parser') def test_hush_if_test_setup(u_boot_console): - '''Set up environment variables used during the "if" tests.''' + """Set up environment variables used during the "if" tests.""" u_boot_console.run_command('setenv ut_var_nonexistent') u_boot_console.run_command('setenv ut_var_exists 1') @@ -111,13 +111,13 @@ def test_hush_if_test_setup(u_boot_console): @pytest.mark.buildconfigspec('sys_hush_parser') @pytest.mark.parametrize('expr,result', subtests) def test_hush_if_test(u_boot_console, expr, result): - '''Test a single "if test" condition.''' + """Test a single "if test" condition.""" exec_hush_if(u_boot_console, expr, result) @pytest.mark.buildconfigspec('sys_hush_parser') def test_hush_if_test_teardown(u_boot_console): - '''Clean up environment variables used during the "if" tests.''' + """Clean up environment variables used during the "if" tests.""" u_boot_console.run_command('setenv ut_var_exists') @@ -126,7 +126,7 @@ def test_hush_if_test_teardown(u_boot_console): # Of those, only UMS currently allows file removal though. @pytest.mark.boardspec('sandbox') def test_hush_if_test_host_file_exists(u_boot_console): - '''Test the "if test -e" shell command.''' + """Test the "if test -e" shell command.""" test_file = u_boot_console.config.result_dir + \ '/creating_this_file_breaks_u_boot_tests' diff --git a/test/py/tests/test_md.py b/test/py/tests/test_md.py index 32cce4f15c..5fe25826b3 100644 --- a/test/py/tests/test_md.py +++ b/test/py/tests/test_md.py @@ -8,8 +8,8 @@ import u_boot_utils @pytest.mark.buildconfigspec('cmd_memory') def test_md(u_boot_console): - '''Test that md reads memory as expected, and that memory can be modified - using the mw command.''' + """Test that md reads memory as expected, and that memory can be modified + using the mw command.""" ram_base = u_boot_utils.find_ram_base(u_boot_console) addr = '%08x' % ram_base @@ -24,8 +24,8 @@ def test_md(u_boot_console): @pytest.mark.buildconfigspec('cmd_memory') def test_md_repeat(u_boot_console): - '''Test command repeat (via executing an empty command) operates correctly - for "md"; the command must repeat and dump an incrementing address.''' + """Test command repeat (via executing an empty command) operates correctly + for "md"; the command must repeat and dump an incrementing address.""" ram_base = u_boot_utils.find_ram_base(u_boot_console) addr_base = '%08x' % ram_base diff --git a/test/py/tests/test_net.py b/test/py/tests/test_net.py index 9c46551e8c..68eedde7c8 100644 --- a/test/py/tests/test_net.py +++ b/test/py/tests/test_net.py @@ -8,7 +8,7 @@ import pytest import u_boot_utils -''' +""" Note: This test relies on boardenv_* containing configuration values to define which the network environment available for testing. Without this, this test will be automatically skipped. @@ -46,16 +46,16 @@ env__net_tftp_readable_file = { "size": 5058624, "crc32": "c2244b26", } -''' +""" net_set_up = False def test_net_pre_commands(u_boot_console): - '''Execute any commands required to enable network hardware. + """Execute any commands required to enable network hardware. These commands are provided by the boardenv_* file; see the comment at the beginning of this file. - ''' + """ init_usb = u_boot_console.config.env.get('env__net_uses_usb', False) if init_usb: @@ -67,11 +67,11 @@ def test_net_pre_commands(u_boot_console): @pytest.mark.buildconfigspec('cmd_dhcp') def test_net_dhcp(u_boot_console): - '''Test the dhcp command. + """Test the dhcp command. The boardenv_* file may be used to enable/disable this test; see the comment at the beginning of this file. - ''' + """ test_dhcp = u_boot_console.config.env.get('env__net_dhcp_server', False) if not test_dhcp: @@ -86,11 +86,11 @@ def test_net_dhcp(u_boot_console): @pytest.mark.buildconfigspec('net') def test_net_setup_static(u_boot_console): - '''Set up a static IP configuration. + """Set up a static IP configuration. The configuration is provided by the boardenv_* file; see the comment at the beginning of this file. - ''' + """ env_vars = u_boot_console.config.env.get('env__net_static_env_vars', None) if not env_vars: @@ -104,12 +104,12 @@ def test_net_setup_static(u_boot_console): @pytest.mark.buildconfigspec('cmd_ping') def test_net_ping(u_boot_console): - '''Test the ping command. + """Test the ping command. The $serverip (as set up by either test_net_dhcp or test_net_setup_static) is pinged. The test validates that the host is alive, as reported by the ping command's output. - ''' + """ if not net_set_up: pytest.skip("Network not initialized") @@ -119,14 +119,14 @@ def test_net_ping(u_boot_console): @pytest.mark.buildconfigspec('cmd_net') def test_net_tftpboot(u_boot_console): - '''Test the tftpboot command. + """Test the tftpboot command. A file is downloaded from the TFTP server, its size and optionally its CRC32 are validated. The details of the file to download are provided by the boardenv_* file; see the comment at the beginning of this file. - ''' + """ if not net_set_up: pytest.skip("Network not initialized") diff --git a/test/py/tests/test_sandbox_exit.py b/test/py/tests/test_sandbox_exit.py index 1ec3607eb2..d1aa3083f4 100644 --- a/test/py/tests/test_sandbox_exit.py +++ b/test/py/tests/test_sandbox_exit.py @@ -9,14 +9,14 @@ import signal @pytest.mark.boardspec('sandbox') @pytest.mark.buildconfigspec('reset') def test_reset(u_boot_console): - '''Test that the "reset" command exits sandbox process.''' + """Test that the "reset" command exits sandbox process.""" u_boot_console.run_command('reset', wait_for_prompt=False) assert(u_boot_console.validate_exited()) @pytest.mark.boardspec('sandbox') def test_ctrl_c(u_boot_console): - '''Test that sending SIGINT to sandbox causes it to exit.''' + """Test that sending SIGINT to sandbox causes it to exit.""" u_boot_console.kill(signal.SIGINT) assert(u_boot_console.validate_exited()) diff --git a/test/py/tests/test_shell_basics.py b/test/py/tests/test_shell_basics.py index 719ce611d7..32e5f83015 100644 --- a/test/py/tests/test_shell_basics.py +++ b/test/py/tests/test_shell_basics.py @@ -5,13 +5,13 @@ # Test basic shell functionality, such as commands separate by semi-colons. def test_shell_execute(u_boot_console): - '''Test any shell command.''' + """Test any shell command.""" response = u_boot_console.run_command('echo hello') assert response.strip() == 'hello' def test_shell_semicolon_two(u_boot_console): - '''Test two shell commands separate by a semi-colon.''' + """Test two shell commands separate by a semi-colon.""" cmd = 'echo hello; echo world' response = u_boot_console.run_command(cmd) @@ -19,8 +19,8 @@ def test_shell_semicolon_two(u_boot_console): assert response.index('hello') < response.index('world') def test_shell_semicolon_three(u_boot_console): - '''Test three shell commands separate by a semi-colon, with variable - expansion dependencies between them.''' + """Test three shell commands separate by a semi-colon, with variable + expansion dependencies between them.""" cmd = 'setenv list 1; setenv list ${list}2; setenv list ${list}3; ' + \ 'echo ${list}' @@ -29,7 +29,7 @@ def test_shell_semicolon_three(u_boot_console): u_boot_console.run_command('setenv list') def test_shell_run(u_boot_console): - '''Test the "run" shell command.''' + """Test the "run" shell command.""" u_boot_console.run_command('setenv foo \"setenv monty 1; setenv python 2\"') u_boot_console.run_command('run foo') diff --git a/test/py/tests/test_sleep.py b/test/py/tests/test_sleep.py index 437b6bb9fe..74add891c3 100644 --- a/test/py/tests/test_sleep.py +++ b/test/py/tests/test_sleep.py @@ -6,8 +6,8 @@ import pytest import time def test_sleep(u_boot_console): - '''Test the sleep command, and validate that it sleeps for approximately - the correct amount of time.''' + """Test the sleep command, and validate that it sleeps for approximately + the correct amount of time.""" # 3s isn't too long, but is enough to cross a few second boundaries. sleep_time = 3 diff --git a/test/py/tests/test_ums.py b/test/py/tests/test_ums.py index f482cfeca1..21d40a9725 100644 --- a/test/py/tests/test_ums.py +++ b/test/py/tests/test_ums.py @@ -14,7 +14,7 @@ import re import time import u_boot_utils -''' +""" Note: This test relies on: a) boardenv_* to contain configuration values to define which USB ports are @@ -69,11 +69,11 @@ root permissions. For example: This entry is only needed if any block_devs above contain a writable_fs_partition value. -''' +""" @pytest.mark.buildconfigspec('cmd_usb_mass_storage') def test_ums(u_boot_console, env__usb_dev_port, env__block_devs): - '''Test the "ums" command; the host system must be able to enumerate a UMS + """Test the "ums" command; the host system must be able to enumerate a UMS device when "ums" is running, block and optionally file I/O are tested, and this device must disappear when "ums" is aborted. @@ -88,7 +88,7 @@ def test_ums(u_boot_console, env__usb_dev_port, env__block_devs): Returns: Nothing. - ''' + """ have_writable_fs_partition = 'writable_fs_partition' in env__block_devs[0] if not have_writable_fs_partition: @@ -120,7 +120,7 @@ def test_ums(u_boot_console, env__usb_dev_port, env__block_devs): mounted_test_fn = mount_point + '/' + mount_subdir + test_f.fn def start_ums(): - '''Start U-Boot's ums shell command. + """Start U-Boot's ums shell command. This also waits for the host-side USB enumeration process to complete. @@ -129,7 +129,7 @@ def test_ums(u_boot_console, env__usb_dev_port, env__block_devs): Returns: Nothing. - ''' + """ u_boot_console.log.action( 'Starting long-running U-Boot ums shell command') @@ -142,21 +142,21 @@ def test_ums(u_boot_console, env__usb_dev_port, env__block_devs): fh.close() def mount(): - '''Mount the block device that U-Boot exports. + """Mount the block device that U-Boot exports. Args: None. Returns: Nothing. - ''' + """ u_boot_console.log.action('Mounting exported UMS device') cmd = ('/bin/mount', host_ums_part_node) u_boot_utils.run_and_log(u_boot_console, cmd) def umount(ignore_errors): - '''Unmount the block device that U-Boot exports. + """Unmount the block device that U-Boot exports. Args: ignore_errors: Ignore any errors. This is useful if an error has @@ -166,14 +166,14 @@ def test_ums(u_boot_console, env__usb_dev_port, env__block_devs): Returns: Nothing. - ''' + """ u_boot_console.log.action('Unmounting UMS device') cmd = ('/bin/umount', host_ums_part_node) u_boot_utils.run_and_log(u_boot_console, cmd, ignore_errors) def stop_ums(ignore_errors): - '''Stop U-Boot's ums shell command from executing. + """Stop U-Boot's ums shell command from executing. This also waits for the host-side USB de-enumeration process to complete. @@ -186,7 +186,7 @@ def test_ums(u_boot_console, env__usb_dev_port, env__block_devs): Returns: Nothing. - ''' + """ u_boot_console.log.action( 'Stopping long-running U-Boot ums shell command') diff --git a/test/py/tests/test_unknown_cmd.py b/test/py/tests/test_unknown_cmd.py index 2de93e0026..c27ab49d55 100644 --- a/test/py/tests/test_unknown_cmd.py +++ b/test/py/tests/test_unknown_cmd.py @@ -4,8 +4,8 @@ # SPDX-License-Identifier: GPL-2.0 def test_unknown_command(u_boot_console): - '''Test that executing an unknown command causes U-Boot to print an - error.''' + """Test that executing an unknown command causes U-Boot to print an + error.""" # The "unknown command" error is actively expected here, # so error detection for it is disabled. diff --git a/test/py/u_boot_console_base.py b/test/py/u_boot_console_base.py index bb834b0d34..c500fb3ae5 100644 --- a/test/py/u_boot_console_base.py +++ b/test/py/u_boot_console_base.py @@ -24,12 +24,12 @@ pattern_unknown_command = re.compile('Unknown command \'.*\' - try \'help\'') pattern_error_notification = re.compile('## Error: ') class ConsoleDisableCheck(object): - '''Context manager (for Python's with statement) that temporarily disables + """Context manager (for Python's with statement) that temporarily disables the specified console output error check. This is useful when deliberately executing a command that is known to trigger one of the error checks, in order to test that the error condition is actually raised. This class is used internally by ConsoleBase::disable_check(); it is not intended for - direct usage.''' + direct usage.""" def __init__(self, console, check_type): self.console = console @@ -42,13 +42,13 @@ class ConsoleDisableCheck(object): self.console.disable_check_count[self.check_type] -= 1 class ConsoleBase(object): - '''The interface through which test functions interact with the U-Boot + """The interface through which test functions interact with the U-Boot console. This primarily involves executing shell commands, capturing their results, and checking for common error conditions. Some common utilities - are also provided too.''' + are also provided too.""" def __init__(self, log, config, max_fifo_fill): - '''Initialize a U-Boot console connection. + """Initialize a U-Boot console connection. Can only usefully be called by sub-classes. @@ -65,7 +65,7 @@ class ConsoleBase(object): Returns: Nothing. - ''' + """ self.log = log self.config = config @@ -88,7 +88,7 @@ class ConsoleBase(object): self.at_prompt_logevt = None def close(self): - '''Terminate the connection to the U-Boot console. + """Terminate the connection to the U-Boot console. This function is only useful once all interaction with U-Boot is complete. Once this function is called, data cannot be sent to or @@ -99,7 +99,7 @@ class ConsoleBase(object): Returns: Nothing. - ''' + """ if self.p: self.p.close() @@ -107,7 +107,7 @@ class ConsoleBase(object): def run_command(self, cmd, wait_for_echo=True, send_nl=True, wait_for_prompt=True): - '''Execute a command via the U-Boot console. + """Execute a command via the U-Boot console. The command is always sent to U-Boot. @@ -142,7 +142,7 @@ class ConsoleBase(object): The output from U-Boot during command execution. In other words, the text U-Boot emitted between the point it echod the command string and emitted the subsequent command prompts. - ''' + """ if self.at_prompt and \ self.at_prompt_logevt != self.logstream.logfile.cur_evt: @@ -198,7 +198,7 @@ class ConsoleBase(object): raise def ctrlc(self): - '''Send a CTRL-C character to U-Boot. + """Send a CTRL-C character to U-Boot. This is useful in order to stop execution of long-running synchronous commands such as "ums". @@ -208,13 +208,13 @@ class ConsoleBase(object): Returns: Nothing. - ''' + """ self.log.action('Sending Ctrl-C') self.run_command(chr(3), wait_for_echo=False, send_nl=False) def wait_for(self, text): - '''Wait for a pattern to be emitted by U-Boot. + """Wait for a pattern to be emitted by U-Boot. This is useful when a long-running command such as "dfu" is executing, and it periodically emits some text that should show up at a specific @@ -226,14 +226,14 @@ class ConsoleBase(object): Returns: Nothing. - ''' + """ if type(text) == type(''): text = re.escape(text) self.p.expect([text]) def drain_console(self): - '''Read from and log the U-Boot console for a short time. + """Read from and log the U-Boot console for a short time. U-Boot's console output is only logged when the test code actively waits for U-Boot to emit specific data. There are cases where tests @@ -248,7 +248,7 @@ class ConsoleBase(object): Returns: Nothing. - ''' + """ # If we are already not connected to U-Boot, there's nothing to drain. # This should only happen when a previous call to run_command() or @@ -270,7 +270,7 @@ class ConsoleBase(object): self.p.timeout = orig_timeout def ensure_spawned(self): - '''Ensure a connection to a correctly running U-Boot instance. + """Ensure a connection to a correctly running U-Boot instance. This may require spawning a new Sandbox process or resetting target hardware, as defined by the implementation sub-class. @@ -282,7 +282,7 @@ class ConsoleBase(object): Returns: Nothing. - ''' + """ if self.p: return @@ -320,7 +320,7 @@ class ConsoleBase(object): raise def cleanup_spawn(self): - '''Shut down all interaction with the U-Boot instance. + """Shut down all interaction with the U-Boot instance. This is used when an error is detected prior to re-establishing a connection with a fresh U-Boot instance. @@ -332,7 +332,7 @@ class ConsoleBase(object): Returns: Nothing. - ''' + """ try: if self.p: @@ -342,7 +342,7 @@ class ConsoleBase(object): self.p = None def validate_version_string_in_text(self, text): - '''Assert that a command's output includes the U-Boot signon message. + """Assert that a command's output includes the U-Boot signon message. This is primarily useful for validating the "version" command without duplicating the signon text regex in a test function. @@ -352,12 +352,12 @@ class ConsoleBase(object): Returns: Nothing. An exception is raised if the validation fails. - ''' + """ assert(self.u_boot_version_string in text) def disable_check(self, check_type): - '''Temporarily disable an error check of U-Boot's output. + """Temporarily disable an error check of U-Boot's output. Create a new context manager (for use with the "with" statement) which temporarily disables a particular console output error check. @@ -368,6 +368,6 @@ class ConsoleBase(object): Returns: A context manager object. - ''' + """ return ConsoleDisableCheck(self, check_type) diff --git a/test/py/u_boot_console_exec_attach.py b/test/py/u_boot_console_exec_attach.py index 0ca9e7c178..19520cb3b9 100644 --- a/test/py/u_boot_console_exec_attach.py +++ b/test/py/u_boot_console_exec_attach.py @@ -11,15 +11,15 @@ from u_boot_spawn import Spawn from u_boot_console_base import ConsoleBase class ConsoleExecAttach(ConsoleBase): - '''Represents a physical connection to a U-Boot console, typically via a + """Represents a physical connection to a U-Boot console, typically via a serial port. This implementation executes a sub-process to attach to the console, expecting that the stdin/out of the sub-process will be forwarded to/from the physical hardware. This approach isolates the test infra- structure from the user-/installation-specific details of how to - communicate with, and the identity of, serial ports etc.''' + communicate with, and the identity of, serial ports etc.""" def __init__(self, log, config): - '''Initialize a U-Boot console connection. + """Initialize a U-Boot console connection. Args: log: A multiplexed_log.Logfile instance. @@ -27,7 +27,7 @@ class ConsoleExecAttach(ConsoleBase): Returns: Nothing. - ''' + """ # The max_fifo_fill value might need tweaking per-board/-SoC? # 1 would be safe anywhere, but is very slow (a pexpect issue?). @@ -42,7 +42,7 @@ class ConsoleExecAttach(ConsoleBase): runner.close() def get_spawn(self): - '''Connect to a fresh U-Boot instance. + """Connect to a fresh U-Boot instance. The target board is reset, so that U-Boot begins running from scratch. @@ -51,7 +51,7 @@ class ConsoleExecAttach(ConsoleBase): Returns: A u_boot_spawn.Spawn object that is attached to U-Boot. - ''' + """ args = [self.config.board_type, self.config.board_identity] s = Spawn(['u-boot-test-console'] + args) diff --git a/test/py/u_boot_console_sandbox.py b/test/py/u_boot_console_sandbox.py index eb84150a1e..267f8b0650 100644 --- a/test/py/u_boot_console_sandbox.py +++ b/test/py/u_boot_console_sandbox.py @@ -10,11 +10,11 @@ from u_boot_spawn import Spawn from u_boot_console_base import ConsoleBase class ConsoleSandbox(ConsoleBase): - '''Represents a connection to a sandbox U-Boot console, executed as a sub- - process.''' + """Represents a connection to a sandbox U-Boot console, executed as a sub- + process.""" def __init__(self, log, config): - '''Initialize a U-Boot console connection. + """Initialize a U-Boot console connection. Args: log: A multiplexed_log.Logfile instance. @@ -22,12 +22,12 @@ class ConsoleSandbox(ConsoleBase): Returns: Nothing. - ''' + """ super(ConsoleSandbox, self).__init__(log, config, max_fifo_fill=1024) def get_spawn(self): - '''Connect to a fresh U-Boot instance. + """Connect to a fresh U-Boot instance. A new sandbox process is created, so that U-Boot begins running from scratch. @@ -37,25 +37,25 @@ class ConsoleSandbox(ConsoleBase): Returns: A u_boot_spawn.Spawn object that is attached to U-Boot. - ''' + """ return Spawn([self.config.build_dir + '/u-boot']) def kill(self, sig): - '''Send a specific Unix signal to the sandbox process. + """Send a specific Unix signal to the sandbox process. Args: sig: The Unix signal to send to the process. Returns: Nothing. - ''' + """ self.log.action('kill %d' % sig) self.p.kill(sig) def validate_exited(self): - '''Determine whether the sandbox process has exited. + """Determine whether the sandbox process has exited. If required, this function waits a reasonable time for the process to exit. @@ -65,7 +65,7 @@ class ConsoleSandbox(ConsoleBase): Returns: Boolean indicating whether the process has exited. - ''' + """ p = self.p self.p = None diff --git a/test/py/u_boot_spawn.py b/test/py/u_boot_spawn.py index df4c67597c..d508075990 100644 --- a/test/py/u_boot_spawn.py +++ b/test/py/u_boot_spawn.py @@ -12,23 +12,23 @@ import select import time class Timeout(Exception): - '''An exception sub-class that indicates that a timeout occurred.''' + """An exception sub-class that indicates that a timeout occurred.""" pass class Spawn(object): - '''Represents the stdio of a freshly created sub-process. Commands may be + """Represents the stdio of a freshly created sub-process. Commands may be sent to the process, and responses waited for. - ''' + """ def __init__(self, args): - '''Spawn (fork/exec) the sub-process. + """Spawn (fork/exec) the sub-process. Args: args: array of processs arguments. argv[0] is the command to execute. Returns: Nothing. - ''' + """ self.waited = False self.buf = '' @@ -56,26 +56,26 @@ class Spawn(object): self.poll.register(self.fd, select.POLLIN | select.POLLPRI | select.POLLERR | select.POLLHUP | select.POLLNVAL) def kill(self, sig): - '''Send unix signal "sig" to the child process. + """Send unix signal "sig" to the child process. Args: sig: The signal number to send. Returns: Nothing. - ''' + """ os.kill(self.pid, sig) def isalive(self): - '''Determine whether the child process is still running. + """Determine whether the child process is still running. Args: None. Returns: Boolean indicating whether process is alive. - ''' + """ if self.waited: return False @@ -88,19 +88,19 @@ class Spawn(object): return False def send(self, data): - '''Send data to the sub-process's stdin. + """Send data to the sub-process's stdin. Args: data: The data to send to the process. Returns: Nothing. - ''' + """ os.write(self.fd, data) def expect(self, patterns): - '''Wait for the sub-process to emit specific data. + """Wait for the sub-process to emit specific data. This function waits for the process to emit one pattern from the supplied list of patterns, or for a timeout to occur. @@ -116,7 +116,7 @@ class Spawn(object): Notable exceptions: Timeout, if the process did not emit any of the patterns within the expected time. - ''' + """ for pi in xrange(len(patterns)): if type(patterns[pi]) == type(''): @@ -161,7 +161,7 @@ class Spawn(object): self.logfile_read.flush() def close(self): - '''Close the stdio connection to the sub-process. + """Close the stdio connection to the sub-process. This also waits a reasonable time for the sub-process to stop running. @@ -170,7 +170,7 @@ class Spawn(object): Returns: Nothing. - ''' + """ os.close(self.fd) for i in xrange(100): diff --git a/test/py/u_boot_utils.py b/test/py/u_boot_utils.py index 522390a207..72d24e42aa 100644 --- a/test/py/u_boot_utils.py +++ b/test/py/u_boot_utils.py @@ -11,21 +11,21 @@ import sys import time def md5sum_data(data): - '''Calculate the MD5 hash of some data. + """Calculate the MD5 hash of some data. Args: data: The data to hash. Returns: The hash of the data, as a binary string. - ''' + """ h = hashlib.md5() h.update(data) return h.digest() def md5sum_file(fn, max_length=None): - '''Calculate the MD5 hash of the contents of a file. + """Calculate the MD5 hash of the contents of a file. Args: fn: The filename of the file to hash. @@ -35,7 +35,7 @@ def md5sum_file(fn, max_length=None): Returns: The hash of the file content, as a binary string. - ''' + """ with open(fn, 'rb') as fh: if max_length: @@ -46,11 +46,11 @@ def md5sum_file(fn, max_length=None): return md5sum_data(data) class PersistentRandomFile(object): - '''Generate and store information about a persistent file containing - random data.''' + """Generate and store information about a persistent file containing + random data.""" def __init__(self, u_boot_console, fn, size): - '''Create or process the persistent file. + """Create or process the persistent file. If the file does not exist, it is generated. @@ -66,7 +66,7 @@ class PersistentRandomFile(object): Returns: Nothing. - ''' + """ self.fn = fn @@ -85,7 +85,7 @@ class PersistentRandomFile(object): self.content_hash = md5sum_data(data) def attempt_to_open_file(fn): - '''Attempt to open a file, without throwing exceptions. + """Attempt to open a file, without throwing exceptions. Any errors (exceptions) that occur during the attempt to open the file are ignored. This is useful in order to test whether a file (in @@ -98,7 +98,7 @@ def attempt_to_open_file(fn): Returns: An open file handle to the file, or None if the file could not be opened. - ''' + """ try: return open(fn, 'rb') @@ -106,7 +106,7 @@ def attempt_to_open_file(fn): return None def wait_until_open_succeeds(fn): - '''Poll until a file can be opened, or a timeout occurs. + """Poll until a file can be opened, or a timeout occurs. Continually attempt to open a file, and return when this succeeds, or raise an exception after a timeout. @@ -116,7 +116,7 @@ def wait_until_open_succeeds(fn): Returns: An open file handle to the file. - ''' + """ for i in xrange(100): fh = attempt_to_open_file(fn) @@ -126,7 +126,7 @@ def wait_until_open_succeeds(fn): raise Exception('File could not be opened') def wait_until_file_open_fails(fn, ignore_errors): - '''Poll until a file cannot be opened, or a timeout occurs. + """Poll until a file cannot be opened, or a timeout occurs. Continually attempt to open a file, and return when this fails, or raise an exception after a timeout. @@ -139,7 +139,7 @@ def wait_until_file_open_fails(fn, ignore_errors): Returns: Nothing. - ''' + """ for i in xrange(100): fh = attempt_to_open_file(fn) @@ -152,7 +152,7 @@ def wait_until_file_open_fails(fn, ignore_errors): raise Exception('File can still be opened') def run_and_log(u_boot_console, cmd, ignore_errors=False): - '''Run a command and log its output. + """Run a command and log its output. Args: u_boot_console: A console connection to U-Boot. @@ -164,7 +164,7 @@ def run_and_log(u_boot_console, cmd, ignore_errors=False): Returns: Nothing. - ''' + """ runner = u_boot_console.log.get_runner(cmd[0], sys.stdout) runner.run(cmd, ignore_errors=ignore_errors) @@ -172,7 +172,7 @@ def run_and_log(u_boot_console, cmd, ignore_errors=False): ram_base = None def find_ram_base(u_boot_console): - '''Find the running U-Boot's RAM location. + """Find the running U-Boot's RAM location. Probe the running U-Boot to determine the address of the first bank of RAM. This is useful for tests that test reading/writing RAM, or @@ -186,7 +186,7 @@ def find_ram_base(u_boot_console): Returns: The address of U-Boot's first RAM bank, as an integer. - ''' + """ global ram_base if u_boot_console.config.buildconfig.get('config_cmd_bdi', 'n') != 'y': |