ecu-tests/docs/02_configuration_resolution.md

125 lines
4.3 KiB
Markdown

# Configuration Resolution: What is read and when
This document explains how configuration is loaded, merged, and provided to tests and interfaces.
## Sources and precedence
From highest to lowest precedence:
1. In-code overrides (if `load_config(..., overrides=...)` is used)
2. Environment variable `ECU_TESTS_CONFIG` (absolute/relative path to YAML)
3. `config/test_config.yaml` (if present under the workspace root)
4. Built-in defaults
## Data model (dataclasses)
- `EcuTestConfig`
- `interface: InterfaceConfig`
- `type`: `mock` or `babylin`
- `channel`: LIN channel index (0-based in SDK wrapper)
- `bitrate`: LIN bitrate (e.g., 19200); usually defined by SDF
- `sdf_path`: Path to SDF file (hardware; required for typical operation)
- `schedule_nr`: Schedule number to start on connect (hardware)
- `node_name`: Optional node identifier (informational)
- `dll_path`, `func_names`: Legacy fields from the old ctypes adapter; not used with the SDK wrapper
- `flash: FlashConfig`
- `enabled`: whether to flash before tests
- `hex_path`: path to HEX file
- `power_supply: PowerSupplyConfig`
- `enabled`: whether PSU features/tests are active
- `port`: Serial device (e.g., `COM4`, `/dev/ttyUSB0`)
- `baudrate`, `timeout`, `eol`: line settings (e.g., `"\n"` or `"\r\n"`)
- `parity`: `N|E|O`
- `stopbits`: `1` or `2`
- `xonxoff`, `rtscts`, `dsrdtr`: flow control flags
- `idn_substr`: optional substring to assert in `*IDN?`
- `do_set`, `set_voltage`, `set_current`: optional demo/test actions
## YAML examples
Minimal mock configuration (default):
```yaml
interface:
type: mock
channel: 1
bitrate: 19200
flash:
enabled: false
```
Hardware (BabyLIN SDK wrapper) configuration:
```yaml
interface:
type: babylin
channel: 0 # 0-based channel index
bitrate: 19200 # optional; typically driven by SDF
node_name: "ECU_TEST_NODE"
sdf_path: "./vendor/Example.sdf"
schedule_nr: 0
flash:
enabled: true
hex_path: "firmware/ecu_firmware.hex"
Power supply configuration (either inline or merged from a dedicated YAML):
```yaml
power_supply:
enabled: true
port: COM4 # or /dev/ttyUSB0 on Linux
baudrate: 115200
timeout: 1.0
eol: "\n" # or "\r\n" if your device requires CRLF
parity: N # N|E|O
stopbits: 1 # 1|2
xonxoff: false
rtscts: false
dsrdtr: false
idn_substr: OWON
do_set: false
set_voltage: 5.0
set_current: 0.1
```
```
## Load flow
```text
tests/conftest.py: config() fixture
→ load_config(workspace_root)
→ check env var ECU_TESTS_CONFIG
→ else check config/test_config.yaml
→ else use defaults
→ convert dicts to EcuTestConfig dataclasses
→ provide to other fixtures/tests
Additionally, if present, a dedicated PSU YAML is merged into `power_supply`:
- Environment variable `OWON_PSU_CONFIG` (path to YAML), else
- `config/owon_psu.yaml` under the workspace root
This lets you keep machine-specific serial settings separate while still having
central defaults in `config/test_config.yaml`.
```
## How tests and adapters consume config
- `lin` fixture picks `mock` or `babylin` based on `interface.type`
- Mock adapter uses `bitrate` and `channel` to simulate timing/behavior
- BabyLIN adapter (SDK wrapper) uses `sdf_path`, `schedule_nr`, `channel` to open the device, load the SDF, and start a schedule. `bitrate` is informational unless explicitly applied via commands/SDF.
- `flash_ecu` uses `flash.enabled` and `flash.hex_path`
- PSU-related tests or utilities read `config.power_supply` for serial parameters
and optional actions (IDN assertions, on/off toggle, set/measure). The reference
implementation is `ecu_framework/power/owon_psu.py`, with a hardware test in
`tests/hardware/test_owon_psu.py` and a quick demo script in `vendor/Owon/owon_psu_quick_demo.py`.
## Tips
- Keep multiple YAMLs and switch via `ECU_TESTS_CONFIG`
- Check path validity for `sdf_path` and `hex_path` before running hardware tests
- Ensure `vendor/BabyLIN_library.py` and the platform-specific libraries from the SDK are available on `PYTHONPATH`
- Use environment-specific YAML files for labs vs. CI
- For PSU, prefer `OWON_PSU_CONFIG` or `config/owon_psu.yaml` to avoid committing
local COM port settings. Central defaults can live in `config/test_config.yaml`.