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