Add test for PNG files

Test various image and formats.
The idea is to decode and encode again an image and
check for differences. ImageMagick is used to create
some test image and compare results.
Wine is used to execute a test helper.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
This commit is contained in:
Frediano Ziglio 2017-07-14 12:42:45 +01:00
parent 868d347b91
commit fd4ea9fa36
3 changed files with 160 additions and 0 deletions

View File

@ -68,6 +68,26 @@ vdservice_rc.$(OBJEXT): vdservice/vdservice.rc
MAINTAINERCLEANFILES += vdservice_rc.$(OBJEXT)
check_PROGRAMS = imagetest
imagetest_LDADD = $(LIBPNG_LIBS) $(ZLIB_LIBS) -lwtsapi32 -lgdi32
imagetest_CXXFLAGS = $(AM_CXXFLAGS) $(LIBPNG_CFLAGS)
imagetest_LDFLAGS = $(AM_LDFLAGS) -Wl,--subsystem,console
imagetest_SOURCES = \
common/vdcommon.cpp \
common/vdcommon.h \
common/vdlog.cpp \
common/vdlog.h \
vdagent/imagetest.cpp \
vdagent/image.cpp \
vdagent/image.h \
vdagent/imagepng.cpp \
vdagent/imagepng.h \
$(NULL)
TESTS = test-png
EXTRA_DIST += test-png
deps.txt:
$(AM_V_GEN)rpm -qa | grep $(host_os) | sort | unix2dos > $@

58
test-png Executable file
View File

@ -0,0 +1,58 @@
#!/bin/bash
VERBOSE=${VERBOSE:-0}
IN=in.png
OUT=out.png
OUT_BMP=out.bmp
error() {
echo "$*" >&2
exit 1
}
verbose() {
if [ $VERBOSE != 0 ]; then
"$@"
fi
}
compare_images() {
DIFF=$(compare -metric AE $1 $2 - 2>&1 > /dev/null || true)
if [ "$DIFF" != "0" ]; then
error "Images $1 and $2 are too different, diff $DIFF"
fi
}
do_test() {
echo "Running image $IMAGE with '$*'..."
convert $IMAGE "$@" $IN
wine imagetest.exe $IN $OUT_BMP $OUT
verbose ls -lh $IN
verbose identify $IN
verbose identify $OUT_BMP
compare_images $IN $OUT
compare_images $IN $OUT_BMP
rm -f $IN $OUT $OUT_BMP
}
do_test_all() {
IMAGE="$1"
do_test
do_test -type Palette
do_test -type Palette -colors 14
do_test -type Palette -colors 3
do_test -type TrueColor
do_test -type Grayscale -depth 8
do_test -type Grayscale -depth 2
do_test -type Grayscale -depth 4
}
set -e
# test with small image
do_test_all rose:
# test with larger image
do_test_all logo:
rm -f $IN $OUT $OUT_BMP
verbose echo Finish

82
vdagent/imagetest.cpp Normal file
View File

@ -0,0 +1,82 @@
/*
Copyright (C) 2017 Red Hat, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#undef NDEBUG
#include <assert.h>
#include <vector>
#include "vdcommon.h"
#include "image.h"
#include "imagepng.h"
int main(int argc, char **argv)
{
ImageCoder *coder = create_png_coder();
assert(coder);
if (argc < 2) {
fprintf(stderr, "Usage: %s <in-image> [<out-bmp> [<out-png>]]\n", argv[0]);
return 1;
}
// read all file into memory
FILE *f = fopen(argv[1], "rb");
assert(f);
assert(fseek(f, 0, SEEK_END) == 0);
long len = ftell(f);
assert(len > 0);
assert(fseek(f, 0, SEEK_SET) == 0);
std::vector<uint8_t> data(len);
assert(fread(&data[0], 1, len, f) == (unsigned long) len);
fclose(f);
size_t dib_size = coder->get_dib_size(&data[0], len);
assert(dib_size);
std::vector<uint8_t> out(dib_size);
memset(&out[0], 0xcc, dib_size);
coder->get_dib_data(&out[0], &data[0], len);
// looks like many tools wants this header so craft it
BITMAPFILEHEADER head;
memset(&head, 0, sizeof(head));
head.bfType = 'B'+'M'*256u;
head.bfSize = sizeof(head) + dib_size;
BITMAPINFOHEADER& info(*(BITMAPINFOHEADER*)&out[0]);
head.bfOffBits = sizeof(head) + sizeof(BITMAPINFOHEADER) + 4 * info.biClrUsed;
f = fopen(argc > 2 ? argv[2] : "out.bmp", "wb");
assert(f);
assert(fwrite(&head, 1, sizeof(head), f) == sizeof(head));
assert(fwrite(&out[0], 1, dib_size, f) == dib_size);
fclose(f);
// convert back to PNG
long png_size = 0;
uint8_t *png = coder->from_bitmap(*((BITMAPINFO*)&out[0]), &out[sizeof(BITMAPINFOHEADER) + 4 * info.biClrUsed], png_size);
assert(png && png_size > 0);
f = fopen(argc > 3 ? argv[3] : "out.png", "wb");
assert(f);
assert(fwrite(png, 1, png_size, f) == (unsigned long) png_size);
fclose(f);
free(png);
png = NULL;
return 0;
}