Skip to content

Commit d4b31a7

Browse files
committed
Enhance tests for 'sh' and 'bat' shells
The existing tests exercise much of the code for implementing colcon's shell subsystem, but it doesn't validate the results. If the platform supports the shell, we should check that the code for appending and prepending paths to lists function as intended.
1 parent 3310754 commit d4b31a7

File tree

2 files changed

+126
-38
lines changed

2 files changed

+126
-38
lines changed

test/test_shell_bat.py

Lines changed: 63 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pathlib import Path
66
import sys
77
from tempfile import TemporaryDirectory
8+
from unittest.mock import patch
89

910
from colcon_core import shell
1011
from colcon_core.plugin_system import SkipExtensionException
@@ -39,33 +40,36 @@ def _test_extension(prefix_path):
3940
extension.create_prefix_script(prefix_path, False)
4041
assert (prefix_path / 'local_setup.bat').exists()
4142

43+
# create_hook_append_value
44+
append_hook_path = extension.create_hook_append_value(
45+
'append_env_hook_name', prefix_path, 'pkg_name',
46+
'APPEND_NAME', 'subdirectory')
47+
assert append_hook_path.exists()
48+
assert append_hook_path.name == 'append_env_hook_name.bat'
49+
content = append_hook_path.read_text()
50+
assert 'APPEND_NAME' in content
51+
52+
# create_hook_prepend_value
53+
prepend_hook_path = extension.create_hook_prepend_value(
54+
'prepend_env_hook_name', prefix_path, 'pkg_name',
55+
'PREPEND_NAME', 'subdirectory')
56+
assert prepend_hook_path.exists()
57+
assert prepend_hook_path.name == 'prepend_env_hook_name.bat'
58+
content = prepend_hook_path.read_text()
59+
assert 'PREPEND_NAME' in content
60+
4261
# create_package_script
4362
extension.create_package_script(
4463
prefix_path, 'pkg_name', [
45-
('hookA.bat', '/some/path/hookA.bat'),
64+
(append_hook_path.relative_to(prefix_path), ()),
65+
(prepend_hook_path.relative_to(prefix_path), ()),
4666
('hookB.other', '/some/path/hookB.other')])
4767
assert (prefix_path / 'share' / 'pkg_name' / 'package.bat').exists()
4868
content = (prefix_path / 'share' / 'pkg_name' / 'package.bat').read_text()
49-
assert 'hookA' in content
69+
assert append_hook_path.name in content
70+
assert prepend_hook_path.name in content
5071
assert 'hookB' not in content
5172

52-
# create_hook_append_value
53-
hook_path = extension.create_hook_append_value(
54-
'append_env_hook_name', prefix_path, 'pkg_name',
55-
'APPEND_NAME', 'append_subdirectory')
56-
assert hook_path.exists()
57-
assert hook_path.name == 'append_env_hook_name.bat'
58-
content = hook_path.read_text()
59-
assert 'APPEND_NAME' in content
60-
61-
# create_hook_prepend_value
62-
hook_path = extension.create_hook_prepend_value(
63-
'env_hook_name', prefix_path, 'pkg_name', 'NAME', 'subdirectory')
64-
assert hook_path.exists()
65-
assert hook_path.name == 'env_hook_name.bat'
66-
content = hook_path.read_text()
67-
assert 'NAME' in content
68-
6973
# generate_command_environment
7074
if sys.platform != 'win32':
7175
with pytest.raises(SkipExtensionException) as e:
@@ -93,3 +97,43 @@ def _test_extension(prefix_path):
9397
'task_name', prefix_path, {'dep': str(prefix_path)})
9498
env = run_until_complete(coroutine)
9599
assert isinstance(env, dict)
100+
101+
subdirectory_path = str(prefix_path / 'subdirectory')
102+
103+
# validate appending/prepending
104+
with patch.dict(os.environ, {
105+
'APPEND_NAME': os.pathsep.join(('', '', 'control', '', '')),
106+
'PREPEND_NAME': os.pathsep.join(('', '', 'control', '', '')),
107+
}):
108+
coroutine = extension.generate_command_environment(
109+
'task_name', prefix_path, {'pkg_name': str(prefix_path)})
110+
env = run_until_complete(coroutine)
111+
# Expect excess separators to be removed
112+
assert env.get('APPEND_NAME') == os.pathsep.join((
113+
'control',
114+
subdirectory_path,
115+
))
116+
# Expect excess separators to be removed
117+
assert env.get('PREPEND_NAME') == os.pathsep.join((
118+
subdirectory_path,
119+
'control',
120+
))
121+
122+
# validate appending/prepending unique values
123+
with patch.dict(os.environ, {
124+
'APPEND_NAME': os.pathsep.join((subdirectory_path, 'control')),
125+
'PREPEND_NAME': os.pathsep.join(('control', subdirectory_path)),
126+
}):
127+
coroutine = extension.generate_command_environment(
128+
'task_name', prefix_path, {'pkg_name': str(prefix_path)})
129+
env = run_until_complete(coroutine)
130+
# Expect no change, value already appears earlier in the list
131+
assert env.get('APPEND_NAME') == os.pathsep.join((
132+
subdirectory_path,
133+
'control',
134+
))
135+
# Expect value to be *moved* to the front of the list
136+
assert env.get('PREPEND_NAME') == os.pathsep.join((
137+
subdirectory_path,
138+
'control',
139+
))

