mirror of
https://github.com/lexmount/moli.git
synced 2026-09-24 08:01:30 +00:00
172 lines
7.1 KiB
Python
172 lines
7.1 KiB
Python
from __future__ import annotations
|
|
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from moli_benchmark.cdp_session import (
|
|
_benchmark_marker_expression,
|
|
_benchmark_marker_wait_expression,
|
|
_cdp_trace_events,
|
|
_trace_summary,
|
|
_write_trace_artifact,
|
|
run_cdp_session_suite,
|
|
)
|
|
|
|
|
|
class CdpSessionTraceTests(unittest.TestCase):
|
|
def test_marker_expression_requires_current_url_case_and_ok_marker(self) -> None:
|
|
expression = _benchmark_marker_expression(url="http://fixture/static-html", case="static-html")
|
|
|
|
self.assertIn("document.readyState === 'complete'", expression)
|
|
self.assertIn('location.href === "http://fixture/static-html"', expression)
|
|
self.assertIn('node.getAttribute(\'data-benchmark-case\') === "static-html"', expression)
|
|
self.assertIn('document.querySelector(\'[data-benchmark-status="ok"]\') !== null', expression)
|
|
|
|
def test_marker_wait_expression_wraps_strict_marker_check(self) -> None:
|
|
expression = _benchmark_marker_wait_expression(url="http://fixture/dom-heavy", case="dom-heavy", timeout_seconds=1.25)
|
|
|
|
self.assertIn("new Promise", expression)
|
|
self.assertIn("Date.now() + 1250", expression)
|
|
self.assertIn('location.href === "http://fixture/dom-heavy"', expression)
|
|
self.assertIn('node.getAttribute(\'data-benchmark-case\') === "dom-heavy"', expression)
|
|
|
|
def test_cdp_trace_events_compact_console_exception_and_network_events(self) -> None:
|
|
events = _cdp_trace_events(
|
|
[
|
|
{
|
|
"method": "Runtime.consoleAPICalled",
|
|
"params": {"type": "error", "args": [{"value": "boom"}, {"description": "detail"}]},
|
|
},
|
|
{
|
|
"method": "Runtime.exceptionThrown",
|
|
"params": {"exceptionDetails": {"text": "Uncaught Error", "url": "http://fixture/", "lineNumber": 7}},
|
|
},
|
|
{
|
|
"method": "Network.responseReceived",
|
|
"params": {"requestId": "1", "type": "Document", "response": {"url": "http://fixture/", "status": 200}},
|
|
},
|
|
{
|
|
"method": "Network.loadingFailed",
|
|
"params": {"requestId": "2", "type": "Script", "errorText": "net::ERR_FAILED", "canceled": False},
|
|
},
|
|
{"method": "Log.entryAdded", "params": {"entry": {"level": "warning", "text": "slow"}}},
|
|
{"method": "Log.entryAdded", "params": {"entry": {"level": "error", "text": "broken"}}},
|
|
{"id": 99, "result": {}},
|
|
]
|
|
)
|
|
|
|
self.assertEqual(
|
|
[event["method"] for event in events],
|
|
[
|
|
"Runtime.consoleAPICalled",
|
|
"Runtime.exceptionThrown",
|
|
"Network.responseReceived",
|
|
"Network.loadingFailed",
|
|
"Log.entryAdded",
|
|
"Log.entryAdded",
|
|
],
|
|
)
|
|
self.assertEqual(events[0]["text"], "boom detail")
|
|
self.assertEqual(events[2]["status"], 200)
|
|
self.assertEqual(
|
|
_trace_summary(events),
|
|
{"console_errors": 2, "js_exceptions": 1, "network_failures": 1},
|
|
)
|
|
|
|
def test_write_trace_artifact_uses_suite_relative_path(self) -> None:
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
suite_dir = Path(temp_dir) / "cdp-session"
|
|
row = {"target": "moli", "run": 1, "case": "static-html", "ok": False}
|
|
relative = _write_trace_artifact(
|
|
suite_dir=suite_dir,
|
|
row=row,
|
|
events=[{"method": "Network.loadingFailed", "error_text": "failed"}],
|
|
)
|
|
|
|
self.assertEqual(relative, "traces/moli-run-1-static-html.json")
|
|
self.assertTrue((suite_dir / relative).exists())
|
|
|
|
def test_cdp_session_rejects_unmeasured_gate_target(self) -> None:
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
with self.assertRaisesRegex(RuntimeError, "must be included"):
|
|
run_cdp_session_suite(
|
|
output_dir=Path(temp_dir),
|
|
target_matrix={},
|
|
targets=("lightpanda",),
|
|
cases=("static-html",),
|
|
runs=1,
|
|
timeout_seconds=1.0,
|
|
gate_target="moli",
|
|
)
|
|
|
|
def test_summary_total_trace_events_counts_trace_artifacts_only(self) -> None:
|
|
class FakeServer:
|
|
def __enter__(self) -> "FakeServer":
|
|
return self
|
|
|
|
def __exit__(self, exc_type: object, exc: object, tb: object) -> None:
|
|
return None
|
|
|
|
async def fake_run_target_session(**_kwargs: object) -> tuple[list[dict[str, object]], dict[str, object]]:
|
|
return (
|
|
[
|
|
{
|
|
"target": "moli-cdp",
|
|
"engine": "moli",
|
|
"driver": "cdp",
|
|
"label": "moli / cdp",
|
|
"binary_key": "moli",
|
|
"case": "static-html",
|
|
"run": 1,
|
|
"ok": True,
|
|
"elapsed_ms": 1.0,
|
|
"messages": 12,
|
|
"trace_events": 12,
|
|
"console_errors": 0,
|
|
"js_exceptions": 0,
|
|
"network_failures": 0,
|
|
"error": None,
|
|
},
|
|
{
|
|
"target": "moli-cdp",
|
|
"engine": "moli",
|
|
"driver": "cdp",
|
|
"label": "moli / cdp",
|
|
"binary_key": "moli",
|
|
"case": "js-xhr-fetch",
|
|
"run": 1,
|
|
"ok": False,
|
|
"elapsed_ms": 2.0,
|
|
"messages": 30,
|
|
"trace_events": 30,
|
|
"console_errors": 0,
|
|
"js_exceptions": 0,
|
|
"network_failures": 1,
|
|
"trace_artifact": "traces/moli-cdp-run-1-js-xhr-fetch.json",
|
|
"error": "marker did not become true",
|
|
},
|
|
],
|
|
{},
|
|
)
|
|
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
with patch("moli_benchmark.cdp_session.SyntheticServer", FakeServer):
|
|
with patch("moli_benchmark.cdp_session._run_target_session", fake_run_target_session):
|
|
summary = run_cdp_session_suite(
|
|
output_dir=Path(temp_dir),
|
|
target_matrix={"moli": {"available": True, "path": "/bin/true"}},
|
|
targets=("moli-cdp",),
|
|
cases=("static-html", "js-xhr-fetch"),
|
|
runs=1,
|
|
timeout_seconds=1.0,
|
|
gate_target="moli-cdp",
|
|
)
|
|
|
|
self.assertEqual(summary["total_trace_events"], 1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|