| 1 |
22c722bf
|
Wojtek Kosior
|
# SPDX-License-Identifier: CC0-1.0
|
| 2 |
|
|
|
| 3 |
|
|
# Copyright (C) 2022 Wojtek Kosior <koszko@koszko.org>
|
| 4 |
|
|
#
|
| 5 |
|
|
# Available under the terms of Creative Commons Zero v1.0 Universal.
|
| 6 |
|
|
|
| 7 |
|
|
import re
|
| 8 |
|
|
|
| 9 |
|
|
variable_word_re = re.compile(r'^<(.+)>$')
|
| 10 |
|
|
|
| 11 |
|
|
def process_command(command, expected_command):
|
| 12 |
|
|
"""Validate the command line and extract its variable parts (if any)."""
|
| 13 |
|
|
assert len(command) == len(expected_command)
|
| 14 |
|
|
|
| 15 |
|
|
extracted = {}
|
| 16 |
|
|
for word, expected_word in zip(command, expected_command):
|
| 17 |
|
|
match = variable_word_re.match(expected_word)
|
| 18 |
|
|
if match:
|
| 19 |
|
|
extracted[match.group(1)] = word
|
| 20 |
|
|
else:
|
| 21 |
|
|
assert word == expected_word
|
| 22 |
|
|
|
| 23 |
|
|
return extracted
|
| 24 |
|
|
|
| 25 |
|
|
def run_missing_executable(command, **kwargs):
|
| 26 |
|
|
"""
|
| 27 |
|
|
Instead of running a command, raise FileNotFoundError as if its executable
|
| 28 |
|
|
was missing.
|
| 29 |
|
|
"""
|
| 30 |
|
|
raise FileNotFoundError('dummy')
|
| 31 |
|
|
|
| 32 |
|
|
class MockedCompletedProcess:
|
| 33 |
|
|
"""
|
| 34 |
|
|
Object with some fields similar to those of subprocess.CompletedProcess.
|
| 35 |
|
|
"""
|
| 36 |
|
|
def __init__(self, args, returncode=0,
|
| 37 |
|
|
stdout='some output', stderr='some error output',
|
| 38 |
|
|
text_output=True):
|
| 39 |
|
|
"""
|
| 40 |
|
|
Initialize MockedCompletedProcess. Convert strings to bytes if needed.
|
| 41 |
|
|
"""
|
| 42 |
|
|
self.args = args
|
| 43 |
|
|
self.returncode = returncode
|
| 44 |
|
|
|
| 45 |
|
|
if type(stdout) is str and not text_output:
|
| 46 |
|
|
stdout = stdout.encode()
|
| 47 |
|
|
if type(stderr) is str and not text_output:
|
| 48 |
|
|
stderr = stderr.encode()
|
| 49 |
|
|
|
| 50 |
|
|
self.stdout = stdout
|
| 51 |
|
|
self.stderr = stderr
|