mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-22 17:41:13 +00:00
[AZ-266] [AZ-269] [AZ-277] [AZ-280] Cross-cutting log/config + SE3/SHA256 helpers
AZ-266: schema-compliant JSON logging entrypoint, level normalisation, handler-topology guard, format-error fallback (log_record_schema v1.0.0). AZ-269: env > YAML > defaults config loader, frozen Config dataclass, missing-var fail-fast with pointer to .env.example, component-block registry. AZ-277: GTSAM-backed SE3Utils (matrix<->SE3 + exp/log/adjoint) with strict orthogonality, dtype, and bottom-row contract enforcement. AZ-280: atomicwrites-backed write_atomic + independent verify + order-deterministic aggregate_hash; sidecar format strictness. pyproject.toml pins gtsam>=4.2,<5.0 and atomicwrites>=1.4,<2.0 (named-backend deps per the AZ-277 / AZ-280 contracts). 139 unit tests pass (44 new). Review verdict: PASS_WITH_WARNINGS; findings are perf-NFR + journald deferrals, no blocking issues. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
"""Structured logging smoke — AZ-263 AC-7."""
|
||||
"""Structured logging smoke — AZ-263 AC-7 (schema-compliant per AZ-266)."""
|
||||
|
||||
import io
|
||||
import json
|
||||
import logging
|
||||
|
||||
from gps_denied_onboard.logging import get_logger
|
||||
from gps_denied_onboard.logging.structured import JsonFormatter
|
||||
|
||||
|
||||
def test_get_logger_returns_logger_instance() -> None:
|
||||
@@ -16,25 +18,24 @@ def test_get_logger_returns_logger_instance() -> None:
|
||||
|
||||
def test_log_lines_are_single_json_objects() -> None:
|
||||
# Arrange
|
||||
import io
|
||||
|
||||
from gps_denied_onboard.logging.structured import _JsonFormatter
|
||||
|
||||
stream = io.StringIO()
|
||||
handler = logging.StreamHandler(stream)
|
||||
handler.setFormatter(_JsonFormatter())
|
||||
handler.setFormatter(JsonFormatter())
|
||||
logger = logging.getLogger("test.json.unit")
|
||||
logger.handlers = [handler]
|
||||
logger.setLevel(logging.DEBUG)
|
||||
logger.propagate = False
|
||||
|
||||
# Act
|
||||
logger.error("hello world", extra={"event": "smoke", "value": 42})
|
||||
logger.error(
|
||||
"hello world",
|
||||
extra={"kind": "test.smoke", "kv": {"event": "smoke", "value": 42}},
|
||||
)
|
||||
|
||||
# Assert
|
||||
line = stream.getvalue().strip().splitlines()[-1]
|
||||
payload = json.loads(line)
|
||||
assert payload["level"] == "ERROR"
|
||||
assert payload["msg"] == "hello world"
|
||||
assert payload["event"] == "smoke"
|
||||
assert payload["value"] == 42
|
||||
assert payload["kind"] == "test.smoke"
|
||||
assert payload["kv"] == {"event": "smoke", "value": 42}
|
||||
|
||||
Reference in New Issue
Block a user