• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2#
3# Perform the complete set of IPP compliance tests specified in the
4# CUPS Software Test Plan.
5#
6# Copyright © 2007-2019 by Apple Inc.
7# Copyright © 1997-2007 by Easy Software Products, all rights reserved.
8#
9# Licensed under Apache License v2.0.  See the file "LICENSE" for more
10# information.
11#
12
13argcount=$#
14
15#
16# Don't allow "make check" or "make test" to be run by root...
17#
18
19if test "x`id -u`" = x0; then
20	echo Please run this as a normal user. Not supported when run as root.
21	exit 1
22fi
23
24#
25# Force the permissions of the files we create...
26#
27
28umask 022
29
30#
31# Make the IPP test program...
32#
33
34make
35
36#
37# Solaris has a non-POSIX grep in /bin...
38#
39
40if test -x /usr/xpg4/bin/grep; then
41	GREP=/usr/xpg4/bin/grep
42else
43	GREP=grep
44fi
45
46#
47# Figure out the proper echo options...
48#
49
50if (echo "testing\c"; echo 1,2,3) | $GREP c >/dev/null; then
51        ac_n=-n
52        ac_c=
53else
54        ac_n=
55        ac_c='\c'
56fi
57
58#
59# Greet the tester...
60#
61
62echo "Welcome to the CUPS Automated Test Script."
63echo ""
64echo "Before we begin, it is important that you understand that the larger"
65echo "tests require significant amounts of RAM and disk space.  If you"
66echo "attempt to run one of the big tests on a system that lacks sufficient"
67echo "disk and virtual memory, the UNIX kernel might decide to kill one or"
68echo "more system processes that you've grown attached to, like the X"
69echo "server.  The question you may want to ask yourself before running a"
70echo "large test is: Do you feel lucky?"
71echo ""
72echo "OK, now that we have the Dirty Harry quote out of the way, please"
73echo "choose the type of test you wish to perform:"
74echo ""
75echo "0 - No testing, keep the scheduler running for me (all systems)"
76echo "1 - Basic conformance test, no load testing (all systems)"
77echo "2 - Basic conformance test, some load testing (minimum 256MB VM, 50MB disk)"
78echo "3 - Basic conformance test, extreme load testing (minimum 1GB VM, 500MB disk)"
79echo "4 - Basic conformance test, torture load testing (minimum 2GB VM, 1GB disk)"
80echo ""
81echo $ac_n "Enter the number of the test you wish to perform: [1] $ac_c"
82
83if test $# -gt 0; then
84	testtype=$1
85	shift
86else
87	read testtype
88fi
89echo ""
90
91case "$testtype" in
92	0)
93		echo "Running in test mode (0)"
94		nprinters=0
95		pjobs=0
96		pprinters=0
97		loglevel="debug2"
98		;;
99	2)
100		echo "Running the medium tests (2)"
101		nprinters=20
102		pjobs=20
103		pprinters=10
104		loglevel="debug"
105		;;
106	3)
107		echo "Running the extreme tests (3)"
108		nprinters=1000
109		pjobs=100
110		pprinters=50
111		loglevel="debug"
112		;;
113	4)
114		echo "Running the torture tests (4)"
115		nprinters=20000
116		pjobs=200
117		pprinters=100
118		loglevel="debug"
119		;;
120	*)
121		echo "Running the timid tests (1)"
122		nprinters=0
123		pjobs=10
124		pprinters=0
125		loglevel="debug2"
126		testtype="1"
127		;;
128esac
129
130#
131# See if we want to do SSL testing...
132#
133
134echo ""
135echo "Now you can choose whether to create a SSL/TLS encryption key and"
136echo "certificate for testing:"
137echo ""
138echo "0 - Do not do SSL/TLS encryption tests"
139echo "1 - Test but do not require encryption"
140echo "2 - Test and require encryption"
141echo ""
142echo $ac_n "Enter the number of the SSL/TLS tests to perform: [0] $ac_c"
143
144if test $# -gt 0; then
145	ssltype=$1
146	shift
147else
148	read ssltype
149fi
150echo ""
151
152case "$ssltype" in
153	1)
154		echo "Will test but not require encryption (1)"
155		;;
156	2)
157		echo "Will test and require encryption (2)"
158		;;
159	*)
160		echo "Not using SSL/TLS (0)"
161		ssltype=0
162		;;
163esac
164
165#
166# Information for the server/tests...
167#
168
169user="$USER"
170if test -z "$user"; then
171	if test -x /usr/ucb/whoami; then
172		user=`/usr/ucb/whoami`
173	else
174		user=`whoami`
175	fi
176
177	if test -z "$user"; then
178		user="unknown"
179	fi
180fi
181
182port="${CUPS_TESTPORT:=8631}"
183cwd=`pwd`
184root=`dirname $cwd`
185CUPS_TESTROOT="$root"; export CUPS_TESTROOT
186
187BASE="${CUPS_TESTBASE:=}"
188if test -z "$BASE"; then
189	if test -d /private/tmp; then
190		BASE=/private/tmp/cups-$user
191	else
192		BASE=/tmp/cups-$user
193	fi
194fi
195export BASE
196
197#
198# Make sure that the LPDEST and PRINTER environment variables are
199# not included in the environment that is passed to the tests.  These
200# will usually cause tests to fail erroneously...
201#
202
203unset LPDEST
204unset PRINTER
205
206#
207# See if we want to use valgrind...
208#
209
210echo ""
211echo "This test script can use the Valgrind software from:"
212echo ""
213echo "    http://developer.kde.org/~sewardj/"
214echo ""
215echo $ac_n "Enter Y to use Valgrind or N to not use Valgrind: [N] $ac_c"
216
217if test $# -gt 0; then
218	usevalgrind=$1
219	shift
220else
221	read usevalgrind
222fi
223echo ""
224
225case "$usevalgrind" in
226	Y* | y*)
227		VALGRIND="valgrind --tool=memcheck --log-file=$BASE/log/valgrind.%p --error-limit=no --leak-check=yes --trace-children=yes"
228		if test `uname` = Darwin; then
229			VALGRIND="$VALGRIND --dsymutil=yes"
230		fi
231		export VALGRIND
232		echo "Using Valgrind; log files can be found in $BASE/log..."
233		;;
234
235	*)
236		VALGRIND=""
237		export VALGRIND
238		;;
239esac
240
241#
242# See if we want to do debug logging of the libraries...
243#
244
245echo ""
246echo "If CUPS was built with the --enable-debug-printfs configure option, you"
247echo "can enable debug logging of the libraries."
248echo ""
249echo $ac_n "Enter Y or a number from 0 to 9 to enable debug logging or N to not: [N] $ac_c"
250
251if test $# -gt 0; then
252	usedebugprintfs=$1
253	shift
254else
255	read usedebugprintfs
256fi
257echo ""
258
259case "$usedebugprintfs" in
260	Y* | y*)
261		echo "Enabling debug printfs (level 5); log files can be found in $BASE/log..."
262		CUPS_DEBUG_LOG="$BASE/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
263		CUPS_DEBUG_LEVEL=5; export CUPS_DEBUG_LEVEL
264		CUPS_DEBUG_FILTER='^(http|_http|ipp|_ipp|cups.*Request|cupsGetResponse|cupsSend).*$'; export CUPS_DEBUG_FILTER
265		;;
266
267	0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)
268		echo "Enabling debug printfs (level $usedebugprintfs); log files can be found in $BASE/log..."
269		CUPS_DEBUG_LOG="$BASE/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
270		CUPS_DEBUG_LEVEL="$usedebugprintfs"; export CUPS_DEBUG_LEVEL
271		CUPS_DEBUG_FILTER='^(http|_http|ipp|_ipp|cups.*Request|cupsGetResponse|cupsSend|mime).*$'; export CUPS_DEBUG_FILTER
272		;;
273
274	*)
275		;;
276esac
277
278#
279# Start by creating temporary directories for the tests...
280#
281
282echo "Creating directories for test..."
283
284rm -rf $BASE
285mkdir $BASE
286mkdir $BASE/bin
287mkdir $BASE/bin/backend
288mkdir $BASE/bin/driver
289mkdir $BASE/bin/filter
290mkdir $BASE/certs
291mkdir $BASE/share
292mkdir $BASE/share/banners
293mkdir $BASE/share/drv
294mkdir $BASE/share/locale
295for file in ../locale/cups_*.po; do
296	loc=`basename $file .po | cut -c 6-`
297	mkdir $BASE/share/locale/$loc
298	ln -s $root/locale/cups_$loc.po $BASE/share/locale/$loc
299done
300mkdir $BASE/share/locale/en
301ln -s $root/locale/cups.pot $BASE/share/locale/en/cups_en.po
302mkdir $BASE/share/mime
303mkdir $BASE/share/model
304mkdir $BASE/share/ppdc
305mkdir $BASE/interfaces
306mkdir $BASE/log
307mkdir $BASE/ppd
308mkdir $BASE/spool
309mkdir $BASE/spool/temp
310mkdir $BASE/ssl
311
312ln -s $root/backend/dnssd $BASE/bin/backend
313ln -s $root/backend/http $BASE/bin/backend
314ln -s $root/backend/ipp $BASE/bin/backend
315ln -s ipp $BASE/bin/backend/ipps
316ln -s $root/backend/lpd $BASE/bin/backend
317ln -s $root/backend/mdns $BASE/bin/backend
318ln -s $root/backend/pseudo $BASE/bin/backend
319ln -s $root/backend/snmp $BASE/bin/backend
320ln -s $root/backend/socket $BASE/bin/backend
321ln -s $root/backend/usb $BASE/bin/backend
322ln -s $root/cgi-bin $BASE/bin
323ln -s $root/monitor $BASE/bin
324ln -s $root/notifier $BASE/bin
325ln -s $root/scheduler $BASE/bin/daemon
326ln -s $root/filter/commandtops $BASE/bin/filter
327ln -s $root/filter/gziptoany $BASE/bin/filter
328ln -s $root/filter/pstops $BASE/bin/filter
329ln -s $root/filter/rastertoepson $BASE/bin/filter
330ln -s $root/filter/rastertohp $BASE/bin/filter
331ln -s $root/filter/rastertolabel $BASE/bin/filter
332ln -s $root/filter/rastertopwg $BASE/bin/filter
333cat >$BASE/share/banners/standard <<EOF
334           ==== Cover Page ====
335
336
337      Job: {?printer-name}-{?job-id}
338    Owner: {?job-originating-user-name}
339     Name: {?job-name}
340    Pages: {?job-impressions}
341
342
343           ==== Cover Page ====
344EOF
345cat >$BASE/share/banners/classified <<EOF
346           ==== Classified - Do Not Disclose ====
347
348
349      Job: {?printer-name}-{?job-id}
350    Owner: {?job-originating-user-name}
351     Name: {?job-name}
352    Pages: {?job-impressions}
353
354
355           ==== Classified - Do Not Disclose ====
356EOF
357ln -s $root/data $BASE/share
358ln -s $root/ppdc/sample.drv $BASE/share/drv
359ln -s $root/conf/mime.types $BASE/share/mime
360ln -s $root/conf/mime.convs $BASE/share/mime
361ln -s $root/data/*.h $BASE/share/ppdc
362ln -s $root/data/*.defs $BASE/share/ppdc
363ln -s $root/templates $BASE/share
364
365#
366# Local filters and configuration files...
367#
368
369instfilter() {
370	# instfilter src dst format
371	#
372	# See if the filter exists in a standard location; if so, make a
373	# symlink, otherwise create a dummy script for the specified format.
374	#
375	src="$1"
376	dst="$2"
377	format="$3"
378
379	for dir in /usr/local/libexec/cups/filter /usr/libexec/cups/filter /usr/lib/cups/filter; do
380		if test -x "$dir/$src"; then
381			ln -s "$dir/$src" "$BASE/bin/filter/$dst"
382			return
383		fi
384	done
385
386	# Source filter not present, create a dummy filter
387	case $format in
388		passthru)
389			ln -s gziptoany "$BASE/bin/filter/$dst"
390			;;
391		pdf)
392			cat >"$BASE/bin/filter/$dst" <<EOF
393#!/bin/sh
394trap "" TERM
395trap "" PIPE
396gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
397case "\$5" in
398	*media=a4* | *media=iso_a4* | *PageSize=A4*)
399		gziptoany "$1" "$2" "$3" "$4" "$5" "$root/examples/onepage-a4.pdf"
400		;;
401	*)
402		gziptoany "$1" "$2" "$3" "$4" "$5" "$root/examples/onepage-letter.pdf"
403		;;
404esac
405EOF
406			chmod +x "$BASE/bin/filter/$dst"
407			;;
408		ps)
409			cat >"$BASE/bin/filter/$dst" <<EOF
410#!/bin/sh
411trap "" TERM
412trap "" PIPE
413gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
414case "\$5" in
415	*media=a4* | *media=iso_a4* | *PageSize=A4*)
416		gziptoany "$1" "$2" "$3" "$4" "$5" "$root/examples/onepage-a4.ps"
417		;;
418	*)
419		gziptoany "$1" "$2" "$3" "$4" "$5" "$root/examples/onepage-letter.ps"
420		;;
421esac
422EOF
423			chmod +x "$BASE/bin/filter/$dst"
424			;;
425		raster)
426			cat >"$BASE/bin/filter/$dst" <<EOF
427#!/bin/sh
428trap "" TERM
429trap "" PIPE
430gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
431case "\$5" in
432	*media=a4* | *media=iso_a4* | *PageSize=A4*)
433		gziptoany "$1" "$2" "$3" "$4" "$5" "$root/examples/onepage-a4-300-black-1.pwg"
434		;;
435	*)
436		gziptoany "$1" "$2" "$3" "$4" "$5" "$root/examples/onepage-letter-300-black-1.pwg"
437		;;
438esac
439EOF
440			chmod +x "$BASE/bin/filter/$dst"
441			;;
442	esac
443}
444
445ln -s $root/test/test.convs $BASE/share/mime
446ln -s $root/test/test.types $BASE/share/mime
447
448if test `uname` = Darwin; then
449	instfilter cgimagetopdf imagetopdf pdf
450	instfilter cgpdftopdf pdftopdf passthru
451	instfilter cgpdftops pdftops ps
452	instfilter cgpdftoraster pdftoraster raster
453	instfilter cgpdftoraster pdftourf raster
454	instfilter cgtexttopdf texttopdf pdf
455	instfilter pstocupsraster pstoraster raster
456else
457	instfilter imagetopdf imagetopdf pdf
458	instfilter pdftopdf pdftopdf passthru
459	instfilter pdftops pdftops ps
460	instfilter pdftoraster pdftoraster raster
461	instfilter pdftoraster pdftourf raster
462	instfilter pstoraster pstoraster raster
463	instfilter texttopdf texttopdf pdf
464
465	if test -d /usr/share/cups/charsets; then
466		ln -s /usr/share/cups/charsets $BASE/share
467	fi
468fi
469
470#
471# Then create the necessary config files...
472#
473
474echo "Creating cupsd.conf for test..."
475
476if test $ssltype = 2; then
477	encryption="Encryption Required"
478else
479	encryption=""
480fi
481
482if test $testtype = 0; then
483	jobhistory="30m"
484	jobfiles="5m"
485else
486	jobhistory="30"
487	jobfiles="Off"
488fi
489
490cat >$BASE/cupsd.conf <<EOF
491StrictConformance Yes
492Browsing Off
493Listen localhost:$port
494Listen $BASE/sock
495MaxSubscriptions 3
496MaxLogSize 0
497AccessLogLevel actions
498LogLevel $loglevel
499LogTimeFormat usecs
500PreserveJobHistory $jobhistory
501PreserveJobFiles $jobfiles
502<Policy default>
503<Limit All>
504Order Allow,Deny
505$encryption
506</Limit>
507</Policy>
508EOF
509
510if test $testtype = 0; then
511	echo WebInterface yes >>$BASE/cupsd.conf
512fi
513
514cat >$BASE/cups-files.conf <<EOF
515FileDevice yes
516Printcap
517User $user
518ServerRoot $BASE
519StateDir $BASE
520ServerBin $BASE/bin
521CacheDir $BASE/share
522DataDir $BASE/share
523FontPath $BASE/share/fonts
524DocumentRoot $root/doc
525RequestRoot $BASE/spool
526TempDir $BASE/spool/temp
527AccessLog $BASE/log/access_log
528ErrorLog $BASE/log/error_log
529PageLog $BASE/log/page_log
530
531PassEnv DYLD_INSERT_LIBRARIES
532PassEnv DYLD_LIBRARY_PATH
533PassEnv LD_LIBRARY_PATH
534PassEnv LD_PRELOAD
535PassEnv LOCALEDIR
536PassEnv ASAN_OPTIONS
537
538Sandboxing Off
539EOF
540
541if test $ssltype != 0 -a `uname` = Darwin; then
542	echo "ServerKeychain $HOME/Library/Keychains/login.keychain" >> $BASE/cups-files.conf
543fi
544
545#
546# Setup lots of test queues with PPD files...
547#
548
549echo "Creating printers.conf for test..."
550
551i=1
552while test $i -le $nprinters; do
553	cat >>$BASE/printers.conf <<EOF
554<Printer test-$i>
555Accepting Yes
556DeviceURI file:/dev/null
557Info Test PS printer $i
558JobSheets none none
559Location CUPS test suite
560State Idle
561StateMessage Printer $1 is idle.
562</Printer>
563EOF
564
565	cp testps.ppd $BASE/ppd/test-$i.ppd
566
567	i=`expr $i + 1`
568done
569
570if test -f $BASE/printers.conf; then
571	cp $BASE/printers.conf $BASE/printers.conf.orig
572else
573	touch $BASE/printers.conf.orig
574fi
575
576#
577# Create a helper script to run programs with...
578#
579
580echo "Setting up environment variables for test..."
581
582if test "x$ASAN_OPTIONS" = x; then
583	# AddressSanitizer on Linux reports memory leaks from the main function
584	# which is basically useless - in general, programs do not need to free
585	# every object before exit since the OS will recover the process's
586	# memory.
587	ASAN_OPTIONS="detect_leaks=false"
588	export ASAN_OPTIONS
589fi
590
591if test -f "$root/cups/libcups.so.2"; then
592	if test "x$LD_LIBRARY_PATH" = x; then
593		LD_LIBRARY_PATH="$root/cups"
594	else
595		LD_LIBRARY_PATH="$root/cups:$LD_LIBRARY_PATH"
596	fi
597
598	LD_PRELOAD="$root/cups/libcups.so.2:$root/cups/libcupsimage.so.2"
599	if test `uname` = SunOS -a -r /usr/lib/libCrun.so.1; then
600		LD_PRELOAD="/usr/lib/libCrun.so.1:$LD_PRELOAD"
601	fi
602fi
603
604if test -f "$root/cups/libcups.2.dylib"; then
605	if test "x$DYLD_INSERT_LIBRARIES" = x; then
606		DYLD_INSERT_LIBRARIES="$root/cups/libcups.2.dylib:$root/cups/libcupsimage.2.dylib"
607	else
608		DYLD_INSERT_LIBRARIES="$root/cups/libcups.2.dylib:$root/cups/libcupsimage.2.dylib:$DYLD_INSERT_LIBRARIES"
609	fi
610
611	if test "x$DYLD_LIBRARY_PATH" = x; then
612		DYLD_LIBRARY_PATH="$root/cups"
613	else
614		DYLD_LIBRARY_PATH="$root/cups:$DYLD_LIBRARY_PATH"
615	fi
616fi
617
618# These get exported because they don't have side-effects...
619CUPS_DISABLE_APPLE_DEFAULT=yes; export CUPS_DISABLE_APPLE_DEFAULT
620CUPS_SERVER=localhost:$port; export CUPS_SERVER
621CUPS_SERVERROOT=$BASE; export CUPS_SERVERROOT
622CUPS_STATEDIR=$BASE; export CUPS_STATEDIR
623CUPS_DATADIR=$BASE/share; export CUPS_DATADIR
624IPP_PORT=$port; export IPP_PORT
625LOCALEDIR=$BASE/share/locale; export LOCALEDIR
626
627echo "Creating wrapper script..."
628
629runcups="$BASE/runcups"; export runcups
630
631echo "#!/bin/sh" >$runcups
632echo "# Helper script for running CUPS test instance." >>$runcups
633echo "" >>$runcups
634echo "# Set required environment variables..." >>$runcups
635echo "CUPS_DATADIR=\"$CUPS_DATADIR\"; export CUPS_DATADIR" >>$runcups
636echo "CUPS_SERVER=\"$CUPS_SERVER\"; export CUPS_SERVER" >>$runcups
637echo "CUPS_SERVERROOT=\"$CUPS_SERVERROOT\"; export CUPS_SERVERROOT" >>$runcups
638echo "CUPS_STATEDIR=\"$CUPS_STATEDIR\"; export CUPS_STATEDIR" >>$runcups
639echo "DYLD_INSERT_LIBRARIES=\"$DYLD_INSERT_LIBRARIES\"; export DYLD_INSERT_LIBRARIES" >>$runcups
640echo "DYLD_LIBRARY_PATH=\"$DYLD_LIBRARY_PATH\"; export DYLD_LIBRARY_PATH" >>$runcups
641# IPP_PORT=$port; export IPP_PORT
642echo "LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH\"; export LD_LIBRARY_PATH" >>$runcups
643echo "LD_PRELOAD=\"$LD_PRELOAD\"; export LD_PRELOAD" >>$runcups
644echo "LOCALEDIR=\"$LOCALEDIR\"; export LOCALEDIR" >>$runcups
645if test "x$CUPS_DEBUG_LEVEL" != x; then
646	echo "CUPS_DEBUG_FILTER='$CUPS_DEBUG_FILTER'; export CUPS_DEBUG_FILTER" >>$runcups
647	echo "CUPS_DEBUG_LEVEL=$CUPS_DEBUG_LEVEL; export CUPS_DEBUG_LEVEL" >>$runcups
648	echo "CUPS_DEBUG_LOG='$CUPS_DEBUG_LOG'; export CUPS_DEBUG_LOG" >>$runcups
649fi
650echo "" >>$runcups
651echo "# Run command..." >>$runcups
652echo "exec \"\$@\"" >>$runcups
653
654chmod +x $runcups
655
656#
657# Set a new home directory to avoid getting user options mixed in...
658#
659
660HOME=$BASE
661export HOME
662
663#
664# Force POSIX locale for tests...
665#
666
667LANG=C
668export LANG
669
670LC_MESSAGES=C
671export LC_MESSAGES
672
673#
674# Start the server; run as foreground daemon in the background...
675#
676
677echo "Starting scheduler:"
678echo "    $runcups $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &"
679echo ""
680
681$runcups $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &
682
683cupsd=$!
684
685if test "x$testtype" = x0; then
686	# Not running tests...
687	echo "Scheduler is PID $cupsd and is listening on port $port."
688	echo ""
689
690	echo "The $runcups helper script can be used to test programs"
691	echo "with the server."
692	exit 0
693fi
694
695if test $argcount -eq 0; then
696	echo "Scheduler is PID $cupsd; run debugger now if you need to."
697	echo ""
698	echo $ac_n "Press ENTER to continue... $ac_c"
699	read junk
700else
701	echo "Scheduler is PID $cupsd."
702	sleep 2
703fi
704
705while true; do
706	running=`$runcups ../systemv/lpstat -r 2>/dev/null`
707	if test "x$running" = "xscheduler is running"; then
708		break
709	fi
710
711	echo "Waiting for scheduler to become ready..."
712	sleep 10
713done
714
715#
716# Create the test report source file...
717#
718
719date=`date "+%Y-%m-%d"`
720
721strfile=$BASE/cups-str-$date-$user.html
722
723rm -f $strfile
724cat str-header.html >$strfile
725
726#
727# Run the IPP tests...
728#
729
730echo ""
731echo "Running IPP compliance tests..."
732
733echo "    <h1><a name='IPP'>1 - IPP Compliance Tests</a></h1>" >>$strfile
734echo "    <p>This section provides the results to the IPP compliance tests" >>$strfile
735echo "    outlined in the CUPS Software Test Plan. These tests were run on" >>$strfile
736echo "    $date by $user on `hostname`." >>$strfile
737echo "    <pre>" >>$strfile
738
739fail=0
740for file in 4*.test ../examples/ipp-2.1.test; do
741	echo $ac_n "Performing `basename $file`: $ac_c"
742	echo "" >>$strfile
743        echo $ac_n "`date '+[%d/%b/%Y:%H:%M:%S %z]'` $ac_c" >>$strfile
744
745	if test $file = ../examples/ipp-2.1.test; then
746		uri="ipp://localhost:$port/printers/Test1"
747		options="-V 2.1 -d NOPRINT=1 -f testfile.ps"
748	else
749		uri="ipp://localhost:$port/printers"
750		options=""
751	fi
752	$runcups $VALGRIND ../tools/ipptool -tI $options $uri $file >> $strfile
753	status=$?
754
755	if test $status != 0; then
756		echo FAIL
757		fail=`expr $fail + 1`
758	else
759		echo PASS
760	fi
761done
762
763echo "    </pre>" >>$strfile
764
765#
766# Run the command tests...
767#
768
769echo ""
770echo "Running command tests..."
771
772echo "    <h1><a name='COMMAND'>2 - Command Tests</a></h1>" >>$strfile
773echo "    <p>This section provides the results to the command tests" >>$strfile
774echo "    outlined in the CUPS Software Test Plan. These tests were run on" >>$strfile
775echo "    $date by $user on `hostname`." >>$strfile
776echo "    <pre>" >>$strfile
777
778for file in 5*.sh; do
779	echo $ac_n "Performing $file: $ac_c"
780	echo "" >>$strfile
781        echo "`date '+[%d/%b/%Y:%H:%M:%S %z]'` \"$file\":" >>$strfile
782
783	sh $file $pjobs $pprinters >> $strfile
784	status=$?
785
786	if test $status != 0; then
787		echo FAIL
788		fail=`expr $fail + 1`
789	else
790		echo PASS
791	fi
792done
793
794#
795# Restart the server...
796#
797
798echo $ac_n "Performing restart test: $ac_c"
799echo "" >>$strfile
800echo "`date '+[%d/%b/%Y:%H:%M:%S %z]'` \"5.10-restart\":" >>$strfile
801
802kill -HUP $cupsd
803
804while true; do
805	sleep 10
806
807	running=`$runcups ../systemv/lpstat -r 2>/dev/null`
808	if test "x$running" = "xscheduler is running"; then
809		break
810	fi
811done
812
813description="`$runcups ../systemv/lpstat -l -p Test1 | grep Description | sed -e '1,$s/^[^:]*: //g'`"
814if test "x$description" != "xTest Printer 1"; then
815	echo "Failed, printer-info for Test1 is '$description', expected 'Test Printer 1'." >>$strfile
816	echo "FAIL (got '$description', expected 'Test Printer 1')"
817	fail=`expr $fail + 1`
818else
819	echo "Passed." >>$strfile
820	echo PASS
821fi
822
823
824#
825# Perform job history test...
826#
827
828echo $ac_n "Starting history test: $ac_c"
829echo "" >>$strfile
830echo "`date '+[%d/%b/%Y:%H:%M:%S %z]'` \"5.11-history\":" >>$strfile
831
832echo "    lp -d Test1 testfile.jpg" >>$strfile
833
834$runcups ../systemv/lp -d Test1 ../examples/testfile.jpg 2>&1 >>$strfile
835if test $? != 0; then
836	echo "FAIL (unable to queue test job)"
837	echo "    FAILED" >>$strfile
838	fail=`expr $fail + 1`
839else
840	echo "PASS"
841	echo "    PASSED" >>$strfile
842
843	./waitjobs.sh >>$strfile
844
845        echo $ac_n "Verifying that history still exists: $ac_c"
846
847	echo "    ls -l $BASE/spool" >>$strfile
848	count=`ls -1 $BASE/spool | wc -l`
849	if test $count = 1; then
850		echo "FAIL"
851		echo "    FAILED (job control files not present)" >>$strfile
852		ls -l $BASE/spool >>$strfile
853		fail=`expr $fail + 1`
854	else
855		echo "PASS"
856		echo "    PASSED" >>$strfile
857
858		echo $ac_n "Waiting for job history to expire: $ac_c"
859		echo "" >>$strfile
860		echo "    sleep 35" >>$strfile
861		sleep 35
862
863		echo "    lpstat" >>$strfile
864		$runcups ../systemv/lpstat 2>&1 >>$strfile
865
866		echo "    ls -l $BASE/spool" >>$strfile
867		count=`ls -1 $BASE/spool | wc -l`
868		if test $count != 1; then
869			echo "FAIL"
870			echo "    FAILED (job control files still present)" >>$strfile
871			ls -l $BASE/spool >>$strfile
872			fail=`expr $fail + 1`
873		else
874			echo "PASS"
875			echo "    PASSED" >>$strfile
876		fi
877	fi
878fi
879
880
881#
882# Stop the server...
883#
884
885echo "    </pre>" >>$strfile
886
887kill $cupsd
888wait $cupsd
889cupsdstatus=$?
890
891#
892# Verify counts...
893#
894
895echo "Test Summary"
896echo ""
897echo "    <h1><a name='SUMMARY'>3 - Test Summary</a></h1>" >>$strfile
898
899if test $cupsdstatus != 0; then
900	echo "FAIL: cupsd failed with exit status $cupsdstatus."
901	echo "    <p>FAIL: cupsd failed with exit status $cupsdstatus.</p>" >>$strfile
902	fail=`expr $fail + 1`
903else
904	echo "PASS: cupsd exited with no errors."
905	echo "    <p>PASS: cupsd exited with no errors.</p>" >>$strfile
906fi
907
908# Job control files
909count=`ls -1 $BASE/spool | wc -l`
910count=`expr $count - 1`
911if test $count != 0; then
912	echo "FAIL: $count job control files were not purged."
913	echo "    <p>FAIL: $count job control files were not purged.</p>" >>$strfile
914	fail=`expr $fail + 1`
915else
916	echo "PASS: All job control files purged."
917	echo "    <p>PASS: All job control files purged.</p>" >>$strfile
918fi
919
920# Pages printed on Test1 (within 1 page for timing-dependent cancel issues)
921count=`$GREP '^Test1 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
922expected=`expr $pjobs \* 2 + 34`
923expected2=`expr $expected + 2`
924if test $count -lt $expected -a $count -gt $expected2; then
925	echo "FAIL: Printer 'Test1' produced $count page(s), expected $expected."
926	echo "    <p>FAIL: Printer 'Test1' produced $count page(s), expected $expected.</p>" >>$strfile
927	fail=`expr $fail + 1`
928else
929	echo "PASS: Printer 'Test1' correctly produced $count page(s)."
930	echo "    <p>PASS: Printer 'Test1' correctly produced $count page(s).</p>" >>$strfile
931fi
932
933# Paged printed on Test2
934count=`$GREP '^Test2 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
935expected=`expr $pjobs \* 2 + 3`
936if test $count != $expected; then
937	echo "FAIL: Printer 'Test2' produced $count page(s), expected $expected."
938	echo "    <p>FAIL: Printer 'Test2' produced $count page(s), expected $expected.</p>" >>$strfile
939	fail=`expr $fail + 1`
940else
941	echo "PASS: Printer 'Test2' correctly produced $count page(s)."
942	echo "    <p>PASS: Printer 'Test2' correctly produced $count page(s).</p>" >>$strfile
943fi
944
945# Paged printed on Test3
946count=`$GREP '^Test3 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
947expected=2
948if test $count != $expected; then
949	echo "FAIL: Printer 'Test3' produced $count page(s), expected $expected."
950	echo "    <p>FAIL: Printer 'Test3' produced $count page(s), expected $expected.</p>" >>$strfile
951	fail=`expr $fail + 1`
952else
953	echo "PASS: Printer 'Test3' correctly produced $count page(s)."
954	echo "    <p>PASS: Printer 'Test3' correctly produced $count page(s).</p>" >>$strfile
955fi
956
957# Requests logged
958count=`wc -l $BASE/log/access_log | awk '{print $1}'`
959expected=`expr 35 + 18 + 30 + $pjobs \* 8 + $pprinters \* $pjobs \* 4 + 2`
960if test $count != $expected; then
961	echo "FAIL: $count requests logged, expected $expected."
962	echo "    <p>FAIL: $count requests logged, expected $expected.</p>" >>$strfile
963	fail=`expr $fail + 1`
964else
965	echo "PASS: $count requests logged."
966	echo "    <p>PASS: $count requests logged.</p>" >>$strfile
967fi
968
969# Did CUPS-Get-Default get logged?
970if $GREP -q CUPS-Get-Default $BASE/log/access_log; then
971	echo "FAIL: CUPS-Get-Default logged with 'AccessLogLevel actions'"
972	echo "    <p>FAIL: CUPS-Get-Default logged with 'AccessLogLevel actions'</p>" >>$strfile
973	echo "    <pre>" >>$strfile
974	$GREP CUPS-Get-Default $BASE/log/access_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
975	echo "    </pre>" >>$strfile
976	fail=`expr $fail + 1`
977else
978	echo "PASS: CUPS-Get-Default not logged."
979	echo "    <p>PASS: CUPS-Get-Default not logged.</p>" >>$strfile
980fi
981
982# Emergency log messages
983count=`$GREP '^X ' $BASE/log/error_log | wc -l | awk '{print $1}'`
984if test $count != 0; then
985	echo "FAIL: $count emergency messages, expected 0."
986	$GREP '^X ' $BASE/log/error_log
987	echo "    <p>FAIL: $count emergency messages, expected 0.</p>" >>$strfile
988	echo "    <pre>" >>$strfile
989	$GREP '^X ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
990	echo "    </pre>" >>$strfile
991	fail=`expr $fail + 1`
992else
993	echo "PASS: $count emergency messages."
994	echo "    <p>PASS: $count emergency messages.</p>" >>$strfile
995fi
996
997# Alert log messages
998count=`$GREP '^A ' $BASE/log/error_log | wc -l | awk '{print $1}'`
999if test $count != 0; then
1000	echo "FAIL: $count alert messages, expected 0."
1001	$GREP '^A ' $BASE/log/error_log
1002	echo "    <p>FAIL: $count alert messages, expected 0.</p>" >>$strfile
1003	echo "    <pre>" >>$strfile
1004	$GREP '^A ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
1005	echo "    </pre>" >>$strfile
1006	fail=`expr $fail + 1`
1007else
1008	echo "PASS: $count alert messages."
1009	echo "    <p>PASS: $count alert messages.</p>" >>$strfile
1010fi
1011
1012# Critical log messages
1013count=`$GREP '^C ' $BASE/log/error_log | wc -l | awk '{print $1}'`
1014if test $count != 0; then
1015	echo "FAIL: $count critical messages, expected 0."
1016	$GREP '^C ' $BASE/log/error_log
1017	echo "    <p>FAIL: $count critical messages, expected 0.</p>" >>$strfile
1018	echo "    <pre>" >>$strfile
1019	$GREP '^C ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
1020	echo "    </pre>" >>$strfile
1021	fail=`expr $fail + 1`
1022else
1023	echo "PASS: $count critical messages."
1024	echo "    <p>PASS: $count critical messages.</p>" >>$strfile
1025fi
1026
1027# Error log messages
1028count=`$GREP '^E ' $BASE/log/error_log | $GREP -v 'Unknown default SystemGroup' | wc -l | awk '{print $1}'`
1029if test $count != 33; then
1030	echo "FAIL: $count error messages, expected 33."
1031	$GREP '^E ' $BASE/log/error_log
1032	echo "    <p>FAIL: $count error messages, expected 33.</p>" >>$strfile
1033	echo "    <pre>" >>$strfile
1034	$GREP '^E ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
1035	echo "    </pre>" >>$strfile
1036	fail=`expr $fail + 1`
1037else
1038	echo "PASS: $count error messages."
1039	echo "    <p>PASS: $count error messages.</p>" >>$strfile
1040fi
1041
1042# Warning log messages
1043count=`$GREP '^W ' $BASE/log/error_log | $GREP -v CreateProfile | wc -l | awk '{print $1}'`
1044if test $count != 8; then
1045	echo "FAIL: $count warning messages, expected 8."
1046	$GREP '^W ' $BASE/log/error_log
1047	echo "    <p>FAIL: $count warning messages, expected 8.</p>" >>$strfile
1048	echo "    <pre>" >>$strfile
1049	$GREP '^W ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
1050	echo "    </pre>" >>$strfile
1051	fail=`expr $fail + 1`
1052else
1053	echo "PASS: $count warning messages."
1054	echo "    <p>PASS: $count warning messages.</p>" >>$strfile
1055fi
1056
1057# Notice log messages
1058count=`$GREP '^N ' $BASE/log/error_log | wc -l | awk '{print $1}'`
1059if test $count != 0; then
1060	echo "FAIL: $count notice messages, expected 0."
1061	$GREP '^N ' $BASE/log/error_log
1062	echo "    <p>FAIL: $count notice messages, expected 0.</p>" >>$strfile
1063	echo "    <pre>" >>$strfile
1064	$GREP '^N ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
1065	echo "    </pre>" >>$strfile
1066	fail=`expr $fail + 1`
1067else
1068	echo "PASS: $count notice messages."
1069	echo "    <p>PASS: $count notice messages.</p>" >>$strfile
1070fi
1071
1072# Info log messages
1073count=`$GREP '^I ' $BASE/log/error_log | wc -l | awk '{print $1}'`
1074if test $count = 0; then
1075	echo "FAIL: $count info messages, expected more than 0."
1076	echo "    <p>FAIL: $count info messages, expected more than 0.</p>" >>$strfile
1077	fail=`expr $fail + 1`
1078else
1079	echo "PASS: $count info messages."
1080	echo "    <p>PASS: $count info messages.</p>" >>$strfile
1081fi
1082
1083# Debug log messages
1084count=`$GREP '^D ' $BASE/log/error_log | wc -l | awk '{print $1}'`
1085if test $count = 0; then
1086	echo "FAIL: $count debug messages, expected more than 0."
1087	echo "    <p>FAIL: $count debug messages, expected more than 0.</p>" >>$strfile
1088	fail=`expr $fail + 1`
1089else
1090	echo "PASS: $count debug messages."
1091	echo "    <p>PASS: $count debug messages.</p>" >>$strfile
1092fi
1093
1094# Debug2 log messages
1095count=`$GREP '^d ' $BASE/log/error_log | wc -l | awk '{print $1}'`
1096if test $count = 0 -a $loglevel = debug2; then
1097	echo "FAIL: $count debug2 messages, expected more than 0."
1098	echo "    <p>FAIL: $count debug2 messages, expected more than 0.</p>" >>$strfile
1099	fail=`expr $fail + 1`
1100elif test $count != 0 -a $loglevel = debug; then
1101	echo "FAIL: $count debug2 messages, expected 0."
1102	echo "    <p>FAIL: $count debug2 messages, expected 0.</p>" >>$strfile
1103	fail=`expr $fail + 1`
1104else
1105	echo "PASS: $count debug2 messages."
1106	echo "    <p>PASS: $count debug2 messages.</p>" >>$strfile
1107fi
1108
1109#
1110# Log files...
1111#
1112
1113echo "    <h1><a name='LOGS'>4 - Log Files</a></h1>" >>$strfile
1114
1115for file in $BASE/log/*_log; do
1116        baselog=`basename $file`
1117
1118        echo "    <h2><a name=\"$baselog\">$baselog</a></h2>" >>$strfile
1119        case $baselog in
1120                error_log)
1121                        echo "    <blockquote>Note: debug2 messages have been filtered out of the HTML report.</blockquote>" >>$strfile
1122                        echo "    <pre>" >>$strfile
1123                        $GREP -v '^d' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
1124                        echo "    </pre>" >>$strfile
1125                        ;;
1126
1127                *)
1128                        echo "    <pre>" >>$strfile
1129                        sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' $file >>$strfile
1130                        echo "    </pre>" >>$strfile
1131                        ;;
1132        esac
1133done
1134
1135#
1136# Format the reports and tell the user where to find them...
1137#
1138
1139cat str-trailer.html >>$strfile
1140
1141echo ""
1142for file in $BASE/log/*_log; do
1143        baselog=`basename $file`
1144        cp $file $baselog-$date-$user
1145        echo "Copied log file \"$baselog-$date-$user\" to test directory."
1146done
1147cp $strfile .
1148echo "Copied report file \"cups-str-$date-$user.html\" to test directory."
1149
1150# Clean out old failure log files after 1 week...
1151find . -name \*_log-\*-$user -a -mtime +7 -print -exec rm -f '{}' \; | awk '{print "Removed old log file \"" substr($1,3) "\" from test directory."}'
1152find . -name cups-str-\*-$user.html -a -mtime +7 -print -exec rm -f '{}' \; | awk '{print "Removed old report file \"" $1 "\" from test directory."}'
1153
1154echo ""
1155
1156if test $fail != 0; then
1157	echo "$fail tests failed."
1158	exit 1
1159else
1160	echo "All tests were successful."
1161fi
1162