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