mysql-test-run.sh 23.7 KB
Newer Older
unknown's avatar
unknown committed
1
#! /bin/sh
2 3
# mysql-test-run - originally written by Matt Wagner <matt@mysql.com>
# modified by Sasha Pachev <sasha@mysql.com>
unknown's avatar
unknown committed
4
# Sligtly updated by Monty
5
# Cleaned up again by Matt
unknown's avatar
unknown committed
6 7
# Fixed by Sergei
# :-)
unknown's avatar
unknown committed
8 9 10 11 12

#++
# Access Definitions
#--
DB=test
13
DBPASSWD=
14
VERBOSE=""
unknown's avatar
unknown committed
15
TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work
unknown's avatar
unknown committed
16

17 18 19 20
#++
# Program Definitions
#--

21
PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/bin/X11
22

23 24 25 26
# Standard functions

which ()
{
27
  IFS="${IFS=   }"; save_ifs="$IFS"; IFS=':'
28 29
  for file
  do
30
    for dir in $PATH
31 32 33 34 35 36 37 38 39 40
    do
      if test -f $dir/$file
      then
        echo "$dir/$file"
        continue 2
      fi
    done
    echo "which: no $file in ($PATH)"
    exit 1
  done
41
  IFS="$save_ifs"
42 43 44
}


45 46
# No paths below as we can't be sure where the program is!

unknown's avatar
unknown committed
47 48 49 50
SED=sed

BASENAME=`which basename | $SED q`
DIFF=`which diff | $SED q`
51 52 53 54 55 56
CAT=cat
CUT=cut
TAIL=tail
ECHO=echo # use internal echo if possible
EXPR=expr # use internal if possible
FIND=find
unknown's avatar
unknown committed
57
GCOV=`which gcov | $SED q`
58 59 60 61
PRINTF=printf
RM=rm
TIME=time
TR=tr
unknown's avatar
unknown committed
62
XARGS=`which xargs | $SED q`
63 64 65 66 67

# Are we using a source or a binary distribution?

testdir=@testdir@
if [ -d bin/mysqld ] && [ -d mysql-test ] ; then
68 69
 cd mysql-test
else
70 71
 if [ -d $testdir/mysql-test ] ; then
   cd $testdir
72
 fi
73 74 75 76 77 78 79
fi

if [ ! -f ./mysql-test-run ] ; then
  $ECHO "Can't find the location for the mysql-test-run script"

  $ECHO "Go to to the mysql-test directory and execute the script as follows:"
  $ECHO "./mysql-test-run."
unknown's avatar
unknown committed
80
  exit 1
81
fi
82

unknown's avatar
unknown committed
83 84 85
#++
# Misc. Definitions
#--
86

87 88 89 90 91
if [ -d ../sql ] ; then
   SOURCE_DIST=1
else
   BINARY_DIST=1
fi
92

93
#BASEDIR is always one above mysql-test directory 
unknown's avatar
unknown committed
94 95 96 97
CWD=`pwd`
cd ..
BASEDIR=`pwd`
cd $CWD
98
MYSQL_TEST_DIR=$BASEDIR/mysql-test
99
export MYSQL_TEST_DIR
100
STD_DATA=$MYSQL_TEST_DIR/std_data
unknown's avatar
unknown committed
101
hostname=`hostname`		# Installed in the mysql privilege table
102
  
unknown's avatar
unknown committed
103
TESTDIR="$MYSQL_TEST_DIR/t"
unknown's avatar
unknown committed
104
TESTSUFFIX=test
unknown's avatar
unknown committed
105
TOT_SKIP=0
unknown's avatar
unknown committed
106 107 108
TOT_PASS=0
TOT_FAIL=0
TOT_TEST=0
109 110 111
USERT=0
SYST=0
REALT=0
unknown's avatar
unknown committed
112
MYSQL_TMP_DIR=$MYSQL_TEST_DIR/var/tmp
unknown's avatar
unknown committed
113
SLAVE_LOAD_TMPDIR=../../var/tmp #needs to be same length to test logging
unknown's avatar
unknown committed
114
RES_SPACE="      "
unknown's avatar
unknown committed
115 116
MYSQLD_SRC_DIRS="strings mysys include extra regex isam merge myisam \
 myisammrg heap sql"
117 118 119 120 121
#
# Set LD_LIBRARY_PATH if we are using shared libraries
#
LD_LIBRARY_PATH="$BASEDIR/lib:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
122

unknown's avatar
fixed  
unknown committed
123
MASTER_RUNNING=0
124
MASTER_MYPORT=9306
unknown's avatar
fixed  
unknown committed
125
SLAVE_RUNNING=0
126
SLAVE_MYPORT=9307
127
NO_SLAVE=0
unknown's avatar
unknown committed
128
USER_TEST=
129

130
EXTRA_MASTER_OPT=""
131 132 133 134 135
EXTRA_MYSQL_TEST_OPT=""
USE_RUNNING_SERVER=1
DO_GCOV=""
DO_GDB=""
DO_DDD=""
unknown's avatar
unknown committed
136
DO_CLIENT_GDB=""
137
SLEEP_TIME=2
138
DBUSER=""
139 140 141

while test $# -gt 0; do
  case "$1" in
142 143
    --user=*) DBUSER=`$ECHO "$1" | $SED -e "s;--user=;;"` ;;
    --force)  FORCE=1 ;;
