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
|