Newer
Older
from .utils import run_ioc_get_output
RE_MISSING_FILE = "No rule to make target [`']{filename}'"
def create_patch_file(path, desc):
path.parent.mkdir(parents=True, exist_ok=True)
patch_file_contents = """
diff --git database.db database.db
index 1806ff6..8701832 100644
--- database.db
+++ database.db
@@ -1,3 +1,3 @@
record(ai, "TEST") {{
f.write(patch_file_contents.format(desc=desc))
db_file_contents = """record(ai, "TEST") {
}
"""
create_patch_file(patch_dir / MODULE_VERSION / "apply.p0.patch", "OK")
create_patch_file(
patch_dir / MODULE_VERSION_NO_BUILD / "dont-apply.p0.patch", "Bad"
)
create_patch_file(patch_dir / (MODULE_VERSION + "-dont-apply.p0.patch"), "Bad")
assert "You are in the local source mode" in outs
rc, _, _ = wrapper.run_make("patch", module_version=MODULE_VERSION)
db_contents = f.read()
assert 'field(DESC, "OK")' in db_contents
rc, _, _ = wrapper.run_make("build", module_version=MODULE_VERSION)
rc, _, _ = wrapper.run_make("cellinstall", module_version=MODULE_VERSION)
assert any((wrapper.path / "cellMods").glob("**/*.db"))
wrapper.add_var_to_makefile("DBDS", "nonexistent.dbd")
assert rc == 2
assert re.search(
RE_MISSING_FILE.format(filename=re.escape("../nonexistent.dbd")),
)
def test_missing_source_file(wrapper):
wrapper.add_var_to_makefile("SOURCES", "nonexistent.c")
assert rc == 2
assert re.search(
RE_MISSING_FILE.format(filename=re.escape("nonexistent.o")),
def test_missing_requirement(wrapper):
assert rc == 0
assert 'Invalid dependency "FOO_DEP_VERSION"; pruning' in errs
def test_header_install_location(wrapper):
subdir = wrapper.module_dir / "db" / "subdir"
subdir.mkdir(parents=True)
extensions = ["h", "hpp", "hxx", "hh"]
wrapper.add_var_to_makefile("HEADERS", f"db/subdir/header.{ext}")
wrapper.add_var_to_makefile("KEEP_HEADER_SUBDIRS", "db")
for ext in extensions:
(subdir / f"header.{ext}").touch()
rc, *_ = wrapper.run_make("cellinstall")
cell_path = wrapper.get_env_var("E3_MODULES_INSTALL_LOCATION")
for ext in extensions:
assert (Path(cell_path) / "include" / "subdir" / f"header.{ext}").is_file()
assert not (Path(cell_path) / "include" / f"header.{ext}").is_file()
def test_updated_dependencies(wrappers):
wrapper_dep = wrappers.get()
wrapper_main = wrappers.get()
cell_path = wrapper_main.path / "cellMods"
old_version = "0.0.0+0"
wrapper_main.add_var_to_config_module(
f"{wrapper_dep.name}_DEP_VERSION", old_version, modifier=""
module_version=old_version,
cell_path=cell_path,
rc, *_ = wrapper_main.run_make("cellinstall", module_version=old_version)
assert rc == 0
new_version = "1.0.0+0"
module_version=new_version,
cell_path=cell_path,
wrapper_main.add_var_to_config_module(
f"{wrapper_dep.name}_DEP_VERSION", new_version, modifier=""
rc, *_ = wrapper_main.run_make("cellinstall", module_version=new_version)
wrapper_main.name, new_version, wrapper_main.path / "cellMods"
)
assert rc == 0
assert f"Loaded {wrapper_dep.name} version {new_version}" in outs
def test_automated_dependency(wrappers):
wrapper_a = wrappers.get()
wrapper_b = wrappers.get()
cell_path = wrapper_a.path / "cellMods"
module_version = "0.0.0+0"
wrapper_a.add_var_to_config_module(f"{wrapper_b.name}_DEP_VERSION", module_version)
rc, *_ = wrapper_b.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
assert rc == 0
rc, *_ = wrapper_a.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
assert rc == 0
for dep_file in (cell_path / wrapper_a.name).rglob("*.dep"):
with open(dep_file, "r") as f:
contents = f.readlines()
assert len(contents) == 2
assert contents[0].strip() == "# Generated file. Do not edit."
assert f"{wrapper_b.name} {module_version}" == contents[1]
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
def test_architecture_dependent_dependency(wrappers):
wrapper_a = wrappers.get()
wrapper_b = wrappers.get()
wrapper_c = wrappers.get()
cell_path = wrapper_a.path / "cellMods"
module_version = "0.0.0+0"
wrapper_a.add_var_to_config_module(
f"{wrapper_b.name}_DEP_VERSION_linux", module_version
)
wrapper_a.add_var_to_config_module(
f"{wrapper_c.name}_DEP_VERSION_not_an_arch", module_version
)
rc, *_ = wrapper_c.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
assert rc == 0
rc, *_ = wrapper_b.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
assert rc == 0
rc, *_ = wrapper_a.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
assert rc == 0
rc, outs, _ = run_ioc_get_output(
wrapper_a.name, module_version, wrapper_a.path / "cellMods"
)
assert rc == 0
assert f"Loaded {wrapper_b.name} version {module_version}" in outs
assert f"Loaded {wrapper_c.name} version {module_version}" not in outs
def test_recursive_header_include(wrappers):
wrapper_a = wrappers.get()
wrapper_b = wrappers.get()
wrapper_c = wrappers.get()
cell_path = wrapper_a.path / "cellMods"
module_version = "0.0.0+0"
wrapper_b.add_var_to_config_module(f"{wrapper_c.name}_DEP_VERSION", module_version)
wrapper_a.add_var_to_config_module(f"{wrapper_b.name}_DEP_VERSION", module_version)
wrapper_c.add_var_to_makefile("HEADERS", f"{wrapper_c.name}.h")
(wrapper_c.module_dir / f"{wrapper_c.name}.h").touch()
wrapper_a.add_var_to_makefile("SOURCES", f"{wrapper_a.name}.c")
with open(wrapper_a.module_dir / f"{wrapper_a.name}.c", "w") as f:
f.write(f'#include "{wrapper_c.name}.h"')
rc, *_ = wrapper_c.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
assert rc == 0
rc, *_ = wrapper_b.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
rc, *_ = wrapper_a.run_make(
"cellinstall", module_version=module_version, cell_path=cell_path
)
rc, outs, _ = run_ioc_get_output(
wrapper_a.name, module_version, wrapper_a.path / "cellMods"
)
assert f"Loaded {wrapper_c.name} version {module_version}" in outs
def test_updated_template_files(wrapper):
wrapper.add_var_to_makefile("SUBS", "x.substitutions")
substitution_file = wrapper.module_dir / "x.substitutions"
substitution_file.write_text("file x.template {pattern {x} {y}}")
template_file = wrapper.module_dir / "x.template"
template_file.write_text("record(ai, a) {}")
base_version = wrapper.get_env_var("EPICS_VERSION_NUMBER")
db_file = wrapper.module_dir / f"O.{base_version}_Common" / "x.db"
rc, *_ = wrapper.run_make("db_internal")
assert rc == 0
assert db_file.read_text() == "record(ai, a) {}"
template_file.write_text("record(ai, b) {}")
rc, *_ = wrapper.run_make("db_internal")
assert rc == 0
assert db_file.read_text() == "record(ai, b) {}"