Files
lgtv_audio_cap/test/run-tests.sh
T
Rene KievitsandClaude Opus 5 0759cc00aa Let the Device field be picked, not typed blind
Diagnosing capture on a real TV meant reading pactlSources off the
screen and typing an exact PulseAudio source name back in through the
same remote-driven text field — no way to copy-paste, easy to
mistype, and the one piece of information (which source, if any, is
actually RUNNING) was buried in a JSON dump.

Added two choice() pickers bound to the same capture.device setting:
one built from pactlSources (pulse/auto backends), one built from
alsaCapturePcms (alsa backend), both parsed from diagnostics the
service already collects — no new Luna method needed. Diagnostics
already run once at boot, so the picker is populated immediately,
before the user ever presses "Run diagnostics" by hand.

Picking a value writes straight into capture.device, and the plain
text field stays as the fallback for anything the parser misses.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 13:51:02 +02:00

105 lines
3.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Host-side tests. These build the parts of the service that are not tied to
# webOS with the system compiler and run them, so the risky code (FlatBuffers
# encoding, the capture pipeline, socket framing) is verified before anything
# is ever copied to a TV.
set -euo pipefail
cd "$(dirname "$0")/.."
CC="${CC:-cc}"
# verify_rtp.py imports the host receiver by path; without this it would leave a
# __pycache__ next to it.
export PYTHONDONTWRITEBYTECODE=1
OUT=$(mktemp -d)
trap 'rm -rf "$OUT"' EXIT
CFLAGS=(-std=c11 -Wall -Wextra -Wno-unused-parameter -D_GNU_SOURCE -Inative/src -O1 -g)
SOURCES=(
native/src/engine.c
native/src/config.c
native/src/dsp.c
native/src/common/log.c
native/src/common/json.c
native/src/common/ringbuf.c
native/src/capture/capture.c
native/src/capture/cap_pulse.c
native/src/capture/cap_alsa.c
native/src/capture/cap_exec.c
native/src/capture/cap_tone.c
native/src/net/flatbuf.c
native/src/net/hyperion.c
native/src/net/streamserv.c
native/src/sinks/sink.c
native/src/sinks/sink_hyperhdr.c
native/src/sinks/sink_hyperhdr_viz.c
native/src/sinks/sink_udp.c
native/src/sinks/sink_tcp.c
native/src/sinks/sink_http.c
)
echo "== Syntax-checking the webOS-only sources against stub headers"
for f in native/src/service.c native/src/main.c; do
"$CC" "${CFLAGS[@]}" -Itest/stubs -fsyntax-only "$f"
echo " ok $f"
done
echo
echo "== FlatBuffers wire format"
if python3 -c "import flatbuffers" 2>/dev/null; then
python3 test/verify_flatbuf.py
else
echo " SKIP: the 'flatbuffers' Python package is not installed"
echo " python3 -m venv /tmp/fbvenv && /tmp/fbvenv/bin/pip install flatbuffers"
echo " CC=$CC /tmp/fbvenv/bin/python test/verify_flatbuf.py"
fi
echo
echo "== RTP wire format, against the host receiver"
"$CC" "${CFLAGS[@]}" -o "$OUT/rtp_send" test/rtp_send.c "${SOURCES[@]}" -lpthread -lm
python3 test/verify_rtp.py "$OUT/rtp_send"
echo
echo "== Capture pipeline end to end"
"$CC" "${CFLAGS[@]}" -o "$OUT/engine_smoke" test/engine_smoke.c "${SOURCES[@]}" -lpthread -lm
"$OUT/engine_smoke"
echo
echo "== Unraid plugin"
python3 test/verify_unraid_plugin.py
echo
echo "== Receiver container"
if command -v docker >/dev/null 2>&1; then
docker build -f docker/Dockerfile -t lgtv-audiocap-receiver:test-run . >/dev/null 2>&1
docker run --rm lgtv-audiocap-receiver:test-run --help >/dev/null
echo " ok image builds and forwards --help"
docker rmi lgtv-audiocap-receiver:test-run >/dev/null 2>&1
else
echo " SKIP: docker is not installed"
fi
echo
echo "== Frontend"
if command -v node >/dev/null 2>&1; then
for f in frontend/js/*.js; do
node --check "$f"
echo " ok $f"
done
# jsdom is a test-only dependency; the app itself has none. `npm install`
# puts it in node_modules, or point JSDOM_PATH at an install elsewhere.
if [ -z "${JSDOM_PATH:-}" ] && [ -d node_modules/jsdom ]; then
JSDOM_PATH="$PWD/node_modules"
fi
JSDOM_PATH="${JSDOM_PATH:-/tmp/audiocap-domtest/node_modules}"
if NODE_PATH="$JSDOM_PATH" node -e "require('jsdom')" 2>/dev/null; then
NODE_PATH="$JSDOM_PATH" node test/ui_smoke.js
else
echo " SKIP: jsdom is not installed, so the page was not run"
echo " mkdir -p /tmp/audiocap-domtest && cd /tmp/audiocap-domtest && npm i jsdom"
fi
else
echo " SKIP: node is not installed"
fi