mysql-test-run.sh 22 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
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 47
# No paths below as we can't be sure where the program is!

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

# Are we using a source or a binary distribution?

testdir=@testdir@
if [ -d bin/mysqld ] && [ -d mysql-test ] ; then
67 68
 cd mysql-test
else
69 70
 if [ -d $testdir/mysql-test ] ; then
   cd $testdir
71
 fi
72 73 74 75 76 77 78
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
79
  exit 1
80
fi
81

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

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

92
#BASEDIR is always one above mysql-test directory 
unknown's avatar
unknown committed
93 94 95 96
CWD=`pwd`
cd ..
BASEDIR=`pwd`
cd $CWD
97
MYSQL_TEST_DIR=$BASEDIR/mysql-test
98
export MYSQL_TEST_DIR
99
STD_DATA=$MYSQL_TEST_DIR/std_data
unknown's avatar
unknown committed
100
hostname=`hostname`		# Installed in the mysql privilege table
101
  
102
TESTDIR="$MYSQL_TEST_DIR/t"
unknown's avatar
unknown committed
103
TESTSUFFIX=test
104
TOT_SKIP=0
unknown's avatar
unknown committed
105 106 107
TOT_PASS=0
TOT_FAIL=0
TOT_TEST=0
108 109 110
USERT=0
SYST=0
REALT=0
unknown's avatar
unknown committed
111
MYSQL_TMP_DIR=$MYSQL_TEST_DIR/var/tmp
unknown's avatar
unknown committed
112
RES_SPACE="      "
unknown's avatar
unknown committed
113 114
MYSQLD_SRC_DIRS="strings mysys include extra regex isam merge myisam \
 myisammrg heap sql"
115

unknown's avatar
fixed  
unknown committed
116
MASTER_RUNNING=0
117
MASTER_MYPORT=9306
unknown's avatar
fixed  
unknown committed
118
SLAVE_RUNNING=0
119
SLAVE_MYPORT=9307
120
NO_SLAVE=0
121

122
EXTRA_MASTER_OPT=""
123 124 125 126 127
EXTRA_MYSQL_TEST_OPT=""
USE_RUNNING_SERVER=1
DO_GCOV=""
DO_GDB=""
DO_DDD=""
128
DO_CLIENT_GDB=""
129
SLEEP_TIME=2
130
DBUSER=""
131 132 133

while test $# -gt 0; do
  case "$1" in
134 135
    --user=*) DBUSER=`$ECHO "$1" | $SED -e "s;--user=;;"` ;;
    --force)  FORCE=1 ;;
136 137 138 139
    --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=;;"` ;;
140 141 142 143 144 145
    --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" ;;
146
    --skip-rpl) NO_SLAVE=1 ;;
unknown's avatar
unknown committed
147
    --skip-test=*) SKIP_TEST=`$ECHO "$1" | $SED -e "s;--skip-test=;;"`;;
148 149 150
    --record)
      RECORD=1;
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
unknown's avatar
unknown committed
151 152 153 154
    --bench)
      DO_BENCH=1
      NO_SLAVE=1
      ;;  
155 156 157 158
    --sleep=*)
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1"
      SLEEP_TIME=`$ECHO "$1" | $SED -e "s;--sleep=;;"`
      ;;
159 160 161
    --mysqld=*)
       TMP=`$ECHO "$1" | $SED -e "s;--mysqld-=;"`
       EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $TMP"
162
       EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $TMP"
163
       ;;
164 165 166 167 168 169 170
    --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
171 172 173
    --gprof )
      DO_GPROF=1
      ;;  
174 175
    --gdb )
      if [ x$BINARY_DIST = x1 ] ; then
176
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --gdb option"
177 178
      fi
      DO_GDB=1
179
      USE_RUNNING_SERVER=""
180
      ;;
181 182 183 184 185 186
    --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
      ;;
187 188
    --ddd )
      if [ x$BINARY_DIST = x1 ] ; then
189
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --ddd option"
190 191
      fi
      DO_DDD=1
192
      USE_RUNNING_SERVER=""
193
      ;;
194 195 196 197
    --skip-*)
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $1"
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $1"
      ;;
198
    --debug)
