universalisos/docs/TESTING_GUIDELINES.md

316 lines
10 KiB
Markdown

# UniversalisOS Testing Toolchain Manual
This document is the official manual for the UniversalisOS testing toolchain. It replaces generic testing guidelines with concrete instructions for the custom-built tools already present in the codebase.
---
## 1. Toolchain Overview
The UniversalisOS testing ecosystem consists of three integrated components:
| Component | Tool | Purpose | Location |
|-----------|------|---------|----------|
| **Test Execution** | `uos-target.py` | Compile tests into kernel payload, run via QEMU, parse UART results | `tools/uos-target/` |
| **Code Coverage** | `uos-cover` suite | C instrumentation, trace parsing, MC/DC/branch/statement coverage | `tools/uos-cover/` |
| **Requirements** | Doorstop + Plane | HLR management (Doorstop) and LLR management (Plane) | `tools/doorstop-integration/` |
---
## 2. Test Execution: `uos-target.py`
### Purpose
`uos-target.py` manages the complete test execution pipeline:
1. Compiles tests directly into the kernel payload/firmware
2. Launches QEMU with the instrumented kernel
3. Parses `pass`, `fail`, and `skip` results directly from UART output
4. Generates JUnit XML reports for CI integration
### Usage
```bash
# Run all tests for default target (qemu-arm-virt)
python tools/uos-target/uos-target.py --run
# Run tests for specific architecture
python tools/uos-target/uos-target.py --arch armv7 --platform qemu-arm-virt --run
# Run with specific test filter
python tools/uos-target/uos-target.py --run --filter "scheduler_*"
# Generate JUnit XML for CI
python tools/uos-target/uos-target.py --run --junit results.xml
# Run with coverage instrumentation enabled
python tools/uos-target/uos-target.py --run --coverage
```
### Test Output Format
Tests embedded in the kernel must output results in this exact format:
```
[UOS-TEST] <test_name>: <pass|fail|skip> [<message>]
```
Example UART output:
```
[UOS-TEST] scheduler_round_robin: pass
[UOS-TEST] scheduler_preemption: pass
[UOS-TEST] memory_alloc_null: fail [null pointer not caught]
[UOS-TEST] ipc_message_size: skip [not implemented on this platform]
```
### Configuration
`uos-target.py` reads target definitions from `tools/uos-target/targets/`:
```yaml
# tools/uos-target/targets/qemu-arm-virt.yaml
name: qemu-arm-virt
arch: armv7
platform: qemu-arm-virt
qemu_binary: qemu-system-arm
qemu_args:
- -M virt
- -cpu cortex-a15
- -m 512M
- -nographic
uart_timeout: 10
banner: "UniversalisOS"
```
---
## 3. Code Coverage: `uos-cover` Suite
### Purpose
The `uos-cover` suite provides precise, bare-metal ARINC/ISO 26262 compliant coverage analysis for firmware builds. It achieves MC/DC, branch, and statement coverage through source-level C instrumentation.
### Tools
| Tool | Command | Purpose |
|------|---------|---------|
| `uos_cins.py` | `python tools/uos-cover/uos_cins.py` | Instrument C/C++ source before compilation |
| `uos_cover.py` | `python tools/uos-cover/uos_cover.py` | Main coverage orchestrator |
| `uos_covparse.py` | `python tools/uos-cover/uos_covparse.py` | Parse trace data into coverage reports |
| `uos_trace.py` | `python tools/uos-cover/uos_trace.py` | Parse raw trace files from instrumented runs |
| `uos_justify.py` | `python tools/uos-cover/uos_justify.py` | Justify unreachable code paths |
| `uos_verify.py` | `python tools/uos-cover/uos_verify.py` | Verify coverage against requirements |
| `uos_covexport.py` | `python tools/uos-cover/uos_covexport.py` | Export coverage data (HTML, CSV, JSON) |
| `uos_package.py` | `python tools/uos-cover/uos_package.py` | Package coverage artifacts for submission |
| `uos_xst.py` | `python tools/uos-cover/uos_xst.py` | Cross-source traceability analysis |
### Coverage Workflow
```bash
# 1. Instrument source code
python tools/uos-cover/uos_cins.py \
--input kernel/src/ \
--output kernel/src_instrumented/
# 2. Build instrumented firmware
cd kernel
make ARCH=armv7 PLATFORM=qemu-arm-virt \
SRC_DIR=src_instrumented/
# 3. Run tests with coverage (uos-target handles trace extraction)
python tools/uos-target/uos-target.py --run --coverage
# 4. Parse trace data
python tools/uos-cover/uos_covparse.py \
--trace build/trace.txt \
--output coverage.json
# 5. Verify against requirements
python tools/uos-cover/uos_verify.py \
--coverage coverage.json \
--requirements tools/doorstop-integration/
# 6. Generate HTML report
python tools/uos-cover/uos_covexport.py \
--input coverage.json \
--format html \
--output coverage_report/
# 7. Package for submission
python tools/uos-cover/uos_package.py \
--input coverage_report/ \
--output coverage_package.zip
```
### Coverage Levels (DO-178C / ISO 26262)
| Level | Metric | Threshold | Tool |
|-------|--------|-----------|------|
| Statement | % of executable statements | 100% | `uos_covparse.py` |
| Branch | % of decision branches | 100% | `uos_covparse.py` |
| MC/DC | Modified Condition/Decision | 100% | `uos_covparse.py --mcdc` |
| Function | % of functions called | 100% | `uos_covparse.py` |
### Justifying Unreachable Code
For code that cannot be exercised (e.g., hardware-failure paths, defensive checks):
```bash
python tools/uos-cover/uos_justify.py \
--file kernel/src/core/scheduler.cpp \
--line 245 \
--reason "Unreachable: watchdog timeout triggers system reset before this path" \
--category "hardware_failure"
```
Justifications are stored in `.uos_justifications.json` and included in verification reports.
---
## 4. Requirements Traceability
### Higher-Level Requirements (HLR)
HLRs are managed by **Doorstop** at `tools/doorstop-integration/`:
```bash
# Create new HLR
cd tools/doorstop-integration
python doorsetup.py --create HLR --id REQ-006 \
--text "The scheduler shall support round-robin partitioning"
# Validate all requirements
python doors_export.py --validate
# Generate traceability matrix
python doors_export.py --format csv --output trace_matrix.csv
```
HLRs are viewed and edited via:
- **Web**: `janela-do-desassossego-web` (DOORS-like grid at `/doors`)
- **IDE**: `aurelio-theia` sidebar widget (`HLR Requirements` view)
- **VS Code**: `aurelio-vscode` panel (`Aurelio: Open HLR Requirements` command)
### Lower-Level Requirements (LLR)
LLRs are managed in **Plane** (`plane.portugalfuturista.org`) and tied directly to the CI execution pipeline.
### Bidirectional Sync
```bash
# Push HLRs to Plane (create/update LLRs)
python plane_bridge.py --sync
# Pull LLR status from Plane
python plane_bridge.py --pull --format yaml
```
---
## 5. CI Integration
### GitHub Actions Pipeline
The CI pipeline runs all three toolchain components in sequence:
```yaml
# .github/workflows/ci.yml (relevant jobs)
jobs:
uos-target-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run firmware tests
run: python tools/uos-target/uos-target.py --run --junit test-results.xml
- name: Upload test results
uses: actions/upload-artifact@v4
with:
name: test-results
path: test-results.xml
uos-cover-analysis:
needs: uos-target-test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Instrument source
run: python tools/uos-cover/uos_cins.py --input kernel/src/ --output kernel/src/
- name: Build with coverage
run: cd kernel && make ARCH=armv7 PLATFORM=qemu-arm-virt
- name: Run tests with coverage
run: python tools/uos-target/uos-target.py --run --coverage
- name: Parse coverage
run: python tools/uos-cover/uos_covparse.py --trace build/trace.txt --output coverage.json
- name: Verify coverage
run: python tools/uos-cover/uos_verify.py --coverage coverage.json --requirements tools/doorstop-integration/
- name: Export HTML report
run: python tools/uos-cover/uos_covexport.py --input coverage.json --format html --output coverage/
- name: Upload coverage
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
requirements-coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate Doorstop requirements
run: python tools/doorstop-integration/doors_export.py --validate
- name: Check traceability
run: python tools/doorstop-integration/doors_export.py --check-links
```
---
## 6. Quick Reference
### Running Tests Locally
```bash
# Full test suite with coverage
python tools/uos-target/uos-target.py --run --coverage
# Specific architecture only
python tools/uos-target/uos-target.py --arch riscv --run
# Quick smoke test (no coverage)
cd kernel && ./uos-check.sh test
```
### Coverage Commands
```bash
# Instrument → Build → Test → Report (full pipeline)
python tools/uos-cover/uos_cover.py --full-pipeline --arch armv7
# Justify unreachable code
python tools/uos-cover/uos_justify.py --file <file> --line <line> --reason "<reason>"
# Export coverage for specific requirement
python tools/uos-cover/uos_covexport.py --input coverage.json --requirement REQ-001 --format html
```
### Requirements Commands
```bash
# View requirements in browser (Doorstop backend must be running)
curl http://192.168.0.9:8100/api/v1/requirements
# Validate
python tools/doorstop-integration/doors_export.py --validate
# Sync with Plane
python tools/doorstop-integration/plane_bridge.py --sync
```
---
## 7. File Locations
| Path | Purpose |
|------|---------|
| `tools/uos-target/` | Test execution engine (QEMU orchestration + UART parsing) |
| `tools/uos-cover/` | Coverage instrumentation and analysis suite |
| `tools/doorstop-integration/` | HLR requirements management (Doorstop backend) |
| `tools/uos-pkg/` | Package build tooling |
| `kernel/uos-check.sh` | Legacy build + boot smoke tests |
| `.github/workflows/ci.yml` | CI pipeline configuration |
---
## 8. References
- [DO-178C](https://www.rtca.org/sc-205/) — Software Considerations in Airborne Systems
- [ISO 26262](https://www.iso.org/standard/68383.html) — Road vehicles functional safety
- [ARINC 653](https://www.aviation-ia.com/standards) — Avionics application standard interface
- [Doorstop](https://doorstop.readthedocs.io/) — Requirements management tool
- [uos-cover README](../tools/uos-cover/README.md) — Coverage tooling details
- [uos-target README](../tools/uos-target/README.md) — Test execution details