Skip to content

Commit 8066ee0

Browse files
committed
Cache compiled CN1SS helpers to reduce screenshot latency
1 parent 40d230c commit 8066ee0

File tree

3 files changed

+110
-18
lines changed

3 files changed

+110
-18
lines changed

scripts/lib/cn1ss.sh

Lines changed: 90 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,107 @@
77
: "${CN1SS_RENDER_CLASS:=RenderScreenshotReport}"
88
: "${CN1SS_POST_COMMENT_CLASS:=PostPrComment}"
99

10+
CN1SS_INITIALIZED=0
11+
CN1SS_JAVA_BIN=""
12+
CN1SS_JAVAC_BIN=""
13+
CN1SS_SOURCE_PATH=""
14+
CN1SS_CACHE_ROOT=""
15+
CN1SS_CLASS_DIR=""
16+
CN1SS_STAMP_FILE=""
17+
CN1SS_JAVA_CLASSPATH=""
18+
19+
if ! declare -p CN1SS_JAVA_OPTS >/dev/null 2>&1; then
20+
declare -a CN1SS_JAVA_OPTS=()
21+
fi
22+
if [ "${#CN1SS_JAVA_OPTS[@]}" -eq 0 ]; then
23+
CN1SS_JAVA_OPTS+=(-Djava.awt.headless=true)
24+
fi
25+
1026
cn1ss_setup() {
1127
CN1SS_JAVA_BIN="$1"
1228
CN1SS_SOURCE_PATH="$2"
29+
local cache_override="${3:-}" tmp_root
30+
31+
if [ -z "$CN1SS_JAVA_BIN" ] || [ ! -x "$CN1SS_JAVA_BIN" ]; then
32+
cn1ss_log "CN1SS setup failed: java binary not executable ($CN1SS_JAVA_BIN)"
33+
return 1
34+
fi
35+
if [ -z "$CN1SS_SOURCE_PATH" ] || [ ! -d "$CN1SS_SOURCE_PATH" ]; then
36+
cn1ss_log "CN1SS setup failed: source directory missing ($CN1SS_SOURCE_PATH)"
37+
return 1
38+
fi
39+
40+
if [ -z "$CN1SS_JAVAC_BIN" ]; then
41+
local java_dir
42+
java_dir="$(dirname "$CN1SS_JAVA_BIN")"
43+
if [ -x "$java_dir/javac" ]; then
44+
CN1SS_JAVAC_BIN="$java_dir/javac"
45+
elif command -v javac >/dev/null 2>&1; then
46+
CN1SS_JAVAC_BIN="$(command -v javac)"
47+
else
48+
cn1ss_log "CN1SS setup failed: unable to locate javac"
49+
return 1
50+
fi
51+
fi
52+
53+
tmp_root="${TMPDIR:-/tmp}"
54+
tmp_root="${tmp_root%/}"
55+
CN1SS_CACHE_ROOT="${cache_override:-${CN1SS_CACHE_DIR:-$tmp_root/cn1ss-java-cache}}"
56+
CN1SS_CLASS_DIR="$CN1SS_CACHE_ROOT/classes"
57+
CN1SS_STAMP_FILE="$CN1SS_CACHE_ROOT/.stamp"
58+
59+
if [ "$CN1SS_INITIALIZED" -eq 1 ] && [ -n "$CN1SS_JAVA_CLASSPATH" ] && [ -d "$CN1SS_JAVA_CLASSPATH" ]; then
60+
return 0
61+
fi
62+
63+
local need_compile=1
64+
if [ -d "$CN1SS_CLASS_DIR" ] && [ -f "$CN1SS_STAMP_FILE" ]; then
65+
if ! find "$CN1SS_SOURCE_PATH" -type f -name '*.java' -newer "$CN1SS_STAMP_FILE" -print -quit | grep -q .; then
66+
need_compile=0
67+
fi
68+
fi
69+
70+
if [ "$need_compile" -eq 1 ]; then
71+
mkdir -p "$CN1SS_CACHE_ROOT"
72+
rm -rf "$CN1SS_CLASS_DIR"
73+
mkdir -p "$CN1SS_CLASS_DIR"
74+
local -a sources=()
75+
while IFS= read -r -d '' src; do
76+
sources+=("$src")
77+
done < <(find "$CN1SS_SOURCE_PATH" -type f -name '*.java' -print0)
78+
if [ "${#sources[@]}" -eq 0 ]; then
79+
cn1ss_log "CN1SS setup failed: no Java sources found under $CN1SS_SOURCE_PATH"
80+
return 1
81+
fi
82+
cn1ss_log "Compiling CN1SS helpers -> $CN1SS_CLASS_DIR"
83+
if ! "$CN1SS_JAVAC_BIN" -d "$CN1SS_CLASS_DIR" "${sources[@]}"; then
84+
cn1ss_log "CN1SS setup failed: javac returned non-zero status"
85+
return 1
86+
fi
87+
touch "$CN1SS_STAMP_FILE" 2>/dev/null || true
88+
else
89+
cn1ss_log "Reusing CN1SS helpers in $CN1SS_CLASS_DIR"
90+
fi
91+
92+
CN1SS_JAVA_CLASSPATH="$CN1SS_CLASS_DIR"
93+
CN1SS_INITIALIZED=1
1394
}
1495

