############################################################################
# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
############################################################################
import os
import re

import pytest

import atf


@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_slurm_running()
    if atf.get_config_parameter("SlurmdUser") != "root(0)":
        pytest.skip("This test is incompatible with SlurmdUser != root")


@pytest.fixture(scope="module")
def sbcast_binary():
    """Use the sbcast binary itself as the file to broadcast"""

    return atf.run_command_output("which sbcast", fatal=True).strip()


def _run_sbcast_compress_test(sbcast_binary, compress_type, tmp_path):
    """broadcast sbcast binary with given compress type, verify integrity"""

    dest = f"/tmp/test_sbcast_compress_{compress_type}_{os.getpid()}"
    script = str(tmp_path / f"script_{compress_type}.sh")
    output = str(tmp_path / f"output_{compress_type}.txt")

    atf.make_bash_script(
        script,
        f"""
        srun rm -f {dest}
        sbcast --compress={compress_type} {sbcast_binary} {dest}
        srun diff {sbcast_binary} {dest}
        srun rm -f {dest}
    """,
    )

    job_id = atf.submit_job_sbatch(f"-N1 -t2 --output={output} {script}", fatal=True)
    atf.wait_for_job_state(job_id, "DONE", fatal=True)
    atf.wait_for_file(output, fatal=True)
    return atf.run_command_output(f"cat {output}")


def test_compress_none(sbcast_binary, tmp_path):
    """Verify sbcast --compress=none"""

    output = _run_sbcast_compress_test(sbcast_binary, "none", tmp_path)
    assert not re.search(r"differ", output)
    assert not re.search(r"[Ee]rror", output)


def test_compress_lz4(sbcast_binary, tmp_path):
    """Verify sbcast --compress=lz4"""

    output = _run_sbcast_compress_test(sbcast_binary, "lz4", tmp_path)
    assert not re.search(r"differ", output)
    assert not re.search(r"[Ee]rror", output)
