############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import atf
import pytest
import re
import pexpect

node_count = 4


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


def test_input_output_taskid():
    """Verify srun stdin/out routing with specific task number."""

    task_id = 4
    task_num = 10

    # Test --input={task_id} runs Task task_id until the other tasks close
    child = pexpect.spawn(
        f"srun --input={task_id} -O -v --wait=2 -N1 -n{task_num} bash"
    )
    assert (
        child.expect("task 4: Killed") == 0
    ), f"Task ({task_id}) was not killed when other tasks closed"
    child_out = str(child.before)
    match = re.search(r"jobid (\d+)", child_out)
    job_id = match.group(1)
    step_id = rf"StepId={job_id}.0"
    assert (
        re.search(step_id, child_out) is not None
    ), f"Step ({step_id}) not found in verbose output"
    assert re.search(
        rf"{step_id} task {task_id}: running", child_out
    ), f"Task ({task_id}) failed to run"
    assert re.search(
        rf"{step_id} tasks 0-{task_id - 1},{task_id + 1}-{task_num - 1}: exited",
        child_out,
    ), "Other tasks failed to exit"

    # Test --output={task_id} sends only {task_id}'s output to stdout
    stdout = atf.run_command_output(f"srun --output={task_id} -O -N1 -n{task_num} env")
    match = re.search(r"SLURM_PROCID=(\d+)", stdout)
    proc_id = match.group(1)
    assert (
        str(task_id) == proc_id
    ), f"Wrong task id ({proc_id}) responded, expected task id ({task_id})"
