feat(scheduler-core): implement REPL breakpoints and state inspection (task 12.2)
Adds the interactive simulation REPL's breakpoint and state-inspection commands (Req 5 AC 22): `break <event_type> [key=value ...]` / `info break` / `delete <id>|all` on event and decision types, and `info session/job/queue/worker/resource/summary`. repl.c (370 lines after task 12.1) couldn't hold this task's full surface under the project's 800-line cap, so it's split three ways (matching the snapshot.c/snapshot_wire.c/snapshot_load.c precedent): repl.c (execution control + dispatch), repl_break.c (matching/CRUD + the three new driver-facing hooks), repl_info.c (info dumps), sharing state via repl_internal.h. sim_loop.c gained 3 new bare hook calls (repl.h inline wrappers, same pattern as task 12.1's two) at the points design.md's pseudocode requires -- per decoded event before it joins the batch, per session boundary, and per drained decision -- landing sim_loop.c at exactly 800/800 lines. Two real bugs found and fixed during development (bug-1506, bug-1507): an uninitialized xstr_table left breakpoint filter fields silently NULL instead of failing loud, and repl_breakpoint_free() called a bare free() on an RTTI-refcounted makeString() string, corrupting the heap. Review found one gap: `info job` printed only a resreq presence flag instead of the actual resreq text, when format_resreq() already existed in this repo for exactly this purpose. Fixed to match. Scheduler suite: 35/35 clean (was 34/34). RED-phase evidence (2 real bugs plus 2 synthetic probes, all reverted with confirmed zero residue) recorded in tasks.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JPPXeKSUXUqcqvzNXY1rzJ
This commit is contained in:
parent
02f7f48ff9
commit
2fecea3592
18 changed files with 3067 additions and 212 deletions
|
|
@ -551,6 +551,15 @@ sched_sim_isolation_test = executable(
|
|||
'-DXCE_SIM_REPL_H_PATH="'
|
||||
+ (meson.current_source_dir() / '..' / 'include' / 'repl.h')
|
||||
+ '"',
|
||||
'-DXCE_SIM_REPL_BREAK_C_PATH="'
|
||||
+ (meson.current_source_dir() / '..' / 'src' / 'repl_break.c')
|
||||
+ '"',
|
||||
'-DXCE_SIM_REPL_INFO_C_PATH="'
|
||||
+ (meson.current_source_dir() / '..' / 'src' / 'repl_info.c')
|
||||
+ '"',
|
||||
'-DXCE_SIM_REPL_INTERNAL_H_PATH="'
|
||||
+ (meson.current_source_dir() / '..' / 'src' / 'repl_internal.h')
|
||||
+ '"',
|
||||
'-DXCE_SIM_LIB_PATH="'
|
||||
+ sched_sim_isolation_lib.full_path()
|
||||
+ '"'],
|
||||
|
|
@ -660,7 +669,13 @@ sched_sim_equivalence_test = executable(
|
|||
# (core.c, core_clock.c, core_events.c, core_session.c, decision.c, plugin.c,
|
||||
# plugins/builtin_fcfs.c, recording.c, recording_session.c, sim.c, sim_loop.c,
|
||||
# sim_record.c, sim_verify.c, snapshot.c/snapshot_wire.c/snapshot_load.c) PLUS
|
||||
# the new ../src/repl.c under test. Needs libedit_dep (parent meson.build)
|
||||
# ../src/repl.c under test. Also pulls in ../src/repl_break.c/repl_info.c
|
||||
# (task 12.2's 800-line-cap split of repl.c -- repl_internal.h's own "Why a
|
||||
# split at all") -- required at link time since sim_loop.c's new breakpoint
|
||||
# hooks (repl.h) reference symbols repl_break.c defines, even though this
|
||||
# file's own tests exercise only the execution-control slice; task 12.2's
|
||||
# own breakpoint/inspection tests live in the sibling
|
||||
# test_repl_breakpoints_inspection.c. Needs libedit_dep (parent meson.build)
|
||||
# at link time -- repl.c's real readline()/add_history() calls are pulled
|
||||
# into this TU by the white-box #include.
|
||||
sched_repl_execution_control_test = executable(
|
||||
|
|
@ -670,6 +685,29 @@ sched_repl_execution_control_test = executable(
|
|||
dependencies: [scheduler_test_deps, libedit_dep],
|
||||
install: false)
|
||||
|
||||
# Contract test for the interactive simulation REPL's breakpoint and
|
||||
# state-inspection slice (scheduler-core spec, task 12.2, Req 5 AC 22
|
||||
# "Breakpoints"/"State inspection"): setting a breakpoint on a specific
|
||||
# event type and field value pauses the REPL exactly when a matching event
|
||||
# is about to be processed, and each `info` command reports state matching
|
||||
# a snapshot dump of the same moment. Same white-box #include pattern as
|
||||
# sched_repl_execution_control_test above (core.c, core_clock.c,
|
||||
# core_events.c, core_session.c, decision.c, plugin.c,
|
||||
# plugins/builtin_fcfs.c, recording.c, recording_session.c, sim.c,
|
||||
# sim_loop.c, sim_record.c, sim_verify.c,
|
||||
# snapshot.c/snapshot_wire.c/snapshot_load.c, repl.c, repl_break.c,
|
||||
# repl_info.c). Split into its own file rather than appended to
|
||||
# test_repl_execution_control.c -- that file was already 644 lines after
|
||||
# task 12.1, and this task's own fixture/assertion surface (breakpoints on
|
||||
# multiple event kinds plus five separate `info` dumps) does not fit
|
||||
# alongside it under this project's 800-line cap.
|
||||
sched_repl_breakpoints_inspection_test = executable(
|
||||
'sched_repl_breakpoints_inspection_test',
|
||||
['test_repl_breakpoints_inspection.c'],
|
||||
include_directories:[incdir],
|
||||
dependencies: [scheduler_test_deps, libedit_dep],
|
||||
install: false)
|
||||
|
||||
# Register as meson tests so `meson test --suite scheduler` runs them all.
|
||||
# detect_leaks=0 matches the suite convention (fixtures are not torn down).
|
||||
test('scheduler test', scheduler_test, suite: 'scheduler',
|
||||
|
|
@ -763,3 +801,6 @@ test('scheduler sim equivalence test',
|
|||
test('scheduler repl execution control test',
|
||||
sched_repl_execution_control_test, suite: 'scheduler',
|
||||
env: ['ASAN_OPTIONS=detect_leaks=0'])
|
||||
test('scheduler repl breakpoints inspection test',
|
||||
sched_repl_breakpoints_inspection_test, suite: 'scheduler',
|
||||
env: ['ASAN_OPTIONS=detect_leaks=0'])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue