@@ -64,6 +64,7 @@ ENV_FILE="$ENV_DIR/env.sh"
6464ARTIFACTS_DIR=" ${ARTIFACTS_DIR:- ${GITHUB_WORKSPACE:- $REPO_ROOT } / artifacts} "
6565ensure_dir " $ARTIFACTS_DIR "
6666TEST_LOG=" $ARTIFACTS_DIR /connectedAndroidTest.log"
67+ GRADLE_STDOUT_LOG=" $ARTIFACTS_DIR /connectedAndroidTest.stdout"
6768SCREENSHOT_REF_DIR=" $SCRIPT_DIR /android/screenshots"
6869SCREENSHOT_TMP_DIR=" $( mktemp -d " ${TMPDIR} /cn1ss-XXXXXX" 2> /dev/null || echo " ${TMPDIR} /cn1ss-tmp" ) "
6970ensure_dir " $SCREENSHOT_TMP_DIR "
144145ra_log " Running connected Android instrumentation tests"
145146ORIGINAL_JAVA_HOME=" ${JAVA_HOME:- } "
146147export JAVA_HOME=" $JAVA17_HOME "
147- GRADLE_RC=0
148- if ! (
149- cd " $GRADLE_PROJECT_DIR " &&
150- {
151- if command -v sdkmanager > /dev/null 2>&1 ; then
152- yes | sdkmanager --licenses > /dev/null 2>&1 || true
153- elif [ -x " $ANDROID_SDK_ROOT /cmdline-tools/latest/bin/sdkmanager" ]; then
154- yes | " $ANDROID_SDK_ROOT /cmdline-tools/latest/bin/sdkmanager" --licenses > /dev/null 2>&1 || true
155- fi
156- ./gradlew --no-daemon connectedDebugAndroidTest
157- }
158- ); then
159- GRADLE_RC=$?
160- fi
148+ : > " $GRADLE_STDOUT_LOG "
149+ set +e
150+ (
151+ cd " $GRADLE_PROJECT_DIR " || exit 1
152+ if command -v sdkmanager > /dev/null 2>&1 ; then
153+ yes | sdkmanager --licenses > /dev/null 2>&1 || true
154+ elif [ -x " $ANDROID_SDK_ROOT /cmdline-tools/latest/bin/sdkmanager" ]; then
155+ yes | " $ANDROID_SDK_ROOT /cmdline-tools/latest/bin/sdkmanager" --licenses > /dev/null 2>&1 || true
156+ fi
157+ ./gradlew --no-daemon connectedDebugAndroidTest
158+ ) | tee " $GRADLE_STDOUT_LOG "
159+ GRADLE_RC=${PIPESTATUS[0]}
160+ set -e
161161export JAVA_HOME=" $ORIGINAL_JAVA_HOME "
162+ ra_log " Gradle stdout captured at $GRADLE_STDOUT_LOG "
162163
163164sleep 2
164165
165- declare -a CN1SS_SOURCES=(" LOGCAT:$TEST_LOG " )
166+ declare -a CN1SS_SOURCES=()
167+ [ -s " $GRADLE_STDOUT_LOG " ] && CN1SS_SOURCES+=(" STDOUT:$GRADLE_STDOUT_LOG " )
168+ [ -s " $TEST_LOG " ] && CN1SS_SOURCES+=(" LOGCAT:$TEST_LOG " )
166169
167170
168171# ---- Chunk accounting (diagnostics) ---------------------------------------
169172
170- LOGCAT_CHUNKS=" $( cn1ss_count_chunks " $TEST_LOG " ) "
171- LOGCAT_CHUNKS=" ${LOGCAT_CHUNKS// [^0-9]/ } " ; : " ${LOGCAT_CHUNKS:= 0} "
173+ if [ ${# CN1SS_SOURCES[@]} -eq 0 ]; then
174+ ra_log " STAGE:MARKERS_NOT_FOUND -> No CN1SS sources were captured"
175+ exit 12
176+ fi
172177
173- ra_log " Chunk counts -> logcat: ${LOGCAT_CHUNKS} "
178+ TOTAL_CHUNKS=0
179+ PRIMARY_SOURCE_LABEL=" "
180+ PRIMARY_SOURCE_PATH=" "
181+ for entry in " ${CN1SS_SOURCES[@]} " ; do
182+ source_type=" ${entry%%:* } "
183+ source_path=" ${entry#*: } "
184+ count=" $( cn1ss_count_chunks " $source_path " 2> /dev/null || echo 0) "
185+ count=" ${count// [^0-9]/ } " ; : " ${count:= 0} "
186+ label=" $( echo " $source_type " | tr ' [:upper:]' ' [:lower:]' ) "
187+ ra_log " Chunk counts -> ${label} : ${count} "
188+ if [ -z " $PRIMARY_SOURCE_PATH " ] && [ " $count " -gt 0 ]; then
189+ PRIMARY_SOURCE_PATH=" $source_path "
190+ PRIMARY_SOURCE_LABEL=" $source_type "
191+ fi
192+ TOTAL_CHUNKS=$(( TOTAL_CHUNKS + count))
193+ done
174194
175- if [ " ${LOGCAT_CHUNKS :- 0} " = " 0 " ]; then
195+ if [ " $TOTAL_CHUNKS " -eq 0 ]; then
176196 ra_log " STAGE:MARKERS_NOT_FOUND -> DeviceRunner output did not include CN1SS chunks"
177- ra_log " ---- CN1SS lines from logcat ----"
178- (grep " CN1SS:" " $TEST_LOG " || true) | sed ' s/^/[CN1SS] /'
197+ for entry in " ${CN1SS_SOURCES[@]} " ; do
198+ source_type=" ${entry%%:* } "
199+ source_path=" ${entry#*: } "
200+ if [ -s " $source_path " ]; then
201+ label=" $( echo " $source_type " | tr ' [:upper:]' ' [:lower:]' ) "
202+ ra_log " ---- CN1SS lines from ${label} ----"
203+ (grep " CN1SS:" " $source_path " || true) | sed ' s/^/[CN1SS] /'
204+ fi
205+ done
179206 exit 12
180207fi
181208
182209# ---- Identify CN1SS test streams -----------------------------------------
183210
184- TEST_NAMES_RAW=" $( cn1ss_list_tests " $TEST_LOG " 2> /dev/null | awk ' NF' | sort -u || true) "
211+ TEST_NAMES_RAW=" "
212+ if [ -n " $PRIMARY_SOURCE_PATH " ]; then
213+ TEST_NAMES_RAW=" $( cn1ss_list_tests " $PRIMARY_SOURCE_PATH " 2> /dev/null | awk ' NF' | sort -u || true) "
214+ fi
215+ if [ -z " $TEST_NAMES_RAW " ]; then
216+ for entry in " ${CN1SS_SOURCES[@]} " ; do
217+ source_path=" ${entry#*: } "
218+ TEST_NAMES_RAW=" $( cn1ss_list_tests " $source_path " 2> /dev/null | awk ' NF' | sort -u || true) "
219+ if [ -n " $TEST_NAMES_RAW " ]; then
220+ break
221+ fi
222+ done
223+ fi
185224declare -a TEST_NAMES=()
186225if [ -n " $TEST_NAMES_RAW " ]; then
187226 while IFS= read -r name; do
@@ -216,16 +255,22 @@ for test in "${TEST_NAMES[@]}"; do
216255 ra_log " WARN: Failed to extract/decode CN1SS payload for test '$test '; continuing without screenshot"
217256 rm -f " $dest " 2> /dev/null || true
218257 RAW_B64_OUT=" $SCREENSHOT_TMP_DIR /${test} .raw.b64"
219- if cn1ss_extract_base64 " $TEST_LOG " " $test " > " $RAW_B64_OUT " 2> /dev/null; then
220- if [ -s " $RAW_B64_OUT " ]; then
221- head -c 64 " $RAW_B64_OUT " | sed ' s/^/[CN1SS-B64-HEAD] /'
222- ra_log " Partial base64 saved at: $RAW_B64_OUT "
258+ rm -f " $RAW_B64_OUT " 2> /dev/null || true
259+ for entry in " ${CN1SS_SOURCES[@]} " ; do
260+ source_type=" ${entry%%:* } "
261+ source_path=" ${entry#*: } "
262+ if cn1ss_extract_base64 " $source_path " " $test " > " $RAW_B64_OUT " 2> /dev/null; then
263+ if [ -s " $RAW_B64_OUT " ]; then
264+ head -c 64 " $RAW_B64_OUT " | sed ' s/^/[CN1SS-B64-HEAD] /'
265+ ra_log " Partial base64 saved (${source_type} ) at: $RAW_B64_OUT "
266+ else
267+ rm -f " $RAW_B64_OUT " 2> /dev/null || true
268+ fi
269+ break
223270 else
224271 rm -f " $RAW_B64_OUT " 2> /dev/null || true
225272 fi
226- else
227- rm -f " $RAW_B64_OUT " 2> /dev/null || true
228- fi
273+ done
229274 TEST_OUTPUTS[" $test " ]=" $dest "
230275 TEST_SOURCES[" $test " ]=" missing"
231276 ra_log " -> Marked '$test ' as missing actual screenshot (placeholder path: $dest )"
0 commit comments