From 96b97c0c6490b713b559a4e82bd699a2ebe357d3 Mon Sep 17 00:00:00 2001 From: AshishKumar Mishra Date: Thu, 6 Nov 2025 14:44:10 +0530 Subject: [PATCH] imagemagick: adds ptest for imagemagick The logic used is : - We check if the required tools are present or not - We used magick to create an raw RGB file - The created RGB is then converted to PNG using convert - We re-gerenate RGB from PNG and compare the original and re-generated RGB - Enabled the ptest in ptest-packagelists-meta-oe.inc as suggested by Gyorgy Sarvari and incorporated logging suggestion - This was done as standard imagemagick test like drawtest requires manual internetion to verify the file Signed-off-by: AshishKumar Mishra Signed-off-by: Khem Raj --- .../include/ptest-packagelists-meta-oe.inc | 1 + .../imagemagick/imagemagick-ptest.sh | 132 ++++++++++++++++++ .../imagemagick/imagemagick/run-ptest | 43 ++++++ .../imagemagick/imagemagick_7.1.2-8.bb | 15 +- 4 files changed, 189 insertions(+), 2 deletions(-) create mode 100755 meta-oe/recipes-support/imagemagick/imagemagick/imagemagick-ptest.sh create mode 100644 meta-oe/recipes-support/imagemagick/imagemagick/run-ptest diff --git a/meta-oe/conf/include/ptest-packagelists-meta-oe.inc b/meta-oe/conf/include/ptest-packagelists-meta-oe.inc index 0a5bbf5fe5..a685510359 100644 --- a/meta-oe/conf/include/ptest-packagelists-meta-oe.inc +++ b/meta-oe/conf/include/ptest-packagelists-meta-oe.inc @@ -16,6 +16,7 @@ PTESTS_FAST_META_OE = "\ function2 \ fwupd \ gcab \ + imagemagick \ jemalloc \ jq \ leveldb \ diff --git a/meta-oe/recipes-support/imagemagick/imagemagick/imagemagick-ptest.sh b/meta-oe/recipes-support/imagemagick/imagemagick/imagemagick-ptest.sh new file mode 100755 index 0000000000..08595837d6 --- /dev/null +++ b/meta-oe/recipes-support/imagemagick/imagemagick/imagemagick-ptest.sh @@ -0,0 +1,132 @@ +#!/bin/sh +# +# ImageMagick ptest: +# We ceate an BASERGB file for our usage using "magick" +# We convert this RGB file to BASEPNG +# Using BASEPNG we recreate RGB named REGENERATEDRGB +# +# BASERGB to BASEPNG to REGENERATEDRGB +# - Then compare BASERGB with REGENERATEDRGB +# +# 0) The convert command is deprecated in IMv7 +# used "magick" instead of "convert" +# 1) We are checking if the binaries are present in RFS or not +# 2) We Created an RBG of size : WIDTH x HEIGHT pixels +# 3) Return value is captured after every major actio to capture the status +# 4) cmp -s is used to compare binary byte by byte data and +# capture only exit status +# 5) Important parametsrs used are : +# -depth : How many bits for each colour pixel +# -alpha off : Don't consider transparency +# -define png:color-type=2 : Make PNG work with truecolour RGB +# -strip : Remove all non-pixel metadata og PNG +# so file is reproducible +# -set gamma 1.0 : No PNG brightness correction +# gradient:red-blue : Data moves liberly from RED to Blue vertically + + +WIDTH=16 +HEIGHT=16 +BASERGB=base.rgb +BASEPNG=base.png +REGENERATEDRGB=roundtrip.rgb + +echo "[DEBUG] Starting ImageMagick Ptest with ${WIDTH}x${HEIGHT} pixels " + +# Verify required binaries +for bin in magick cmp wc rm; do + if [ -z "$(command -v "$bin" 2>/dev/null)" ]; then + echo "[ERROR] Required binary '$bin' not found $PATH" + exit 127 + fi +done + + +# Generate raw RGB +magick -size ${WIDTH}x${HEIGHT} gradient:red-blue \ + -depth 8 -type TrueColor \ + -alpha off -define png:color-type=2 \ + -strip -set gamma 1.0 \ + rgb:${BASERGB} + +returnvalue=$? +if [ "$returnvalue" -ne 0 ]; then + echo "[FAIL] Failed to generate RGB pattern " + exit 1 +else + echo "[DEBUG] ${BASERGB} generated from gradient" +fi + + +# Convert raw RGB to PNG +magick -depth 8 -size ${WIDTH}x${HEIGHT} rgb:${BASERGB} \ + -type TrueColor -alpha off \ + -define png:color-type=2 -strip -set gamma 1.0 \ + ${BASEPNG} + +returnvalue=$? +if [ $returnvalue -ne 0 ]; then + echo "[FAIL] Failed to convert RGB to PNG" + rm -f ${BASERGB} + exit 1 +else + echo "[DEBUG] ${BASEPNG} generated from ${BASERGB}" +fi + + + +# Regenerate raw RGB from PNG +magick ${BASEPNG} \ + -size ${WIDTH}x${HEIGHT} -depth 8 -type TrueColor \ + -alpha off -define png:color-type=2 \ + -strip -set gamma 1.0 \ + rgb:${REGENERATEDRGB} + +returnvalue=$? +if [ $returnvalue -ne 0 ]; then + echo "[FAIL] Failed to regenerate RGB from PNG" + rm -f ${BASERGB} ${BASEPNG} + exit 1 +else + echo "[DEBUG] ${REGENERATEDRGB} generated from ${BASEPNG}" +fi + + + +# Compare original and recreated RGB +if cmp -s ${BASERGB} ${REGENERATEDRGB}; then + echo "[PASS] RGB data identical after PNG round-trip" + RESULT=0 +else + echo "[FAIL] RGB mismatch detected, printing their size " + echo "[INFO] Base RGB size: $(wc -c < ${BASERGB}) bytes" + echo "[INFO] Round-trip RGB size: $(wc -c < ${REGENERATEDRGB}) bytes" + RESULT=1 +fi + + + +# Checking the identify tool from imagemagick to get the PNG metadata +# True is added in end to ensure that test script doesnt fail even if +# identify fails for any reason +echo "[DEBUG] PNG file info:" +identify -verbose ${BASEPNG} | grep -E "Depth|Type|Colorspace" || true + + + +# Cleanup of files create by test code +echo "[DEBUG] Cleaning up temporary files" +rm -f ${BASERGB} ${BASEPNG} ${REGENERATEDRGB} +returnvalue=$? +echo "[DEBUG] Cleanup exit=$returnvalue" + + +# Logging the final result +if [ ${RESULT} -eq 0 ]; then + echo "[DEBUG]: imagemagick-ptest.sh sucessfull " +else + echo "[DEBUG]: imagemagick-ptest.sh failed " +fi + + +exit ${RESULT} diff --git a/meta-oe/recipes-support/imagemagick/imagemagick/run-ptest b/meta-oe/recipes-support/imagemagick/imagemagick/run-ptest new file mode 100644 index 0000000000..75251a803f --- /dev/null +++ b/meta-oe/recipes-support/imagemagick/imagemagick/run-ptest @@ -0,0 +1,43 @@ +#!/bin/sh +# +# run-ptest — ImageMagick ptest harness +# POSIX-safe and BusyBox compatible + +PTDIR=$(dirname "$0") +TESTDIR="$PTDIR" +PASSCOUNT=0 +FAILCOUNT=0 +TOTAL=0 + +echo "=======================================" +echo "ImageMagick ptest: Runtime Validation" +echo "=======================================" + +for t in "$TESTDIR"/*.sh; do + [ -x "$t" ] || chmod +x "$t" + TOTAL=$((TOTAL + 1)) + echo + echo "[DEBUG] Launching test script $t" + + if sh "$t" 2>&1; then + echo "PASS: $(basename "$t")" + PASSCOUNT=$((PASSCOUNT + 1)) + else + rc=$? + if [ "$rc" -eq 77 ]; then + echo "SKIP: $(basename "$t")" + else + echo "FAIL: $(basename "$t")" + FAILCOUNT=$((FAILCOUNT + 1)) + fi + fi + +done + +echo +echo "=======================================" +echo "[SUMMARY] Total: $TOTAL | PASS: $PASSCOUNT | FAIL: $FAILCOUNT" +echo "=======================================" +echo +[ "$FAILCOUNT" -eq 0 ] + diff --git a/meta-oe/recipes-support/imagemagick/imagemagick_7.1.2-8.bb b/meta-oe/recipes-support/imagemagick/imagemagick_7.1.2-8.bb index f83adb15f2..b445ae8f62 100644 --- a/meta-oe/recipes-support/imagemagick/imagemagick_7.1.2-8.bb +++ b/meta-oe/recipes-support/imagemagick/imagemagick_7.1.2-8.bb @@ -12,11 +12,15 @@ DEPENDS = "lcms bzip2 jpeg libpng tiff zlib fftw freetype libtool" BASE_PV = "${@d.getVar('PV').split('-')[0]}" UPSTREAM_CHECK_GITTAGREGEX = "(?P([0-9][\.|_|-]?)+)" -SRC_URI = "git://github.com/ImageMagick/ImageMagick.git;branch=main;protocol=https;tag=${PV}" +SRC_URI = "git://github.com/ImageMagick/ImageMagick.git;branch=main;protocol=https;tag=${PV} \ + file://run-ptest \ + file://imagemagick-ptest.sh \ +" + SRCREV = "a3b13d143fd7dea44cd71d31aa02f411b597688f" -inherit autotools pkgconfig update-alternatives +inherit autotools pkgconfig update-alternatives ptest export ac_cv_sys_file_offset_bits = "64" EXTRA_OECONF = "--program-prefix= --program-suffix=.im7 --without-perl --enable-largefile" @@ -55,6 +59,13 @@ do_install:append:class-target() { fi } +do_install_ptest() { + install -d ${D}${PTEST_PATH} + install -m 0755 ${UNPACKDIR}/run-ptest ${D}${PTEST_PATH}/ + install -m 0755 ${UNPACKDIR}/imagemagick-ptest.sh ${D}${PTEST_PATH}/ +} + + FILES:${PN} += "${libdir}/ImageMagick-${BASE_PV}/config-Q16* \ ${datadir}/ImageMagick-7"