imagemagick: adds ptest for imagemagick recipe

Backport of the commit 96b97c0c64 from master

This patch enables ptest for imagemagick, improving test coverage for
continuous integration and runtime validation.
No functional changes are introduced to the core package.

The logic used is :
- We check if the required tools are present or not
- We used convert 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>

Adapted to Kirkstone.
Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
This commit is contained in:
AshishKumar Mishra
2025-11-18 11:58:14 +01:00
committed by Gyorgy Sarvari
parent 4ae2ec4620
commit fb79c60c57
3 changed files with 178 additions and 1 deletions
@@ -0,0 +1,128 @@
#!/bin/sh
#
# ImageMagick ptest:
# We ceate an BASERGB file for our usage using "convert"
# We convert this RGB file to BASEPNG
# Using BASEPNG we recreate RGB named REGENERATEDRGB
#
# BASERGB to BASEPNG to REGENERATEDRGB
# - Then compare BASERGB with REGENERATEDRGB
#
# 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 convert 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
convert -size ${WIDTH}x${HEIGHT} -depth 8 -type TrueColor \
-alpha off -define png:color-type=2 \
-strip -set gamma 1.0 \
gradient:red-blue rgb:${BASERGB}
returnvalue=$?
if [ "$returnvalue" -ne 0 ]; then
echo "[FAIL] Failed to generate RGB pattern "
exit 1
else
echo "[DEBUG] Generated raw RGB ${BASERGB} for test case"
fi
# Convert raw RGB to PNG
convert -size ${WIDTH}x${HEIGHT} -depth 8 -type TrueColor \
-alpha off -define png:color-type=2 \
-strip -set gamma 1.0 \
rgb:${BASERGB} ${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
convert -size ${WIDTH}x${HEIGHT} -depth 8 -type TrueColor \
-alpha off -define png:color-type=2 \
-strip -set gamma 1.0 \
${BASEPNG} rgb:${REGENERATEDRGB}
returnvalue=$?
if [ $returnvalue -ne 0 ]; then
echo "[FAIL] Failed to re generate 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}
@@ -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 ]
@@ -12,6 +12,8 @@ DEPENDS = "lcms bzip2 jpeg libpng tiff zlib fftw freetype libtool"
BASE_PV := "${PV}"
PV .= "-62"
SRC_URI = "git://github.com/ImageMagick/ImageMagick.git;branch=main;protocol=https \
file://run-ptest \
file://imagemagick-ptest.sh \
file://CVE-2021-20309.patch \
file://CVE-2021-20310.patch \
file://CVE-2021-3610.patch \
@@ -39,7 +41,11 @@ CVE_CHECK_IGNORE += "CVE-2016-7538"
# current version is not affected by the CVE which affects versions at least earlier than 7.0.4-4
CVE_CHECK_IGNORE += "CVE-2017-5506"
inherit autotools pkgconfig update-alternatives
inherit autotools pkgconfig update-alternatives ptest
do_install_ptest() {
install -m 0755 ${WORKDIR}/imagemagick-ptest.sh ${D}${PTEST_PATH}/
}
# xml disabled because it's using xml2-config --prefix to determine prefix which returns just /usr with our libxml2
# if someone needs xml support then fix it first