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 <ashishkumar.mishra@bmwtechworks.in>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
AshishKumar Mishra 2025-11-06 14:44:10 +05:30 committed by Khem Raj
parent 78e81c6390
commit 96b97c0c64
No known key found for this signature in database
GPG Key ID: BB053355919D3314
4 changed files with 189 additions and 2 deletions

View File

@ -16,6 +16,7 @@ PTESTS_FAST_META_OE = "\
function2 \
fwupd \
gcab \
imagemagick \
jemalloc \
jq \
leveldb \

View File

@ -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}

View File

@ -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 ]

View File

@ -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<pver>([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"