| ############################################################################ | |
| # Copyright (C) SchedMD LLC. | |
| ############################################################################ | |
| import os | |
| import re | |
| import pytest | |
| import atf | |
| # Setup | |
| @pytest.fixture(scope="module", autouse=True) | |
| def setup(): | |
| atf.require_nodes(4) | |
| atf.require_slurm_running() | |
| def test_multi_prog(): | |
| """Test of MPMD (--multi-prog option).""" | |
| file_in = atf.module_tmp_path / "file_in" | |
| # Submit a slurm job that will execute different programs and arguments by task number | |
| content = r"""1-2 echo task:%t:offset:%o | |
| 0,3 echo task:%t:offset:%o""" | |
| with open(file_in, "w") as f: | |
| f.write(content) | |
| os.chmod(file_in, 0o777) | |
| output = atf.run_job_output(f"-n4 -O -l --multi-prog {file_in}") | |
| assert ( | |
| re.search(r"0: task:0:offset:0", output) is not None | |
| ), "Label 0 did not have correct task or offset" | |
| assert ( | |
| re.search(r"1: task:1:offset:0", output) is not None | |
| ), "Label 1 did not have correct task or offset" | |
| assert ( | |
| re.search(r"2: task:2:offset:1", output) is not None | |
| ), "Label 2 did not have correct task or offset" | |
| assert ( | |
| re.search(r"3: task:3:offset:1", output) is not None | |
| ), "Label 3 did not have correct task or offset" | |
| # Submit a slurm job that will execute different executables and check debug info | |
| content = r"""1-2 hostname | |
| 0,3 date""" | |
| with open(file_in, "w") as f: | |
| f.write(content) | |
| error = str( | |
| atf.run_job_error( | |
| f"--debugger-test -v -n4 -O -l --multi-prog {file_in}", | |
| timeout=10, | |
| xfail=True, | |
| ) | |
| ) | |
| match = re.findall(r"executable:\w+", error) | |
| assert len(match) == 4, "Did not generate full list of executables" | |
| error_output = atf.run_job_error( | |
| f"--debugger-test -v -n5 -O -l --multi-prog {file_in}", xfail=True | |
| ) | |
| assert re.search( | |
| rf"Configuration file {file_in} invalid", error_output | |
| ), "Did not note lack of a executable for task 5" | |
| content = r"""1-2 hostname | |
| 0,3 echo aaaa \ | |
| task:%t:offset:%o bbbb""" | |
| with open(file_in, "w") as f: | |
| f.write(content) | |
| output = atf.run_job_output(f"-n4 --overcommit -l -t1 --multi-prog {file_in}") | |
| assert re.search( | |
| r"0: aaaa task:0:offset:0 bbbb", output | |
| ), "MPMD line continuation first assert" | |
| assert re.search( | |
| r"3: aaaa task:3:offset:1 bbbb", output | |
| ), "MPMD line continuation second assert" |