1596
cn1ss_log() {
1697
echo "[cn1ss] $*"
1798
}
1899

19-
cn1ss_java_source() {
100+
cn1ss_java_run() {
20101
local class_name="$1"; shift
21-
local source_file="${CN1SS_SOURCE_PATH%/}/$class_name.java"
22102
if [ -z "${CN1SS_JAVA_BIN:-}" ] || [ ! -x "$CN1SS_JAVA_BIN" ]; then
23103
cn1ss_log "CN1SS_JAVA_BIN is not configured"
24104
return 1
25105
fi
26-
if [ ! -f "$source_file" ]; then
27-
cn1ss_log "Missing CN1SS helper source: $source_file"
106+
if [ -z "${CN1SS_JAVA_CLASSPATH:-}" ] || [ ! -d "$CN1SS_JAVA_CLASSPATH" ]; then
107+
cn1ss_log "CN1SS Java helpers not initialized; call cn1ss_setup first"
28108
return 1
29109
fi
30-
"$CN1SS_JAVA_BIN" "$source_file" "$@"
110+
"$CN1SS_JAVA_BIN" "${CN1SS_JAVA_OPTS[@]}" -cp "$CN1SS_JAVA_CLASSPATH" "$class_name" "$@"
31111
}
32112

33113
cn1ss_count_chunks() {
@@ -45,7 +125,7 @@ cn1ss_count_chunks() {
45125
if [ -n "$channel" ]; then
46126
args+=("--channel" "$channel")
47127
fi
48-
cn1ss_java_source "$CN1SS_MAIN_CLASS" "${args[@]}" 2>/dev/null || echo 0
128+
cn1ss_java_run "$CN1SS_MAIN_CLASS" "${args[@]}" 2>/dev/null || echo 0
49129
}
50130

51131
cn1ss_extract_base64() {
@@ -62,7 +142,7 @@ cn1ss_extract_base64() {
62142
if [ -n "$channel" ]; then
63143
args+=("--channel" "$channel")
64144
fi
65-
cn1ss_java_source "$CN1SS_MAIN_CLASS" "${args[@]}"
145+
cn1ss_java_run "$CN1SS_MAIN_CLASS" "${args[@]}"
66146
}
67147

68148
cn1ss_decode_binary() {
@@ -79,15 +159,15 @@ cn1ss_decode_binary() {
79159
if [ -n "$channel" ]; then
80160
args+=("--channel" "$channel")
81161
fi
82-
cn1ss_java_source "$CN1SS_MAIN_CLASS" "${args[@]}"
162+
cn1ss_java_run "$CN1SS_MAIN_CLASS" "${args[@]}"
83163
}
84164

85165
cn1ss_list_tests() {
86166
local file="$1"
87167
if [ -z "$file" ] || [ ! -r "$file" ]; then
88168
return 1
89169
fi
90-
cn1ss_java_source "$CN1SS_MAIN_CLASS" tests "$file"
170+
cn1ss_java_run "$CN1SS_MAIN_CLASS" tests "$file"
91171
}
92172

93173
cn1ss_verify_png() {
@@ -181,7 +261,7 @@ cn1ss_post_pr_comment() {
181261
fi
182262
body_size=$(wc -c < "$body_file" 2>/dev/null || echo 0)
183263
cn1ss_log "Attempting to post PR comment (payload bytes=${body_size})"
184-
GITHUB_TOKEN="$comment_token" cn1ss_java_source "$CN1SS_POST_COMMENT_CLASS" \
264+
GITHUB_TOKEN="$comment_token" cn1ss_java_run "$CN1SS_POST_COMMENT_CLASS" \
185265
--body "$body_file" \
186266
--preview-dir "$preview_dir"
187267
local rc=$?

scripts/run-android-instrumentation-tests.sh

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,20 +268,26 @@ done
268268
COMPARE_JSON="$SCREENSHOT_TMP_DIR/screenshot-compare.json"
269269
export CN1SS_PREVIEW_DIR="$SCREENSHOT_PREVIEW_DIR"
270270
ra_log "STAGE:COMPARE -> Evaluating screenshots against stored references"
271-
"$JAVA17_BIN" "$CN1SS_SOURCE_PATH/$PROCESS_SCREENSHOTS_CLASS.java" \
271+
if ! cn1ss_java_run "$PROCESS_SCREENSHOTS_CLASS" \
272272
--reference-dir "$SCREENSHOT_REF_DIR" \
273273
--emit-base64 \
274274
--preview-dir "$SCREENSHOT_PREVIEW_DIR" \
275-
"${COMPARE_ARGS[@]}" > "$COMPARE_JSON"
275+
"${COMPARE_ARGS[@]}" > "$COMPARE_JSON"; then
276+
ra_log "FATAL: Screenshot comparison helper failed"
277+
exit 13
278+
fi
276279

277280
SUMMARY_FILE="$SCREENSHOT_TMP_DIR/screenshot-summary.txt"
278281
COMMENT_FILE="$SCREENSHOT_TMP_DIR/screenshot-comment.md"
279282

280283
ra_log "STAGE:COMMENT_BUILD -> Rendering summary and PR comment markdown"
281-
"$JAVA17_BIN" "$CN1SS_SOURCE_PATH/$RENDER_SCREENSHOT_REPORT_CLASS.java" \
284+
if ! cn1ss_java_run "$RENDER_SCREENSHOT_REPORT_CLASS" \
282285
--compare-json "$COMPARE_JSON" \
283286
--comment-out "$COMMENT_FILE" \
284-
--summary-out "$SUMMARY_FILE"
287+
--summary-out "$SUMMARY_FILE"; then
288+
ra_log "FATAL: Failed to render screenshot summary/comment"
289+
exit 14
290+
fi
285291

286292
if [ -s "$SUMMARY_FILE" ]; then
287293
ra_log " -> Wrote summary entries to $SUMMARY_FILE ($(wc -l < "$SUMMARY_FILE" 2>/dev/null || echo 0) line(s))"

scripts/run-ios-ui-tests.sh

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,20 +299,26 @@ done
299299
COMPARE_JSON="$SCREENSHOT_TMP_DIR/screenshot-compare.json"
300300
export CN1SS_PREVIEW_DIR="$SCREENSHOT_PREVIEW_DIR"
301301
ri_log "STAGE:COMPARE -> Evaluating screenshots against stored references"
302-
"$JAVA17_BIN" "$CN1SS_SOURCE_PATH/$PROCESS_SCREENSHOTS_CLASS.java" \
302+
if ! cn1ss_java_run "$PROCESS_SCREENSHOTS_CLASS" \
303303
--reference-dir "$SCREENSHOT_REF_DIR" \
304304
--emit-base64 \
305305
--preview-dir "$SCREENSHOT_PREVIEW_DIR" \
306-
"${COMPARE_ARGS[@]}" > "$COMPARE_JSON"
306+
"${COMPARE_ARGS[@]}" > "$COMPARE_JSON"; then
307+
ri_log "FATAL: Screenshot comparison helper failed"
308+
exit 13
309+
fi
307310

308311
SUMMARY_FILE="$SCREENSHOT_TMP_DIR/screenshot-summary.txt"
309312
COMMENT_FILE="$SCREENSHOT_TMP_DIR/screenshot-comment.md"
310313

311314
ri_log "STAGE:COMMENT_BUILD -> Rendering summary and PR comment markdown"
312-
"$JAVA17_BIN" "$CN1SS_SOURCE_PATH/$RENDER_SCREENSHOT_REPORT_CLASS.java" \
315+
if ! cn1ss_java_run "$RENDER_SCREENSHOT_REPORT_CLASS" \
313316
--compare-json "$COMPARE_JSON" \
314317
--comment-out "$COMMENT_FILE" \
315-
--summary-out "$SUMMARY_FILE"
318+
--summary-out "$SUMMARY_FILE"; then
319+
ri_log "FATAL: Failed to render screenshot summary/comment"
320+
exit 14
321+
fi
316322

317323
if [ -s "$SUMMARY_FILE" ]; then
318324
ri_log " -> Wrote summary entries to $SUMMARY_FILE ($(wc -l < "$SUMMARY_FILE" 2>/dev/null || echo 0) line(s))"

0 commit comments

Comments
 (0)