142 lines
4.9 KiB
Python
142 lines
4.9 KiB
Python
import importlib.util
|
|
from pathlib import Path
|
|
|
|
SCRIPT = Path(__file__).parents[1] / "scripts" / "run_firebird_discovery.py"
|
|
|
|
|
|
def load_script():
|
|
spec = importlib.util.spec_from_file_location("run_firebird_discovery_dependency", SCRIPT)
|
|
module = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def valid_fdb():
|
|
return type(
|
|
"Fdb",
|
|
(),
|
|
{
|
|
"__version__": "2.0.4",
|
|
"ISOLATION_LEVEL_READ_COMMITED_RO": b"\x03\x08\x06\x0f\x11",
|
|
},
|
|
)()
|
|
|
|
|
|
def patch_valid_environment(monkeypatch, module, tmp_path):
|
|
client = tmp_path / "fbclient.dll"
|
|
client.write_bytes(b"client")
|
|
monkeypatch.setattr(module, "CLIENT_LIBRARY", client)
|
|
monkeypatch.setattr(module, "validate_fdb_provenance", lambda: {
|
|
"status": "VALID",
|
|
"distribution_name": "fdb",
|
|
"distribution_version": "2.0.4",
|
|
})
|
|
monkeypatch.setattr(module.importlib.metadata, "version", lambda name: "2.0.4")
|
|
monkeypatch.setattr(module, "_client_metadata", lambda path: {
|
|
"path": str(path),
|
|
"exists": True,
|
|
"version": "2.5.9.27139",
|
|
"architecture": "x64",
|
|
})
|
|
return client
|
|
|
|
|
|
def test_validate_firebird_runtime_returns_complete_compatibility_evidence(monkeypatch, tmp_path):
|
|
module = load_script()
|
|
patch_valid_environment(monkeypatch, module, tmp_path)
|
|
|
|
evidence = module.validate_firebird_runtime(fdb_module=valid_fdb())
|
|
|
|
assert evidence["status"] == "VALID"
|
|
assert evidence["python_runtime"]["architecture"] == "x64"
|
|
assert evidence["fdb"]["version"] == "2.0.4"
|
|
assert evidence["client"]["version"] == "2.5.9.27139"
|
|
assert evidence["client"]["architecture"] == "x64"
|
|
assert evidence["compatibility"] == {
|
|
"status": "VALID",
|
|
"python_client_architecture_match": True,
|
|
"fdb_client_version_match": True,
|
|
"read_only_api": True,
|
|
}
|
|
|
|
|
|
def test_validate_firebird_runtime_without_module_is_unknown(monkeypatch, tmp_path):
|
|
module = load_script()
|
|
patch_valid_environment(monkeypatch, module, tmp_path)
|
|
|
|
evidence = module.validate_firebird_runtime()
|
|
|
|
assert evidence["status"] == "UNKNOWN"
|
|
assert evidence["compatibility"]["read_only_api"] is False
|
|
assert evidence["blocker"] == "compatibility_unproven"
|
|
|
|
|
|
def test_preimport_gate_requires_client_architecture(monkeypatch, tmp_path):
|
|
module = load_script()
|
|
client = tmp_path / "fbclient.dll"
|
|
client.write_bytes(b"client")
|
|
monkeypatch.setattr(module, "CLIENT_LIBRARY", client)
|
|
monkeypatch.setattr(module, "validate_fdb_provenance", lambda: {"status": "VALID"})
|
|
monkeypatch.setattr(module, "_client_metadata", lambda path: {
|
|
"path": str(path), "exists": True, "version": "2.5.9.27139"
|
|
})
|
|
monkeypatch.setattr(module, "_read_client_architecture", lambda path: "UNKNOWN")
|
|
monkeypatch.setattr(module.importlib.metadata, "version", lambda name: "2.0.4")
|
|
|
|
try:
|
|
module._validate_preimport_compatibility()
|
|
except RuntimeError as error:
|
|
assert "compatibility" in str(error)
|
|
else:
|
|
raise AssertionError("unknown client architecture must block before import")
|
|
|
|
|
|
def test_preimport_gate_requires_exact_read_only_api(monkeypatch, tmp_path):
|
|
module = load_script()
|
|
patch_valid_environment(monkeypatch, module, tmp_path)
|
|
monkeypatch.setattr(module, "_preimport_read_only_api_proven", lambda: False)
|
|
|
|
try:
|
|
module._validate_preimport_compatibility()
|
|
except RuntimeError as error:
|
|
assert "compatibility" in str(error)
|
|
else:
|
|
raise AssertionError("unproven read-only API must block before import")
|
|
|
|
|
|
def test_unknown_client_architecture_blocks(monkeypatch, tmp_path):
|
|
module = load_script()
|
|
patch_valid_environment(monkeypatch, module, tmp_path)
|
|
monkeypatch.setattr(module, "_client_metadata", lambda path: {
|
|
"path": str(path), "exists": True, "version": "2.5.9.27139", "architecture": "UNKNOWN"
|
|
})
|
|
|
|
evidence = module.validate_firebird_runtime(fdb_module=valid_fdb())
|
|
|
|
assert evidence["status"] == "UNKNOWN"
|
|
assert evidence["blocker"] == "compatibility_unproven"
|
|
|
|
|
|
def test_unknown_client_version_blocks(monkeypatch, tmp_path):
|
|
module = load_script()
|
|
patch_valid_environment(monkeypatch, module, tmp_path)
|
|
monkeypatch.setattr(module, "_client_metadata", lambda path: {
|
|
"path": str(path), "exists": True, "version": None, "architecture": "x64"
|
|
})
|
|
|
|
evidence = module.validate_firebird_runtime(fdb_module=valid_fdb())
|
|
|
|
assert evidence["status"] == "UNKNOWN"
|
|
assert evidence["blocker"] == "compatibility_unproven"
|
|
|
|
|
|
def test_unsupported_read_only_api_is_unknown(monkeypatch, tmp_path):
|
|
module = load_script()
|
|
patch_valid_environment(monkeypatch, module, tmp_path)
|
|
fdb = type("Fdb", (), {"__version__": "2.0.4"})()
|
|
|
|
evidence = module.validate_firebird_runtime(fdb_module=fdb)
|
|
|
|
assert evidence["status"] == "UNKNOWN"
|
|
assert evidence["blocker"] == "compatibility_unproven"
|