144 145 146 147
    --local)   USE_RUNNING_SERVER="" ;;
    --tmpdir=*) MYSQL_TMP_DIR=`$ECHO "$1" | $SED -e "s;--tmpdir=;;"` ;;
    --master_port=*) MASTER_MYPORT=`$ECHO "$1" | $SED -e "s;--master_port=;;"` ;;
    --slave_port=*) SLAVE_MYPORT=`$ECHO "$1" | $SED -e "s;--slave_port=;;"` ;;
unknown's avatar
unknown committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
    --with-openssl)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
     --ssl-ca=$BASEDIR/SSL/cacert.pem \
     --ssl-cert=$BASEDIR/SSL/server-cert.pem \
     --ssl-key=$BASEDIR/SSL/server-key.pem"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
     --ssl-ca=$BASEDIR/SSL/cacert.pem \
     --ssl-cert=$BASEDIR/SSL/server-cert.pem \
     --ssl-key=$BASEDIR/SSL/server-key.pem" ;;
    --skip-innobase)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-innobase"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-innobase" ;;
    --skip-bdb)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-bdb"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-bdb" ;;
163
    --skip-rpl) NO_SLAVE=1 ;;
unknown's avatar
unknown committed
164 165
    --skip-test=*) SKIP_TEST=`$ECHO "$1" | $SED -e "s;--skip-test=;;"`;;
    --do-test=*) DO_TEST=`$ECHO "$1" | $SED -e "s;--do-test=;;"`;;
166 167 168
    --record)
      RECORD=1;
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
unknown's avatar
unknown committed
169 170 171 172 173 174
    --bench)
      DO_BENCH=1
      NO_SLAVE=1
      ;;  
    --big*)			# Actually --big-test
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
175 176 177 178
    --sleep=*)
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1"
      SLEEP_TIME=`$ECHO "$1" | $SED -e "s;--sleep=;;"`
      ;;
unknown's avatar
unknown committed
179 180 181
    --user-test=*)
      USER_TEST=`$ECHO "$1" | $SED -e "s;--user-test=;;"`
      ;;
182
    --mysqld=*)
183 184 185
       TMP=`$ECHO "$1" | $SED -e "s;--mysqld=;;"`
       EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $TMP"
       EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $TMP"
186
       ;;
187 188 189 190 191 192 193
    --gcov )
      if [ x$BINARY_DIST = x1 ] ; then
	$ECHO "Cannot do coverage test without the source - please use source dist"
	exit 1
      fi
      DO_GCOV=1
      ;;
unknown's avatar
unknown committed
194 195 196
    --gprof )
      DO_GPROF=1
      ;;  
197 198
    --gdb )
      if [ x$BINARY_DIST = x1 ] ; then
unknown's avatar
unknown committed
199
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --gdb option"
200 201
      fi
      DO_GDB=1
202
      USE_RUNNING_SERVER=""
unknown's avatar
unknown committed
203 204 205 206 207 208
      ;;
    --client-gdb )
      if [ x$BINARY_DIST = x1 ] ; then
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --client-gdb option"
      fi
      DO_CLIENT_GDB=1
209 210 211
      ;;
    --ddd )
      if [ x$BINARY_DIST = x1 ] ; then
unknown's avatar
unknown committed
212
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --ddd option"
213 214
      fi
      DO_DDD=1
215
      USE_RUNNING_SERVER=""
216
      ;;
217 218 219 220
    --skip-*)
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $1"
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $1"
      ;;
221
    --debug)
222
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
223
       --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/master.trace"
224
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
225
       --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/slave.trace"
226
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --debug"
227 228 229 230 231 232 233
      ;;
    -- )  shift; break ;;
    --* ) $ECHO "Unrecognized option: $1"; exit 1 ;;
    * ) break ;;
  esac
  shift
done
unknown's avatar
fixed  
unknown committed
234

unknown's avatar
unknown committed
235 236 237
#++
# mysqld Environment Parameters
#--
238

unknown's avatar
unknown committed
239
MYRUN_DIR=$MYSQL_TEST_DIR/var/run
240
MASTER_MYDDIR="$MYSQL_TEST_DIR/var/master-data"
241
MASTER_MYSOCK="$MYSQL_TMP_DIR/mysql-master.sock"
unknown's avatar
unknown committed
242
MASTER_MYPID="$MYRUN_DIR/mysqld.pid"
243 244 245 246
MASTER_MYLOG="$MYSQL_TEST_DIR/var/log/mysqld.log"
MASTER_MYERR="$MYSQL_TEST_DIR/var/log/mysqld.err"

SLAVE_MYDDIR="$MYSQL_TEST_DIR/var/slave-data"
unknown's avatar
unknown committed
247 248
SLAVE_MYSOCK="$MYSQL_TMP_DIR/mysql-slave.sock"
SLAVE_MYPID="$MYRUN_DIR/mysqld-slave.pid"
249 250 251
SLAVE_MYLOG="$MYSQL_TEST_DIR/var/log/mysqld-slave.log"
SLAVE_MYERR="$MYSQL_TEST_DIR/var/log/mysqld-slave.err"

252 253
SMALL_SERVER="-O key_buffer_size=1M -O sort_buffer=256K -O max_heap_table_size=1M"

unknown's avatar
unknown committed
254 255 256
export MASTER_MYPORT
export SLAVE_MYPORT

257 258 259 260 261
if [ x$SOURCE_DIST = x1 ] ; then
 MY_BASEDIR=$MYSQL_TEST_DIR
