diff --git a/Runner/suites/Multimedia/Sensors/README_Sensors.md b/Runner/suites/Multimedia/Sensors/README_Sensors.md index 9e861fbb..e2b4859c 100644 --- a/Runner/suites/Multimedia/Sensors/README_Sensors.md +++ b/Runner/suites/Multimedia/Sensors/README_Sensors.md @@ -37,9 +37,8 @@ This test validates Qualcomm SSC/ADSP sensor streaming **without relying on Devi - Default: `--profile auto` - Auto mode selects the discovered sensor types supported by the streaming tools, such as `accel`, `gyro`, `mag`, and `pressure`. -- Auto mode passes the SSC platform-service validation when no testable data - sensor is present. Service and test endpoint types are not functional - streaming targets. +- Auto mode reports SKIP when no testable data sensor is present. Service and + test endpoint inventory is not proof of successful sensor streaming. 4. **Runs functional validation** - For each selected sensor TYPE: @@ -106,9 +105,23 @@ Profiles: ### Run an explicit list of sensors ```sh +./run.sh --sensors accel,gravity,gyro,mag,pressure +./run.sh --sensors ' accel, gyro, accel ' # trims whitespace and tests duplicates once ./run.sh --sensors accel,gyro,tilt --strict 0 ``` +CSV names are checked individually against the current available inventory. +Ordering is preserved, and `--sensors` overrides the profile. Empty lists, empty +fields, embedded whitespace and wildcard/path characters are rejected before +discovery or package/service operations. Names may contain letters, digits, +underscores and hyphens, and must start with a letter, digit or underscore. + +For example, `--sensors accel,pressur --strict 0` tests `accel` if available and +records the misspelled `pressur` as SKIP. It does not silently substitute +`pressure`. If all requested types are missing, the result is SKIP, never PASS. +With `--strict 1`, any missing requested type makes the suite FAIL before +streaming starts. Strict mode does not require sensors in automatic mode. + ### Control durations / progress heartbeat ```sh ./run.sh --see-duration 5 --drva-duration 10 --hb 5 @@ -124,12 +137,20 @@ Profiles: ## Parameters ### CLI options (most common) +- `--overlay` + Use the existing optional Sensors package-provider flow on supported desktop + distributions. Image-managed runs continue using provisioned components. +- `--out ` + Evidence directory (default: `./logs_Sensors`, environment: `OUT_DIR`). +- `--help` / `-h` + Show usage without running sensor validation. - `--list` List discovered sensor TYPEs and exit 0 - `--profile ` Select preset sensors list - `--sensors ` - Comma-separated list of sensor TYPEs to test + Comma-separated sensor TYPEs, normalized and deduplicated as described above. + There is no environment equivalent for this option or `--profile`/`--list`. - `--see-duration ` Duration for `see_workhorse` (default: `5`) - `--drva-duration ` @@ -152,6 +173,16 @@ Profiles: Passed to `see_workhorse -display_events=` (default: `1`) - `SENSORS_DRVA_NUM_SAMPLES` Extra knob for accel in `ssc_drva_test` (default set in run.sh to `325`) +- `SENSORS_SERVICE` + Existing service override (default: `sscrpcd.service`). + +Examples combining existing package/service and selection options: + +```sh +./run.sh --overlay --list +./run.sh --overlay --sensors accel,gyro --out ./logs_selected +STRICT_REQUIRED=0 ./run.sh --profile vision +``` --- @@ -160,6 +191,9 @@ Profiles: All heavy tool output is redirected to files under `--out` (default `./logs_Sensors`): - `ssc_sensor_info.txt` +- `targets.txt`, reset after valid argument parsing and populated only with selected + available types. Old per-tool logs may remain in a reused directory, so use + the current target list, stdout and `Sensors.res` to identify executed checks. - `see_workhorse_.log` (e.g. `see_workhorse_gyro.log`) - `ssc_drva_test_.log` (e.g. `ssc_drva_test_accel.log`) @@ -168,7 +202,8 @@ The console shows: - periodic heartbeat lines like: - `see_workhorse(accel) running... 5/5s (log: ...)` - final summary: - - `Summary: pass=X fail=Y skip=Z (logs in ...)` + - `Summary (checks): pass=X fail=Y skip=Z (logs in ...)` + - Counts describe individual tool checks and missing selections, not sensors. Result file: - `Sensors.res` in the testcase directory @@ -178,29 +213,42 @@ Result file: ## Verdict policy -- **PASS, control plane only:** package/runtime checks, `sscrpcd`, ADSP, and - `ssc_sensor_info` are healthy, but the runtime inventory has no streamable - physical data-sensor type. This does not claim that sensor streaming was - tested. -- **PASS, functional:** one or more discovered streamable data sensors pass - `see_workhorse` and the available `ssc_drva_test` validation. +- **PASS, functional:** at least one selected sensor passes streaming validation + and no check fails. A non-strict run may contain explicitly reported missing + sensor SKIPs. Missing sensors are never counted as passing checks. +- **PASS, list only:** explicit `--list` completes an inventory query. Its result + message states that streaming was not validated. This exception never applies + to ordinary or explicit-sensor streaming runs. - **FAIL:** a required runtime component is broken, a discovered streamable sensor fails functional validation, or an explicitly requested/named-profile - sensor is absent while strict mode is enabled. -- **SKIP:** prerequisites are unavailable or the runtime cannot provide a - usable inventory, for example no Sensors configuration, no ADSP remoteproc, - missing commands, or no parsable `ssc_sensor_info` output. + sensor is absent while strict mode is enabled. Invalid CLI input, failed + discovery, or discovery output without TYPE entries also fails. +- **SKIP:** required optional image prerequisites are unavailable, no testable + sensors are available in automatic mode, or all selected sensors are missing + with `--strict 0`. Inventory, package readiness and a running ADSP cannot turn + an empty streaming selection into PASS. +- **Optional driver tool:** a missing `ssc_drva_test` is recorded as SKIP, not + PASS. Successful `see_workhorse` streaming can still pass the suite, preserving + minimal-image support. Driver-tool failures override earlier streaming passes. + +The shared result lifecycle resets the previous result and retains FAIL +precedence. No package, service, timeout duration or YAML interface is changed +by the selection fix. Apply the same policy on Yocto, Debian, Ubuntu and CentOS. --- ## Result parsing behavior ### `see_workhorse` -The script determines PASS/FAIL primarily from log markers: +The script requires successful process exit and a final PASS log marker: - `PASS see_workhorse ...` - `FAIL see_workhorse ...` -The log may contain duplicate PASS lines; verdict is based on the **last PASS/FAIL marker**. +The log may contain duplicate markers. The last PASS/FAIL marker is used. +Empty logs, diagnostic-only output, missing markers, nonzero process status and +timeouts do not count as successful streaming, even if an earlier PASS exists. +An expired deadline remains a failure even if the client exits zero after the +timeout signal. The existing timeout duration and signal sequence are unchanged. ### `ssc_drva_test` - If `ssc_drva_test` binary is missing → treated as **SKIP** for that sensor. @@ -219,7 +267,9 @@ Some builds print diagnostic socket warnings in `see_workhorse` output. This is captured in the log file. The test still passes as long as the final PASS marker is present. ### `ssc_sensor_info` outputs nothing / parsing fails -This is treated as **SKIP** (no usable inventory → no further tests). +Failed execution or output without TYPE entries is FAIL. A successful query +containing only unavailable sensors produces no streaming targets, so automatic +mode reports SKIP and an explicit strict selection reports FAIL. Check: - overlay apps installed and runnable diff --git a/Runner/suites/Multimedia/Sensors/run.sh b/Runner/suites/Multimedia/Sensors/run.sh index ad9f68c0..d4880fc9 100755 --- a/Runner/suites/Multimedia/Sensors/run.sh +++ b/Runner/suites/Multimedia/Sensors/run.sh @@ -3,16 +3,53 @@ # SPDX-License-Identifier: BSD-3-Clause # Dynamic Sensors validation (DT-free): discover via ssc_sensor_info and validate selected sensor types. -TESTNAME="Sensors" - +# ---------- Repo env + helpers ---------- SCRIPT_DIR="$( cd "$(dirname "$0")" || exit 1 pwd )" +INIT_ENV="" +SEARCH="$SCRIPT_DIR" + +while [ "$SEARCH" != "/" ]; do + if [ -f "$SEARCH/init_env" ]; then + INIT_ENV="$SEARCH/init_env" + break + fi + SEARCH=$(dirname "$SEARCH") +done + +if [ -z "$INIT_ENV" ]; then + echo "[ERROR] Could not find init_env (starting at $SCRIPT_DIR)" >&2 + exit 1 +fi + +# Only source once (idempotent) +# NOTE: We intentionally **do not export** any new vars. They stay local to this shell. +if [ -z "${__INIT_ENV_LOADED:-}" ]; then + # shellcheck disable=SC1090 + . "$INIT_ENV" + __INIT_ENV_LOADED=1 +fi -# shellcheck disable=SC2034 +# shellcheck disable=SC1090 +. "$INIT_ENV" +# shellcheck disable=SC1091 +. "$TOOLS/functestlib.sh" +# shellcheck disable=SC1091 +. "$TOOLS/lib_sensors.sh" + +if [ -r "$TOOLS/lib_pkg_provider.sh" ]; then + # shellcheck disable=SC1090,SC1091 + . "$TOOLS/lib_pkg_provider.sh" +fi + +TESTNAME="Sensors" RES_FILE="$SCRIPT_DIR/${TESTNAME}.res" +test_result_init "$TESTNAME" "$RES_FILE" || exit 1 +# usage +# Print supported CLI options and environment overrides. No target operations. usage() { cat < Comma-separated list of sensor TYPEs to test Example: --sensors accel,gyro,mag + Whitespace around names is trimmed, duplicates run once. + Empty fields or unsafe names are rejected. --profile Choose a preset list: basic : accel,gyro core : accel,gyro @@ -40,6 +79,7 @@ Durations / progress: --hb Heartbeat seconds (default: 5) --strict <0|1> Fail when an explicitly selected or named-profile sensor is absent (default: 1). Auto mode uses present sensors only. + With 0, missing entries are SKIP. No tested sensors means SKIP. Other: --help Show this help @@ -58,58 +98,95 @@ Environment overrides: EOF } -SENSORS_CSV="" -PROFILE="auto" -LIST_ONLY=0 -OVERLAY_REQUESTED=0 - -while [ $# -gt 0 ]; do - case "$1" in - --overlay) OVERLAY_REQUESTED=1; shift 1 ;; - --out) OUT_DIR="$2"; shift 2 ;; - --see-duration) SEE_DURATION="$2"; shift 2 ;; - --drva-duration) DRVA_DURATION="$2"; shift 2 ;; - --hb) HB_SECS="$2"; shift 2 ;; - --strict) STRICT_REQUIRED="$2"; shift 2 ;; - --sensors) SENSORS_CSV="$2"; shift 2 ;; - --profile) PROFILE="$2"; shift 2 ;; - --list) LIST_ONLY=1; shift 1 ;; - --help|-h) usage; exit 0 ;; - *) echo "[WARN] Unknown arg: $1" >&2; shift 1 ;; - esac -done - -INIT_ENV="" -SEARCH="$SCRIPT_DIR" -while [ "$SEARCH" != "/" ]; do - if [ -f "$SEARCH/init_env" ]; then - INIT_ENV="$SEARCH/init_env" - break - fi - SEARCH=$(dirname "$SEARCH") -done - -if [ -z "$INIT_ENV" ]; then - echo "[ERROR] Could not find init_env (starting at $SCRIPT_DIR)" >&2 - echo "$TESTNAME SKIP" >"$RES_FILE" 2>/dev/null || true - exit 0 -fi - -if [ -z "${__INIT_ENV_LOADED:-}" ]; then - # shellcheck disable=SC1090 - . "$INIT_ENV" - __INIT_ENV_LOADED=1 -fi +# parse_args ARGS... +# Validate selection before discovery or package/service operations. Invalid input +# publishes FAIL through shared result handling. Sets existing CLI policy globals. +parse_args() { + SENSORS_CSV="" + SENSORS_REQUESTED=0 + REQUESTED_TARGETS="" + PROFILE=auto + LIST_ONLY=0 + OVERLAY_REQUESTED=0 + STRICT_REQUIRED="${STRICT_REQUIRED:-1}" + + while [ $# -gt 0 ]; do + case "$1" in + --overlay) + OVERLAY_REQUESTED=1 + shift + ;; + --list) + LIST_ONLY=1 + shift + ;; + --help|-h) + usage + exit 0 + ;; + --out|--see-duration|--drva-duration|--hb|--strict|--sensors|--profile) + if [ $# -lt 2 ]; then + test_result_finish FAIL "Missing value for $1, see --help" + fi + case "$2" in + --*) + test_result_finish FAIL "Missing value for $1 before $2, see --help" + ;; + esac + case "$1" in + --out) + OUT_DIR="$2" + ;; + --see-duration) + SEE_DURATION="$2" + ;; + --drva-duration) + DRVA_DURATION="$2" + ;; + --hb) + HB_SECS="$2" + ;; + --strict) + STRICT_REQUIRED="$2" + ;; + --sensors) + SENSORS_CSV="$2" + SENSORS_REQUESTED=1 + ;; + --profile) + PROFILE="$2" + ;; + esac + shift 2 + ;; + *) + test_result_finish FAIL "Unknown option: $1, see --help" + ;; + esac + done -# shellcheck disable=SC1090,SC1091 -. "$TOOLS/functestlib.sh" -# shellcheck disable=SC1090,SC1091 -. "$TOOLS/lib_sensors.sh" + case "$STRICT_REQUIRED" in + 0|1) + ;; + *) + test_result_finish FAIL "Invalid strict value '$STRICT_REQUIRED', use 0 or 1" + ;; + esac + case "$PROFILE" in + auto|basic|core|vision|all) + ;; + *) + test_result_finish FAIL "Unknown profile '$PROFILE', use auto, basic, core, vision or all" + ;; + esac + if [ "$SENSORS_REQUESTED" -eq 1 ]; then + if ! REQUESTED_TARGETS=$(sensors_parse_csv "$SENSORS_CSV"); then + test_result_finish FAIL "Invalid --sensors CSV, use nonempty comma-separated TYPE names with letters, digits, underscores or hyphens, see --list" + fi + fi +} -if [ -r "$TOOLS/lib_pkg_provider.sh" ]; then - # shellcheck disable=SC1090,SC1091 - . "$TOOLS/lib_pkg_provider.sh" -fi +parse_args "$@" # Resolve test path and cd (single SKIP/exit path) SKIP_REASON="" @@ -123,9 +200,10 @@ else fi if [ -n "$SKIP_REASON" ]; then - log_skip "$SKIP_REASON" - echo "$TESTNAME SKIP" >"$RES_FILE" 2>/dev/null || true - exit 0 + test_result_finish SKIP "$SKIP_REASON" +fi +if [ "$TEST_RESULT_FILE" != "$RES_FILE" ]; then + test_result_init "$TESTNAME" "$RES_FILE" || exit 1 fi OUT_DIR="${OUT_DIR:-./logs_Sensors}" @@ -136,7 +214,13 @@ STRICT_REQUIRED="${STRICT_REQUIRED:-1}" SENSORS_SERVICE="${SENSORS_SERVICE:-sscrpcd.service}" : "${SENSORS_DRVA_NUM_SAMPLES:=325}" -mkdir -p "$OUT_DIR" 2>/dev/null || true +if ! mkdir -p "$OUT_DIR"; then + test_result_finish FAIL "Cannot create sensor evidence directory $OUT_DIR, check permissions" +fi +TARGET_FILE="$OUT_DIR/targets.txt" +if ! : >"$TARGET_FILE"; then + test_result_finish FAIL "Cannot reset $TARGET_FILE, check evidence directory permissions" +fi OS_ID="unknown" DISTRO_SENSORS_HANDLING_SUPPORTED=0 @@ -183,9 +267,7 @@ if [ "$OVERLAY_REQUESTED" -eq 1 ]; then pkg_ensure_optional_package_set_present \ pkg_verify_package_set_installed; do if ! command -v "$required_helper" >/dev/null 2>&1; then - log_fail "$TESTNAME FAIL - required package helper is unavailable: $required_helper" - echo "$TESTNAME FAIL" >"$RES_FILE" - exit 0 + test_result_finish FAIL "Required package helper is unavailable: $required_helper" fi done @@ -210,9 +292,7 @@ if [ "$OVERLAY_REQUESTED" -eq 1 ]; then ;; esac - log_fail "$TESTNAME FAIL - failed to ensure Qualcomm Sensors package set" - echo "$TESTNAME FAIL" >"$RES_FILE" - exit 0 + test_result_finish FAIL "Failed to ensure Qualcomm Sensors package set" fi case "$old_package_set_upgrade" in @@ -225,25 +305,21 @@ if [ "$OVERLAY_REQUESTED" -eq 1 ]; then ;; esac - log_pass "Qualcomm Sensors runtime/test package set is ready" + log_info "Qualcomm Sensors runtime/test package set is ready" else - log_info "Package installation skipped for os=$OS_ID; using image-provided Sensors runtime" + log_info "Package installation skipped for os=$OS_ID, using image-provided Sensors runtime" fi else - log_info "Overlay package installation not requested; validating installed Sensors runtime" + log_info "Overlay package installation not requested, validating installed Sensors runtime" fi deps="ssc_sensor_info see_workhorse awk sed grep sort wc tr" if ! check_dependencies "$deps"; then - log_skip "$TESTNAME SKIP - missing dependencies: $deps" - echo "$TESTNAME SKIP" >"$RES_FILE" - exit 0 + test_result_finish SKIP "Missing sensor dependencies, provision image commands: $deps" fi if [ ! -d /etc/sensors/config ]; then - log_skip "$TESTNAME SKIP - /etc/sensors/config not present (likely non-prop build)" - echo "$TESTNAME SKIP" >"$RES_FILE" - exit 0 + test_result_finish SKIP "/etc/sensors/config not present, provision Sensors runtime configuration" fi # The qcom-sensors-services package installs sscrpcd.service. On supported @@ -255,14 +331,12 @@ if [ "$DISTRO_SENSORS_HANDLING_SUPPORTED" -eq 1 ] && log_info "Starting Sensors service, $SENSORS_SERVICE" if ! systemctl start "$SENSORS_SERVICE"; then - log_fail "$TESTNAME FAIL - failed to start $SENSORS_SERVICE" systemctl status "$SENSORS_SERVICE" --no-pager --full 2>/dev/null || true - echo "$TESTNAME FAIL" >"$RES_FILE" - exit 0 + test_result_finish FAIL "Failed to start $SENSORS_SERVICE, check the service status" fi fi - log_pass "Sensors service is active, $SENSORS_SERVICE" + log_info "Sensors service is active, $SENSORS_SERVICE" else log_warn "Sensors service unit is not installed: $SENSORS_SERVICE" fi @@ -276,17 +350,11 @@ log_info "ADSP remoteproc:" log_info " path=${SENSORS_ADSP_RPROC_PATH:-unknown} state=${SENSORS_ADSP_STATE:-unknown} firmware=${SENSORS_ADSP_FW:-unknown}" if [ "$adsp_rc" -eq 3 ]; then - log_skip "$TESTNAME SKIP - ADSP remoteproc not found" - echo "$TESTNAME SKIP" >"$RES_FILE" - exit 0 + test_result_finish SKIP "ADSP remoteproc not found, check image ADSP support" elif [ "$adsp_rc" -eq 2 ]; then - log_fail "$TESTNAME FAIL - ADSP not running and firmware missing: ${SENSORS_ADSP_FW:-adsp.mbn}" - echo "$TESTNAME FAIL" >"$RES_FILE" - exit 0 + test_result_finish FAIL "ADSP not running and firmware missing: ${SENSORS_ADSP_FW:-adsp.mbn}" elif [ "$adsp_rc" -eq 1 ]; then - log_fail "$TESTNAME FAIL - ADSP remoteproc state is not running: ${SENSORS_ADSP_STATE:-unknown}" - echo "$TESTNAME FAIL" >"$RES_FILE" - exit 0 + test_result_finish FAIL "ADSP remoteproc state is not running: ${SENSORS_ADSP_STATE:-unknown}" fi # Discover sensors @@ -294,22 +362,16 @@ SSC_LOG="$OUT_DIR/ssc_sensor_info.txt" log_info "Collecting sensor inventory -> $SSC_LOG" if ! sensors_dump_ssc_sensor_info "$SSC_LOG"; then - log_skip "$TESTNAME SKIP - ssc_sensor_info failed to run (see $SSC_LOG)" - echo "$TESTNAME SKIP" >"$RES_FILE" - exit 0 + test_result_finish FAIL "ssc_sensor_info execution failed, check sensor runtime and $SSC_LOG" fi if [ ! -s "$SSC_LOG" ] || ! grep -q '^TYPE[[:space:]]*=' "$SSC_LOG" 2>/dev/null; then - log_skip "$TESTNAME SKIP - ssc_sensor_info produced no TYPE entries (see $SSC_LOG)" - echo "$TESTNAME SKIP" >"$RES_FILE" - exit 0 + test_result_finish FAIL "ssc_sensor_info produced no TYPE entries, check runtime discovery in $SSC_LOG" fi types_nl="$(sensors_types_from_ssc_file "$SSC_LOG" 2>/dev/null || true)" if [ -z "$types_nl" ]; then - log_skip "$TESTNAME SKIP - no parsable sensor inventory from ssc_sensor_info (see $SSC_LOG)" - echo "$TESTNAME SKIP" >"$RES_FILE" - exit 0 + log_info "No available sensor TYPEs in inventory, evidence=$SSC_LOG" fi log_info "Sensor TYPEs discovered:" @@ -319,26 +381,16 @@ done # ---- list-only mode should be a clean PASS for LAVA ---- if [ "$LIST_ONLY" -eq 1 ]; then - log_pass "$TESTNAME PASS - --list requested" - echo "$TESTNAME PASS" >"$RES_FILE" - exit 0 + test_result_finish PASS "Sensors inventory listing completed, --list does not validate streaming" fi TARGET_NL="" TARGET_SOURCE="" # 1) explicit sensor list overrides everything -if [ -n "$SENSORS_CSV" ]; then +if [ "$SENSORS_REQUESTED" -eq 1 ]; then TARGET_SOURCE="explicit list" - OLDIFS=$IFS - IFS=, - set -- "$SENSORS_CSV" - IFS=$OLDIFS - for s in "$@"; do - s="$(printf '%s' "$s" | tr -d '[:space:]')" - [ -z "$s" ] && continue - TARGET_NL="$(sensors_append_unique_line "$TARGET_NL" "$s")" - done + TARGET_NL="$REQUESTED_TARGETS" else # 2) profile selection case "$PROFILE" in @@ -368,44 +420,36 @@ pressure" TARGET_NL="$types_nl" ;; *) - log_skip "$TESTNAME SKIP - unknown profile: $PROFILE" - echo "$TESTNAME SKIP" >"$RES_FILE" - exit 0 + test_result_finish FAIL "Unknown profile: $PROFILE, see --help" ;; esac fi present_targets="" -missing_targets="" -for s in $TARGET_NL; do +while IFS= read -r s; do + [ -n "$s" ] || continue if sensors_type_present "$types_nl" "$s"; then present_targets="$(sensors_append_unique_line "$present_targets" "$s")" else - missing_targets="$(sensors_append_unique_line "$missing_targets" "$s")" - fi -done - -if [ -n "$missing_targets" ]; then - printf '%s\n' "$missing_targets" | while IFS= read -r s; do - [ -n "$s" ] && log_warn "Selected sensor type is not present: $s" - done - - if [ "$STRICT_REQUIRED" = "1" ]; then - if [ "$PROFILE" != "auto" ] || [ -n "$SENSORS_CSV" ]; then - log_fail "$TESTNAME FAIL - required selected sensor types are missing" - echo "$TESTNAME FAIL" >"$RES_FILE" - exit 0 + if [ "$STRICT_REQUIRED" = "1" ]; then + test_result_record FAIL "Requested sensor '$s' is unavailable in $SSC_LOG, check --list and sensor provisioning" + else + test_result_record SKIP "Requested sensor '$s' is unavailable in $SSC_LOG, ignored by --strict 0, check --list" fi fi +done <"$RES_FILE" - exit 0 + test_result_record SKIP "No selected sensors are available for streaming, source=$TARGET_SOURCE, check --list and $SSC_LOG" + test_result_finish fi log_info "Sensors selected to test from $TARGET_SOURCE:" @@ -413,62 +457,35 @@ printf '%s\n' "$TARGET_NL" | while IFS= read -r s; do [ -n "$s" ] && log_info " - $s" done -TARGET_FILE="$OUT_DIR/targets.txt" -printf '%s\n' "$TARGET_NL" >"$TARGET_FILE" 2>/dev/null || true - -pass_count=0 -fail_count=0 -skip_count=0 +if ! printf '%s\n' "$TARGET_NL" >"$TARGET_FILE"; then + test_result_finish FAIL "Cannot write selected sensors to $TARGET_FILE, check evidence directory permissions" +fi while IFS= read -r s; do [ -z "$s" ] && continue log_info "---- Sensor test: $s ----" - if ! sensors_type_present "$types_nl" "$s"; then - log_info "Sensor $s: not present -> SKIP" - skip_count=$((skip_count + 1)) - continue - fi - if sensors_run_see_workhorse "$s" "$SEE_DURATION" "$OUT_DIR" "$HB_SECS"; then - log_info "see_workhorse: PASS ($s) [log: $OUT_DIR/see_workhorse_${s}.log]" + test_result_record PASS "see_workhorse ($s), log=$OUT_DIR/see_workhorse_${s}.log" else - log_error "see_workhorse: FAIL ($s) [log: $OUT_DIR/see_workhorse_${s}.log]" - fail_count=$((fail_count + 1)) + test_result_record FAIL "see_workhorse ($s) failed execution or its final PASS marker is absent, inspect $OUT_DIR/see_workhorse_${s}.log" continue fi sensors_run_ssc_drva_test "$s" "$DRVA_DURATION" "$OUT_DIR" "$HB_SECS" rc=$? if [ "$rc" -eq 0 ]; then - log_info "ssc_drva_test: PASS ($s) [log: $OUT_DIR/ssc_drva_test_${s}.log]" - pass_count=$((pass_count + 1)) + test_result_record PASS "ssc_drva_test ($s), log=$OUT_DIR/ssc_drva_test_${s}.log" continue fi if [ "$rc" -eq 2 ]; then - log_info "ssc_drva_test: SKIP ($s) (tool not present)" - pass_count=$((pass_count + 1)) + test_result_record SKIP "ssc_drva_test ($s) is not installed, provision the optional driver-test binary for additional coverage" continue fi - log_error "ssc_drva_test: FAIL ($s) [log: $OUT_DIR/ssc_drva_test_${s}.log]" - fail_count=$((fail_count + 1)) + test_result_record FAIL "ssc_drva_test ($s) failed, inspect $OUT_DIR/ssc_drva_test_${s}.log" done <"$TARGET_FILE" -log_info "Summary: pass=$pass_count fail=$fail_count skip=$skip_count (logs in $OUT_DIR)" - -if [ "$fail_count" -gt 0 ]; then - log_fail "$TESTNAME FAIL - failures=$fail_count passes=$pass_count skips=$skip_count (logs in $OUT_DIR)" - echo "$TESTNAME FAIL" >"$RES_FILE" -else - if [ "$pass_count" -eq 0 ]; then - log_skip "$TESTNAME SKIP - no selected sensors were validated (all missing/unsupported)" - echo "$TESTNAME SKIP" >"$RES_FILE" - else - log_pass "$TESTNAME PASS - passes=$pass_count skips=$skip_count" - echo "$TESTNAME PASS" >"$RES_FILE" - fi -fi - -exit 0 +log_info "Summary (checks): pass=$TEST_RESULT_PASS_COUNT fail=$TEST_RESULT_FAIL_COUNT skip=$TEST_RESULT_SKIP_COUNT (logs in $OUT_DIR)" +test_result_finish diff --git a/Runner/utils/lib_sensors.sh b/Runner/utils/lib_sensors.sh index cade740c..c2774551 100755 --- a/Runner/utils/lib_sensors.sh +++ b/Runner/utils/lib_sensors.sh @@ -8,6 +8,36 @@ SENSORS_ADSP_FW="" SENSORS_ADSP_RPROC_PATH="" SENSORS_ADSP_STATE="" +# sensors_parse_csv CSV +# Validate comma-separated TYPE names, trim surrounding whitespace and deduplicate. +# Output: newline-separated names on stdout only after the entire input is valid. +# Returns 0 on success, 1 for empty fields or unsafe names. No shell-state changes. +sensors_parse_csv() { + printf '%s\n' "$1" | LC_ALL=C awk ' + { input = input $0 "\n" } + END { + count = split(input, fields, ",") + for (item = 1; item <= count; item++) { + name = fields[item] + sub(/^[[:space:]]+/, "", name) + sub(/[[:space:]]+$/, "", name) + if (name !~ /^[[:alnum:]_][[:alnum:]_-]*$/) { + exit 1 + } + if (!seen[name]++) { + names[++total] = name + } + } + if (!total) { + exit 1 + } + for (item = 1; item <= total; item++) { + print names[item] + } + } + ' +} + sensors__trim_ws() { # usage: sensors__trim_ws " abc " -> prints "abc" # shellcheck disable=SC2001 @@ -158,8 +188,10 @@ sensors_select_testable_types() { done } -# Run a command in background, redirect all output to logfile, and print a heartbeat. # sensors_run_cmd_with_progress