199 200 201 202
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
       --debug=d:t:O,$MYSQL_TMP_DIR/master.trace"
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
       --debug=d:t:O,$MYSQL_TMP_DIR/slave.trace"
203
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --debug"
204 205 206 207 208 209 210
      ;;
    -- )  shift; break ;;
    --* ) $ECHO "Unrecognized option: $1"; exit 1 ;;
    * ) break ;;
  esac
  shift
done
unknown's avatar
fixed  
unknown committed
211

unknown's avatar
unknown committed
212 213 214
#++
# mysqld Environment Parameters
#--
215

unknown's avatar
unknown committed
216
MYRUN_DIR=$MYSQL_TEST_DIR/var/run
217
MASTER_MYDDIR="$MYSQL_TEST_DIR/var/master-data"
218
MASTER_MYSOCK="$MYSQL_TMP_DIR/mysql-master.sock"
unknown's avatar
unknown committed
219
MASTER_MYPID="$MYRUN_DIR/mysqld.pid"
220 221 222 223
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
224 225
SLAVE_MYSOCK="$MYSQL_TMP_DIR/mysql-slave.sock"
SLAVE_MYPID="$MYRUN_DIR/mysqld-slave.pid"
226 227 228
SLAVE_MYLOG="$MYSQL_TEST_DIR/var/log/mysqld-slave.log"
SLAVE_MYERR="$MYSQL_TEST_DIR/var/log/mysqld-slave.err"

229 230
SMALL_SERVER="-O key_buffer_size=1M -O sort_buffer=256K -O max_heap_table_size=1M"

unknown's avatar
unknown committed
231 232 233
export MASTER_MYPORT
export SLAVE_MYPORT

234 235 236 237 238
if [ x$SOURCE_DIST = x1 ] ; then
 MY_BASEDIR=$MYSQL_TEST_DIR
else
 MY_BASEDIR=$BASEDIR
fi  
unknown's avatar
unknown committed
239

unknown's avatar
unknown committed
240 241 242 243 244 245 246 247 248
# 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

249 250
[ -z "$COLUMNS" ] && COLUMNS=80
E=`$EXPR $COLUMNS - 8`
251 252
#DASH72=`expr substr '------------------------------------------------------------------------' 1 $E`
DASH72=`$ECHO '------------------------------------------------------------------------'|$CUT -c 1-$E`
253

254 255 256 257 258 259
# 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"
 MYSQL_TEST="$BASEDIR/client/mysqltest"
 MYSQLADMIN="$BASEDIR/client/mysqladmin"
unknown's avatar
unknown committed
260
 MYSQL="$BASEDIR/client/mysql"
261 262 263 264 265
 INSTALL_DB="./install_test_db"
else
 MYSQLD="$BASEDIR/bin/mysqld"
 MYSQL_TEST="$BASEDIR/bin/mysqltest"
 MYSQLADMIN="$BASEDIR/bin/mysqladmin"
unknown's avatar
unknown committed
266
 MYSQL="$BASEDIR/bin/mysql"
unknown's avatar
unknown committed
267
 INSTALL_DB="./install_test_db -bin"
268 269
fi

270 271 272 273 274 275
# If we should run all tests cases, we will use a local server for that

if [ -z "$1" ]
then
   USE_RUNNING_SERVER=""
fi
276 277 278
if [ -n "$USE_RUNNING_SERVER" ]
then
   MASTER_MYSOCK="/tmp/mysql.sock"
279
   DBUSER=${DBUSER:-test}
280
else
281
   DBUSER=${DBUSER:-root}		# We want to do FLUSH xxx commands
282
fi
283 284 285 286 287 288 289 290

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

291

292 293 294 295
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
296 297 298
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
299 300 301 302
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
303 304 305
TIMEFILE="$MYSQL_TMP_DIR/mysqltest-time"
SLAVE_MYSQLD=$MYSQLD #this can be changed later if we are doing gcov

unknown's avatar
unknown committed
306 307 308
#++
# Function Definitions
#--
unknown's avatar
unknown committed
309
wait_for_server_start ()
unknown's avatar
unknown committed
310
{
unknown's avatar
unknown committed
311
   $MYSQLADMIN --no-defaults -u $DBUSER --silent -O connect_timeout=10 -w2 --host=$hostname --port=$1  ping >/dev/null 2>&1
unknown's avatar
unknown committed
312
}
unknown's avatar
unknown committed
313