else
 MY_BASEDIR=$BASEDIR
fi  
unknown's avatar
unknown committed
262

unknown's avatar
unknown committed
263 264 265 266 267 268 269 270 271
# Create the directories

# This should be fixed to be not be dependent on the contence of MYSQL_TMP_DIR
# or MYRUN_DIR
# (mkdir -p is not portable)
[ -d $MYSQL_TEST_DIR/var ] || mkdir $MYSQL_TEST_DIR/var
[ -d $MYSQL_TEST_DIR/var/tmp ] || mkdir $MYSQL_TEST_DIR/var/tmp
[ -d $MYSQL_TEST_DIR/var/run ] || mkdir $MYSQL_TEST_DIR/var/run

272 273
[ -z "$COLUMNS" ] && COLUMNS=80
E=`$EXPR $COLUMNS - 8`
274
DASH72=`$ECHO '------------------------------------------------------------------------'|$CUT -c 1-$E`
275

276 277 278 279
# on source dist, we pick up freshly build executables
# on binary, use what is installed
if [ x$SOURCE_DIST = x1 ] ; then
 MYSQLD="$BASEDIR/sql/mysqld"
280
 if [ -f "$BASEDIR/client/.libs/lt-mysqltest" ] ; then
unknown's avatar
unknown committed
281 282 283 284
   MYSQL_TEST="$BASEDIR/client/.libs/lt-mysqltest"
 else
   MYSQL_TEST="$BASEDIR/client/mysqltest"
 fi
285
 MYSQLADMIN="$BASEDIR/client/mysqladmin"
unknown's avatar
unknown committed
286
 MYSQL="$BASEDIR/client/mysql"
unknown's avatar
unknown committed
287 288
 LANGUAGE="$BASEDIR/sql/share/english/"
 CHARSETSDIR="$BASEDIR/sql/share/charsets"
289 290 291 292 293
 INSTALL_DB="./install_test_db"
else
 MYSQLD="$BASEDIR/bin/mysqld"
 MYSQL_TEST="$BASEDIR/bin/mysqltest"
 MYSQLADMIN="$BASEDIR/bin/mysqladmin"
unknown's avatar
unknown committed
294
 MYSQL="$BASEDIR/bin/mysql"
unknown's avatar
unknown committed
295
 INSTALL_DB="./install_test_db -bin"
unknown's avatar
unknown committed
296 297 298 299 300 301 302 303
 if test -d "$BASEDIR/share/mysql/english" 
 then
   LANGUAGE="$BASEDIR/share/mysql/english/"
   CHARSETSDIR="$BASEDIR/share/mysql/charsets"
 else
   LANGUAGE="$BASEDIR/share/english/"
   CHARSETSDIR="$BASEDIR/share/charsets"
  fi
304 305
fi

306 307 308 309 310 311
# If we should run all tests cases, we will use a local server for that

if [ -z "$1" ]
then
   USE_RUNNING_SERVER=""
fi
312 313 314
if [ -n "$USE_RUNNING_SERVER" ]
then
   MASTER_MYSOCK="/tmp/mysql.sock"
315
   DBUSER=${DBUSER:-test}
316
else
317
   DBUSER=${DBUSER:-root}		# We want to do FLUSH xxx commands
318
fi
319 320 321 322 323 324 325 326

if [ -w / ]
then
    # We are running as root;  We need to add the --root argument
    EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --user=root"
    EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --user=root"
fi

327

unknown's avatar
unknown committed
328 329 330 331
MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB --user=$DBUSER --password=$DBPASSWD --silent -v --tmpdir=$MYSQL_TMP_DIR"
MYSQL_TEST_BIN=$MYSQL_TEST
MYSQL_TEST="$MYSQL_TEST $MYSQL_TEST_ARGS"
GDB_CLIENT_INIT=$MYSQL_TMP_DIR/gdbinit.client
332 333 334
GDB_MASTER_INIT=$MYSQL_TMP_DIR/gdbinit.master
GDB_SLAVE_INIT=$MYSQL_TMP_DIR/gdbinit.slave
GCOV_MSG=$MYSQL_TMP_DIR/mysqld-gcov.out
unknown's avatar
unknown committed
335 336 337 338
GCOV_ERR=$MYSQL_TMP_DIR/mysqld-gcov.err
GPROF_DIR=$MYSQL_TMP_DIR/gprof
GPROF_MASTER=$GPROF_DIR/master.gprof
GPROF_SLAVE=$GPROF_DIR/slave.gprof
339 340 341
TIMEFILE="$MYSQL_TMP_DIR/mysqltest-time"
SLAVE_MYSQLD=$MYSQLD #this can be changed later if we are doing gcov

unknown's avatar
unknown committed
342 343 344
#++
# Function Definitions
#--
unknown's avatar
unknown committed
345
wait_for_server_start ()
unknown's avatar
unknown committed
346
{
347 348 349 350 351
   $MYSQLADMIN --no-defaults -u $DBUSER --silent -O connect_timeout=10 -w3 --host=$hostname --port=$1  ping >/dev/null 2>&1
   exit_code=$?
   if [ $exit_code != 0 ]; then
	echo "Error: Could not start $2, exit code $exit_code";
   fi
unknown's avatar
unknown committed
352
}
unknown's avatar
unknown committed
353

unknown's avatar
unknown committed
354 355
prompt_user ()
{
356
 $ECHO $1
357
 read unused
unknown's avatar
unknown committed
358 359
}

