# -*- coding: utf-8 -*- """Tests de `monitor_estado.lock` — instancia unica (RF-22).""" import json import monitor_estado.lock as lock def test_lock_impide_segunda_instancia(tmp_path, monkeypatch): """Una segunda adquisicion con la primera viva debe fallar (RF-22).""" monkeypatch.setattr(lock, "LOCK_PATH", tmp_path / ".lock") assert lock.adquirir() is True # Misma PID viva -> la segunda instancia no arranca. assert lock.adquirir() is False lock.liberar() assert not (tmp_path / ".lock").exists() assert lock.adquirir() is True lock.liberar() def test_lock_recupera_lock_caducado(tmp_path, monkeypatch): """Un lock de un PID muerto no debe bloquear (se recupera).""" ruta = tmp_path / ".lock" monkeypatch.setattr(lock, "LOCK_PATH", ruta) ruta.write_text(json.dumps({"pid": 999999, "arranque": "2026-01-01T00:00:00"}), encoding="utf-8") assert lock.adquirir() is True lock.liberar() def test_lock_liberar_no_borra_lock_ajeno(tmp_path, monkeypatch): """`liberar` solo elimina el lock si es de nuestro propio PID.""" ruta = tmp_path / ".lock" monkeypatch.setattr(lock, "LOCK_PATH", ruta) ruta.write_text(json.dumps({"pid": 999999, "arranque": "x"}), encoding="utf-8") lock.liberar() assert ruta.exists() # no era nuestro -> se respeta