Viewing files at commit 4310ddbe60b6Commit detailsView latest

Browse files
tests/test_baseline_book.py 168 lines · 5.7 KB · python
1
from __future__ import annotations
2
3
import json
4
import subprocess
5
import sys
6
import tempfile
7
import unittest
8
from pathlib import Path
9
10
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts"))
11
12
from oakbench.baseline_book import cells_from_rows
13
14
15
def row(subject: str, kind: str, elapsed: float | None, returncode: int = 0, **extra) -> dict:
16
    base = {
17
        "bench_id": "b",
18
        "profile": "smoke",
19
        "scenario": "tiny_text",
20
        "operation": "status.clean",
21
        "run": extra.pop("run", 0),
22
        "subject": subject,
23
        "subject_kind": kind,
24
        "returncode": returncode,
25
        "command": [subject, "status"],
26
    }
27
    if elapsed is not None:
28
        base["elapsed_ms"] = elapsed
29
    base.update(extra)
30
    return base
31
32
33
class BaselineBookTest(unittest.TestCase):
34
    def test_cells_from_rows_uses_successful_git_rows_only(self) -> None:
35
        cells = cells_from_rows(
36
            [
37
                row("git", "git", 10.0),
38
                row("git", "git", 12.0),
39
                row("git", "git", 99.0, returncode=1),
40
                row("oak_local", "oak", 1.0),
41
            ],
42
            lane="core",
43
            metrics=("elapsed_ms",),
44
            statistics_names=("median",),
45
            bootstrap_samples=20,
46
        )
47
        self.assertEqual(len(cells), 1)
48
        self.assertEqual(cells[0].subject, "git")
49
        self.assertEqual(cells[0].value, 11.0)
50
        self.assertEqual(cells[0].n, 2)
51
52
    def test_cells_from_rows_ignores_unmeasured_metrics(self) -> None:
53
        cells = cells_from_rows(
54
            [row("git", "git", None)],
55
            lane="core",
56
            metrics=("elapsed_ms",),
57
            statistics_names=("median",),
58
            bootstrap_samples=20,
59
        )
60
        self.assertEqual(cells, [])
61
62
    def test_cells_from_rows_stamps_noise_floor_pct(self) -> None:
63
        cells = cells_from_rows(
64
            [row("git", "git", 10.0), row("git", "git", 12.0)],
65
            lane="core",
66
            metrics=("elapsed_ms",),
67
            statistics_names=("median",),
68
            bootstrap_samples=20,
69
            noise_floor_pct=4.2,
70
        )
71
        self.assertEqual(cells[0].noise_floor_pct, 4.2)
72
73
    def test_cells_from_rows_excludes_null_returncode_rows_without_crashing(self) -> None:
74
        broken = row("git", "git", 10.0)
75
        broken["returncode"] = None
76
        cells = cells_from_rows(
77
            [broken],
78
            lane="core",
79
            metrics=("elapsed_ms",),
80
            statistics_names=("median",),
81
            bootstrap_samples=20,
82
        )
83
        self.assertEqual(cells, [])
84
85
    def test_cli_writes_book_files_and_refuses_overwrite(self) -> None:
86
        with tempfile.TemporaryDirectory() as tmp:
87
            root = Path(tmp)
88
            rows = root / "rows.jsonl"
89
            rows.write_text(json.dumps(row("git", "git", 10.0)) + "\n")
90
            out = root / "book"
91
            proc = subprocess.run(
92
                [
93
                    sys.executable,
94
                    "scripts/baseline_book.py",
95
                    "--book-id",
96
                    "test-book",
97
                    "--out",
98
                    str(out),
99
                    "--bootstrap-samples",
100
                    "20",
101
                    "--noise-floor-pct",
102
                    "4.2",
103
                    str(rows),
104
                ],
105
                cwd=Path(__file__).resolve().parents[1],
106
                text=True,
107
                stdout=subprocess.PIPE,
108
                stderr=subprocess.PIPE,
109
                check=False,
110
            )
111
            self.assertEqual(proc.returncode, 0, proc.stderr)
112
            self.assertTrue((out / "manifest.json").exists())
113
            manifest = json.loads((out / "manifest.json").read_text())
114
            self.assertIsNotNone(manifest["runner_id"], "books must carry runner identity (ADR-0007)")
115
            self.assertIsNotNone(manifest["runner_class"])
116
            book = json.loads((out / "book.json").read_text())
117
            self.assertEqual(book["schema_version"], 1)
118
            self.assertEqual(book["cells"][0]["subject"], "git")
119
            self.assertEqual(book["cells"][0]["noise_floor_pct"], 4.2)
120
121
            proc = subprocess.run(
122
                [
123
                    sys.executable,
124
                    "scripts/baseline_book.py",
125
                    "--book-id",
126
                    "test-book",
127
                    "--out",
128
                    str(out),
129
                    str(rows),
130
                ],
131
                cwd=Path(__file__).resolve().parents[1],
132
                text=True,
133
                stdout=subprocess.PIPE,
134
                stderr=subprocess.PIPE,
135
                check=False,
136
            )
137
            self.assertEqual(proc.returncode, 2)
138
            self.assertIn("refusing to overwrite", proc.stderr)
139
140
    def test_cli_rejects_negative_noise_floor_pct(self) -> None:
141
        with tempfile.TemporaryDirectory() as tmp:
142
            root = Path(tmp)
143
            rows = root / "rows.jsonl"
144
            rows.write_text(json.dumps(row("git", "git", 10.0)) + "\n")
145
            proc = subprocess.run(
146
                [
147
                    sys.executable,
148
                    "scripts/baseline_book.py",
149
                    "--book-id",
150
                    "test-book",
151
                    "--out",
152
                    str(root / "book"),
153
                    "--noise-floor-pct",
154
                    "-1",
155
                    str(rows),
156
                ],
157
                cwd=Path(__file__).resolve().parents[1],
158
                text=True,
159
                stdout=subprocess.PIPE,
160
                stderr=subprocess.PIPE,
161
                check=False,
162
            )
163
            self.assertEqual(proc.returncode, 2)
164
            self.assertIn("must be >= 0", proc.stderr)
165
166
167
if __name__ == "__main__":
168
    unittest.main()