360
# We can't use diff -u or diff -a as these are not portable
361

unknown's avatar
unknown committed
362 363 364 365
show_failed_diff ()
{
  reject_file=r/$1.reject
  result_file=r/$1.result
unknown's avatar
unknown committed
366 367 368 369 370 371 372
  eval_file=r/$1.eval
  
  if [ -f $eval_file ]
  then
    result_file=$eval_file
  fi
    
unknown's avatar
unknown committed
373 374 375 376
  if [ -x "$DIFF" ] && [ -f $reject_file ]
  then
    echo "Below are the diffs between actual and expected results:"
    echo "-------------------------------------------------------"
377
    $DIFF -c $result_file $reject_file
unknown's avatar
unknown committed
378
    echo "-------------------------------------------------------"
379 380 381
    echo "Please follow the instructions outlined at"
    echo "http://www.mysql.com/doc/R/e/Reporting_mysqltest_bugs.html"
    echo "to find the reason to this problem and how to report this."
unknown's avatar
unknown committed
382 383
  fi  
}
unknown's avatar
unknown committed
384

unknown's avatar
unknown committed
385 386 387 388 389 390 391 392 393
do_gdb_test ()
{
  mysql_test_args="$MYSQL_TEST_ARGS $1"
  $ECHO "set args $mysql_test_args < $2" > $GDB_CLIENT_INIT
  echo "Set breakpoints ( if needed) and type 'run' in gdb window"
  #this xterm should not be backgrounded
  xterm -title "Client" -e gdb -x $GDB_CLIENT_INIT $MYSQL_TEST_BIN
}

unknown's avatar
unknown committed
394
error () {
unknown's avatar
unknown committed
395
    $ECHO  "Error:  $1"
unknown's avatar
unknown committed
396 397 398
    exit 1
}

399
error_is () {
400
    $TR "\n" " " < $TIMEFILE | $SED -e 's/.* At line \(.*\)\: \(.*\)Command .*$/   \>\> Error at line \1: \2<\</'
401 402
}

unknown's avatar
unknown committed
403
prefix_to_8() {
404
 $ECHO "        $1" | $SED -e 's:.*\(........\)$:\1:'
unknown's avatar
unknown committed
405 406
}

unknown's avatar
unknown committed
407
pass_inc () {
unknown's avatar
unknown committed
408
    TOT_PASS=`$EXPR $TOT_PASS + 1`
unknown's avatar
unknown committed
409 410 411
}

fail_inc () {
unknown's avatar
unknown committed
412
    TOT_FAIL=`$EXPR $TOT_FAIL + 1`
unknown's avatar
unknown committed
413 414
}

415 416 417 418
skip_inc () {
    TOT_SKIP=`$EXPR $TOT_SKIP + 1`
}

unknown's avatar
unknown committed
419
total_inc () {
unknown's avatar
unknown committed
420
    TOT_TEST=`$EXPR $TOT_TEST + 1`
unknown's avatar
unknown committed
421 422 423
}

report_stats () {
424
    if [ $TOT_FAIL = 0 ]; then
unknown's avatar
unknown committed
425
	$ECHO "All $TOT_TEST tests were successful."
unknown's avatar
unknown committed
426
    else
unknown's avatar
unknown committed
427 428 429 430 431 432
	xten=`$EXPR $TOT_PASS \* 10000`   
	raw=`$EXPR $xten / $TOT_TEST`     
	raw=`$PRINTF %.4d $raw`           
	whole=`$PRINTF %.2s $raw`         
	xwhole=`$EXPR $whole \* 100`      
	deci=`$EXPR $raw - $xwhole`       
433
	$ECHO  "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful."
434 435 436 437 438
	$ECHO ""
        $ECHO "The log files in $MYSQL_TEST_DIR/var/log may give you some hint"
	$ECHO "of what when wrong."
	$ECHO "If you want to report this error, please read first the documentation at"
        $ECHO "http://www.mysql.com/doc/M/y/MySQL_test_suite.html"
unknown's avatar
unknown committed
439 440
    fi
}
441

unknown's avatar
unknown committed
442
mysql_install_db () {
443
    $ECHO "Removing Stale Files"
444 445
    $RM -rf $MASTER_MYDDIR $SLAVE_MYDDIR $SLAVE_MYLOG $MASTER_MYLOG \
     $SLAVE_MYERR $MASTER_MYERR
446
    $ECHO "Installing Master Databases"
447 448 449 450 451
    $INSTALL_DB
    if [ $? != 0 ]; then
	error "Could not install master test DBs"
	exit 1
    fi
452
    $ECHO "Installing Slave Databases"
453
    $INSTALL_DB -slave
454
    if [ $? != 0 ]; then
455
	error "Could not install slave test DBs"
456
	exit 1
unknown's avatar
unknown committed
457
    fi
458 459
    # Give mysqld some time to die.
    sleep $SLEEP_TIME
unknown's avatar
unknown committed
460 461 462
    return 0
}

unknown's avatar
unknown committed
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
gprof_prepare ()
{
 rm -rf $GPROF_DIR
 mkdir -p $GPROF_DIR 
}

gprof_collect ()
{
 if [ -f $MASTER_MYDDIR/gmon.out ]; then
   gprof $MYSQLD $MASTER_MYDDIR/gmon.out > $GPROF_MASTER
   echo "Master execution profile has been saved in $GPROF_MASTER"
 fi
 if [ -f $SLAVE_MYDDIR/gmon.out ]; then
   gprof $MYSQLD $SLAVE_MYDDIR/gmon.out > $GPROF_SLAVE
   echo "Slave execution profile has been saved in $GPROF_SLAVE"
 fi
}

