| ############################################################################ |
| # Copyright (C) SchedMD LLC. |
| ############################################################################ |
| import atf |
| import pytest |
| import os |
| import re |
| |
| |
| # 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" |