patman: Provide a way to intercept commands for testing

Add a test point for the command module. This allows tests to emulate
the execution of commands. This provides more control (since we can make
the fake 'commands' do whatever we like), makes it faster to write tests
since we don't need to set up as much environment, and speeds up test
execution.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2014-09-05 19:00:12 -06:00
parent 48ba5856eb
commit 82012dd284

View File

@ -20,9 +20,25 @@ class CommandResult:
def __init__(self):
self.stdout = None
self.stderr = None
self.combined = None
self.return_code = None
self.exception = None
def __init__(self, stdout='', stderr='', combined='', return_code=0,
exception=None):
self.stdout = stdout
self.stderr = stderr
self.combined = combined
self.return_code = return_code
self.exception = exception
# This permits interception of RunPipe for test purposes. If it is set to
# a function, then that function is called with the pipe list being
# executed. Otherwise, it is assumed to be a CommandResult object, and is
# returned as the result for every RunPipe() call.
# When this value is None, commands are executed as normal.
test_result = None
def RunPipe(pipe_list, infile=None, outfile=None,
capture=False, capture_stderr=False, oneline=False,
@ -44,6 +60,10 @@ def RunPipe(pipe_list, infile=None, outfile=None,
Returns:
CommandResult object
"""
if test_result:
if hasattr(test_result, '__call__'):
return test_result(pipe_list=pipe_list)
return test_result
result = CommandResult()
last_pipe = None
pipeline = list(pipe_list)