Source code for curate_ipsum.verification.backends.mock
"""
Mock verification backend for testing.
Mirrors the angr_adapter_baseline mock with additional call logging.
Three modes: "ce" (always finds counterexample), "no_ce" (always safe),
"error" (always errors).
"""
from __future__ import annotations
import logging
import time
from typing import Any
from curate_ipsum.verification.backend import VerificationBackend
from curate_ipsum.verification.types import (
Counterexample,
VerificationRequest,
VerificationResult,
VerificationStatus,
)
LOG = logging.getLogger("verification.backends.mock")
[docs]
class MockBackend(VerificationBackend):
"""
Mock verification backend for testing and CI.
Modes:
"ce" - Always returns a counterexample
"no_ce" - Always returns no_ce_within_budget
"error" - Always returns an error
"""
def __init__(self, mode: str = "no_ce", **kwargs: Any) -> None:
self.mode = mode
self.call_log: list[VerificationRequest] = []
[docs]
def supports(self) -> dict[str, Any]:
return {
"input": "mock",
"constraints": ["any"],
"find": ["any"],
"avoid": ["any"],
}
[docs]
async def verify(self, request: VerificationRequest) -> VerificationResult:
t0 = time.monotonic()
self.call_log.append(request)
if self.mode == "ce":
ce = Counterexample(
model={s.name: 0 for s in request.symbols},
trace=[{"addr": "0x0"}],
path_constraints=[],
notes={"mock": True},
)
return VerificationResult(
status=VerificationStatus.CE_FOUND,
counterexample=ce,
stats={"elapsed_s": time.monotonic() - t0, "mock": True},
)
if self.mode == "error":
return VerificationResult(
status=VerificationStatus.ERROR,
stats={"elapsed_s": time.monotonic() - t0, "mock": True},
logs="mock error",
)
return VerificationResult(
status=VerificationStatus.NO_CE_WITHIN_BUDGET,
stats={"elapsed_s": time.monotonic() - t0, "mock": True},
)