# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
"""Unit tests for ``system_fingerprint`` construction."""

from types import SimpleNamespace

import pytest

from vllm.entrypoints.serve.utils import fingerprint as fp


def _cfg(tp=1, pp=1, dp=1, ep=False, digest="a3b21f94deadbeef"):
    c = SimpleNamespace(
        parallel_config=SimpleNamespace(
            tensor_parallel_size=tp,
            pipeline_parallel_size=pp,
            data_parallel_size=dp,
            enable_expert_parallel=ep,
        )
    )
    c.compute_hash = lambda: digest  # type: ignore[attr-defined]
    return c


@pytest.fixture(autouse=True)
def _reset():
    fp.set_default_fingerprint_mode("full")
    yield
    fp.set_default_fingerprint_mode("full")


def test_four_modes_produce_expected_shapes():
    from vllm import __version__ as v

    cfg = _cfg(tp=8, ep=True)

    assert fp.build_system_fingerprint(cfg, "full") == (f"vllm-{v}-tp8-ep-a3b21f94")
    assert fp.build_system_fingerprint(cfg, "hash") == f"vllm-{v}-a3b21f94"
    assert fp.build_system_fingerprint(cfg, "custom", "my-fp") == "my-fp"
    assert fp.build_system_fingerprint(cfg, "none") is None


def test_full_mode_emits_only_non_trivial_parallelism():
    from vllm import __version__ as v

    # Single-GPU: nothing between version and hash.
    assert fp.build_system_fingerprint(_cfg(), "full") == f"vllm-{v}-a3b21f94"
    # All parallelism axes.
    assert (
        fp.build_system_fingerprint(_cfg(tp=8, pp=2, dp=4, ep=True), "full")
        == f"vllm-{v}-tp8-pp2-dp4-ep-a3b21f94"
    )


def test_get_respects_set_default():
    cfg = _cfg(tp=8)
    full = fp.get_system_fingerprint(cfg)
    assert full == fp.get_system_fingerprint(cfg)

    fp.set_default_fingerprint_mode("hash")
    hashed = fp.get_system_fingerprint(cfg)
    assert hashed != full
    assert "tp8" not in hashed

    fp.set_default_fingerprint_mode("custom", "deploy-42")
    assert fp.get_system_fingerprint(cfg) == "deploy-42"

    fp.set_default_fingerprint_mode("none")
    assert fp.get_system_fingerprint(cfg) is None


def test_compute_hash_failure_does_not_raise():
    cfg = _cfg()
    cfg.compute_hash = lambda: (_ for _ in ()).throw(RuntimeError("boom"))
    assert fp.build_system_fingerprint(cfg, "full").endswith("-nohash")
    assert fp.build_system_fingerprint(cfg, "hash").endswith("-nohash")
