feat(submissions): query bounded anonymous performance snapshots
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
"""Integer-domain tests and finite PG read integration, not measured executions."""
|
||||
|
||||
import asyncio
|
||||
from datetime import UTC, datetime
|
||||
|
||||
import pytest
|
||||
from test_coordinator import claim, fixture, manifest, stages, synthetic_report, worker_headers
|
||||
|
||||
from kf_oj.contracts.judging import I64_MAX
|
||||
from kf_oj.modules.submissions.performance import metric
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"current,values,greater,ties",
|
||||
[
|
||||
(0, [0, 0, 1, 2, 2], 3, 2),
|
||||
(
|
||||
9_007_199_254_740_993,
|
||||
[9_007_199_254_740_992, 9_007_199_254_740_993, 9_007_199_254_740_994, I64_MAX, 0],
|
||||
2,
|
||||
1,
|
||||
),
|
||||
(I64_MAX, [0, 1, 2, 3, 4], 0, 0),
|
||||
(0, [0, 0, 0, 0, 0], 0, 5),
|
||||
],
|
||||
)
|
||||
def test_exact_metrics_keep_zero_ties_and_extreme_values(current, values, greater, ties):
|
||||
now = datetime.now(UTC)
|
||||
result = metric("cpu_microseconds", current, [(v, now) for v in values])
|
||||
assert result.available and result.current == str(current)
|
||||
assert result.strictly_slower_count == greater and result.tied_count == ties
|
||||
assert sum(b.count for b in result.buckets) == len(values)
|
||||
assert len(result.buckets) <= 24
|
||||
for value in values:
|
||||
assert (
|
||||
sum(
|
||||
int(b.start) <= value < int(b.end) or (b.upper_inclusive and value == int(b.end))
|
||||
for b in result.buckets
|
||||
)
|
||||
== 1
|
||||
)
|
||||
|
||||
|
||||
def test_recent_window_missing_and_insufficient_are_distinct():
|
||||
now = datetime.now(UTC)
|
||||
limited = metric("bytes", 0, [(1, now)] * 10_001)
|
||||
assert limited.sample_count == 10_000 and limited.window_truncated
|
||||
assert limited.strictly_slower_count == 10_000
|
||||
assert metric("bytes", None).reason == "measurement_missing"
|
||||
assert metric("bytes", 0).reason == "insufficient_samples"
|
||||
assert metric("bytes", 0, [(0, now)] * 4).buckets == ()
|
||||
|
||||
|
||||
def test_actual_owned_read_snapshot_cache_invalidation_and_history(
|
||||
postgres_url, tmp_path, monkeypatch
|
||||
):
|
||||
async def run():
|
||||
async with fixture(
|
||||
postgres_url, tmp_path, monkeypatch, measurement_epochs=["a" * 64] * 2
|
||||
) as (client, connection, workers, _, create):
|
||||
app = client.fixture_app
|
||||
owner = client.fixture_account
|
||||
created_items = []
|
||||
for _ in range(6):
|
||||
created = await create()
|
||||
grant = await claim(client, created, workers[0])
|
||||
await stages(client, workers[0], grant)
|
||||
report = synthetic_report(grant, await manifest(connection, grant))
|
||||
result = await client.post(
|
||||
"/internal/report", json=report, headers=worker_headers(workers[0], grant)
|
||||
)
|
||||
assert result.status_code == 204, result.text
|
||||
created_items.append(created)
|
||||
target = created_items[0].submission_id
|
||||
first = await app.state.submission_performance.detail(owner, target)
|
||||
assert first.cpu.sample_count == 5 and first.cpu.tied_count == 5
|
||||
assert first.cpu.strictly_slower_count == 0 and first.memory.tied_count == 5
|
||||
cached = await app.state.submission_performance.detail(owner, target)
|
||||
assert cached == first
|
||||
pending = await create()
|
||||
assert (
|
||||
await app.state.submission_performance.detail(owner, pending.submission_id)
|
||||
).cpu.reason == "not_accepted"
|
||||
grant = await claim(client, pending, workers[0])
|
||||
await stages(client, workers[0], grant)
|
||||
report = synthetic_report(grant, await manifest(connection, grant))
|
||||
assert (
|
||||
await client.post(
|
||||
"/internal/report", json=report, headers=worker_headers(workers[0], grant)
|
||||
)
|
||||
).status_code == 204
|
||||
updated = await app.state.submission_performance.detail(owner, target)
|
||||
assert updated.cpu.sample_count == 6 and updated.cpu.tied_count == 6
|
||||
assert updated.as_of >= first.as_of
|
||||
page = await app.state.submission_queries.page(
|
||||
owner, None, 2, client.fixture_version, "c17"
|
||||
)
|
||||
assert len(page.items) == 2 and page.next_after
|
||||
older = await app.state.submission_queries.page(
|
||||
owner, page.next_after, 2, client.fixture_version, "c17"
|
||||
)
|
||||
assert len(older.items) == 2
|
||||
assert not {i.submission_id for i in page.items} & {
|
||||
i.submission_id for i in older.items
|
||||
}
|
||||
assert not (
|
||||
await app.state.submission_queries.page(
|
||||
owner, None, 2, client.fixture_version, "java21"
|
||||
)
|
||||
).items
|
||||
|
||||
asyncio.run(run())
|
||||
Reference in New Issue
Block a user