Skip to content

Commit f1fd8a5

Browse files
xaionaro@dx.centerxaionaro@dx.center
authored andcommitted
Add orchestration script for audio recording E2E test
Builds host injector + device binary, injects 440Hz via gRPC, runs capture+verify on emulator, reports PASS/FAIL.
1 parent 380f7f3 commit f1fd8a5

1 file changed

Lines changed: 88 additions & 0 deletions

File tree

tests/e2e/run-audio-e2e.sh

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/usr/bin/env bash
2+
# E2E test: inject audio via gRPC and verify capture on Android emulator.
3+
#
4+
# Prerequisites:
5+
# - Android NDK installed (auto-detected or set ANDROID_NDK_HOME)
6+
# - A running Android emulator with audio enabled (no -no-audio flag)
7+
# - Emulator gRPC port accessible (default: console_port + 3000)
8+
#
9+
# Usage: ./tests/e2e/run-audio-e2e.sh
10+
11+
set -euo pipefail
12+
13+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
14+
PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
15+
16+
# Detect NDK.
17+
ANDROID_HOME="${ANDROID_HOME:-$HOME/Android/Sdk}"
18+
NDK_PATH="${ANDROID_NDK_HOME:-$(ls -d "$ANDROID_HOME/ndk/"* 2>/dev/null | sort -V | tail -1)}"
19+
if [ -z "$NDK_PATH" ] || [ ! -d "$NDK_PATH" ]; then
20+
echo "ERROR: Android NDK not found; set ANDROID_NDK_HOME or ANDROID_HOME"
21+
exit 1
22+
fi
23+
24+
API_LEVEL="${API_LEVEL:-35}"
25+
CC="${NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android${API_LEVEL}-clang"
26+
if [ ! -x "$CC" ]; then
27+
echo "ERROR: NDK clang not found at $CC"
28+
exit 1
29+
fi
30+
31+
ADB="${ADB:-adb}"
32+
33+
# Verify adb connectivity.
34+
if ! "$ADB" get-state >/dev/null 2>&1; then
35+
echo "ERROR: No adb device found. Start an emulator first."
36+
exit 1
37+
fi
38+
39+
# Determine gRPC port from emulator serial (e.g. emulator-5554 → 8554).
40+
if [ -z "${GRPC_PORT:-}" ]; then
41+
SERIAL=$("$ADB" get-serialno 2>/dev/null | tr -d '\r\n')
42+
if [[ "$SERIAL" =~ emulator-([0-9]+) ]]; then
43+
CONSOLE_PORT="${BASH_REMATCH[1]}"
44+
GRPC_PORT=$((CONSOLE_PORT + 3000))
45+
else
46+
GRPC_PORT=8554
47+
fi
48+
fi
49+
echo "Using gRPC port: $GRPC_PORT"
50+
51+
cd "$PROJECT_DIR"
52+
53+
# Step 1: Build host-side injector.
54+
echo "=== Building audio injector (host) ==="
55+
go build -o /tmp/audio-inject ./tests/e2e/audio-inject
56+
57+
# Step 2: Cross-compile device binary.
58+
echo "=== Building audio recording E2E (android/amd64) ==="
59+
CGO_ENABLED=1 GOOS=android GOARCH=amd64 CC="$CC" \
60+
go build -o /tmp/audio-recording-e2e ./tests/e2e/audio-recording-e2e
61+
62+
# Step 3: Start injector in background (440 Hz, 5 seconds).
63+
echo "=== Starting audio injection (440 Hz @ 48 kHz, 5s) ==="
64+
/tmp/audio-inject -port "$GRPC_PORT" -freq 440 -duration 5s &
65+
INJECT_PID=$!
66+
trap "kill $INJECT_PID 2>/dev/null || true; rm -f /tmp/audio-inject /tmp/audio-recording-e2e" EXIT
67+
68+
# Give the injector time to connect and start streaming.
69+
sleep 2
70+
71+
# Step 4: Push and run device binary.
72+
echo "=== Running audio recording E2E on device ==="
73+
"$ADB" push /tmp/audio-recording-e2e /data/local/tmp/audio-recording-e2e >/dev/null 2>&1
74+
"$ADB" shell chmod 755 /data/local/tmp/audio-recording-e2e
75+
76+
OUTPUT=$("$ADB" shell "timeout 15 /data/local/tmp/audio-recording-e2e 2>&1; echo EXIT=\$?" 2>&1)
77+
echo "$OUTPUT"
78+
79+
EXIT_CODE=$(echo "$OUTPUT" | grep -oP 'EXIT=\K\d+' | tail -1)
80+
"$ADB" shell rm -f /data/local/tmp/audio-recording-e2e 2>/dev/null || true
81+
82+
if [ "$EXIT_CODE" = "0" ]; then
83+
echo "=== PASS: Audio recording E2E ==="
84+
else
85+
echo "=== FAIL: Audio recording E2E (exit=$EXIT_CODE) ==="
86+
fi
87+
88+
exit "${EXIT_CODE:-1}"

0 commit comments

Comments
 (0)