############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import os
import re

import pytest

import atf


# Setup
@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_slurm_running()


def test_task_prolog_and_epilog():
    """Test of srun task-prolog and task-epilog option."""

    task_prolog = atf.module_tmp_path / "task_prolog"
    file_in = atf.module_tmp_path / "file_in"
    task_epilog = atf.module_tmp_path / "task_epilog"
    file_out_pre = atf.module_tmp_path / "file_out_pre"
    file_out_post = atf.module_tmp_path / "file_out_post"
    os.chmod(atf.module_tmp_path, 0o777)

    num_tasks = 4
    node_count = 1
    test_uid = atf.properties["test-user-uid"]

    atf.make_bash_script(
        task_prolog,
        f"""id >> {file_out_pre}
echo print HEADER
echo export TEST=prolog_qa
echo unset DISPLAY""",
    )

    atf.make_bash_script(
        task_epilog,
        f"""id >> {file_out_post}
sleep 200""",
    )

    atf.make_bash_script(
        file_in,
        r"""echo TEST==$TEST
echo DISPLAY==${DISPLAY}X""",
    )

    output = atf.run_job_output(
        f"-N{node_count} -n{num_tasks} -O --task-prolog={task_prolog} --task-epilog={task_epilog} {file_in}"
    )
    match_header = re.findall(r"HEADER", output)
    match_test = re.findall(r"TEST==prolog_qa", output)
    match_display = re.findall(r"DISPLAY==X", output)
    assert (
        len(match_header) == num_tasks
    ), "Prolog exported env var failure HEADER count != number of tasks"
    assert (
        len(match_test) == num_tasks
    ), "Prolog exported env var failure TEST count != number of tasks"
    assert (
        len(match_display) == num_tasks
    ), "Prolog exported env var failure DISPLAY count != number of tasks"

    atf.wait_for_file(file_out_pre)
    output = atf.run_command_output(f"cat {file_out_pre}")
    match_uid = re.findall(rf"uid={test_uid}", output)
    assert len(match_uid) == num_tasks, "Task prolog output is missing or uid mismatch"

    atf.wait_for_file(file_out_post)
    output = atf.run_command_output(f"cat {file_out_post}")
    match_uid = re.findall(rf"uid={test_uid}", output)
    assert len(match_uid) == num_tasks, "Task epilog output is missing or uid mismatch"
