1#!@SHELL@
2
3retval=0
4
5if [ -z "$srcdir" -o "$srcdir" = "." ] ; then
6    sdir=`pwd`
7elif [ -n "`echo $srcdir |grep '^/'`" ] ; then
8    sdir="$srcdir"
9else
10    sdir="`pwd`/$srcdir"
11fi
12
13if [ -z "$STP_DATA_PATH" ] ; then
14    STP_DATA_PATH="$sdir/../xml"
15    export STP_DATA_PATH
16fi
17
18if [ -z "$STP_MODULE_PATH" ] ; then
19    STP_MODULE_PATH="$sdir/../main:$sdir/../main/.libs"
20    export STP_MODULE_PATH
21fi
22
23single=''
24all_models=''
25verbose=''
26make_ppds=1
27md5dir=''
28outdir=''
29cupsargs=''
30
31usage() {
32    echo "Usage: test-rastertogutenprint [-s] [-v|--valgrind]"
33    exit 0;
34}
35
36set_args() {
37    while true ; do
38	case "$1" in
39	    -s) single=1 ;;
40	    -h*|--h*) usage ;;
41	    -v|--valgrind) valopts='--tool=memcheck' ; valgrind=`expr $valgrind + 1` ;;
42	    -c|--cachegrind) valopts='--tool=cachegrind'; valgrind=4 ;;
43	    -g|--gdb-attach) valopts='--gdb-attach=yes' ;;
44	    -V|--verbose) verbose=1 ;;
45	    -n|--no-make-ppds) make_ppds='' ;;
46	    -O|--output) shift; outdir="$1" ;;
47	    -o|--option) shift; cupsargs="$cupsargs $1" ;;
48	    -m|--md5dir) shift; md5dir="$1" ;;
49	    --) shift; args="$@"; return ;;
50	    *) return ;;
51	esac
52    shift
53    done
54}
55
56set_args `getopt vcgsVnO:m:o: "$@"`
57
58if [ -n "$outdir" -a ! -d "$outdir" ] ; then
59    mkdir -p "$outdir"
60fi
61if [ -n "$md5dir" -a ! -d "$md5dir" ] ; then
62    mkdir -p "$md5dir"
63fi
64
65version="@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@";
66cupsdir="@cups_conf_serverbin@/filter"
67if [ -x "$cupsdir/pstoraster" -o -x "$cupsdir/cgpdftoraster" ] ; then
68    pages='page-ranges=24-26 '
69else
70    pages=''
71fi
72
73if [ ! -x "$cupsdir/cgpdftoraster" -a ! -x "$cupsdir/pdftops" ] ; then
74    echo 'CUPS does not appear to be installed, skipping test'
75    exit 0
76fi
77
78cleanup() {
79    if [ -f "$tfile" ] ; then
80	rm -f $tfile
81    fi
82    exit 1
83}
84
85pdftops="`type -p pdftops`"
86
87if [ ! -n "$pdftops" -o ! -x "$pdftops" ] ; then
88    pdftops="`whence pdftops`"
89fi
90
91if [ -n "$pdftops" -a ! -x "$cupsdir/cgpdftoraster" ] ; then
92    tfile=`mktemp`
93    trap cleanup 1 2 3 6 14 15 30
94    $pdftops -f 24 -l 26 "$sdir/../../doc/gutenprint-users-manual.pdf" $tfile
95fi
96
97if [ -z "$verbose" ] ; then
98    STP_SUPPRESS_MESSAGES=1
99    export STP_SUPPRESS_MESSAGES
100fi
101
102is_duplicate() {
103    model=`gunzip -c "$1" | grep '^.StpDriverModelFamily' | awk '{print $2}'`
104    for m in $all_models; do
105	if [ "$model" = "$m" ] ; then
106	    skip=1
107	fi
108    done
109    all_models="$model $all_models"
110}
111
112# Note that using CUPS arguments may trigger valgrind memory leaks in
113# CUPS.
114#cupsargs='PageSize=Custom.400.00x500.00'
115#cupsargs='PageSize=Custom.324x495 Resolution=180dpi'
116#cupsargs='PageSize=w324h495 Resolution=180dpi'
117#cupsargs='PageSize=A8'
118
119run_rastertogp() {
120    case "$valgrind" in
121	1) valgrind $valopts -q --num-callers=100 --leak-check=yes --error-limit=no ./rastertogutenprint.$version 1 1 1 1 "$cupsargs" ;;
122	2) valgrind $valopts --num-callers=100 --leak-resolution=high --leak-check=yes --error-limit=no ./rastertogutenprint.$version 1 1 1 1 "$cupsargs" ;;
123	3) valgrind $valopts --error-limit=no --num-callers=100 --show-reachable=yes --leak-resolution=high --leak-check=yes ./rastertogutenprint.$version 1 1 1 1 "$cupsargs" ;;
124	4) valgrind $valopts ./rastertogutenprint.$version 1 1 1 1 "$cupsargs" ;;
125	*) ./rastertogutenprint.$version 1 1 1 1 "$cupsargs" ;;
126    esac
127    if [ $? -ne 0 ] ; then
128	retval=1
129    fi
130    exit $retval
131}
132
133get_ppds() {
134    args="$@"
135    if [ -n "$args" ] ; then
136	for f in "$@" ; do
137	    if [ -r "$f" ] ; then
138		echo $f
139	    elif [ -r "ppd/C/$f" ] ; then
140		echo "ppd/C/$f"
141	    elif [ -f "ppd/C/${f}.ppd" ] ; then
142		echo "ppd/C/${f}.ppd"
143	    elif [ -f "ppd/C/${f}.ppd.gz" ] ; then
144		echo "ppd/C/${f}.ppd.gz"
145	    elif [ -f "ppd/C/${f}.ppd.GZ" ] ; then
146		echo "ppd/C/${f}.ppd.GZ"
147	    elif [ -f "ppd/C/${f}.ppd.bz2" ] ; then
148		echo "ppd/C/${f}.ppd.bz2"
149	    elif [ -f "ppd/C/${f}.ppd.BZ2" ] ; then
150		echo "ppd/C/${f}.ppd.BZ2"
151	    elif [ -f "ppd/C/${f}.ppd.z" ] ; then
152		echo "ppd/C/${f}.ppd.z"
153	    elif [ -f "ppd/C/${f}.ppd.Z" ] ; then
154		echo "ppd/C/${f}.ppd.Z"
155	    elif [ -f "ppd/C/stp-${f}.ppd" ] ; then
156		echo "ppd/C/stp-${f}.ppd"
157	    elif [ -f "ppd/C/stp-${f}.ppd.gz" ] ; then
158		echo "ppd/C/stp-${f}.ppd.gz"
159	    elif [ -f "ppd/C/stp-${f}.ppd.GZ" ] ; then
160		echo "ppd/C/stp-${f}.ppd.GZ"
161	    elif [ -f "ppd/C/stp-${f}.ppd.bz2" ] ; then
162		echo "ppd/C/stp-${f}.ppd.bz2"
163	    elif [ -f "ppd/C/stp-${f}.ppd.BZ2" ] ; then
164		echo "ppd/C/stp-${f}.ppd.BZ2"
165	    elif [ -f "ppd/C/stp-${f}.ppd.z" ] ; then
166		echo "ppd/C/stp-${f}.ppd.z"
167	    elif [ -f "ppd/C/stp-${f}.ppd.Z" ] ; then
168		echo "ppd/C/stp-${f}.ppd.Z"
169	    elif [ -f "ppd/C/stp-${f}.${version}.ppd" ] ; then
170		echo "ppd/C/stp-${f}.${version}.ppd"
171	    elif [ -f "ppd/C/stp-${f}.${version}.ppd.gz" ] ; then
172		echo "ppd/C/stp-${f}.${version}.ppd.gz"
173	    elif [ -f "ppd/C/stp-${f}.${version}.ppd.GZ" ] ; then
174		echo "ppd/C/stp-${f}.${version}.ppd.GZ"
175	    elif [ -f "ppd/C/stp-${f}.${version}.ppd.bz2" ] ; then
176		echo "ppd/C/stp-${f}.${version}.ppd.bz2"
177	    elif [ -f "ppd/C/stp-${f}.${version}.ppd.BZ2" ] ; then
178		echo "ppd/C/stp-${f}.${version}.ppd.BZ2"
179	    elif [ -f "ppd/C/stp-${f}.${version}.ppd.z" ] ; then
180		echo "ppd/C/stp-${f}.${version}.ppd.z"
181	    elif [ -f "ppd/C/stp-${f}.${version}.ppd.Z" ] ; then
182		echo "ppd/C/stp-${f}.${version}.ppd.Z"
183	    fi
184	done
185    else
186	echo ppd/C/*.ppd*
187    fi
188}
189
190if [ -n "$make_ppds" -o ! -d ppd/C ] ; then
191    make ppd-nonls
192## Not all systems can work with gzipped PPDs
193    find ppd/C -name '*.ppd.gz' | xargs gunzip -f
194fi
195
196do_output() {
197    if [ -n "`echo "$PPD" |grep '\.gz$'`" ] ; then
198	driver=`gunzip -c "$PPD" | grep '^\*StpDriverName:' |awk '{print $2}' | sed 's/"//g'`
199    else
200	driver=`grep '^\*StpDriverName:' "$PPD" |awk '{print $2}' | sed 's/"//g'`
201    fi
202    if [ -n "$outdir" ] ; then
203	cat > "$outdir/$driver.prn"
204	if [ -n "$md5dir" ] ; then
205	    (cd "$outdir"; cat "$driver.prn") | md5sum | sed "s/-/\*$driver/" > "$md5dir/$driver.md5"
206	fi
207    elif [ -n "$md5dir" ] ; then
208	cat | md5sum | sed "s/-/\*$driver/" > "$md5dir/$driver.md5"
209    else
210	cat > /dev/null
211    fi
212}
213
214if [ -d ppd/C ] ; then
215    for f in `get_ppds $args` ; do
216	skip=''
217	if [ -n "$single" ] ; then
218	    is_duplicate $f
219	fi
220	if [ -z "$skip" ] ; then
221	    echo "$f "
222	    PPD=$f
223	    export PPD
224	    if [ -x "$cupsdir/cgpdftoraster" ] ; then
225		output="`($cupsdir/cgpdftoraster 1 1 1 1 $pages < $sdir/../../doc/gutenprint-users-manual.pdf 2>/dev/null | run_rastertogp | do_output) 2>&1`"
226	    elif [ -f "$tfile" ] ; then
227		output="`($cupsdir/pstops 1 1 1 1 \"$cupsargs\" < $tfile 2>/dev/null | $cupsdir/pstoraster 2>/dev/null | run_rastertogp | do_output) 2>&1`"
228	    elif [ -x "$cupsdir/pstoraster" ] ; then
229		output="`($cupsdir/pdftops 1 1 1 1 \"$pages$cupsargs\" < $sdir/../../doc/gutenprint-users-manual.pdf 2>/dev/null | $cupsdir/pstops 1 1 1 1 \"$pages$cupsargs\" 2>/dev/null | $cupsdir/pstoraster 2>/dev/null | run_rastertogp | do_output) 2>&1`"
230	    else
231		output="`($cupsdir/imagetoraster 1 1 1 1 \"$pages$cupsargs\" < calibrate.ppm 2>/dev/null | run_rastertogp | do_output) 2>&1`"
232	    fi
233	    if [ $? -ne 0 ] ; then
234		retval=1
235	    fi
236	    echo "$output"
237	    echo "$output" |grep ERROR
238	    if [ $? -eq 0 ] ; then
239		retval=1
240	    fi
241	fi
242    done
243fi
244if [ -f "$tfile" ] ; then
245    rm -f $tfile
246fi
247exit $retval
248