481
gcov_prepare () {
unknown's avatar
unknown committed
482 483
    $FIND $BASEDIR -name \*.gcov \
    -or -name \*.da | $XARGS $RM
unknown's avatar
unknown committed
484 485 486
}

gcov_collect () {
unknown's avatar
unknown committed
487
    $ECHO "Collecting source coverage info..."
unknown's avatar
unknown committed
488 489
    [ -f $GCOV_MSG ] && $RM $GCOV_MSG
    [ -f $GCOV_ERR ] && $RM $GCOV_ERR
unknown's avatar
unknown committed
490 491 492
    for d in $MYSQLD_SRC_DIRS; do
	cd $BASEDIR/$d
	for f in *.h *.cc *.c; do
unknown's avatar
unknown committed
493
	    $GCOV $f 2>>$GCOV_ERR  >>$GCOV_MSG
unknown's avatar
unknown committed
494
	done
495
	cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
496 497
    done

unknown's avatar
unknown committed
498
    $ECHO "gcov info in $GCOV_MSG, errors in $GCOV_ERR"
unknown's avatar
unknown committed
499 500
}

unknown's avatar
unknown committed
501

unknown's avatar
unknown committed
502 503
start_master()
{
unknown's avatar
fixed  
unknown committed
504
    [ x$MASTER_RUNNING = 1 ] && return
505 506 507 508 509
    #run master initialization shell script if one exists
    if [ -f "$master_init_script" ] ;
    then
        /bin/sh $master_init_script
    fi
unknown's avatar
unknown committed
510
    cd $BASEDIR # for gcov
unknown's avatar
unknown committed
511 512
    # Remove old berkeley db log files that can confuse the server
    $RM -f $MASTER_MYDDIR/log.*	
513
    #start master
unknown's avatar
unknown committed
514 515 516
    if [ -z "$DO_BENCH" ]
    then
      master_args="--no-defaults --log-bin=master-bin \
517
    	    --server-id=1 \
518
            --basedir=$MY_BASEDIR \
519
	    --port=$MASTER_MYPORT \
unknown's avatar
unknown committed
520
	    --exit-info=256 \
unknown's avatar
unknown committed
521
	    --core \
522 523 524
            --datadir=$MASTER_MYDDIR \
	    --pid-file=$MASTER_MYPID \
	    --socket=$MASTER_MYSOCK \
unknown's avatar
unknown committed
525 526
            --log=$MASTER_MYLOG \
	    --character-sets-dir=$CHARSETSDIR \
527
	    --tmpdir=$MYSQL_TMP_DIR \
unknown's avatar
unknown committed
528
	    --language=$LANGUAGE \
unknown's avatar
unknown committed
529
            --innodb_data_file_path=ibdata1:50M \
530 531
	     $SMALL_SERVER \
	     $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
unknown's avatar
unknown committed
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
    else
      master_args="--no-defaults --log-bin=master-bin --server-id=1 \
            --basedir=$MY_BASEDIR \
	    --port=$MASTER_MYPORT \
            --datadir=$MASTER_MYDDIR \
	    --pid-file=$MASTER_MYPID \
	    --socket=$MASTER_MYSOCK \
            --default-character-set=$CHARACTER_SET \
	    --core \
	    --tmpdir=$MYSQL_TMP_DIR \
	    --language=$LANGUAGE \
            --innodb_data_file_path=ibdata1:50M \
	     $SMALL_SERVER \
	     $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
    fi	     
unknown's avatar
unknown committed
547 548 549 550 551 552
    if [ x$DO_DDD = x1 ]
    then
      $ECHO "set args $master_args" > $GDB_MASTER_INIT
      ddd --debugger "gdb -x $GDB_MASTER_INIT" $MYSQLD &
      prompt_user "Hit enter to continue after you've started the master"
    elif [ x$DO_GDB = x1 ]
unknown's avatar
unknown committed
553
    then
554
      $ECHO "set args $master_args" > $GDB_MASTER_INIT
unknown's avatar
unknown committed
555 556 557 558 559
      xterm -title "Master" -e gdb -x $GDB_MASTER_INIT $MYSQLD &
      prompt_user "Hit enter to continue after you've started the master"
    else	    
      $MYSQLD $master_args  >> $MASTER_MYERR 2>&1 &
    fi  
560
  wait_for_server_start $MASTER_MYPORT master
unknown's avatar
unknown committed
561 562 563 564 565
  MASTER_RUNNING=1
}