unknown's avatar
unknown committed
314 315
prompt_user ()
{
316
 $ECHO $1
317
 read unused
unknown's avatar
unknown committed
318 319
}

320 321
# We can't use diff -u as this isn't portable

unknown's avatar
unknown committed
322 323 324 325 326 327 328 329
show_failed_diff ()
{
  reject_file=r/$1.reject
  result_file=r/$1.result
  if [ -x "$DIFF" ] && [ -f $reject_file ]
  then
    echo "Below are the diffs between actual and expected results:"
    echo "-------------------------------------------------------"
330
    $DIFF -c $result_file $reject_file
unknown's avatar
unknown committed
331
    echo "-------------------------------------------------------"
332 333 334
    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
335 336
  fi  
}
unknown's avatar
unknown committed
337

338 339 340 341 342 343 344 345 346
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
347
error () {
unknown's avatar
unknown committed
348
    $ECHO  "Error:  $1"
unknown's avatar
unknown committed
349 350 351
    exit 1
}

352
error_is () {
353
    $TR "\n" " " < $TIMEFILE | $SED -e 's/.* At line \(.*\)\: \(.*\)Command .*$/   \>\> Error at line \1: \2<\</'
354 355
}

unknown's avatar
unknown committed
356
prefix_to_8() {
357
 $ECHO "        $1" | $SED -e 's:.*\(........\)$:\1:'
unknown's avatar
unknown committed
358 359
}

unknown's avatar
unknown committed
360
pass_inc () {
unknown's avatar
unknown committed
361
    TOT_PASS=`$EXPR $TOT_PASS + 1`
unknown's avatar
unknown committed
362 363 364
}

fail_inc () {
unknown's avatar
unknown committed
365
    TOT_FAIL=`$EXPR $TOT_FAIL + 1`
unknown's avatar
unknown committed
366 367
}

368 369 370 371
skip_inc () {
    TOT_SKIP=`$EXPR $TOT_SKIP + 1`
}

unknown's avatar
unknown committed
372
total_inc () {
unknown's avatar
unknown committed
373
    TOT_TEST=`$EXPR $TOT_TEST + 1`
unknown's avatar
unknown committed
374 375 376
}

