############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import pytest

import atf

script_name = "./script.sh"
script_out = "./script.out"


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


def make_and_run_bash(command) -> None:
    """Make and run the bash script to run a command 1000 times.
    Input is a list of lines to be run as bash script."""
    atf.make_bash_script(
        script_name,
        f"""
        for i in $(seq 1 1000)
            do {command} &
        done > {script_out}
        wait
        """,
    )
    atf.run_command(script_name)


@pytest.mark.parametrize(
    "command, phrase",
    [
        ("sinfo --Format=NODELIST", "^NODELIST"),
        ("scontrol show node | head -1", "^NodeName="),
        ("squeue --only-job-state --Format=NODELIST", "^NODELIST"),
    ],
)
def test_parallel(command, phrase):
    """Test that sinfo and scontrol can be run in parallel. We submit
    1000 user commands to slurm to make sure that it doesn't crash. We then
    check the output that the correct number of commands were run."""

    make_and_run_bash(command)

    output = atf.run_command_output(f"cat {script_out} | grep -c '{phrase}'")
    assert (
        int(output) == 1000
    ), f"We expected 1000 commands to be run in parallel, but got {output}"


def test_squeue_parallel():
    """Test for when lots of squeue calls are made, all the commands still run
    correctly. To test this we submit 100 jobs, then we run 1000 squeue
    commands and make sure that all 1000 worked and produced output."""

    # Submit 100 jobs to fill up the queue
    for i in range(100):
        atf.submit_job_sbatch("--wrap='sleep 100'")

    make_and_run_bash("squeue")

    output = atf.run_command_output(f"cat {script_out} | grep -c 'JOBID'")
    assert (
        int(output) == 1000
    ), f"We expected 1000 user commands to run, but got {int(output)}"


def test_show_jobs_parallel():
    """Test that scontrol show job works in parallel. We submit one job and
    then run 1000 'scontrol show job {job_id} &' commands to make sure that all
    of them provide the correct output"""

    job_id = atf.submit_job_srun("true")

    make_and_run_bash(f"scontrol show job {job_id}")

    output = atf.run_command_output(f'cat {script_out} | grep -c "JobId="')
    assert (
        int(output) == 1000
    ), f"We expected 1000 commands to be run in parallel, but got {output}"
