#!/bin/bash
#
# This file is part of rasdaman community.
#
# Rasdaman community 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 3 of the License, or
# (at your option) any later version.
#
# Rasdaman community 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 rasdaman community. If not, see .
#
# Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
# rasdaman GmbH.
#
# For more information please see
# or contact Peter Baumann via .
# test_ql-png-options.sh - test png(mdd,options) function of rasql
#
# SYNOPSIS:
# test_ql-png-options.sh
#
# DESCRIPTION
# Performs test queries to check whether transparency and background
# option works in function png(_,_).
#Write log to stdout/stderr for ???
# Does not test general image encoding!
#
# RESPONDING TO INCIDENT
# Incident_2005-07-12_IGN_png-transparency
#
# PROCEDURE
# - create test collections and objects
# - perform rasql calls, check output and, where applicable, the image generated
# check that (i) file is generated, (ii) has transparency color set appropriately
# - remove output files and test collections
#
# PRECONDITIONS
# - rasql binary available in the $RMANBASE/applications/rasql development directory
# - rasdaman up and running,
# - database allows write access using user/password as defined below
# - ImageMagick installed to have 'identify' utility
# - can create subdir in cwd
#
# RETURN CODES
RC_OK=0 # everything went fine
RC_ERROR=1 # something went wrong
#
# CHANGE HISTORY
# 2005-jul-26 P.Baumann created
# 2005-aug-25 P.Baumann use raiseError() to centralize bailout behavior
#
# COMMENTS
# - add test for INV_PNG()
#
# --- CONSTANTS -----------------------------------------------------
# textual representation of error conditions
RCTEXT_OK="OK"
RCTEXT_ERROR="NOT_OK"
# name of script
PROG=`basename $0`
# reference data directory
OLDDIR=./`basename $PROG .sh`.old
# temp dir for image files
TMPDIR=./`basename $PROG .sh`.test
# user/password (must have r/w rights!)
USER=rasadmin
PASSWD=rasadmin
# test collections for monochrome/gray/color images
TESTCOLL_MONO=TestPngMono
TESTCOLL_GRAY=TestPngGray
TESTCOLL_COLOR=TestPngColor
# the rasql utility, suppressing unnecessarily verbose output
RMANBASE=~rasdev/Compile/rasdaman
RASQL="$RMANBASE/applications/rasql/rasql --quiet"
# to get error messages (from $RMANHOME/bin/errtxts):
RMANHOME=$RMANBASE
# how to react on error
function raiseError() { echo "$PROG: fatal error, aborting."; exit $RC_ERROR; }
#function raiseError() { echo "$PROG: error in test; resuming."; RC=$RC_ERROR; }
# --- ACTION --------------------------------------------------------
echo "$PROG: test rasql PNG() function"
# --- preparation
echo "$PROG: create test dir"
mkdir -p $TMPDIR
# initialize overall return code
RC=$RC_OK
# --- cleanup to prepare
# delete test collection & image & temp data
$RASQL -q "drop collection $TESTCOLL_MONO" --user $USER --passwd $PASSWD
$RASQL -q "drop collection $TESTCOLL_GRAY" --user $USER --passwd $PASSWD
$RASQL -q "drop collection $TESTCOLL_COLOR" --user $USER --passwd $PASSWD
# create test collections
# - mono
$RASQL -q "create collection $TESTCOLL_MONO BoolSet" --user $USER --passwd $PASSWD || raiseError
# - gray
$RASQL -q "create collection $TESTCOLL_GRAY GreySet" --user $USER --passwd $PASSWD || raiseError
# - color
$RASQL -q "create collection $TESTCOLL_COLOR RGBSet" --user $USER --passwd $PASSWD || raiseError
# create test objects
# - mono
$RASQL -q "insert into $TESTCOLL_MONO values marray x in [0:3,0:3] values (x[0]+x[1]) = 1" --user $USER --passwd $PASSWD || raiseError
# - gray
$RASQL -q "insert into $TESTCOLL_GRAY values marray x in [0:3,0:3] values (char) (x[0]*x[1])" --user $USER --passwd $PASSWD || raiseError
# - color
$RASQL -q "insert into $TESTCOLL_COLOR values marray x in [0:3,0:3] values ((char)(x[0]*x[1]))*{1c,1c,1c}" --user $USER --passwd $PASSWD || raiseError
# --- tests
echo "$PROG: test good cases pf transp / non-transp, bg colors"
echo "$PROG: --- set bg to transparent"
echo "$PROG: --- --- mono"
echo "$PROG: --- --- --- dec"
$RASQL -q "select png(a,\"tRNS=0)\" ) from $TESTCOLL_MONO as a" --out file --outfile $TMPDIR/png-mono-trns_1 || raiseError
if [ `identify -verbose $TMPDIR/png-mono-trns_1.png | grep Opacity | grep 0 | wc -l` -eq 0 ]
then
echo "Error: transparency not set in PNG file $TMPDIR/pngmono-trns_1.png -- $RCTEXT_ERROR"
raiseError
fi
if [ ! `cmp -s $OLDDIR/png-mono-trns_1.png $TMPDIR/png-mono-trns_1.png` ]
then
echo "Error: PNG file contents in file $TMPDIR/pngmono-trns_1.png does not match regression source -- $RCTEXT_ERROR"
raiseError
fi
# ==== complete down here:
$RASQL -q "select png(a,\"tRNS=1)\" ) from $TESTCOLL_MONO as a" --out file --outfile $TMPDIR/png-mono-trns_2 || raiseError
echo "$PROG: --- --- gray"
echo "$PROG: --- --- --- dec"
$RASQL -q "select png(a,\"tRNS=0)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_1 || raiseError
$RASQL -q "select png(a,\"tRNS=2)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_2 || raiseError
$RASQL -q "select png(a,\"tRNS=255)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_3 || raiseError
echo "$PROG: --- --- --- oct"
$RASQL -q "select png(a,\"tRNS=00)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_4 || raiseError
$RASQL -q "select png(a,\"tRNS=02)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_5 || raiseError
$RASQL -q "select png(a,\"tRNS=07777)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_6 || raiseError
echo "$PROG: --- --- --- hex"
$RASQL -q "select png(a,\"tRNS=0x0)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_7 || raiseError
$RASQL -q "select png(a,\"tRNS=0x2)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_8 || raiseError
$RASQL -q "select png(a,\"tRNS=0xff)\" ) from $TESTCOLL_GRAY as a" --out file --outfile $TMPDIR/png-gray-trns_9 || raiseError
echo "$PROG: --- --- color"
echo "$PROG: --- --- --- dec"
$RASQL -q "select png(a,\"tRNS=(1;2;3)\" ) from $TESTCOLL_COLOR as a" --out file --outfile $TMPDIR/png-color-trns_1 || raiseError
echo "$PROG: --- --- --- hex"
$RASQL -q "select png(a,\"tRNS=(0x77;0xd0;0xf8)\" ) from rgb as a" --out file || raiseError
echo "$PROG: --- --- --- mixed"
$RASQL -q "select png(a,\"tRNS=(1;02;0x3)\" ) from $TESTCOLL_COLOR as a" --out file --outfile $TMPDIR/png-color-trns_10 || raiseError
echo "$PROG: test bad cases: syntax errors, overflow in bg colors"
echo "$PROG: --- tRNS tag wrong"
if [ `$RASQL -q "select png(a,\"XXX=(1;2;3)\" ) from $TESTCOLL_COLOR as a" 2>&1 | grep "Execution error 381" | wc -l` -ne 1 ]
then
echo "Error: cannot sense proper error message -- $RCTEXT_ERROR"
raiseError
fi
echo "$PROG: --- no number, gray"
if [ `$RASQL -q "select png(a,\"tRNS=zzz\" ) from $TESTCOLL_GRAY as a" 2>&1 | grep "Execution error 381" | wc -l` -ne 1 ]
then
echo "Error: cannot sense proper error message -- $RCTEXT_ERROR"
raiseError
fi
echo "$PROG: --- no number, color"
if [ `$RASQL -q "select png(a,\"tRNS=(q;w;s)\" ) from $TESTCOLL_GRAY as a" 2>&1 | grep "Execution error 381" | wc -l` -ne 1 ]
then
echo "Error: cannot sense proper error message -- $RCTEXT_ERROR"
raiseError
fi
echo "$PROG: --- color/gray mismatch"
if [ `$RASQL -q "select png(a,\"tRNS=12\" ) from $TESTCOLL_COLOR as a" 2>&1 | grep "Execution error 381" | wc -l` -ne 1 ]
then
echo "Error: cannot sense proper error message -- $RCTEXT_ERROR"
raiseError
fi
if [ `$RASQL -q "select png(a,\"tRNS=(1;2;3)\" ) from $TESTCOLL_GRAY as a" 2>&1 | grep "Execution error 381" | wc -l` -ne 1 ]
then
echo "Error: cannot sense proper error message -- $RCTEXT_ERROR"
raiseError
fi
echo "$PROG: --- paren error (not recognized currently)"
if [ `$RASQL -q "select png(a,\"tRNS=12;13;14)\" ) from $TESTCOLL_GRAY as a" 2>&1 | grep "Execution error 381" | wc -l` -ne 1 ]
then
echo "Error: cannot sense proper error message -- $RCTEXT_ERROR"
raiseError
fi
echo "$PROG: --- number overflow"
if [ `$RASQL -q "select png(a,\"tRNS=1000000000;2000000000;30000000000000)\" ) from $TESTCOLL_COLOR as a" 2>&1 | grep "Execution error 381" | wc -l` -ne 1 ]
then
echo "Error: cannot sense proper error message -- $RCTEXT_ERROR"
raiseError
fi
# compare files against old ones
for i in `(cd $TMPDIR; ls *.png)`
do
if [ `cmp -s $OLDDIR/$i $TMPDIR/$i` ]
then
echo "Error: regression discrepancy between files $OLDDIR/$i and $TMPDIR/$i -- $RCTEXT_ERROR"
fi
done
# --- cleanup and summarise
# delete test collection & image & temp data
$RASQL -q "drop collection $TESTCOLL_MONO" --user $USER --passwd $PASSWD || raiseError
$RASQL -q "drop collection $TESTCOLL_GRAY" --user $USER --passwd $PASSWD || raiseError
$RASQL -q "drop collection $TESTCOLL_COLOR" --user $USER --passwd $PASSWD || raiseError
if [ $RC -eq $RC_OK ]
then
rm -rf $TMPDIR
RCTEXT=$RCTEXT_OK
else
RCTEXT=$RCTEXT_ERROR
fi
echo $PROG: done, result is $RCTEXT.
exit $RC