111 lines
4.1 KiB
Markdown
111 lines
4.1 KiB
Markdown
---
|
|
id: PLN-0057
|
|
ticket: system-os-lifecycle-process-task-contract
|
|
title: Lifecycle Tests and Invariants
|
|
status: done
|
|
created: 2026-05-15
|
|
ref_decisions: [DEC-0025]
|
|
tags: [runtime, os, lifecycle, process, task, shell, firmware]
|
|
---
|
|
|
|
## Briefing
|
|
|
|
Add focused test coverage and invariant checks for the lifecycle contract
|
|
introduced by `PLN-0055` and consumed by `PLN-0056`.
|
|
|
|
## Source Decisions
|
|
|
|
- `DEC-0025`: first-wave lifecycle maps task states to process states through
|
|
`SystemOS` and keeps `Background` outside the public lifecycle contract.
|
|
|
|
## Target
|
|
|
|
Make the lifecycle contract executable through unit tests and regression tests,
|
|
without expanding scope into background execution, UI behavior, or service
|
|
ownership.
|
|
|
|
## Scope
|
|
|
|
- Add `SystemOS` unit tests for all first-wave lifecycle operations.
|
|
- Add negative tests for missing task, missing process, and invalid transition.
|
|
- Add firmware-level regression coverage for lifecycle delegation where the
|
|
existing test harness can observe it.
|
|
- Keep manager tests focused on local storage and simple transitions.
|
|
|
|
## Out of Scope
|
|
|
|
- End-to-end UX tests for suspend/resume.
|
|
- Hub/Home navigation after lifecycle changes.
|
|
- Background services.
|
|
- Docking.
|
|
- App switching.
|
|
- Diagnostics persistence.
|
|
- WindowManager behavior changes.
|
|
|
|
## Execution Plan
|
|
|
|
1. Add core lifecycle mapping tests.
|
|
- Target file: `crates/console/prometeu-system/src/os/system_os.rs` or a
|
|
dedicated `os` test module following existing crate style.
|
|
- Verify:
|
|
- `set_foreground_task`: task becomes `Foreground`, process becomes
|
|
`Running`.
|
|
- `suspend_task`: task becomes `Suspended`, process becomes `Suspended`.
|
|
- `resume_task`: suspended task becomes `Foreground`, process becomes
|
|
`Running`.
|
|
- `close_task`: task becomes `Closed`, process becomes `Stopped`.
|
|
- `crash_task`: task becomes `Crashed`, process becomes `Crashed`.
|
|
|
|
2. Add error tests.
|
|
- Verify missing task returns `LifecycleError::TaskNotFound`.
|
|
- Verify a task whose process no longer exists returns
|
|
`LifecycleError::ProcessNotFound`.
|
|
- Verify invalid resume from non-suspended task returns
|
|
`LifecycleError::InvalidTransition` with operation `Resume`.
|
|
|
|
3. Add non-removal tests.
|
|
- Verify `close_task` leaves the closed task available through
|
|
`TaskManager::get`.
|
|
- Verify `close_task` leaves the stopped process available through
|
|
`ProcessManager::get`.
|
|
- Do not call `remove_closed` or `remove_stopped` as part of lifecycle API
|
|
tests.
|
|
|
|
4. Add background exclusion tests.
|
|
- Assert there is no `SystemOS::background_task` API added by this wave.
|
|
- Keep any existing `TaskState::Background` behavior in manager-level tests
|
|
documented as manager behavior, not first-wave lifecycle semantics.
|
|
|
|
5. Add firmware regression tests after `PLN-0056`.
|
|
- Target file: `crates/console/prometeu-firmware/src/firmware/firmware.rs`
|
|
or the relevant step test module.
|
|
- Verify game launch still enters `GameRunningStep`.
|
|
- Verify shell launch still enters `SystemRunningStep`.
|
|
- Verify a game crash path marks the active task as crashed when the test
|
|
harness can observe `ctx.os.task_manager`.
|
|
|
|
## Acceptance Criteria
|
|
|
|
- Every lifecycle method from `DEC-0025` has a positive `SystemOS` test.
|
|
- Missing task and missing process return typed lifecycle errors.
|
|
- Invalid resume transition is covered by a test.
|
|
- `close_task` is tested as mark-only, not removal.
|
|
- No test encodes `Background` as a normative first-wave lifecycle operation.
|
|
- Firmware regression tests still pass for game and shell launch.
|
|
|
|
## Tests / Validation
|
|
|
|
- Run `cargo test -p prometeu-system`.
|
|
- Run `cargo test -p prometeu-firmware`.
|
|
- If workspace-level tests are practical after these changes, run the relevant
|
|
workspace command used by this repository.
|
|
|
|
## Risks
|
|
|
|
- Some negative tests may require test-only helpers to create an inconsistent
|
|
task/process relationship. Prefer narrow test fixtures over making corruption
|
|
APIs public.
|
|
- Compile-time absence of `background_task` may not be directly testable
|
|
without compile-fail infrastructure. In that case, validate it by code review
|
|
and keep runtime tests focused on the exposed first-wave methods.
|