test/py: Allow passing input to a program

When running a program on the host, allow input to be passed in as stdin.
This is needed for running sfdisk, for example.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2021-10-23 17:25:57 -06:00
parent c700f109a3
commit 15156c95e9
2 changed files with 8 additions and 5 deletions

View File

@ -109,7 +109,7 @@ class RunAndLog(object):
"""Clean up any resources managed by this object.""" """Clean up any resources managed by this object."""
pass pass
def run(self, cmd, cwd=None, ignore_errors=False): def run(self, cmd, cwd=None, ignore_errors=False, stdin=None):
"""Run a command as a sub-process, and log the results. """Run a command as a sub-process, and log the results.
The output is available at self.output which can be useful if there is The output is available at self.output which can be useful if there is
@ -123,6 +123,7 @@ class RunAndLog(object):
function will simply return if the command cannot be executed function will simply return if the command cannot be executed
or exits with an error code, otherwise an exception will be or exits with an error code, otherwise an exception will be
raised if such problems occur. raised if such problems occur.
stdin: Input string to pass to the command as stdin (or None)
Returns: Returns:
The output as a string. The output as a string.
@ -135,8 +136,9 @@ class RunAndLog(object):
try: try:
p = subprocess.Popen(cmd, cwd=cwd, p = subprocess.Popen(cmd, cwd=cwd,
stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdin=subprocess.PIPE if stdin else None,
(stdout, stderr) = p.communicate() stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
(stdout, stderr) = p.communicate(input=stdin)
if stdout is not None: if stdout is not None:
stdout = stdout.decode('utf-8') stdout = stdout.decode('utf-8')
if stderr is not None: if stderr is not None:

View File

@ -154,7 +154,7 @@ def wait_until_file_open_fails(fn, ignore_errors):
return return
raise Exception('File can still be opened') raise Exception('File can still be opened')
def run_and_log(u_boot_console, cmd, ignore_errors=False): def run_and_log(u_boot_console, cmd, ignore_errors=False, stdin=None):
"""Run a command and log its output. """Run a command and log its output.
Args: Args:
@ -166,6 +166,7 @@ def run_and_log(u_boot_console, cmd, ignore_errors=False):
will simply return if the command cannot be executed or exits with will simply return if the command cannot be executed or exits with
an error code, otherwise an exception will be raised if such an error code, otherwise an exception will be raised if such
problems occur. problems occur.
stdin: Input string to pass to the command as stdin (or None)
Returns: Returns:
The output as a string. The output as a string.
@ -173,7 +174,7 @@ def run_and_log(u_boot_console, cmd, ignore_errors=False):
if isinstance(cmd, str): if isinstance(cmd, str):
cmd = cmd.split() cmd = cmd.split()
runner = u_boot_console.log.get_runner(cmd[0], sys.stdout) runner = u_boot_console.log.get_runner(cmd[0], sys.stdout)
output = runner.run(cmd, ignore_errors=ignore_errors) output = runner.run(cmd, ignore_errors=ignore_errors, stdin=stdin)
runner.close() runner.close()
return output return output