start_slave()
{
unknown's avatar
unknown committed
566
    [ x$SKIP_SLAVE = x1 ] && return
unknown's avatar
fixed  
unknown committed
567
    [ x$SLAVE_RUNNING = 1 ] && return
568 569 570 571 572 573 574
    
    #run slave initialization shell script if one exists
    if [ -f "$slave_init_script" ] ;
    then
	  /bin/sh $slave_init_script
    fi
    
575
    if [ -z "$SLAVE_MASTER_INFO" ] ; then
unknown's avatar
fixed  
unknown committed
576
      master_info="--master-user=root \
unknown's avatar
unknown committed
577
	    --master-connect-retry=1 \
578
	    --master-host=127.0.0.1 \
unknown's avatar
unknown committed
579
	    --master-password= \
580
	    --master-port=$MASTER_MYPORT \
unknown's avatar
fixed  
unknown committed
581 582 583 584 585
	    --server-id=2"
   else
     master_info=$SLAVE_MASTER_INFO
   fi	    
    
unknown's avatar
unknown committed
586
    $RM -f $SLAVE_MYDDIR/log.*	
unknown's avatar
fixed  
unknown committed
587 588
    slave_args="--no-defaults $master_info \
    	    --exit-info=256 \
589
	    --log-bin=slave-bin --log-slave-updates \
590
            --log=$SLAVE_MYLOG \
591
            --basedir=$MY_BASEDIR \
592 593 594 595
            --datadir=$SLAVE_MYDDIR \
	    --pid-file=$SLAVE_MYPID \
	    --port=$SLAVE_MYPORT \
	    --socket=$SLAVE_MYSOCK \
unknown's avatar
unknown committed
596
	    --character-sets-dir=$CHARSETSDIR \
597
	    --core \
598
	    --tmpdir=$MYSQL_TMP_DIR \
unknown's avatar
unknown committed
599
            --language=$LANGUAGE \
600
	    --skip-innodb --skip-slave-start \
601
	    --master-retry-count=5 \
602 603
	     $SMALL_SERVER \
             $EXTRA_SLAVE_OPT $EXTRA_SLAVE_MYSQLD_OPT"
unknown's avatar
unknown committed
604 605 606
    if [ x$DO_DDD = x1 ]
    then
      $ECHO "set args $master_args" > $GDB_SLAVE_INIT
607
      ddd --debugger "gdb -x $GDB_SLAVE_INIT" $SLAVE_MYSQLD &
unknown's avatar
unknown committed
608
      prompt_user "Hit enter to continue after you've started the slave"
unknown's avatar
unknown committed
609
    elif [ x$DO_GDB = x1 ]
unknown's avatar
unknown committed
610
    then
611
      $ECHO "set args $slave_args" > $GDB_SLAVE_INIT
unknown's avatar
unknown committed
612
      xterm -title "Slave" -e gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD &
unknown's avatar
unknown committed
613
      prompt_user "Hit enter to continue after you've started the slave"
unknown's avatar
unknown committed
614 615
    else
      $SLAVE_MYSQLD $slave_args  >> $SLAVE_MYERR 2>&1 &
unknown's avatar
unknown committed
616
    fi
617
    wait_for_server_start $SLAVE_MYPORT slave
unknown's avatar
unknown committed
618 619 620 621
    SLAVE_RUNNING=1
}

mysql_start () {
622
    $ECHO "Starting MySQL daemon"
unknown's avatar
unknown committed
623 624
    start_master
    start_slave
625
    cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
626 627 628
    return 1
}

unknown's avatar
unknown committed
629 630 631 632
stop_slave ()
{
  if [ x$SLAVE_RUNNING = x1 ]
  then
633
    $MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root -O shutdown_timeout=20 shutdown
634 635
    if [ $? != 0 ] && [ -f $SLAVE_MYPID ]
    then # try harder!
636
     $ECHO "slave not cooperating with mysqladmin, will try manual kill"
637
     kill `$CAT $SLAVE_MYPID`
638
     sleep $SLEEP_TIME
unknown's avatar
unknown committed
639
     if [ -f $SLAVE_MYPID ] ; then
unknown's avatar
unknown committed
640
       $ECHO "slave refused to die. Sending SIGKILL"
641
       kill -9 `$CAT $SLAVE_MYPID`
642
       $RM -f $SLAVE_MYPID
unknown's avatar
unknown committed
643
     else
644
      $ECHO "slave responded to SIGTERM " 
unknown's avatar
unknown committed
645 646
     fi
    fi
unknown's avatar
unknown committed
647 648 649
    SLAVE_RUNNING=0
  fi  
}
unknown's avatar
unknown committed
650

unknown's avatar
unknown committed
651 652 653 654
stop_master ()
{
  if [ x$MASTER_RUNNING = x1 ]
  then
655
    $MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root -O shutdown_timeout=20 shutdown
656 657
    if [ $? != 0 ] && [ -f $MASTER_MYPID ]
    then # try harder!
658
     $ECHO "master not cooperating with mysqladmin, will try manual kill"
659
     kill `$CAT $MASTER_MYPID`
660
     sleep $SLEEP_TIME
unknown's avatar
unknown committed
661
     if [ -f $MASTER_MYPID ] ; then
unknown's avatar
unknown committed
662
       $ECHO "master refused to die. Sending SIGKILL"
663
       kill -9 `$CAT $MASTER_MYPID`
664
       $RM -f $MASTER_MYPID
unknown's avatar
unknown committed
665
     else
666
      $ECHO "master responded to SIGTERM " 
unknown's avatar
unknown committed
667 668
     fi
    fi
unknown's avatar
unknown committed
669 670 671
    MASTER_RUNNING=0
  fi
}
unknown's avatar
unknown committed
672

unknown's avatar
unknown committed
673 674
mysql_stop ()
{
675 676
 $ECHO  "Ending Tests"
 $ECHO  "Shutting-down MySQL daemon"
677
 $ECHO  ""
unknown's avatar
unknown committed
678
 stop_master
unknown's avatar
unknown committed
679
 $ECHO "Master shutdown finished"
unknown's avatar
unknown committed
680
 stop_slave
unknown's avatar
unknown committed
681 682
 $ECHO "Slave shutdown finished"
 
unknown's avatar
unknown committed
683
 return 1
unknown's avatar
unknown committed
684 685 686 687 688 689 690 691 692 693 694
}

