From 1f93039b1b234ba2410afe23eceaf2d4c31e1169 Mon Sep 17 00:00:00 2001 From: Andrea Bueide Date: Fri, 1 May 2026 18:17:52 -0500 Subject: [PATCH] fix(android): scope logcat crash detection to app process only The verify-app-running steps were dumping full device logcat then scanning for FATAL EXCEPTION patterns across all processes. This could cause false failures if a system app crashed on the emulator. Now extracts app-specific logs via adb logcat --pid before scanning. Fixes: test-suite.yaml, test-suite-android-e2e.yaml, test-suite-all-e2e.yaml Co-Authored-By: Claude Opus 4.6 --- examples/android/tests/test-suite.yaml | 17 +++++++++---- .../tests/test-suite-all-e2e.yaml | 24 ++++++++++++------- .../tests/test-suite-android-e2e.yaml | 24 ++++++++++++------- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/examples/android/tests/test-suite.yaml b/examples/android/tests/test-suite.yaml index ea27eef..c31c3b0 100644 --- a/examples/android/tests/test-suite.yaml +++ b/examples/android/tests/test-suite.yaml @@ -342,16 +342,23 @@ processes: exit 1 fi - # Always save logcat snapshot for analysis + # Save full logcat for offline analysis adb -s "$serial" logcat -d > "$_logs_dir/logcat-final.txt" 2>&1 || true - # Scan for crash patterns in logcat (AndroidRuntime tag is the definitive crash signal) + # Scan for crash patterns scoped to our app process only + APP_PID=$(adb -s "$serial" shell pidof "${ANDROID_APP_ID}" 2>/dev/null || true) + if [ -n "$APP_PID" ]; then + adb -s "$serial" logcat -d --pid="$APP_PID" > "$_logs_dir/logcat-app.txt" 2>&1 || true + else + grep -F "${ANDROID_APP_ID}" "$_logs_dir/logcat-final.txt" > "$_logs_dir/logcat-app.txt" 2>/dev/null || true + fi + crash_patterns="FATAL EXCEPTION|AndroidRuntime.*FATAL" - if grep -qiE "$crash_patterns" "$_logs_dir/logcat-final.txt" 2>/dev/null; then + if grep -qiE "$crash_patterns" "$_logs_dir/logcat-app.txt" 2>/dev/null; then echo "" - echo "FAIL: Crash patterns detected in logcat" + echo "FAIL: Crash patterns detected in app logcat" echo "--- Error lines ---" - grep -iE "$crash_patterns" "$_logs_dir/logcat-final.txt" | tail -20 + grep -iE "$crash_patterns" "$_logs_dir/logcat-app.txt" | tail -20 echo "---" echo "Full logcat: $_logs_dir/logcat-final.txt" printf 'fail\nCrash patterns detected in logcat\n' > "$_step_dir/$_step.status" diff --git a/examples/react-native/tests/test-suite-all-e2e.yaml b/examples/react-native/tests/test-suite-all-e2e.yaml index 7eff4c8..c20371f 100644 --- a/examples/react-native/tests/test-suite-all-e2e.yaml +++ b/examples/react-native/tests/test-suite-all-e2e.yaml @@ -473,27 +473,33 @@ processes: echo " Checking logs for errors..." - # Save logcat snapshot to file + # Save full logcat for offline analysis, then extract app-only logs adb -s "$serial" logcat -d > "$_logs_dir/logcat-android-verify.txt" 2>&1 || true + APP_PID=$(adb -s "$serial" shell pidof "${ANDROID_APP_ID}" 2>/dev/null || true) + if [ -n "$APP_PID" ]; then + adb -s "$serial" logcat -d --pid="$APP_PID" > "$_logs_dir/logcat-android-app.txt" 2>&1 || true + else + grep -F "${ANDROID_APP_ID}" "$_logs_dir/logcat-android-verify.txt" > "$_logs_dir/logcat-android-app.txt" 2>/dev/null || true + fi # Check for Metro connection errors metro_patterns="unable.*load.*script|could.*not.*connect.*metro|connection.*refused.*8081|packaged.*correctly.*for.*release" - if grep -qiE "$metro_patterns" "$_logs_dir/logcat-android-verify.txt" 2>/dev/null; then + if grep -qiE "$metro_patterns" "$_logs_dir/logcat-android-app.txt" 2>/dev/null; then echo "FAIL: App cannot connect to Metro bundler" echo "--- Error lines ---" - grep -iE "unable|load|script|connect|metro|refused|8081|packaged|release|bundle" "$_logs_dir/logcat-android-verify.txt" | tail -30 + grep -iE "unable|load|script|connect|metro|refused|8081|packaged|release|bundle" "$_logs_dir/logcat-android-app.txt" | tail -30 echo "---" echo "Full logcat: $_logs_dir/logcat-android-verify.txt" printf 'fail\nAndroid app cannot connect to Metro bundler\n' > "$_step_dir/$_step.status" exit 1 fi - # Check for native crash patterns + # Check for native crash patterns (scoped to our app) crash_patterns="FATAL EXCEPTION|AndroidRuntime.*FATAL" - if grep -qiE "$crash_patterns" "$_logs_dir/logcat-android-verify.txt" 2>/dev/null; then - echo "FAIL: Crash patterns detected in logcat" + if grep -qiE "$crash_patterns" "$_logs_dir/logcat-android-app.txt" 2>/dev/null; then + echo "FAIL: Crash patterns detected in app logcat" echo "--- Error lines ---" - grep -iE "$crash_patterns" "$_logs_dir/logcat-android-verify.txt" | tail -20 + grep -iE "$crash_patterns" "$_logs_dir/logcat-android-app.txt" | tail -20 echo "---" echo "Full logcat: $_logs_dir/logcat-android-verify.txt" printf 'fail\nCrash patterns detected in Android logcat\n' > "$_step_dir/$_step.status" @@ -502,10 +508,10 @@ processes: # Check for React Native JS errors rn_patterns="ReactNativeJS.*Error|Unhandled JS Exception|RedBoxError" - if grep -qiE "$rn_patterns" "$_logs_dir/logcat-android-verify.txt" 2>/dev/null; then + if grep -qiE "$rn_patterns" "$_logs_dir/logcat-android-app.txt" 2>/dev/null; then echo "FAIL: React Native JS error detected" echo "--- Error lines ---" - grep -iE "$rn_patterns" "$_logs_dir/logcat-android-verify.txt" | tail -20 + grep -iE "$rn_patterns" "$_logs_dir/logcat-android-app.txt" | tail -20 echo "---" echo "Full logcat: $_logs_dir/logcat-android-verify.txt" printf 'fail\nReact Native JS error detected on Android\n' > "$_step_dir/$_step.status" diff --git a/examples/react-native/tests/test-suite-android-e2e.yaml b/examples/react-native/tests/test-suite-android-e2e.yaml index 1256557..d025ed2 100644 --- a/examples/react-native/tests/test-suite-android-e2e.yaml +++ b/examples/react-native/tests/test-suite-android-e2e.yaml @@ -404,27 +404,33 @@ processes: echo " Checking logs for errors..." - # Save logcat snapshot to file + # Save full logcat for offline analysis, then extract app-only logs adb -s "$serial" logcat -d > "$_logs_dir/logcat-verify.txt" 2>&1 || true + APP_PID=$(adb -s "$serial" shell pidof "${ANDROID_APP_ID}" 2>/dev/null || true) + if [ -n "$APP_PID" ]; then + adb -s "$serial" logcat -d --pid="$APP_PID" > "$_logs_dir/logcat-app.txt" 2>&1 || true + else + grep -F "${ANDROID_APP_ID}" "$_logs_dir/logcat-verify.txt" > "$_logs_dir/logcat-app.txt" 2>/dev/null || true + fi # Check for Metro connection errors (these appear in red box) metro_patterns="unable.*load.*script|could.*not.*connect.*metro|connection.*refused.*8081|packaged.*correctly.*for.*release" - if grep -qiE "$metro_patterns" "$_logs_dir/logcat-verify.txt" 2>/dev/null; then + if grep -qiE "$metro_patterns" "$_logs_dir/logcat-app.txt" 2>/dev/null; then echo "FAIL: App cannot connect to Metro bundler" echo "--- Error lines ---" - grep -iE "unable|load|script|connect|metro|refused|8081|packaged|release|bundle" "$_logs_dir/logcat-verify.txt" | tail -30 + grep -iE "unable|load|script|connect|metro|refused|8081|packaged|release|bundle" "$_logs_dir/logcat-app.txt" | tail -30 echo "---" echo "Full logcat: $_logs_dir/logcat-verify.txt" printf 'fail\nApp cannot connect to Metro bundler\n' > "$_step_dir/$_step.status" exit 1 fi - # Check for native crash patterns + # Check for native crash patterns (scoped to our app) crash_patterns="FATAL EXCEPTION|AndroidRuntime.*FATAL" - if grep -qiE "$crash_patterns" "$_logs_dir/logcat-verify.txt" 2>/dev/null; then - echo "FAIL: Crash patterns detected in logcat" + if grep -qiE "$crash_patterns" "$_logs_dir/logcat-app.txt" 2>/dev/null; then + echo "FAIL: Crash patterns detected in app logcat" echo "--- Error lines ---" - grep -iE "$crash_patterns" "$_logs_dir/logcat-verify.txt" | tail -20 + grep -iE "$crash_patterns" "$_logs_dir/logcat-app.txt" | tail -20 echo "---" echo "Full logcat: $_logs_dir/logcat-verify.txt" printf 'fail\nCrash patterns detected in logcat\n' > "$_step_dir/$_step.status" @@ -433,10 +439,10 @@ processes: # Check for React Native JS errors rn_patterns="ReactNativeJS.*Error|Unhandled JS Exception|RedBoxError" - if grep -qiE "$rn_patterns" "$_logs_dir/logcat-verify.txt" 2>/dev/null; then + if grep -qiE "$rn_patterns" "$_logs_dir/logcat-app.txt" 2>/dev/null; then echo "FAIL: React Native JS error detected" echo "--- Error lines ---" - grep -iE "$rn_patterns" "$_logs_dir/logcat-verify.txt" | tail -20 + grep -iE "$rn_patterns" "$_logs_dir/logcat-app.txt" | tail -20 echo "---" echo "Full logcat: $_logs_dir/logcat-verify.txt" printf 'fail\nReact Native JS error detected\n' > "$_step_dir/$_step.status"