| New file |
| | |
| | | #!/usr/bin/env bash |
| | | set -euo pipefail |
| | | |
| | | if [[ $# -ne 1 ]]; then |
| | | echo "Usage: $0 /path/to/qa-evidence-YYYYMMDD-HHMMSS.zip" >&2 |
| | | exit 2 |
| | | fi |
| | | |
| | | evidence_zip="$1" |
| | | if [[ ! -f "$evidence_zip" ]]; then |
| | | echo "Evidence zip not found: $evidence_zip" >&2 |
| | | exit 2 |
| | | fi |
| | | |
| | | workdir="$(mktemp -d)" |
| | | cleanup() { |
| | | rm -rf "$workdir" |
| | | } |
| | | trap cleanup EXIT |
| | | |
| | | unzip -q "$evidence_zip" -d "$workdir" |
| | | |
| | | find_one() { |
| | | local name="$1" |
| | | find "$workdir" -type f -name "$name" -print -quit |
| | | } |
| | | |
| | | require_file() { |
| | | local name="$1" |
| | | local path |
| | | path="$(find_one "$name")" |
| | | if [[ -z "$path" ]]; then |
| | | echo "FAIL missing $name" >&2 |
| | | return 1 |
| | | fi |
| | | echo "$path" |
| | | } |
| | | |
| | | check_pattern() { |
| | | local label="$1" |
| | | local file="$2" |
| | | local pattern="$3" |
| | | if rg -q "$pattern" "$file"; then |
| | | echo "PASS $label" |
| | | return 0 |
| | | fi |
| | | echo "FAIL $label" |
| | | return 1 |
| | | } |
| | | |
| | | failures=0 |
| | | |
| | | qa_results="$(require_file "qa-results.tsv")" || failures=$((failures + 1)) |
| | | app_log="$(require_file "app.log")" || failures=$((failures + 1)) |
| | | target_text="$(require_file "qa-target-dictation-text.txt")" || failures=$((failures + 1)) |
| | | system_info="$(require_file "system-info.txt")" || failures=$((failures + 1)) |
| | | |
| | | if [[ -n "${qa_results:-}" ]]; then |
| | | if rg -q '^NEEDS_EVIDENCE' "$qa_results"; then |
| | | echo "FAIL qa-results.tsv contains NEEDS_EVIDENCE" |
| | | rg '^NEEDS_EVIDENCE' "$qa_results" || true |
| | | failures=$((failures + 1)) |
| | | else |
| | | echo "PASS qa-results.tsv has no NEEDS_EVIDENCE" |
| | | fi |
| | | fi |
| | | |
| | | if [[ -n "${app_log:-}" ]]; then |
| | | check_pattern "startup log" "$app_log" 'PrivateVoice Dictation starting' || failures=$((failures + 1)) |
| | | check_pattern "engine ready log" "$app_log" 'ASR engine ready|Engine initialized' || failures=$((failures + 1)) |
| | | check_pattern "recording log" "$app_log" 'Recording started' || failures=$((failures + 1)) |
| | | check_pattern "recognized text log" "$app_log" 'Recognized:' || failures=$((failures + 1)) |
| | | check_pattern "paste success log" "$app_log" 'PERF paste_done.*result=success|PERF fallback_type_done.*result=success' || failures=$((failures + 1)) |
| | | fi |
| | | |
| | | if [[ -n "${target_text:-}" ]]; then |
| | | if [[ -s "$target_text" ]] && [[ -n "$(tr -d '[:space:]' < "$target_text")" ]]; then |
| | | echo "PASS Notepad target text captured" |
| | | else |
| | | echo "FAIL Notepad target text is empty" |
| | | failures=$((failures + 1)) |
| | | fi |
| | | fi |
| | | |
| | | if [[ -n "${system_info:-}" ]]; then |
| | | check_pattern "Windows system info" "$system_info" 'Windows|Microsoft|CsSystemType|WindowsProductName' || failures=$((failures + 1)) |
| | | fi |
| | | |
| | | echo |
| | | if [[ "$failures" -eq 0 ]]; then |
| | | echo "WINDOWS_QA_EVIDENCE_PASS" |
| | | exit 0 |
| | | fi |
| | | |
| | | echo "WINDOWS_QA_EVIDENCE_FAIL failures=$failures" |
| | | exit 1 |