X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=test%2Fpy%2Fu_boot_console_base.py;h=326b2ac51fbf07daa2e2af0385e9358d8cf9398f;hb=0d8f35b58cc8458a5263b424896a386429ee49e5;hp=b5aad7cb94ad6a876aac51164fdc5e45b4632c0d;hpb=73a9054d0f33dc4612a13200c6f3af00d2a1fcda;p=oweals%2Fu-boot.git diff --git a/test/py/u_boot_console_base.py b/test/py/u_boot_console_base.py index b5aad7cb94..326b2ac51f 100644 --- a/test/py/u_boot_console_base.py +++ b/test/py/u_boot_console_base.py @@ -1,7 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2015 Stephen Warren # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. -# -# SPDX-License-Identifier: GPL-2.0 # Common logic to interact with U-Boot via the console. This class provides # the interface that tests use to execute U-Boot shell commands and wait for @@ -106,7 +105,7 @@ class ConsoleBase(object): # Array slice removes leading/trailing quotes self.prompt = self.config.buildconfig['config_sys_prompt'][1:-1] - self.prompt_escaped = re.escape(self.prompt) + self.prompt_compiled = re.compile('^' + re.escape(self.prompt), re.MULTILINE) self.p = None self.disable_check_count = {pat[PAT_ID]: 0 for pat in bad_pattern_defs} self.eval_bad_patterns() @@ -160,7 +159,7 @@ class ConsoleBase(object): Args: cmd: The command to send. - wait_for_each: Boolean indicating whether to wait for U-Boot to + wait_for_echo: Boolean indicating whether to wait for U-Boot to echo the command text back to its output. send_nl: Boolean indicating whether to send a newline character after the command string. @@ -201,7 +200,7 @@ class ConsoleBase(object): self.bad_pattern_ids[m - 1]) if not wait_for_prompt: return - m = self.p.expect([self.prompt_escaped] + self.bad_patterns) + m = self.p.expect([self.prompt_compiled] + self.bad_patterns) if m != 0: self.at_prompt = False raise Exception('Bad pattern found on console: ' + @@ -215,6 +214,8 @@ class ConsoleBase(object): self.log.error(str(ex)) self.cleanup_spawn() raise + finally: + self.log.timestamp() def run_command_list(self, cmds): """Run a list of commands. @@ -223,13 +224,14 @@ class ConsoleBase(object): for each command in a list. Args: - cmd: List of commands (each a string) + cmd: List of commands (each a string). Returns: - Combined output of all commands, as a string + A list of output strings from each command, one element for each + command. """ - output = '' + output = [] for cmd in cmds: - output += self.run_command(cmd) + output.append(self.run_command(cmd)) return output def ctrlc(self): @@ -302,7 +304,17 @@ class ConsoleBase(object): # Wait for something U-Boot will likely never send. This will # cause the console output to be read and logged. self.p.expect(['This should never match U-Boot output']) - except u_boot_spawn.Timeout: + except: + # We expect a timeout, since U-Boot won't print what we waited + # for. Squash it when it happens. + # + # Squash any other exception too. This function is only used to + # drain (and log) the U-Boot console output after a failed test. + # The U-Boot process will be restarted, or target board reset, once + # this function returns. So, we don't care about detecting any + # additional errors, so they're squashed so that the rest of the + # post-test-failure cleanup code can continue operation, and + # correctly terminate any log sections, etc. pass finally: self.p.timeout = orig_timeout @@ -345,7 +357,7 @@ class ConsoleBase(object): m = self.p.expect([pattern_u_boot_spl_signon] + self.bad_patterns) if m != 0: - raise Exception('Bad pattern found on console: ' + + raise Exception('Bad pattern found on SPL console: ' + self.bad_pattern_ids[m - 1]) m = self.p.expect([pattern_u_boot_main_signon] + self.bad_patterns) if m != 0: @@ -353,7 +365,7 @@ class ConsoleBase(object): self.bad_pattern_ids[m - 1]) self.u_boot_version_string = self.p.after while True: - m = self.p.expect([self.prompt_escaped, + m = self.p.expect([self.prompt_compiled, pattern_stop_autoboot_prompt] + self.bad_patterns) if m == 0: break @@ -369,6 +381,7 @@ class ConsoleBase(object): self.cleanup_spawn() raise finally: + self.log.timestamp() self.log.end_section('Starting U-Boot') def cleanup_spawn(self): @@ -393,6 +406,21 @@ class ConsoleBase(object): pass self.p = None + def restart_uboot(self): + """Shut down and restart U-Boot.""" + self.cleanup_spawn() + self.ensure_spawned() + + def get_spawn_output(self): + """Return the start-up output from U-Boot + + Returns: + The output produced by ensure_spawed(), as a string. + """ + if self.p: + return self.p.get_expect_output() + return None + def validate_version_string_in_text(self, text): """Assert that a command's output includes the U-Boot signon message.