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


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


def test_quit_on_interrupt():
    """Test srun handling of SIGINT to get task status or kill the job (--quit-on-interrupt option)."""

    file_in = atf.module_tmp_path / "file_in"
    atf.make_bash_script(
        file_in,
        """trap \"\" INT
echo WAITING
sleep 1000""",
    )

    child = pexpect.spawn(f"srun -v -N1 --unbuffered {file_in}")
    child.expect(r"launching StepId=(\d+)")
    step_id = re.search(r"\d+", str(child.after)).group(0)
    child.expect("WAITING")
    time.sleep(1)
    atf.run_command(f"kill -INT {child.pid}")
    assert (
        child.expect(["srun: interrupt", pexpect.EOF, pexpect.TIMEOUT]) == 0
    ), f"srun failed to process command (kill -INT {child.pid})"
    atf.run_command(f"scancel {step_id}")
    assert (
        child.expect(["Job step aborted", pexpect.EOF, pexpect.TIMEOUT]) == 0
    ), f"srun failed to process command (scancel {step_id})"
    child.close()

    child = pexpect.spawn(f"srun -v -N1 --unbuffered --quit-on-interrupt {file_in}")
    child.expect(r"launching StepId=(\d+)")
    step_id = re.search(r"\d+", str(child.after)).group(0)
    child.expect("WAITING")
    time.sleep(1)
    atf.run_command(f"kill -INT {child.pid}")
    assert (
        child.expect(["task 0: Killed", pexpect.EOF, pexpect.TIMEOUT]) == 0
    ), "Did not get message (task 0: Killed) from srun"
