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

import pytest

import atf


@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_nodes(1, [("CPUs", 1)])
    atf.require_config_parameter("EnforcePartLimits", "ALL")
    atf.require_slurm_running()


@pytest.mark.xfail(
    atf.get_version() < (24, 11, 1)
    and "use_interactive_step"
    in atf.get_config_parameter("LaunchParameters", "", live=False),
    reason="The 'ioctl(TIOCGWINSZ): Inappropriate ioctl for device' error when using LaunchParameters=use_interactive_step was fixed in 24.11.1",
)
def test_salloc_normal():
    """Test salloc allocations without commands. We test the stderr and
    stdout because the exit_codes seem to be 0 even when it has error messages.
    The normal allocations should have no error output with the -Q flag."""

    # Test that normal salloc works correctly
    result = atf.run_command("salloc -Q true")
    assert result["exit_code"] == 0, "Exit code was not 0!"
    assert (
        result["stderr"] == ""
    ), f"There should be no error messages from the salloc command. Got: {result['stderr']}"
    assert (
        result["stdout"] == ""
    ), f"There should be no stdout from the salloc command. Got: {result['stdout']}"

    atf.cancel_all_jobs()

    # Test that salloc -n1 works correctly
    result = atf.run_command("salloc -Q -n1 true")
    assert result["exit_code"] == 0, "Exit code was not 0!"
    assert (
        result["stderr"] == ""
    ), f"There should be no error messages from the salloc command. Got: {result['stderr']}"
    assert (
        result["stdout"] == ""
    ), f"There should be no stdout from the salloc command. Got: {result['stdout']}"

    atf.cancel_all_jobs()

    if atf.get_version() >= (25, 5):
        # Test that salloc -n2 is rejected with only one node
        result = atf.run_command("salloc -Q -n2 true", timeout=3)
        assert result["exit_code"] != 0, "Verify salloc failed"
        assert re.search(
            "More processors requested than permitted", result["stderr"]
        ), f"Error message should contain 'More processors requested than permitted'. Got: {result['stderr']}"
        assert (
            result["stdout"] == ""
        ), f"There should be no stdout from the salloc command. Got: {result['stdout']}"