mysql_restart () {

    mysql_stop
    mysql_start

    return 1
}

mysql_loadstd () {
695
    
unknown's avatar
unknown committed
696
    # cp $STD_DATA/*.frm $STD_DATA/*.MRG $MASTER_MYDDIR/test  
unknown's avatar
unknown committed
697 698 699
    return 1
}

unknown's avatar
unknown committed
700 701 702
run_testcase ()
{
 tf=$1
unknown's avatar
unknown committed
703
 tname=`$BASENAME $tf .test`
unknown's avatar
unknown committed
704 705
 master_opt_file=$TESTDIR/$tname-master.opt
 slave_opt_file=$TESTDIR/$tname-slave.opt
706 707
 master_init_script=$TESTDIR/$tname-master.sh
 slave_init_script=$TESTDIR/$tname-slave.sh
unknown's avatar
fixed  
unknown committed
708
 slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt
unknown's avatar
unknown committed
709
 SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0`
unknown's avatar
unknown committed
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
 if [ -n "$SKIP_TEST" ] ; then 
   SKIP_THIS_TEST=`$EXPR \( $tname : "$SKIP_TEST" \) != 0`
   if [ x$SKIP_THIS_TEST = x1 ] ;
   then
    return;
   fi
  fi

 if [ -n "$DO_TEST" ] ; then 
   DO_THIS_TEST=`$EXPR \( $tname : "$DO_TEST" \) != 0`
   if [ x$DO_THIS_TEST = x0 ] ;
   then
    return;
   fi
  fi

726 727 728 729 730 731 732

 if [ x${NO_SLAVE}x$SKIP_SLAVE = x1x0 ] ;
 then
   USERT="    ...."
   SYST="    ...."
   REALT="    ...."
   timestr="$USERT $SYST $REALT"
unknown's avatar
unknown committed
733 734 735
   pname=`$ECHO "$tname                        "|$CUT -c 1-24`
   RES="$pname  $timestr"
   skip_inc
736 737 738 739
   $ECHO "$RES$RES_SPACE [ skipped ]"
   return
 fi

740
 if [ -z "$USE_RUNNING_SERVER" ] ;
unknown's avatar
unknown committed
741
 then
742 743 744 745 746 747 748 749 750 751 752 753 754 755
   if [ -f $master_opt_file ] ;
   then
     EXTRA_MASTER_OPT=`$CAT $master_opt_file`
     stop_master
     start_master
   else
     if [ ! -z "$EXTRA_MASTER_OPT" ] || [ x$MASTER_RUNNING != x1 ] ;
     then
       EXTRA_MASTER_OPT=""
       stop_master
       start_master
     fi  
   fi
   do_slave_restart=0
unknown's avatar
fixed  
unknown committed
756
 
757 758 759 760 761 762 763 764 765 766 767
   if [ -f $slave_opt_file ] ;
   then
     EXTRA_SLAVE_OPT=`$CAT $slave_opt_file`
     do_slave_restart=1
   else
    if [ ! -z "$EXTRA_SLAVE_OPT" ] || [ x$SLAVE_RUNNING != x1 ] ;
    then
      EXTRA_SLAVE_OPT=""
      do_slave_restart=1    
    fi  
   fi
unknown's avatar
fixed  
unknown committed
768

769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
   if [ -f $slave_master_info_file ] ; then
     SLAVE_MASTER_INFO=`$CAT $slave_master_info_file`
     do_slave_restart=1
   else
     if [ ! -z "$SLAVE_MASTER_INFO" ] || [ x$SLAVE_RUNNING != x1 ] ;
     then
       SLAVE_MASTER_INFO=""
       do_slave_restart=1    
     fi  
   fi

   if [ x$do_slave_restart = x1 ] ; then
     stop_slave
     start_slave
   fi
unknown's avatar
fixed  
unknown committed
784
 fi
785
 cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
786
  
unknown's avatar
unknown committed
787
 if [ -f $tf ] ; then
unknown's avatar
unknown committed
788
    $RM -f r/$tname.*reject
unknown's avatar
unknown committed
789 790 791 792 793 794 795
    mysql_test_args="-R r/$tname.result $EXTRA_MYSQL_TEST_OPT"
     if [ -z "$DO_CLIENT_GDB" ] ; then
     mytime=`$TIME -p $MYSQL_TEST  $mysql_test_args < $tf 2> $TIMEFILE`
    else
     do_gdb_test "$mysql_test_args" "$tf"
    fi
     
unknown's avatar
unknown committed
796 797
    res=$?

unknown's avatar
unknown committed
798
    if [ $res = 0 ]; then
799
	mytime=`$CAT $TIMEFILE | $TAIL -3 | $TR '\n' ':'`
800

801
	USERT=`$ECHO $mytime | $CUT -d : -f 2 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
802
        USERT=`prefix_to_8 $USERT`
803
	SYST=`$ECHO $mytime | $CUT -d : -f 3 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
804
        SYST=`prefix_to_8 $SYST`
805
	REALT=`$ECHO $mytime | $CUT -d : -f 1 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
806
        REALT=`prefix_to_8 $REALT`
807
    else
unknown's avatar
unknown committed
808 809 810
	USERT="    ...."
	SYST="    ...."
	REALT="    ...."
811 812
    fi

813
    timestr="$USERT $SYST $REALT"
unknown's avatar
unknown committed
814 815
    pname=`$ECHO "$tname                        "|$CUT -c 1-24`
    RES="$pname  $timestr"
unknown's avatar
unknown committed
816

unknown's avatar
unknown committed
817
    if [ $res = 0 ]; then
818 819
      total_inc
      pass_inc
820
      $ECHO "$RES$RES_SPACE [ pass ]"
821
    else
unknown's avatar
unknown committed
822 823 824 825 826
      # why the following ``if'' ? That is why res==1 is special ?
      if [ $res = 2 ]; then
        skip_inc
	$ECHO "$RES$RES_SPACE [ skipped ]"
      else
827
	total_inc
unknown's avatar
unknown committed
828
        fail_inc
829
	$ECHO "$RES$RES_SPACE [ fail ]"
830 831
        $ECHO
	error_is
unknown's avatar
unknown committed
832
	show_failed_diff $tname
unknown's avatar
unknown committed
833
	$ECHO
834
	if [ x$FORCE != x1 ] ; then
835 836
	 $ECHO "Aborting. To continue, re-run with '--force'."
	 $ECHO
unknown's avatar
unknown committed
837 838 839 840
         if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	 then
	   mysql_stop
   	 fi
841 842 843
	 exit 1
	fi
	 
unknown's avatar
unknown committed
844 845 846 847
        if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	then
	  mysql_restart
	fi
848
	$ECHO "Resuming Tests"
849
	$ECHO ""
850
      fi
unknown's avatar
unknown committed
851
    fi
852
  fi
unknown's avatar
unknown committed
853 854 855
}