test/test_shell_sh.py

Lines changed: 63 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pathlib import Path
66
import sys
77
from tempfile import TemporaryDirectory
8+
from unittest.mock import patch
89

910
from colcon_core import shell
1011
from colcon_core.plugin_system import SkipExtensionException
@@ -40,33 +41,36 @@ def _test_extension(prefix_path):
4041
assert (prefix_path / 'local_setup.sh').exists()
4142
assert (prefix_path / '_local_setup_util_sh.py').exists()
4243

44+
# create_hook_append_value
45+
append_hook_path = extension.create_hook_append_value(
46+
'append_env_hook_name', prefix_path, 'pkg_name',
47+
'APPEND_NAME', 'subdirectory')
48+
assert append_hook_path.exists()
49+
assert append_hook_path.name == 'append_env_hook_name.sh'
50+
content = append_hook_path.read_text()
51+
assert 'APPEND_NAME' in content
52+
53+
# create_hook_prepend_value
54+
prepend_hook_path = extension.create_hook_prepend_value(
55+
'prepend_env_hook_name', prefix_path, 'pkg_name',
56+
'PREPEND_NAME', 'subdirectory')
57+
assert prepend_hook_path.exists()
58+
assert prepend_hook_path.name == 'prepend_env_hook_name.sh'
59+
content = prepend_hook_path.read_text()
60+
assert 'PREPEND_NAME' in content
61+
4362
# create_package_script
4463
extension.create_package_script(
4564
prefix_path, 'pkg_name', [
46-
('hookA.sh', '/some/path/hookA.sh'),
65+
(append_hook_path.relative_to(prefix_path), ()),
66+
(prepend_hook_path.relative_to(prefix_path), ()),
4767
('hookB.other', '/some/path/hookB.other')])
4868
assert (prefix_path / 'share' / 'pkg_name' / 'package.sh').exists()
4969
content = (prefix_path / 'share' / 'pkg_name' / 'package.sh').read_text()
50-
assert 'hookA' in content
70+
assert append_hook_path.name in content
71+
assert prepend_hook_path.name in content
5172
assert 'hookB' not in content
5273

53-
# create_hook_append_value
54-
hook_path = extension.create_hook_append_value(
55-
'append_env_hook_name', prefix_path, 'pkg_name',
56-
'APPEND_NAME', 'append_subdirectory')
57-
assert hook_path.exists()
58-
assert hook_path.name == 'append_env_hook_name.sh'
59-
content = hook_path.read_text()
60-
assert 'APPEND_NAME' in content
61-
62-
# create_hook_prepend_value
63-
hook_path = extension.create_hook_prepend_value(
64-
'env_hook_name', prefix_path, 'pkg_name', 'NAME', 'subdirectory')
65-
assert hook_path.exists()
66-
assert hook_path.name == 'env_hook_name.sh'
67-
content = hook_path.read_text()
68-
assert 'NAME' in content
69-
7074
# generate_command_environment
7175
if sys.platform == 'win32':
7276
with pytest.raises(SkipExtensionException) as e:
@@ -94,3 +98,43 @@ def _test_extension(prefix_path):
9498
'task_name', prefix_path, {'dep': str(prefix_path)})
9599
env = run_until_complete(coroutine)
96100
assert isinstance(env, dict)
101+
102+
subdirectory_path = str(prefix_path / 'subdirectory')
103+
104+
# validate appending/prepending
105+
with patch.dict(os.environ, {
106+
'APPEND_NAME': os.pathsep.join(('', '', 'control', '', '')),
107+
'PREPEND_NAME': os.pathsep.join(('', '', 'control', '', '')),
108+
}):
109+
coroutine = extension.generate_command_environment(
110+
'task_name', prefix_path, {'pkg_name': str(prefix_path)})
111+
env = run_until_complete(coroutine)
112+
# Expect excess separators to be removed
113+
assert env.get('APPEND_NAME') == os.pathsep.join((
114+
'control',
115+
subdirectory_path,
116+
))
117+
# Expect excess separators to be removed
118+
assert env.get('PREPEND_NAME') == os.pathsep.join((
119+
subdirectory_path,
120+
'control',
121+
))
122+
123+
# validate appending/prepending unique values
124+
with patch.dict(os.environ, {
125+
'APPEND_NAME': os.pathsep.join((subdirectory_path, 'control')),
126+
'PREPEND_NAME': os.pathsep.join(('control', subdirectory_path)),
127+
}):
128+
coroutine = extension.generate_command_environment(
129+
'task_name', prefix_path, {'pkg_name': str(prefix_path)})
130+
env = run_until_complete(coroutine)
131+
# Expect no change, value already appears earlier in the list
132+
assert env.get('APPEND_NAME') == os.pathsep.join((
133+
subdirectory_path,
134+
'control',
135+
))
136+
# Expect value to be *moved* to the front of the list
137+
assert env.get('PREPEND_NAME') == os.pathsep.join((
138+
subdirectory_path,
139+
'control',
140+
))

0 commit comments

Comments
 (0)