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/&/&/g' -e '1,$s/</</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/&/&/g' -e '1,$s/</</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/&/&/g' -e '1,$s/</</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/&/&/g' -e '1,$s/</</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/&/&/g' -e '1,$s/</</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/&/&/g' -e '1,$s/</</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/&/&/g' -e '1,$s/</</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/&/&/g' -e '1,$s/</</g' >>$strfile 1124 echo " </pre>" >>$strfile 1125 ;; 1126 1127 *) 1128 echo " <pre>" >>$strfile 1129 sed -e '1,$s/&/&/g' -e '1,$s/</</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