report_stats () {
377
    if [ $TOT_FAIL = 0 ]; then
unknown's avatar
unknown committed
378
	$ECHO "All $TOT_TEST tests were successful."
unknown's avatar
unknown committed
379
    else
unknown's avatar
unknown committed
380 381 382 383 384 385
	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`       
386
	$ECHO  "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful."
387 388 389 390 391
	$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
392 393
    fi
}
394

unknown's avatar
unknown committed
395
mysql_install_db () {
396
    $ECHO "Removing Stale Files"
397 398
    $RM -rf $MASTER_MYDDIR $SLAVE_MYDDIR $SLAVE_MYLOG $MASTER_MYLOG \
     $SLAVE_MYERR $MASTER_MYERR
399
    $ECHO "Installing Master Databases"
400 401 402 403 404
    $INSTALL_DB
    if [ $? != 0 ]; then
	error "Could not install master test DBs"
	exit 1
    fi
405
    $ECHO "Installing Slave Databases"
406
    $INSTALL_DB -slave
407
    if [ $? != 0 ]; then
408
	error "Could not install slave test DBs"
409
	exit 1
unknown's avatar
unknown committed
410
    fi
411 412
    # Give mysqld some time to die.
    sleep $SLEEP_TIME
unknown's avatar
unknown committed
413 414 415
    return 0
}

unknown's avatar
unknown committed
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
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
}

434
gcov_prepare () {
unknown's avatar
unknown committed
435 436
    $FIND $BASEDIR -name \*.gcov \
    -or -name \*.da | $XARGS $RM
unknown's avatar
unknown committed
437 438 439
}

gcov_collect () {
unknown's avatar
unknown committed
440
    $ECHO "Collecting source coverage info..."
unknown's avatar
unknown committed
441 442
    [ -f $GCOV_MSG ] && $RM $GCOV_MSG
    [ -f $GCOV_ERR ] && $RM $GCOV_ERR
unknown's avatar
unknown committed
443 444 445
    for d in $MYSQLD_SRC_DIRS; do
	cd $BASEDIR/$d
	for f in *.h *.cc *.c; do
unknown's avatar
unknown committed
446
	    $GCOV $f 2>>$GCOV_ERR  >>$GCOV_MSG
unknown's avatar
unknown committed
447
	done
448
	cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
449 450
    done

unknown's avatar
unknown committed
451
    $ECHO "gcov info in $GCOV_MSG, errors in $GCOV_ERR"
unknown's avatar
unknown committed
452 453
}

unknown's avatar
unknown committed
454

unknown's avatar
unknown committed
455 456
start_master()
{
unknown's avatar
fixed  
unknown committed
457
    [ x$MASTER_RUNNING = 1 ] && return
458 459 460 461 462
    #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
463
    cd $BASEDIR # for gcov
unknown's avatar
unknown committed
464 465
    # Remove old berkeley db log files that can confuse the server
    $RM -f $MASTER_MYDDIR/log.*	
466
    #start master
unknown's avatar
unknown committed
467 468 469
    if [ -z "$DO_BENCH" ]
    then
      master_args="--no-defaults --log-bin=master-bin \
470
    	    --server-id=1 \
471
            --basedir=$MY_BASEDIR \
472
	    --port=$MASTER_MYPORT \
473
	    --exit-info=256 \
474 475 476
            --datadir=$MASTER_MYDDIR \
	    --pid-file=$MASTER_MYPID \
	    --socket=$MASTER_MYSOCK \
unknown's avatar
unknown committed
477
            --log=$MASTER_MYLOG --default-character-set=latin1 \
478
	    --tmpdir=$MYSQL_TMP_DIR \
479
	    --language=english \
unknown's avatar
unknown committed
480
            --innodb_data_file_path=ibdata1:50M \
481 482
	     $SMALL_SERVER \
	     $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
unknown's avatar
unknown committed
483 484 485 486 487 488 489 490 491 492 493
    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=latin1 \
	    --core \
	    --tmpdir=$MYSQL_TMP_DIR \
	    --language=english \
unknown's avatar
unknown committed
494
            --innodb_data_file_path=ibdata1:50M \
unknown's avatar
unknown committed
495 496 497
	     $SMALL_SERVER \
	     $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
    fi	     
unknown's avatar
unknown committed
498 499 500 501 502 503
    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
504
    then
505
      $ECHO "set args $master_args" > $GDB_MASTER_INIT
unknown's avatar
unknown committed
506 507 508 509 510
      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  
unknown's avatar
unknown committed
511
  wait_for_server_start $MASTER_MYPORT
unknown's avatar
unknown committed
512 513 514 515 516
  MASTER_RUNNING=1
}

start_slave()
{
unknown's avatar
unknown committed
517
    [ x$SKIP_SLAVE = x1 ] && return
unknown's avatar
fixed  
unknown committed
518
    [ x$SLAVE_RUNNING = 1 ] && return
519 520 521 522 523 524 525
    
    #run slave initialization shell script if one exists
    if [ -f "$slave_init_script" ] ;
    then
	  /bin/sh $slave_init_script
    fi
    
526
    if [ -z "$SLAVE_MASTER_INFO" ] ; then
unknown's avatar
fixed  
unknown committed
527
      master_info="--master-user=root \
unknown's avatar
unknown committed
528
	    --master-connect-retry=1 \
529
	    --master-host=127.0.0.1 \
unknown's avatar
unknown committed
530
	    --master-password= \
531
	    --master-port=$MASTER_MYPORT \
unknown's avatar
fixed  
unknown committed
532 533 534 535 536
	    --server-id=2"
   else
     master_info=$SLAVE_MASTER_INFO
   fi	    
    
unknown's avatar
unknown committed
537
    $RM -f $SLAVE_MYDDIR/log.*	
unknown's avatar
fixed  
unknown committed
538 539
    slave_args="--no-defaults $master_info \
    	    --exit-info=256 \
540
	    --log-bin=slave-bin --log-slave-updates \
541
            --basedir=$MY_BASEDIR \
542 543 544 545
            --datadir=$SLAVE_MYDDIR \
	    --pid-file=$SLAVE_MYPID \
	    --port=$SLAVE_MYPORT \
	    --socket=$SLAVE_MYSOCK \
unknown's avatar
unknown committed
546
            --log=$SLAVE_MYLOG --default-character-set=latin1 \
547
	    --core \
548
	    --tmpdir=$MYSQL_TMP_DIR \
549
            --language=english \
550
	    --skip-innodb --skip-slave-start \
551 552
	    --report-host=127.0.0.1 --report-user=root \
	    --report-port=$SLAVE_MYPORT \
553 554
	     $SMALL_SERVER \
             $EXTRA_SLAVE_OPT $EXTRA_SLAVE_MYSQLD_OPT"
unknown's avatar
unknown committed
555 556 557
    if [ x$DO_DDD = x1 ]
    then
      $ECHO "set args $master_args" > $GDB_SLAVE_INIT
558
      ddd --debugger "gdb -x $GDB_SLAVE_INIT" $SLAVE_MYSQLD &
unknown's avatar
unknown committed
559 560
      prompt_user "Hit enter to continue after you've started the master"
    elif [ x$DO_GDB = x1 ]
unknown's avatar
unknown committed
561
    then
562
      $ECHO "set args $slave_args" > $GDB_SLAVE_INIT
unknown's avatar
unknown committed
563
      xterm -title "Slave" -e gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD &
unknown's avatar
unknown committed
564
      prompt_user "Hit enter to continue after you've started the slave"
unknown's avatar
unknown committed
565 566
    else
      $SLAVE_MYSQLD $slave_args  >> $SLAVE_MYERR 2>&1 &
unknown's avatar
unknown committed
567
    fi
unknown's avatar
unknown committed
568
    wait_for_server_start $SLAVE_MYPORT
unknown's avatar
unknown committed
569 570 571 572
    SLAVE_RUNNING=1
}

mysql_start () {
573
    $ECHO "Starting MySQL daemon"
unknown's avatar
unknown committed
574 575
    start_master
    start_slave
576
    cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
577 578 579
    return 1
}

unknown's avatar
unknown committed
580 581 582 583
stop_slave ()
{
  if [ x$SLAVE_RUNNING = x1 ]
  then
unknown's avatar
unknown committed
584
    $MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root -O shutdown_timeout=10 shutdown
585 586
    if [ $? != 0 ] && [ -f $SLAVE_MYPID ]
    then # try harder!
587
     $ECHO "slave not cooperating with mysqladmin, will try manual kill"
588
     kill `$CAT $SLAVE_MYPID`
589
     sleep $SLEEP_TIME
unknown's avatar
unknown committed
590
     if [ -f $SLAVE_MYPID ] ; then
unknown's avatar
unknown committed
591
       $ECHO "slave refused to die. Sending SIGKILL"
592
       kill -9 `$CAT $SLAVE_MYPID`
593
       $RM -f $SLAVE_MYPID
unknown's avatar
unknown committed
594
     else
595
      $ECHO "slave responded to SIGTERM " 
unknown's avatar
unknown committed
596 597
     fi
    fi
unknown's avatar
unknown committed
598 599 600
    SLAVE_RUNNING=0
  fi  
}
unknown's avatar
unknown committed
601

unknown's avatar
unknown committed
602 603 604 605
stop_master ()
{
  if [ x$MASTER_RUNNING = x1 ]
  then
unknown's avatar
unknown committed
606
    $MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root -O shutdown_timeout=10 shutdown
607 608
    if [ $? != 0 ] && [ -f $MASTER_MYPID ]
    then # try harder!
609
     $ECHO "master not cooperating with mysqladmin, will try manual kill"
610
     kill `$CAT $MASTER_MYPID`
611
     sleep $SLEEP_TIME
unknown's avatar
unknown committed
612
     if [ -f $MASTER_MYPID ] ; then
unknown's avatar
unknown committed
613
       $ECHO "master refused to die. Sending SIGKILL"
614
       kill -9 `$CAT $MASTER_MYPID`
615
       $RM -f $MASTER_MYPID
unknown's avatar
unknown committed
616
     else
617
      $ECHO "master responded to SIGTERM " 
unknown's avatar
unknown committed
618 619
     fi
    fi
unknown's avatar
unknown committed
620 621 622
    MASTER_RUNNING=0
  fi
}
unknown's avatar
unknown committed
623

unknown's avatar
unknown committed
624 625
mysql_stop ()
{
626 627
 $ECHO  "Ending Tests"
 $ECHO  "Shutting-down MySQL daemon"
628
 $ECHO  ""
unknown's avatar
unknown committed
629
 stop_master
unknown's avatar
unknown committed
630
 $ECHO "Master shutdown finished"
unknown's avatar
unknown committed
631
 stop_slave
unknown's avatar
unknown committed
632 633
 $ECHO "Slave shutdown finished"
 
unknown's avatar
unknown committed
634
 return 1
unknown's avatar
unknown committed
635 636 637 638 639 640 641 642 643 644 645
}

mysql_restart () {

    mysql_stop
    mysql_start

    return 1
}

mysql_loadstd () {
646
    
unknown's avatar
unknown committed
647
    # cp $STD_DATA/*.frm $STD_DATA/*.MRG $MASTER_MYDDIR/test  
unknown's avatar
unknown committed
648 649 650
    return 1
}

unknown's avatar
unknown committed
651 652 653
run_testcase ()
{
 tf=$1
unknown's avatar
unknown committed
654
 tname=`$BASENAME $tf .test`
unknown's avatar
unknown committed
655 656
 master_opt_file=$TESTDIR/$tname-master.opt
 slave_opt_file=$TESTDIR/$tname-slave.opt
657 658
 master_init_script=$TESTDIR/$tname-master.sh
 slave_init_script=$TESTDIR/$tname-slave.sh
unknown's avatar
fixed  
unknown committed
659
 slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt
unknown's avatar
unknown committed
660
 SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0`
unknown's avatar
unknown committed
661
 if [ -n $SKIP_TEST ] ; then 
unknown's avatar
unknown committed
662
   SKIP_THIS_TEST=`$EXPR \( $tname : '$SKIP_TEST' \) != 0`
unknown's avatar
unknown committed
663 664 665 666 667
   if [ x$SKIP_THIS_TEST = x1 ] ;
   then
    return;
   fi
  fi
668 669 670 671 672 673 674 675 676

 if [ x${NO_SLAVE}x$SKIP_SLAVE = x1x0 ] ;
 then
   USERT="    ...."
   SYST="    ...."
   REALT="    ...."
   timestr="$USERT $SYST $REALT"
   pname=`$ECHO "$tname                 "|$CUT -c 1-16`
   RES="$pname          $timestr"
677
   skip_inc
678 679 680 681
   $ECHO "$RES$RES_SPACE [ skipped ]"
   return
 fi

682
 if [ -z "$USE_RUNNING_SERVER" ] ;
unknown's avatar
unknown committed
683
 then
684 685 686 687 688 689 690 691 692 693 694 695 696 697
   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
698
 
699 700 701 702 703 704 705 706 707 708 709
   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
710

711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
   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
726
 fi
727
 cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
728
  
unknown's avatar
unknown committed
729
 if [ -f $tf ] ; then
unknown's avatar
unknown committed
730
    $RM -f r/$tname.*reject
731 732 733 734 735 736 737
    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
738 739
    res=$?

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

743
	USERT=`$ECHO $mytime | $CUT -d : -f 2 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
744
        USERT=`prefix_to_8 $USERT`
745
	SYST=`$ECHO $mytime | $CUT -d : -f 3 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
746
        SYST=`prefix_to_8 $SYST`
747
	REALT=`$ECHO $mytime | $CUT -d : -f 1 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
748
        REALT=`prefix_to_8 $REALT`
749
    else
unknown's avatar
unknown committed
750 751 752
	USERT="    ...."
	SYST="    ...."
	REALT="    ...."
753 754
    fi

755 756 757
    timestr="$USERT $SYST $REALT"
    pname=`$ECHO "$tname                 "|$CUT -c 1-16`
    RES="$pname          $timestr"
unknown's avatar
unknown committed
758

unknown's avatar
unknown committed
759
    if [ $res = 0 ]; then
760 761
      total_inc
      pass_inc
762
      $ECHO "$RES$RES_SPACE [ pass ]"
763
    else
unknown's avatar
unknown committed
764
      if [ $res = 1 ]; then
765
	total_inc
unknown's avatar
unknown committed
766
        fail_inc
767
	$ECHO "$RES$RES_SPACE [ fail ]"
768 769
        $ECHO
	error_is
unknown's avatar
unknown committed
770
	show_failed_diff $tname
unknown's avatar
unknown committed
771
	$ECHO
772
	if [ x$FORCE != x1 ] ; then
773 774
	 $ECHO "Aborting. To continue, re-run with '--force'."
	 $ECHO
unknown's avatar
unknown committed
775 776 777 778
         if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	 then
	   mysql_stop
   	 fi
779 780 781
	 exit 1
	fi
	 
unknown's avatar
unknown committed
782 783 784 785
        if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	then
	  mysql_restart
	fi
786
	$ECHO "Resuming Tests"
787
	$ECHO ""
788
      else
789
        skip_inc
790
	$ECHO "$RES$RES_SPACE [ skipped ]"
791
      fi
unknown's avatar
unknown committed
792
    fi
793
  fi
unknown's avatar
unknown committed
794 795 796
}


unknown's avatar
unknown committed
797 798 799 800
######################################################################
# Main script starts here
######################################################################

unknown's avatar
unknown committed
801 802 803
[ "$DO_GCOV" -a ! -x "$GCOV" ] && error "No gcov found"

[ "$DO_GCOV" ] && gcov_prepare 
unknown's avatar
unknown committed
804
[ "$DO_GPROF" ] && gprof_prepare 
unknown's avatar
unknown committed
805

unknown's avatar
unknown committed
806
# Ensure that no old mysqld test servers are running
807 808 809 810 811 812
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
813

unknown's avatar
unknown committed
814 815
#do not automagically start deamons if we are in gdb or running only one test
#case
816 817 818 819 820 821
  if [ -z "$DO_GDB" ] && [ -z "$DO_DDD" ]
  then
    mysql_start
  fi
  $ECHO  "Loading Standard Test Databases"
  mysql_loadstd
unknown's avatar
unknown committed
822 823 824
fi


825
$ECHO  "Starting Tests"
unknown's avatar
unknown committed
826

unknown's avatar
unknown committed
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848
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
849
$ECHO
unknown's avatar
unknown committed
850
$ECHO " TEST                         USER   SYSTEM  ELAPSED        RESULT"
unknown's avatar
unknown committed
851 852
$ECHO $DASH72

unknown's avatar
unknown committed
853
if [ -z "$1" ] ;
unknown's avatar
unknown committed
854
then
855
 if [ x$RECORD = x1 ]; then
856
  $ECHO "Will not run in record mode without a specific test case."
857 858 859 860 861
 else
  for tf in $TESTDIR/*.$TESTSUFFIX
  do
    run_testcase $tf
  done
862
  $RM -f $TIMEFILE	# Remove for full test
863
 fi
864 865
else 
tname=`$BASENAME $1 .test`
866
 tf=$TESTDIR/$tname.$TESTSUFFIX
867 868 869
 if [ -f $tf ] ; then
  run_testcase $tf
 else
870
   $ECHO "Test case $tf does not exist."
871
 fi
unknown's avatar
unknown committed
872
fi
unknown's avatar
unknown committed
873

unknown's avatar
unknown committed
874 875
$ECHO $DASH72
$ECHO
876

877
if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
unknown's avatar
unknown committed
878 879 880
then
    mysql_stop
fi
unknown's avatar
unknown committed
881 882

report_stats
unknown's avatar
unknown committed
883
$ECHO
unknown's avatar
unknown committed
884

unknown's avatar
unknown committed
885
[ "$DO_GCOV" ] && gcov_collect # collect coverage information
unknown's avatar
unknown committed
886
[ "$DO_GPROF" ] && gprof_collect # collect coverage information
unknown's avatar
unknown committed
887

unknown's avatar
unknown committed
888
exit 0