unknown's avatar
unknown committed
856 857 858 859
######################################################################
# Main script starts here
######################################################################

unknown's avatar
unknown committed
860 861 862
[ "$DO_GCOV" -a ! -x "$GCOV" ] && error "No gcov found"

[ "$DO_GCOV" ] && gcov_prepare 
unknown's avatar
unknown committed
863
[ "$DO_GPROF" ] && gprof_prepare 
unknown's avatar
unknown committed
864

unknown's avatar
unknown committed
865
# Ensure that no old mysqld test servers are running
866 867 868 869 870 871
if [ -z "$USE_RUNNING_SERVER" ]
then
  $MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root -O connect_timeout=5 shutdown > /dev/null 2>&1
  $MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root -O connect_timeout=5 shutdown > /dev/null 2>&1
  $ECHO "Installing Test Databases"
  mysql_install_db
unknown's avatar
unknown committed
872

unknown's avatar
unknown committed
873 874
#do not automagically start deamons if we are in gdb or running only one test
#case
875 876 877 878 879 880
  if [ -z "$DO_GDB" ] && [ -z "$DO_DDD" ]
  then
    mysql_start
  fi
  $ECHO  "Loading Standard Test Databases"
  mysql_loadstd
unknown's avatar
unknown committed
881 882 883
fi


884
$ECHO  "Starting Tests"
unknown's avatar
unknown committed
885

unknown's avatar
unknown committed
886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
if [ "$DO_BENCH" = 1 ]
then
 BENCHDIR=$BASEDIR/sql-bench/
 savedir=`pwd`
 cd $BENCHDIR
 if [ -z "$1" ]
 then
  ./run-all-tests --socket=$MASTER_MYSOCK --user=root
 else
 if [ -x "./$1" ]
  then
   ./$1 --socket=$MASTER_MYSOCK --user=root
  else
   echo "benchmark $1 not found" 
  fi
 fi  
 cd $savedir
 mysql_stop
 exit
fi


unknown's avatar
unknown committed
908
$ECHO
unknown's avatar
unknown committed
909
$ECHO " TEST                         USER   SYSTEM  ELAPSED        RESULT"
unknown's avatar
unknown committed
910 911
$ECHO $DASH72

unknown's avatar
unknown committed
912
if [ -z "$1" ] ;
unknown's avatar
unknown committed
913
then
914
 if [ x$RECORD = x1 ]; then
915
  $ECHO "Will not run in record mode without a specific test case."
916
 else
unknown's avatar
unknown committed
917 918 919 920 921 922 923 924 925 926
  if [ -z "$USER_TEST" ]
  then
    for tf in $TESTDIR/*.$TESTSUFFIX
    do
     run_testcase $tf
    done
    $RM -f $TIMEFILE	# Remove for full test
  else
   $USER_TEST  
  fi  
927
 fi
928 929
else 
tname=`$BASENAME $1 .test`
930
 tf=$TESTDIR/$tname.$TESTSUFFIX
931 932 933
 if [ -f $tf ] ; then
  run_testcase $tf
 else
934
   $ECHO "Test case $tf does not exist."
935
 fi
unknown's avatar
unknown committed
936
fi
unknown's avatar
unknown committed
937

unknown's avatar
unknown committed
938 939
$ECHO $DASH72
$ECHO
940

941
if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
unknown's avatar
unknown committed
942 943 944
then
    mysql_stop
fi
unknown's avatar
unknown committed
945 946

report_stats
unknown's avatar
unknown committed
947
$ECHO
unknown's avatar
unknown committed
948

unknown's avatar
unknown committed
949
[ "$DO_GCOV" ] && gcov_collect # collect coverage information
unknown's avatar
unknown committed
950
[ "$DO_GPROF" ] && gprof_collect # collect coverage information
unknown's avatar
unknown committed
951

unknown's avatar
unknown committed
952
exit 0