diff --git a/src/modules/fullpageos/start_chroot_script b/src/modules/fullpageos/start_chroot_script index cb17ef6..37fdc07 100755 --- a/src/modules/fullpageos/start_chroot_script +++ b/src/modules/fullpageos/start_chroot_script @@ -108,8 +108,39 @@ then fi # Add emoji support -sudo -u pi mkdir -p /home/pi/.fonts -sudo -u pi wget --directory-prefix /home/pi/.fonts https://github.com/googlefonts/noto-emoji/raw/main/fonts/NotoColorEmoji.ttf +apt-get install -y fonts-noto-color-emoji fontconfig +mkdir -p /etc/fonts/conf.d +cat > /etc/fonts/conf.d/99-fullpageos-emoji.conf <<'EOF' + + + + + + sans-serif + + + Noto Color Emoji + + + + + serif + + + Noto Color Emoji + + + + + monospace + + + Noto Color Emoji + + + +EOF +fc-cache -f #override password if [ "$FULLPAGEOS_OVERRIDE_PASSWORD" != "default" ] diff --git a/testing/tests/test_emoji.sh b/testing/tests/test_emoji.sh new file mode 100755 index 0000000..ef6e515 --- /dev/null +++ b/testing/tests/test_emoji.sh @@ -0,0 +1,112 @@ +#!/bin/bash +set -e + +export E2E_SSH_HOST="${1:-localhost}" +export E2E_SSH_PORT="${2:-2222}" +ARTIFACTS_DIR="${3:-}" +source /test/scripts/ssh-helpers.sh + +TMP_DIR=$(mktemp -d) +trap 'rm -rf "$TMP_DIR"' EXIT + +HTML_FILE="$TMP_DIR/emoji-cloud.html" +SCREENSHOT_FILE="$TMP_DIR/emoji-cloud.png" +COUNTS_FILE="$TMP_DIR/emoji-cloud-pixel-counts.txt" + +cat > "$HTML_FILE" <<'HTML' + + + + + + + +
☁️
+ + +HTML + +echo "Test: Chromium renders the cloud emoji in color" + +echo " Checking Noto Color Emoji font availability..." +FONT_MATCH=$(ssh_cmd "fc-match 'Noto Color Emoji' || true" 2>/dev/null) +if ! echo "$FONT_MATCH" | grep -qi "NotoColorEmoji\|Noto Color Emoji"; then + echo " FAIL: Noto Color Emoji is not available to fontconfig" + echo " fc-match output: $FONT_MATCH" + exit 1 +fi + +echo " Rendering emoji fixture with Chromium headless..." +scp_cmd "$HTML_FILE" "pi@${E2E_SSH_HOST}:/tmp/emoji-cloud.html" >/dev/null +ssh_cmd "rm -rf /tmp/emoji-chromium-profile /tmp/emoji-cloud.png && sudo -u pi env HOME=/home/pi chromium --headless --disable-gpu --no-sandbox --disable-dev-shm-usage --hide-scrollbars --run-all-compositor-stages-before-draw --virtual-time-budget=1000 --user-data-dir=/tmp/emoji-chromium-profile --screenshot=/tmp/emoji-cloud.png --window-size=400,240 file:///tmp/emoji-cloud.html" >/dev/null +scp_cmd "pi@${E2E_SSH_HOST}:/tmp/emoji-cloud.png" "$SCREENSHOT_FILE" >/dev/null + +if [ -n "$ARTIFACTS_DIR" ]; then + mkdir -p "$ARTIFACTS_DIR" + cp "$HTML_FILE" "$ARTIFACTS_DIR/emoji-cloud.html" + cp "$SCREENSHOT_FILE" "$ARTIFACTS_DIR/emoji-cloud.png" +fi + +read -r NON_BACKGROUND_PIXELS CHROMATIC_PIXELS < <( + convert "$SCREENSHOT_FILE" -alpha off -depth 8 txt:- | awk -F'[(),]' ' + NR > 1 { + r = $3 + 0 + g = $4 + 0 + b = $5 + 0 + + dr = r - 16; if (dr < 0) dr = -dr + dg = g - 24; if (dg < 0) dg = -dg + db = b - 40; if (db < 0) db = -db + + max = r; if (g > max) max = g; if (b > max) max = b + min = r; if (g < min) min = g; if (b < min) min = b + + if (dr > 8 || dg > 8 || db > 8) { + non_background++ + if (max - min >= 25) { + chromatic++ + } + } + } + END { + print non_background + 0, chromatic + 0 + }' +) + +echo "non_background_pixels=$NON_BACKGROUND_PIXELS chromatic_pixels=$CHROMATIC_PIXELS" > "$COUNTS_FILE" +if [ -n "$ARTIFACTS_DIR" ]; then + cp "$COUNTS_FILE" "$ARTIFACTS_DIR/emoji-cloud-pixel-counts.txt" +fi + +if [ "$NON_BACKGROUND_PIXELS" -lt 1500 ]; then + echo " FAIL: Cloud emoji was not visibly rendered (non-background pixels: $NON_BACKGROUND_PIXELS)" + exit 1 +fi + +if [ "$CHROMATIC_PIXELS" -lt 50 ]; then + echo " FAIL: Cloud emoji rendered without enough color pixels (chromatic pixels: $CHROMATIC_PIXELS)" + exit 1 +fi + +echo " PASS: Cloud emoji rendered visibly in color"