mysql-test-run.sh 35.4 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
USE_MANAGER=0
unknown's avatar
unknown committed
16
TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work
unknown's avatar
unknown committed
17

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

22
PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin:/usr/bin/X11:$PATH
23
MASTER_40_ARGS="--rpl-recovery-rank=1 --init-rpl-role=master"
24

25 26 27 28
# Standard functions

which ()
{
29
  IFS="${IFS=   }"; save_ifs="$IFS"; IFS=':'
30 31
  for file
  do
32
    for dir in $PATH
33
    do
unknown's avatar
unknown committed
34
      if test -f $dir/$file
35 36 37 38 39
      then
        echo "$dir/$file"
        continue 2
      fi
    done
40
    echo "Fatal error: Cannot find program $file in $PATH" 1>&2
41 42
    exit 1
  done
43
  IFS="$save_ifs"
44
  exit 0
45 46 47
}


unknown's avatar
unknown committed
48 49
sleep_until_file_deleted ()
{
50 51
  pid=$1;
  file=$2
unknown's avatar
unknown committed
52
  loop=$SLEEP_TIME_FOR_DELETE
unknown's avatar
unknown committed
53 54
  while (test $loop -gt 0)
  do
unknown's avatar
unknown committed
55
    if [ ! -r $file ]
unknown's avatar
unknown committed
56
    then
57 58 59 60
      if test $pid != "0"
      then
        wait_for_pid $pid
      fi
unknown's avatar
unknown committed
61 62
      return
    fi
unknown's avatar
unknown committed
63
    sleep 1
unknown's avatar
unknown committed
64 65 66 67
    loop=`expr $loop - 1`
  done
}

68
sleep_until_file_created ()
unknown's avatar
unknown committed
69 70
{
  file=$1
unknown's avatar
unknown committed
71 72
  loop=$2
  org_time=$2
unknown's avatar
unknown committed
73 74
  while (test $loop -gt 0)
  do
unknown's avatar
unknown committed
75
    if [ -r $file ]
unknown's avatar
unknown committed
76
    then
77
      return 0
unknown's avatar
unknown committed
78
    fi
unknown's avatar
unknown committed
79
    sleep 1
unknown's avatar
unknown committed
80 81
    loop=`expr $loop - 1`
  done
unknown's avatar
unknown committed
82
  echo "ERROR: $file was not created in $org_time seconds;  Aborting"
unknown's avatar
unknown committed
83 84 85
  exit 1;
}

86 87 88 89 90
# For the future

wait_for_pid()
{
  pid=$1
unknown's avatar
unknown committed
91
  #$WAIT_PID pid $SLEEP_TIME_FOR_DELETE
92 93
}

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

unknown's avatar
unknown committed
96 97
SED=sed

98 99
BASENAME=`which basename`
if test $? != 0; then exit 1; fi
unknown's avatar
unknown committed
100
DIFF=`which diff | $SED q`
101
if test $? != 0; then exit 1; fi
102 103
CAT=cat
CUT=cut
unknown's avatar
unknown committed
104
HEAD=head
105 106 107 108
TAIL=tail
ECHO=echo # use internal echo if possible
EXPR=expr # use internal if possible
FIND=find
109
if test $? != 0; then exit 1; fi
110 111
PRINTF=printf
RM=rm
112 113
TIME=`which time`
if test $? != 0; then exit 1; fi
114
TR=tr
115 116
XARGS=`which xargs`
if test $? != 0; then exit 1; fi
117 118 119 120 121

# Are we using a source or a binary distribution?

testdir=@testdir@
if [ -d bin/mysqld ] && [ -d mysql-test ] ; then
122 123
 cd mysql-test
else
124 125
 if [ -d $testdir/mysql-test ] ; then
   cd $testdir
126
 fi
127 128 129 130 131 132 133
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
134
  exit 1
135
fi
136

unknown's avatar
unknown committed
137 138 139
#++
# Misc. Definitions
#--
140

141 142 143 144 145
if [ -d ../sql ] ; then
   SOURCE_DIST=1
else
   BINARY_DIST=1
fi
146

unknown's avatar
unknown committed
147
#BASEDIR is always one above mysql-test directory
unknown's avatar
unknown committed
148 149 150 151
CWD=`pwd`
cd ..
BASEDIR=`pwd`
cd $CWD
152
MYSQL_TEST_DIR=$BASEDIR/mysql-test
153
export MYSQL_TEST_DIR
154
STD_DATA=$MYSQL_TEST_DIR/std_data
unknown's avatar
unknown committed
155
hostname=`hostname`		# Installed in the mysql privilege table
unknown's avatar
unknown committed
156

unknown's avatar
unknown committed
157
MANAGER_QUIET_OPT="-q"
158
TESTDIR="$MYSQL_TEST_DIR/t"
unknown's avatar
unknown committed
159
TESTSUFFIX=test
160
TOT_SKIP=0
unknown's avatar
unknown committed
161 162 163
TOT_PASS=0
TOT_FAIL=0
TOT_TEST=0
164 165 166
USERT=0
SYST=0
REALT=0
167
FAST_START=""
unknown's avatar
unknown committed
168
MYSQL_TMP_DIR=$MYSQL_TEST_DIR/var/tmp
unknown's avatar
unknown committed
169
SLAVE_LOAD_TMPDIR=../../var/tmp #needs to be same length to test logging
unknown's avatar
unknown committed
170
RES_SPACE="      "
unknown's avatar
unknown committed
171 172
MYSQLD_SRC_DIRS="strings mysys include extra regex isam merge myisam \
 myisammrg heap sql"
173
MY_LOG_DIR="$MYSQL_TEST_DIR/var/log" 
174 175 176
#
# Set LD_LIBRARY_PATH if we are using shared libraries
#
unknown's avatar
unknown committed
177
LD_LIBRARY_PATH="$BASEDIR/lib:$BASEDIR/libmysql/.libs:$LD_LIBRARY_PATH"
178
export LD_LIBRARY_PATH
179

unknown's avatar
fixed  
unknown committed
180
MASTER_RUNNING=0
181
MASTER_MYPORT=9306
unknown's avatar
fixed  
unknown committed
182
SLAVE_RUNNING=0
183
SLAVE_MYPORT=9307
unknown's avatar
unknown committed
184 185 186 187
MYSQL_MANAGER_PORT=9305 # needs to be out of the way of slaves
MYSQL_MANAGER_PW_FILE=$MYSQL_TEST_DIR/var/tmp/manager.pwd
MYSQL_MANAGER_LOG=$MYSQL_TEST_DIR/var/log/manager.log
MYSQL_MANAGER_USER=root
188
NO_SLAVE=0
unknown's avatar
unknown committed
189
USER_TEST=
190

191
EXTRA_MASTER_OPT=""
192 193 194 195
EXTRA_MYSQL_TEST_OPT=""
USE_RUNNING_SERVER=1
DO_GCOV=""
DO_GDB=""
unknown's avatar
unknown committed
196
MANUAL_GDB=""
197
DO_DDD=""
198
DO_CLIENT_GDB=""
unknown's avatar
unknown committed
199
SLEEP_TIME_AFTER_RESTART=1
unknown's avatar
unknown committed
200
SLEEP_TIME_FOR_DELETE=10
unknown's avatar
unknown committed
201
SLEEP_TIME_FOR_FIRST_MASTER=400		# Enough time to create innodb tables
unknown's avatar
unknown committed
202
SLEEP_TIME_FOR_SECOND_MASTER=30
unknown's avatar
unknown committed
203
SLEEP_TIME_FOR_FIRST_SLAVE=400
unknown's avatar
unknown committed
204
SLEEP_TIME_FOR_SECOND_SLAVE=30
unknown's avatar
unknown committed
205
CHARACTER_SET=latin1
206
DBUSER=""
207 208
START_WAIT_TIMEOUT=10
STOP_WAIT_TIMEOUT=10
209 210 211

while test $# -gt 0; do
  case "$1" in
212 213
    --user=*) DBUSER=`$ECHO "$1" | $SED -e "s;--user=;;"` ;;
    --force)  FORCE=1 ;;
unknown's avatar
unknown committed
214
    --verbose-manager)  MANAGER_QUIET_OPT="" ;;
215 216 217 218 219
    --old-master) MASTER_40_ARGS="";;
    --master-binary=*)
      MASTER_MYSQLD=`$ECHO "$1" | $SED -e "s;--master-binary=;;"` ;;
    --slave-binary=*)
      SLAVE_MYSQLD=`$ECHO "$1" | $SED -e "s;--slave-binary=;;"` ;;
220
    --local)   USE_RUNNING_SERVER="" ;;
221
    --extern)   USE_RUNNING_SERVER="1" ;;
222
    --tmpdir=*) MYSQL_TMP_DIR=`$ECHO "$1" | $SED -e "s;--tmpdir=;;"` ;;
223 224 225 226 227
    --local-master)
      MASTER_MYPORT=3306;
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --host=127.0.0.1 \
      --port=$MYSQL_MYPORT"
      LOCAL_MASTER=1 ;;
228 229
    --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
230
    --manager-port=*) MYSQL_MANAGER_PORT=`$ECHO "$1" | $SED -e "s;--manager_port=;;"` ;;
unknown's avatar
unknown committed
231 232
    --with-openssl)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
unknown's avatar
unknown committed
233 234 235
     --ssl-ca=$BASEDIR/SSL/cacert.pem \
     --ssl-cert=$BASEDIR/SSL/server-cert.pem \
     --ssl-key=$BASEDIR/SSL/server-key.pem"
unknown's avatar
unknown committed
236
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
unknown's avatar
unknown committed
237 238 239
     --ssl-ca=$BASEDIR/SSL/cacert.pem \
     --ssl-cert=$BASEDIR/SSL/server-cert.pem \
     --ssl-key=$BASEDIR/SSL/server-key.pem" ;;
unknown's avatar
unknown committed
240
    --no-manager | --skip-manager) USE_MANAGER=0 ;;
241 242 243 244
    --manager)
     USE_MANAGER=1
     USE_RUNNING_SERVER=
     ;;
245 246
    --start-and-exit)
     START_AND_EXIT=1
unknown's avatar
unknown committed
247
     ;;
unknown's avatar
unknown committed
248 249 250
    --skip-innodb)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-innodb"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-innodb" ;;
251 252 253
    --skip-bdb)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-bdb"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-bdb" ;;
254
    --skip-rpl) NO_SLAVE=1 ;;
unknown's avatar
unknown committed
255
    --skip-test=*) SKIP_TEST=`$ECHO "$1" | $SED -e "s;--skip-test=;;"`;;
256
    --do-test=*) DO_TEST=`$ECHO "$1" | $SED -e "s;--do-test=;;"`;;
257 258 259 260
    --warnings | --log-warnings)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --log-warnings"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --log-warnings"
     ;;
unknown's avatar
unknown committed
261 262 263
    --wait-timeout=*)
     START_WAIT_TIMEOUT=`$ECHO "$1" | $SED -e "s;--wait-timeout=;;"`
     STOP_WAIT_TIMEOUT=$START_WAIT_TIMEOUT;;
264 265 266
    --record)
      RECORD=1;
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
unknown's avatar
unknown committed
267 268 269
    --bench)
      DO_BENCH=1
      NO_SLAVE=1
unknown's avatar
unknown committed
270
      ;;
271 272
    --big*)			# Actually --big-test
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
unknown's avatar
unknown committed
273 274
    --compress)
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
275 276
    --sleep=*)
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1"
unknown's avatar
unknown committed
277
      SLEEP_TIME_AFTER_RESTART=`$ECHO "$1" | $SED -e "s;--sleep=;;"`
278
      ;;
unknown's avatar
unknown committed
279 280 281
    --user-test=*)
      USER_TEST=`$ECHO "$1" | $SED -e "s;--user-test=;;"`
      ;;
282
    --mysqld=*)
unknown's avatar
unknown committed
283
       TMP=`$ECHO "$1" | $SED -e "s;--mysqld=;;"`
unknown's avatar
unknown committed
284
       EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $TMP"
285
       EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $TMP"
286
       ;;
287 288 289 290 291 292
    --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
293
      GCOV=`which gcov`
294
      ;;
unknown's avatar
unknown committed
295 296
    --gprof )
      DO_GPROF=1
unknown's avatar
unknown committed
297
      ;;
298
    --gdb )
unknown's avatar
unknown committed
299 300
      START_WAIT_TIMEOUT=300
      STOP_WAIT_TIMEOUT=300
301
      if [ x$BINARY_DIST = x1 ] ; then
302
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --gdb option"
303 304
      fi
      DO_GDB=1
unknown's avatar
unknown committed
305 306
      # This needs to be checked properly
      # USE_MANAGER=1
307
      USE_RUNNING_SERVER=""
308
      ;;
309 310 311 312 313 314
    --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
      ;;
unknown's avatar
unknown committed
315 316 317 318 319
    --manual-gdb )
      DO_GDB=1
      MANUAL_GDB=1
      USE_RUNNING_SERVER=""
      ;;
320 321
    --ddd )
      if [ x$BINARY_DIST = x1 ] ; then
322
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --ddd option"
323 324
      fi
      DO_DDD=1
325
      USE_RUNNING_SERVER=""
326
      ;;
unknown's avatar
unknown committed
327 328 329 330
    --valgrind)
      VALGRIND="valgrind --alignment=8 --leak-check=yes"
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc"
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc"
331
      #SLEEP_TIME_AFTER_RESTART=120
unknown's avatar
unknown committed
332 333 334 335 336 337
      SLEEP_TIME_FOR_DELETE=120
      ;;
    --valgrind-options=*)
      TMP=`$ECHO "$1" | $SED -e "s;--valgrind-options=;;"`
      VALGRIND="$VALGRIND $TMP"
      ;;
338 339 340 341
    --skip-*)
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $1"
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $1"
      ;;
unknown's avatar
unknown committed
342 343
    --strace-client )
      STRACE_CLIENT=1
unknown's avatar
unknown committed
344
      ;;
345
    --debug)
346
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
unknown's avatar
unknown committed
347
       --debug=d:t:i:A,$MYSQL_TEST_DIR/var/log/master.trace"
348
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
unknown's avatar
unknown committed
349
       --debug=d:t:i:A,$MYSQL_TEST_DIR/var/log/slave.trace"
350
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --debug"
351
      ;;
352 353 354
    --fast)
      FAST_START=1
      ;;
355 356 357 358 359 360
    -- )  shift; break ;;
    --* ) $ECHO "Unrecognized option: $1"; exit 1 ;;
    * ) break ;;
  esac
  shift
done
unknown's avatar
fixed  
unknown committed
361

unknown's avatar
unknown committed
362 363 364
#++
# mysqld Environment Parameters
#--
365

unknown's avatar
unknown committed
366
MYRUN_DIR=$MYSQL_TEST_DIR/var/run
367 368
MANAGER_PID_FILE="$MYRUN_DIR/manager.pid"

369
MASTER_MYDDIR="$MYSQL_TEST_DIR/var/master-data"
unknown's avatar
unknown committed
370
MASTER_MYSOCK="$MYSQL_TMP_DIR/master.sock"
unknown's avatar
unknown committed
371 372 373
MASTER_MYPID="$MYRUN_DIR/master.pid"
MASTER_MYLOG="$MYSQL_TEST_DIR/var/log/master.log"
MASTER_MYERR="$MYSQL_TEST_DIR/var/log/master.err"
374 375

SLAVE_MYDDIR="$MYSQL_TEST_DIR/var/slave-data"
unknown's avatar
unknown committed
376
SLAVE_MYSOCK="$MYSQL_TMP_DIR/slave.sock"
unknown's avatar
unknown committed
377 378 379
SLAVE_MYPID="$MYRUN_DIR/slave.pid"
SLAVE_MYLOG="$MYSQL_TEST_DIR/var/log/slave.log"
SLAVE_MYERR="$MYSQL_TEST_DIR/var/log/slave.err"
380

381
CURRENT_TEST="$MYSQL_TEST_DIR/var/log/current_test"
382 383
SMALL_SERVER="-O key_buffer_size=1M -O sort_buffer=256K -O max_heap_table_size=1M"

unknown's avatar
unknown committed
384 385 386
export MASTER_MYPORT
export SLAVE_MYPORT

387 388 389 390
if [ x$SOURCE_DIST = x1 ] ; then
 MY_BASEDIR=$MYSQL_TEST_DIR
else
 MY_BASEDIR=$BASEDIR
unknown's avatar
unknown committed
391
fi
unknown's avatar
unknown committed
392

unknown's avatar
unknown committed
393 394 395 396 397 398 399 400
# 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
401
[ -d $MYSQL_TEST_DIR/var/log ] || mkdir $MYSQL_TEST_DIR/var/log
unknown's avatar
unknown committed
402

403
if test ${COLUMNS:-0} -lt 80 ; then COLUMNS=80 ; fi
404
E=`$EXPR $COLUMNS - 8`
405
DASH72=`$ECHO '------------------------------------------------------------------------'|$CUT -c 1-$E`
406

407 408 409
# on source dist, we pick up freshly build executables
# on binary, use what is installed
if [ x$SOURCE_DIST = x1 ] ; then
unknown's avatar
unknown committed
410
 MYSQLD="$VALGRIND $BASEDIR/sql/mysqld"
411
 if [ -f "$BASEDIR/client/.libs/lt-mysqltest" ] ; then
412
   MYSQL_TEST="$BASEDIR/client/.libs/lt-mysqltest"
unknown's avatar
unknown committed
413 414
 elif [ -f "$BASEDIR/client/.libs/mysqltest" ] ; then
   MYSQL_TEST="$BASEDIR/client/.libs/mysqltest"
415 416 417
 else
   MYSQL_TEST="$BASEDIR/client/mysqltest"
 fi
unknown's avatar
unknown committed
418 419 420
 if [ -n "$STRACE_CLIENT" ]; then
  MYSQL_TEST="strace -o $MYSQL_TEST_DIR/var/log/mysqltest.strace $MYSQL_TEST"
 fi
unknown's avatar
unknown committed
421

422
 MYSQLADMIN="$BASEDIR/client/mysqladmin"
unknown's avatar
unknown committed
423
 WAIT_PID="$BASEDIR/extra/mysql_waitpid"
unknown's avatar
unknown committed
424 425 426
 MYSQL_MANAGER_CLIENT="$BASEDIR/client/mysqlmanagerc"
 MYSQL_MANAGER="$BASEDIR/tools/mysqlmanager"
 MYSQL_MANAGER_PWGEN="$BASEDIR/client/mysqlmanager-pwgen"
unknown's avatar
unknown committed
427
 MYSQL="$BASEDIR/client/mysql"
428
 LANGUAGE="$BASEDIR/sql/share/english/"
429
 CHARSETSDIR="$BASEDIR/sql/share/charsets"
430 431
 INSTALL_DB="./install_test_db"
else
432 433
 if test -x "$BASEDIR/libexec/mysqld"
 then
unknown's avatar
unknown committed
434
   MYSQLD="$VALGRIND $BASEDIR/libexec/mysqld"
435
 else
unknown's avatar
unknown committed
436
   MYSQLD="$VALGRIND $BASEDIR/bin/mysqld"
437
 fi
438 439
 MYSQL_TEST="$BASEDIR/bin/mysqltest"
 MYSQLADMIN="$BASEDIR/bin/mysqladmin"
unknown's avatar
unknown committed
440
 WAIT_PID="$BASEDIR/bin/mysql_waitpid"
unknown's avatar
unknown committed
441 442 443
 MYSQL_MANAGER="$BASEDIR/bin/mysqlmanager"
 MYSQL_MANAGER_CLIENT="$BASEDIR/bin/mysqlmanagerc"
 MYSQL_MANAGER_PWGEN="$BASEDIR/bin/mysqlmanager-pwgen"
unknown's avatar
unknown committed
444
 MYSQL="$BASEDIR/bin/mysql"
unknown's avatar
unknown committed
445
 INSTALL_DB="./install_test_db -bin"
unknown's avatar
unknown committed
446
 if test -d "$BASEDIR/share/mysql/english"
447 448
 then
   LANGUAGE="$BASEDIR/share/mysql/english/"
449
   CHARSETSDIR="$BASEDIR/share/mysql/charsets"
450 451
 else
   LANGUAGE="$BASEDIR/share/english/"
452
   CHARSETSDIR="$BASEDIR/share/charsets"
453
  fi
454 455
fi

456 457 458 459 460 461 462 463 464 465
if [ -z "$MASTER_MYSQLD" ]
then
MASTER_MYSQLD=$MYSQLD
fi

if [ -z "$SLAVE_MYSQLD" ]
then
SLAVE_MYSQLD=$MYSQLD
fi

466 467 468 469 470 471
# If we should run all tests cases, we will use a local server for that

if [ -z "$1" ]
then
   USE_RUNNING_SERVER=""
fi
472 473 474
if [ -n "$USE_RUNNING_SERVER" ]
then
   MASTER_MYSOCK="/tmp/mysql.sock"
475
   DBUSER=${DBUSER:-test}
476
else
477
   DBUSER=${DBUSER:-root}		# We want to do FLUSH xxx commands
478
fi
479 480 481 482 483 484 485 486

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

487

488
MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB \
489
 --user=$DBUSER --password=$DBPASSWD --silent -v --skip-safemalloc \
490
 --tmpdir=$MYSQL_TMP_DIR --port=$MASTER_MYPORT"
491 492 493
MYSQL_TEST_BIN=$MYSQL_TEST
MYSQL_TEST="$MYSQL_TEST $MYSQL_TEST_ARGS"
GDB_CLIENT_INIT=$MYSQL_TMP_DIR/gdbinit.client
494 495 496
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
497 498 499 500
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
501
TIMEFILE="$MYSQL_TEST_DIR/var/log/mysqltest-time"
502 503 504
if [ -n "$DO_CLIENT_GDB" -o -n "$DO_GDB" ] ; then
  XTERM=`which xterm`
fi
505

unknown's avatar
unknown committed
506 507 508 509
#++
# Function Definitions
#--

unknown's avatar
unknown committed
510 511
prompt_user ()
{
512
 $ECHO $1
513
 read unused
unknown's avatar
unknown committed
514 515
}

unknown's avatar
unknown committed
516
# We can't use diff -u or diff -a as these are not portable
517

unknown's avatar
unknown committed
518 519 520 521
show_failed_diff ()
{
  reject_file=r/$1.reject
  result_file=r/$1.result
522
  eval_file=r/$1.eval
unknown's avatar
unknown committed
523

524 525 526 527
  if [ -f $eval_file ]
  then
    result_file=$eval_file
  fi
unknown's avatar
unknown committed
528

unknown's avatar
unknown committed
529 530 531 532
  if [ -x "$DIFF" ] && [ -f $reject_file ]
  then
    echo "Below are the diffs between actual and expected results:"
    echo "-------------------------------------------------------"
unknown's avatar
unknown committed
533
    $DIFF -c $result_file $reject_file
unknown's avatar
unknown committed
534
    echo "-------------------------------------------------------"
535 536 537
    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
538
  fi
unknown's avatar
unknown committed
539
}
unknown's avatar
unknown committed
540

541 542 543 544 545 546
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
unknown's avatar
unknown committed
547
  $XTERM -title "Client" -e gdb -x $GDB_CLIENT_INIT $MYSQL_TEST_BIN
548 549
}

unknown's avatar
unknown committed
550
error () {
unknown's avatar
unknown committed
551
    $ECHO  "Error:  $1"
unknown's avatar
unknown committed
552 553 554
    exit 1
}

555
error_is () {
unknown's avatar
unknown committed
556
    $CAT < $TIMEFILE | $SED -e 's/.* At line \(.*\)\: \(.*\)/   \>\> Error at line \1: \2<\</' | $HEAD -1
557 558
}

unknown's avatar
unknown committed
559
prefix_to_8() {
560
 $ECHO "        $1" | $SED -e 's:.*\(........\)$:\1:'
unknown's avatar
unknown committed
561 562
}

unknown's avatar
unknown committed
563
pass_inc () {
unknown's avatar
unknown committed
564
    TOT_PASS=`$EXPR $TOT_PASS + 1`
unknown's avatar
unknown committed
565 566 567
}

fail_inc () {
unknown's avatar
unknown committed
568
    TOT_FAIL=`$EXPR $TOT_FAIL + 1`
unknown's avatar
unknown committed
569 570
}

571 572 573 574
skip_inc () {
    TOT_SKIP=`$EXPR $TOT_SKIP + 1`
}

unknown's avatar
unknown committed
575
total_inc () {
unknown's avatar
unknown committed
576
    TOT_TEST=`$EXPR $TOT_TEST + 1`
unknown's avatar
unknown committed
577 578
}

579 580 581 582 583 584 585 586 587 588 589 590

skip_test() {
   USERT="    ...."
   SYST="    ...."
   REALT="    ...."
   timestr="$USERT $SYST $REALT"
   pname=`$ECHO "$1                        "|$CUT -c 1-24`
   RES="$pname  $timestr"
   skip_inc
   $ECHO "$RES$RES_SPACE [ skipped ]"
}

unknown's avatar
unknown committed
591
report_stats () {
592
    if [ $TOT_FAIL = 0 ]; then
unknown's avatar
unknown committed
593
	$ECHO "All $TOT_TEST tests were successful."
unknown's avatar
unknown committed
594
    else
unknown's avatar
unknown committed
595 596 597 598 599 600
	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`
601
	$ECHO  "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful."
602
	$ECHO ""
603
        $ECHO "The log files in $MY_LOG_DIR may give you some hint"
604 605 606
	$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
607 608
    fi
}
609

unknown's avatar
unknown committed
610
mysql_install_db () {
611
    $ECHO "Removing Stale Files"
612
    $RM -rf $MASTER_MYDDIR $SLAVE_MYDDIR $MY_LOG_DIR/* 
613
    $ECHO "Installing Master Databases"
614 615 616 617 618
    $INSTALL_DB
    if [ $? != 0 ]; then
	error "Could not install master test DBs"
	exit 1
    fi
619
    $ECHO "Installing Slave Databases"
620
    $INSTALL_DB -slave
621
    if [ $? != 0 ]; then
622
	error "Could not install slave test DBs"
623
	exit 1
unknown's avatar
unknown committed
624
    fi
unknown's avatar
unknown committed
625

626 627
    for slave_num in 1 2 ;
    do
628
      $RM -rf var/slave$slave_num-data
629 630 631
      mkdir -p var/slave$slave_num-data/mysql
      mkdir -p var/slave$slave_num-data/test
      cp var/slave-data/mysql/* var/slave$slave_num-data/mysql
632
    done
unknown's avatar
unknown committed
633 634 635
    return 0
}

unknown's avatar
unknown committed
636 637
gprof_prepare ()
{
unknown's avatar
unknown committed
638 639
 $RM -rf $GPROF_DIR
 mkdir -p $GPROF_DIR
unknown's avatar
unknown committed
640 641 642 643 644
}

gprof_collect ()
{
 if [ -f $MASTER_MYDDIR/gmon.out ]; then
645
   gprof $MASTER_MYSQLD $MASTER_MYDDIR/gmon.out > $GPROF_MASTER
unknown's avatar
unknown committed
646 647 648
   echo "Master execution profile has been saved in $GPROF_MASTER"
 fi
 if [ -f $SLAVE_MYDDIR/gmon.out ]; then
649
   gprof $SLAVE_MYSQLD $SLAVE_MYDDIR/gmon.out > $GPROF_SLAVE
unknown's avatar
unknown committed
650 651 652 653
   echo "Slave execution profile has been saved in $GPROF_SLAVE"
 fi
}

654
gcov_prepare () {
unknown's avatar
unknown committed
655 656
    $FIND $BASEDIR -name \*.gcov \
    -or -name \*.da | $XARGS $RM
unknown's avatar
unknown committed
657 658 659
}

gcov_collect () {
unknown's avatar
unknown committed
660
    $ECHO "Collecting source coverage info..."
unknown's avatar
unknown committed
661 662
    [ -f $GCOV_MSG ] && $RM $GCOV_MSG
    [ -f $GCOV_ERR ] && $RM $GCOV_ERR
unknown's avatar
unknown committed
663 664 665
    for d in $MYSQLD_SRC_DIRS; do
	cd $BASEDIR/$d
	for f in *.h *.cc *.c; do
unknown's avatar
unknown committed
666
	    $GCOV $f 2>>$GCOV_ERR  >>$GCOV_MSG
unknown's avatar
unknown committed
667
	done
668
	cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
669 670
    done

unknown's avatar
unknown committed
671
    $ECHO "gcov info in $GCOV_MSG, errors in $GCOV_ERR"
unknown's avatar
unknown committed
672 673
}

unknown's avatar
unknown committed
674 675 676 677 678
abort_if_failed()
{
 if [ ! $? = 0 ] ; then
  echo $1
  exit 1
unknown's avatar
unknown committed
679
 fi
unknown's avatar
unknown committed
680 681 682 683
}

start_manager()
{
unknown's avatar
unknown committed
684
 if [ $USE_MANAGER = 0 ] ; then
685 686
   echo "Manager disabled, skipping manager start."
   $RM -f $MYSQL_MANAGER_LOG
687 688
  return
 fi
unknown's avatar
unknown committed
689
 $ECHO "Starting MySQL Manager"
690 691 692 693 694 695 696 697 698
 if [ -f "$MANAGER_PID_FILE" ] ; then
    kill `cat $MANAGER_PID_FILE`
    sleep 1
    if [ -f "$MANAGER_PID_FILE" ] ; then
     kill -9 `cat $MANAGER_PID_FILE`
     sleep 1
    fi
 fi

unknown's avatar
unknown committed
699
 $RM -f $MANAGER_PID_FILE
unknown's avatar
unknown committed
700 701
 MYSQL_MANAGER_PW=`$MYSQL_MANAGER_PWGEN -u $MYSQL_MANAGER_USER \
 -o $MYSQL_MANAGER_PW_FILE`
unknown's avatar
unknown committed
702
 $MYSQL_MANAGER --log=$MYSQL_MANAGER_LOG --port=$MYSQL_MANAGER_PORT \
703
  --password-file=$MYSQL_MANAGER_PW_FILE --pid-file=$MANAGER_PID_FILE
unknown's avatar
unknown committed
704
  abort_if_failed "Could not start MySQL manager"
705 706
  mysqltest_manager_args="--manager-host=localhost \
  --manager-user=$MYSQL_MANAGER_USER \
707 708 709 710 711
  --manager-password=$MYSQL_MANAGER_PW \
  --manager-port=$MYSQL_MANAGER_PORT \
  --manager-wait-timeout=$START_WAIT_TIMEOUT"
  MYSQL_TEST="$MYSQL_TEST $mysqltest_manager_args"
  MYSQL_TEST_ARGS="$MYSQL_TEST_ARGS $mysqltest_manager_args"
712 713 714 715
  while [ ! -f $MANAGER_PID_FILE ] ; do
   sleep 1
  done
  echo "Manager started"
unknown's avatar
unknown committed
716 717
}

unknown's avatar
unknown committed
718 719
stop_manager()
{
unknown's avatar
unknown committed
720
 if [ $USE_MANAGER = 0 ] ; then
721 722
  return
 fi
unknown's avatar
unknown committed
723 724 725 726
 $MYSQL_MANAGER_CLIENT $MANAGER_QUIET_OPT -u$MYSQL_MANAGER_USER \
  -p$MYSQL_MANAGER_PW -P $MYSQL_MANAGER_PORT <<EOF
shutdown
EOF
727 728
 echo "Manager terminated"

unknown's avatar
unknown committed
729 730 731
}

manager_launch()
unknown's avatar
unknown committed
732
{
unknown's avatar
unknown committed
733 734
  ident=$1
  shift
unknown's avatar
unknown committed
735
  if [ $USE_MANAGER = 0 ] ; then
unknown's avatar
unknown committed
736
    $@  >> $CUR_MYERR 2>&1  &
unknown's avatar
unknown committed
737 738
    sleep 2 #hack
    return
739
  fi
unknown's avatar
unknown committed
740
  $MYSQL_MANAGER_CLIENT $MANAGER_QUIET_OPT --user=$MYSQL_MANAGER_USER \
unknown's avatar
unknown committed
741
   --password=$MYSQL_MANAGER_PW  --port=$MYSQL_MANAGER_PORT <<EOF
unknown's avatar
unknown committed
742 743 744 745 746
def_exec $ident $@
set_exec_stdout $ident $CUR_MYERR
set_exec_stderr $ident $CUR_MYERR
set_exec_con $ident root localhost $CUR_MYSOCK
start_exec $ident $START_WAIT_TIMEOUT
unknown's avatar
unknown committed
747
EOF
unknown's avatar
unknown committed
748
  abort_if_failed "Could not execute manager command"
unknown's avatar
unknown committed
749
}
unknown's avatar
unknown committed
750

unknown's avatar
unknown committed
751 752
manager_term()
{
753 754
  pid=$1
  ident=$2
unknown's avatar
unknown committed
755
  if [ $USE_MANAGER = 0 ] ; then
unknown's avatar
unknown committed
756 757
    # Shutdown time must be high as slave may be in reconnect
    $MYSQLADMIN --no-defaults -uroot --socket=$MYSQL_TMP_DIR/$ident.sock --connect_timeout=5 --shutdown_timeout=70 shutdown >> $MYSQL_MANAGER_LOG 2>&1
758 759 760 761 762 763 764 765
    res=$?
    # Some systems require an extra connect
    $MYSQLADMIN --no-defaults -uroot --socket=$MYSQL_TMP_DIR/$ident.sock --connect_timeout=1 ping >> $MYSQL_MANAGER_LOG 2>&1
    if test $res = 0
    then
      wait_for_pid $pid
    fi
    return $res
766
  fi
unknown's avatar
unknown committed
767 768
  $MYSQL_MANAGER_CLIENT $MANAGER_QUIET_OPT --user=$MYSQL_MANAGER_USER \
   --password=$MYSQL_MANAGER_PW  --port=$MYSQL_MANAGER_PORT <<EOF
769
stop_exec $ident $STOP_WAIT_TIMEOUT
unknown's avatar
unknown committed
770 771 772 773 774
EOF
 abort_if_failed "Could not execute manager command"
}


unknown's avatar
unknown committed
775 776
start_master()
{
unknown's avatar
unknown committed
777 778 779 780 781 782 783
  if [ x$MASTER_RUNNING = x1 ] || [ x$LOCAL_MASTER = x1 ] ; then
    return
  fi
  # Remove old berkeley db log files that can confuse the server
  $RM -f $MASTER_MYDDIR/log.*
  # Remove stale binary logs
  $RM -f $MYSQL_TEST_DIR/var/log/master-bin.*
unknown's avatar
unknown committed
784 785
  # Remove old master.info files
  $RM -f $MYSQL_TEST_DIR/var/master-data/master.info
unknown's avatar
unknown committed
786 787 788 789 790 791 792 793 794 795 796 797

  #run master initialization shell script if one exists

  if [ -f "$master_init_script" ] ;
  then
      /bin/sh $master_init_script
  fi
  cd $BASEDIR # for gcov
  #start master
  if [ -z "$DO_BENCH" ]
  then
    master_args="--no-defaults --log-bin=$MYSQL_TEST_DIR/var/log/master-bin \
798 799
  	    --server-id=1  \
          --basedir=$MY_BASEDIR \
unknown's avatar
unknown committed
800
          --port=$MASTER_MYPORT \
unknown's avatar
unknown committed
801
          --local-infile \
unknown's avatar
unknown committed
802 803 804 805 806 807 808 809 810 811 812
          --exit-info=256 \
          --core \
          --datadir=$MASTER_MYDDIR \
          --pid-file=$MASTER_MYPID \
          --socket=$MASTER_MYSOCK \
          --log=$MASTER_MYLOG \
          --character-sets-dir=$CHARSETSDIR \
          --default-character-set=$CHARACTER_SET \
          --tmpdir=$MYSQL_TMP_DIR \
          --language=$LANGUAGE \
          --innodb_data_file_path=ibdata1:50M \
813
	   $MASTER_40_ARGS \
unknown's avatar
unknown committed
814 815 816 817 818 819 820
           $SMALL_SERVER \
           $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
  else
    master_args="--no-defaults --log-bin=$MYSQL_TEST_DIR/var/log/master-bin \
          --server-id=1 --rpl-recovery-rank=1 \
          --basedir=$MY_BASEDIR --init-rpl-role=master \
          --port=$MASTER_MYPORT \
unknown's avatar
unknown committed
821
          --local-infile \
unknown's avatar
unknown committed
822 823 824 825 826 827 828 829 830
          --datadir=$MASTER_MYDDIR \
          --pid-file=$MASTER_MYPID \
          --socket=$MASTER_MYSOCK \
          --character-sets-dir=$CHARSETSDIR \
          --default-character-set=$CHARACTER_SET \
          --core \
          --tmpdir=$MYSQL_TMP_DIR \
          --language=$LANGUAGE \
          --innodb_data_file_path=ibdata1:50M \
831
	   $MASTER_40_ARGS \
unknown's avatar
unknown committed
832 833 834 835 836 837 838 839 840 841 842
           $SMALL_SERVER \
           $EXTRA_MASTER_OPT $EXTRA_MASTER_MYSQLD_OPT"
  fi

  CUR_MYERR=$MASTER_MYERR
  CUR_MYSOCK=$MASTER_MYSOCK

  if [ x$DO_DDD = x1 ]
  then
    $ECHO "set args $master_args" > $GDB_MASTER_INIT
    manager_launch master ddd -display $DISPLAY --debugger \
843
    "gdb -x $GDB_MASTER_INIT" $MASTER_MYSQLD
unknown's avatar
unknown committed
844 845
  elif [ x$DO_GDB = x1 ]
  then
unknown's avatar
unknown committed
846 847 848 849
    if [ x$MANUAL_GDB = x1 ]
    then
      $ECHO "set args $master_args" > $GDB_MASTER_INIT
      $ECHO "To start gdb for the master , type in another window:"
850
      $ECHO "cd $CWD ; gdb -x $GDB_MASTER_INIT $MASTER_MYSQLD"
unknown's avatar
unknown committed
851 852 853 854
      wait_for_master=1500
    else
      ( $ECHO set args $master_args;
      if [ $USE_MANAGER = 0 ] ; then
unknown's avatar
unknown committed
855
    cat <<EOF
unknown's avatar
unknown committed
856 857
b mysql_parse
commands 1
858
disa 1
unknown's avatar
unknown committed
859
end
unknown's avatar
unknown committed
860 861
r
EOF
unknown's avatar
unknown committed
862 863
      fi )  > $GDB_MASTER_INIT
      manager_launch master $XTERM -display $DISPLAY \
864
      -title "Master" -e gdb -x $GDB_MASTER_INIT $MASTER_MYSQLD
unknown's avatar
unknown committed
865
    fi
unknown's avatar
unknown committed
866
  else
867
    manager_launch master $MASTER_MYSQLD $master_args
unknown's avatar
unknown committed
868
  fi
869
  sleep_until_file_created $MASTER_MYPID $wait_for_master
unknown's avatar
unknown committed
870
  wait_for_master=$SLEEP_TIME_FOR_SECOND_MASTER
unknown's avatar
unknown committed
871 872 873 874 875
  MASTER_RUNNING=1
}

start_slave()
{
unknown's avatar
unknown committed
876 877 878
  [ x$SKIP_SLAVE = x1 ] && return
  eval "this_slave_running=\$SLAVE$1_RUNNING"
  [ x$this_slave_running = 1 ] && return
unknown's avatar
unknown committed
879 880
  # When testing fail-safe replication, we will have more than one slave
  # in this case, we start secondary slaves with an argument
unknown's avatar
unknown committed
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901
  slave_ident="slave$1"
  if [ -n "$1" ] ;
  then
   slave_server_id=`$EXPR 2 + $1`
   slave_rpl_rank=$slave_server_id
   slave_port=`expr $SLAVE_MYPORT + $1`
   slave_log="$SLAVE_MYLOG.$1"
   slave_err="$SLAVE_MYERR.$1"
   slave_datadir="var/$slave_ident-data/"
   slave_pid="$MYRUN_DIR/mysqld-$slave_ident.pid"
   slave_sock="$SLAVE_MYSOCK-$1"
  else
   slave_server_id=2
   slave_rpl_rank=2
   slave_port=$SLAVE_MYPORT
   slave_log=$SLAVE_MYLOG
   slave_err=$SLAVE_MYERR
   slave_datadir=$SLAVE_MYDDIR
   slave_pid=$SLAVE_MYPID
   slave_sock="$SLAVE_MYSOCK"
 fi
unknown's avatar
unknown committed
902 903 904
  # Remove stale binary logs and old master.info files
  $RM -f $MYSQL_TEST_DIR/var/log/$slave_ident-*bin.*
  $RM -f $MYSQL_TEST_DIR/$slave_datadir/master.info
unknown's avatar
unknown committed
905 906 907 908 909 910 911 912 913 914 915

  #run slave initialization shell script if one exists
  if [ -f "$slave_init_script" ] ;
  then
        /bin/sh $slave_init_script
  fi

  if [ -z "$SLAVE_MASTER_INFO" ] ; then
    master_info="--master-user=root \
          --master-connect-retry=1 \
          --master-host=127.0.0.1 \
916
          --master-password="" \
unknown's avatar
unknown committed
917 918 919 920 921 922 923 924 925 926
          --master-port=$MASTER_MYPORT \
          --server-id=$slave_server_id --rpl-recovery-rank=$slave_rpl_rank"
 else
   master_info=$SLAVE_MASTER_INFO
 fi

  $RM -f $slave_datadir/log.*
  slave_args="--no-defaults $master_info \
  	    --exit-info=256 \
          --log-bin=$MYSQL_TEST_DIR/var/log/$slave_ident-bin \
927
          --relay-log=$MYSQL_TEST_DIR/var/log/$slave_ident-relay-bin \
unknown's avatar
unknown committed
928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943
          --log-slave-updates \
          --log=$slave_log \
          --basedir=$MY_BASEDIR \
          --datadir=$slave_datadir \
          --pid-file=$slave_pid \
          --port=$slave_port \
          --socket=$slave_sock \
          --character-sets-dir=$CHARSETSDIR \
          --default-character-set=$CHARACTER_SET \
          --core --init-rpl-role=slave \
          --tmpdir=$MYSQL_TMP_DIR \
          --language=$LANGUAGE \
          --skip-innodb --skip-slave-start \
          --slave-load-tmpdir=$SLAVE_LOAD_TMPDIR \
          --report-host=127.0.0.1 --report-user=root \
          --report-port=$slave_port \
944
          --master-retry-count=10 \
unknown's avatar
unknown committed
945
          -O slave_net_timeout=10 \
unknown's avatar
unknown committed
946 947 948 949 950 951 952 953 954 955 956 957
           $SMALL_SERVER \
           $EXTRA_SLAVE_OPT $EXTRA_SLAVE_MYSQLD_OPT"
  CUR_MYERR=$slave_err
  CUR_MYSOCK=$slave_sock

  if [ x$DO_DDD = x1 ]
  then
    $ECHO "set args $master_args" > $GDB_SLAVE_INIT
    manager_launch $slave_ident ddd -display $DISPLAY --debugger \
     "gdb -x $GDB_SLAVE_INIT" $SLAVE_MYSQLD
  elif [ x$DO_GDB = x1 ]
  then
unknown's avatar
unknown committed
958 959
    if [ x$MANUAL_GDB = x1 ]
    then
unknown's avatar
unknown committed
960
      $ECHO "set args $slave_args" > $GDB_SLAVE_INIT
unknown's avatar
unknown committed
961
      echo "To start gdb for the slave, type in another window:"
962
      echo "cd $CWD ; gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD"
unknown's avatar
unknown committed
963 964
      wait_for_slave=1500
    else
unknown's avatar
unknown committed
965 966 967 968 969 970 971 972 973 974
      ( $ECHO set args $slave_args;
      if [ $USE_MANAGER = 0 ] ; then
    cat <<EOF
b mysql_parse
commands 1
disa 1
end
r
EOF
      fi )  > $GDB_SLAVE_INIT
unknown's avatar
unknown committed
975 976 977
      manager_launch $slave_ident $XTERM -display $DISPLAY -title "Slave" -e \
      gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD
    fi
unknown's avatar
unknown committed
978 979 980 981
  else
    manager_launch $slave_ident $SLAVE_MYSQLD $slave_args
  fi
  eval "SLAVE$1_RUNNING=1"
982
  sleep_until_file_created $slave_pid $wait_for_slave
unknown's avatar
unknown committed
983
  wait_for_slave=$SLEEP_TIME_FOR_SECOND_SLAVE
unknown's avatar
unknown committed
984 985
}

unknown's avatar
unknown committed
986 987
mysql_start ()
{
unknown's avatar
unknown committed
988 989 990 991 992 993
# We should not start the deamon here as we don't know the argumens
# for the test.  Better to let the test start the deamon

#  $ECHO "Starting MySQL daemon"
#  start_master
#  start_slave
unknown's avatar
unknown committed
994 995
  cd $MYSQL_TEST_DIR
  return 1
unknown's avatar
unknown committed
996 997
}

unknown's avatar
unknown committed
998 999
stop_slave ()
{
1000 1001 1002
  eval "this_slave_running=\$SLAVE$1_RUNNING"
  slave_ident="slave$1"
  if [ -n "$1" ] ;
unknown's avatar
unknown committed
1003
  then
1004 1005 1006
   slave_pid="$MYRUN_DIR/mysqld-$slave_ident.pid"
  else
   slave_pid=$SLAVE_MYPID
unknown's avatar
unknown committed
1007
  fi
1008 1009
  if [ x$this_slave_running = x1 ]
  then
1010 1011
    pid=`$CAT $slave_pid`
    manager_term $pid $slave_ident
1012
    if [ $? != 0 ] && [ -f $slave_pid ]
1013
    then # try harder!
1014
      $ECHO "slave not cooperating with mysqladmin, will try manual kill"
1015 1016
      kill $pid
      sleep_until_file_deleted $pid $slave_pid
1017 1018 1019 1020 1021 1022 1023 1024 1025
      if [ -f $slave_pid ] ; then
        $ECHO "slave refused to die. Sending SIGKILL"
        kill -9 `$CAT $slave_pid`
        $RM -f $slave_pid
      else
        $ECHO "slave responded to SIGTERM "
      fi
    else
      sleep $SLEEP_TIME_AFTER_RESTART
unknown's avatar
unknown committed
1026
    fi
1027
    eval "SLAVE$1_RUNNING=0"
unknown's avatar
unknown committed
1028
  fi
unknown's avatar
unknown committed
1029
}
unknown's avatar
unknown committed
1030

unknown's avatar
unknown committed
1031 1032 1033 1034
stop_master ()
{
  if [ x$MASTER_RUNNING = x1 ]
  then
1035 1036
    pid=`$CAT $MASTER_MYPID`
    manager_term $pid master
1037 1038
    if [ $? != 0 ] && [ -f $MASTER_MYPID ]
    then # try harder!
1039
      $ECHO "master not cooperating with mysqladmin, will try manual kill"
1040 1041
      kill $pid
      sleep_until_file_deleted $pid $MASTER_MYPID
1042 1043 1044 1045 1046 1047 1048 1049 1050
      if [ -f $MASTER_MYPID ] ; then
        $ECHO "master refused to die. Sending SIGKILL"
        kill -9 `$CAT $MASTER_MYPID`
        $RM -f $MASTER_MYPID
      else
        $ECHO "master responded to SIGTERM "
      fi
    else
      sleep $SLEEP_TIME_AFTER_RESTART
unknown's avatar
unknown committed
1051
    fi
unknown's avatar
unknown committed
1052 1053 1054
    MASTER_RUNNING=0
  fi
}
unknown's avatar
unknown committed
1055

unknown's avatar
unknown committed
1056 1057
mysql_stop ()
{
1058 1059
 $ECHO  "Ending Tests"
 $ECHO  "Shutting-down MySQL daemon"
1060
 $ECHO  ""
unknown's avatar
unknown committed
1061
 stop_master
unknown's avatar
unknown committed
1062
 $ECHO "Master shutdown finished"
unknown's avatar
unknown committed
1063
 stop_slave
1064 1065
 stop_slave 1
 stop_slave 2
unknown's avatar
unknown committed
1066
 $ECHO "Slave shutdown finished"
unknown's avatar
unknown committed
1067

unknown's avatar
unknown committed
1068
 return 1
unknown's avatar
unknown committed
1069 1070
}

unknown's avatar
unknown committed
1071 1072 1073 1074 1075
mysql_restart ()
{
  mysql_stop
  mysql_start
  return 1
unknown's avatar
unknown committed
1076 1077 1078
}

mysql_loadstd () {
unknown's avatar
unknown committed
1079 1080

    # cp $STD_DATA/*.frm $STD_DATA/*.MRG $MASTER_MYDDIR/test
unknown's avatar
unknown committed
1081 1082 1083
    return 1
}

unknown's avatar
unknown committed
1084 1085 1086
run_testcase ()
{
 tf=$1
unknown's avatar
unknown committed
1087
 tname=`$BASENAME $tf .test`
unknown's avatar
unknown committed
1088 1089
 master_opt_file=$TESTDIR/$tname-master.opt
 slave_opt_file=$TESTDIR/$tname-slave.opt
1090 1091
 master_init_script=$TESTDIR/$tname-master.sh
 slave_init_script=$TESTDIR/$tname-slave.sh
unknown's avatar
fixed  
unknown committed
1092
 slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt
1093
 echo $tname > $CURRENT_TEST
unknown's avatar
unknown committed
1094
 SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0`
unknown's avatar
unknown committed
1095
 if [ $USE_MANAGER = 1 ] ; then
1096
  many_slaves=`$EXPR \( $tname : rpl_failsafe \) != 0`
unknown's avatar
unknown committed
1097 1098 1099
 fi

 if [ -n "$SKIP_TEST" ] ; then
unknown's avatar
unknown committed
1100
   SKIP_THIS_TEST=`$EXPR \( $tname : "$SKIP_TEST" \) != 0`
unknown's avatar
unknown committed
1101 1102
   if [ x$SKIP_THIS_TEST = x1 ] ;
   then
1103 1104
     skip_test $tname;
     return;
unknown's avatar
unknown committed
1105 1106
   fi
  fi
1107

unknown's avatar
unknown committed
1108
 if [ -n "$DO_TEST" ] ; then
1109 1110 1111
   DO_THIS_TEST=`$EXPR \( $tname : "$DO_TEST" \) != 0`
   if [ x$DO_THIS_TEST = x0 ] ;
   then
1112 1113
     skip_test $tname;
     return;
1114 1115 1116 1117
   fi
  fi


1118 1119
 if [ x${NO_SLAVE}x$SKIP_SLAVE = x1x0 ] ;
 then
1120
   skip_test $tname;
1121 1122 1123
   return
 fi

1124
 if [ -z "$USE_RUNNING_SERVER" ] ;
unknown's avatar
unknown committed
1125
 then
1126 1127
   if [ -f $master_opt_file ] ;
   then
unknown's avatar
unknown committed
1128
     EXTRA_MASTER_OPT=`$CAT $master_opt_file | $SED -e "s;\\$MYSQL_TEST_DIR;$MYSQL_TEST_DIR;"`
1129
     stop_master
unknown's avatar
unknown committed
1130
     echo "CURRENT_TEST: $tname" >> $MASTER_MYERR
1131 1132 1133 1134 1135 1136
     start_master
   else
     if [ ! -z "$EXTRA_MASTER_OPT" ] || [ x$MASTER_RUNNING != x1 ] ;
     then
       EXTRA_MASTER_OPT=""
       stop_master
unknown's avatar
unknown committed
1137
       echo "CURRENT_TEST: $tname" >> $MASTER_MYERR
1138
       start_master
unknown's avatar
unknown committed
1139 1140
     else
       echo "CURRENT_TEST: $tname" >> $MASTER_MYERR
unknown's avatar
unknown committed
1141
     fi
1142
   fi
unknown's avatar
unknown committed
1143

unknown's avatar
unknown committed
1144
   do_slave_restart=0
1145 1146
   if [ -f $slave_opt_file ] ;
   then
unknown's avatar
unknown committed
1147
     EXTRA_SLAVE_OPT=`$CAT $slave_opt_file | $SED -e "s;\\$MYSQL_TEST_DIR;$MYSQL_TEST_DIR;"`
1148 1149 1150 1151 1152
     do_slave_restart=1
   else
    if [ ! -z "$EXTRA_SLAVE_OPT" ] || [ x$SLAVE_RUNNING != x1 ] ;
    then
      EXTRA_SLAVE_OPT=""
unknown's avatar
unknown committed
1153 1154
      do_slave_restart=1
    fi
1155
   fi
unknown's avatar
fixed  
unknown committed
1156

1157 1158 1159 1160 1161 1162 1163
   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=""
unknown's avatar
unknown committed
1164 1165
       do_slave_restart=1
     fi
1166 1167 1168 1169
   fi

   if [ x$do_slave_restart = x1 ] ; then
     stop_slave
unknown's avatar
unknown committed
1170
     echo "CURRENT_TEST: $tname" >> $SLAVE_MYERR
1171
     start_slave
unknown's avatar
unknown committed
1172 1173
   else
     echo "CURRENT_TEST: $tname" >> $SLAVE_MYERR
1174
   fi
1175 1176 1177 1178
   if [ x$many_slaves = x1 ]; then
    start_slave 1
    start_slave 2
   fi
unknown's avatar
fixed  
unknown committed
1179
 fi
1180
 cd $MYSQL_TEST_DIR
unknown's avatar
unknown committed
1181

unknown's avatar
unknown committed
1182
 if [ -f $tf ] ; then
unknown's avatar
unknown committed
1183
    $RM -f r/$tname.*reject
1184
    mysql_test_args="-R r/$tname.result $EXTRA_MYSQL_TEST_OPT"
1185 1186
    if [ -z "$DO_CLIENT_GDB" ] ; then
      mytime=`$TIME -p $MYSQL_TEST  $mysql_test_args < $tf 2> $TIMEFILE`
1187
    else
1188
      do_gdb_test "$mysql_test_args" "$tf"
1189
    fi
unknown's avatar
unknown committed
1190

unknown's avatar
unknown committed
1191 1192
    res=$?

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

1196
	USERT=`$ECHO $mytime | $CUT -d : -f 2 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
1197
        USERT=`prefix_to_8 $USERT`
1198
	SYST=`$ECHO $mytime | $CUT -d : -f 3 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
1199
        SYST=`prefix_to_8 $SYST`
1200
	REALT=`$ECHO $mytime | $CUT -d : -f 1 | $CUT -d ' ' -f 2`
unknown's avatar
unknown committed
1201
        REALT=`prefix_to_8 $REALT`
1202
    else
unknown's avatar
unknown committed
1203 1204 1205
	USERT="    ...."
	SYST="    ...."
	REALT="    ...."
1206 1207
    fi

1208
    timestr="$USERT $SYST $REALT"
1209 1210
    pname=`$ECHO "$tname                        "|$CUT -c 1-24`
    RES="$pname  $timestr"
unknown's avatar
unknown committed
1211

1212 1213 1214 1215
    if [ x$many_slaves = x1 ] ; then
     stop_slave 1
     stop_slave 2
    fi
unknown's avatar
unknown committed
1216

unknown's avatar
unknown committed
1217
    if [ $res = 0 ]; then
1218 1219
      total_inc
      pass_inc
1220
      $ECHO "$RES$RES_SPACE [ pass ]"
1221
    else
1222
      # why the following ``if'' ? That is why res==1 is special ?
1223 1224 1225 1226
      if [ $res = 2 ]; then
        skip_inc
	$ECHO "$RES$RES_SPACE [ skipped ]"
      else
1227
	total_inc
unknown's avatar
unknown committed
1228
        fail_inc
1229
	$ECHO "$RES$RES_SPACE [ fail ]"
1230 1231
        $ECHO
	error_is
unknown's avatar
unknown committed
1232
	show_failed_diff $tname
unknown's avatar
unknown committed
1233
	$ECHO
1234
	if [ x$FORCE != x1 ] ; then
1235 1236
	 $ECHO "Aborting. To continue, re-run with '--force'."
	 $ECHO
unknown's avatar
unknown committed
1237 1238 1239
         if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	 then
	   mysql_stop
unknown's avatar
unknown committed
1240
	   stop_manager
unknown's avatar
unknown committed
1241
   	 fi
1242 1243
	 exit 1
	fi
unknown's avatar
unknown committed
1244

unknown's avatar
unknown committed
1245 1246 1247 1248
        if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	then
	  mysql_restart
	fi
1249
	$ECHO "Resuming Tests"
1250
	$ECHO ""
1251
      fi
unknown's avatar
unknown committed
1252
    fi
1253
  fi
unknown's avatar
unknown committed
1254 1255
}

unknown's avatar
unknown committed
1256 1257 1258 1259
######################################################################
# Main script starts here
######################################################################

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

unknown's avatar
unknown committed
1262 1263
[ "$DO_GCOV" ] && gcov_prepare
[ "$DO_GPROF" ] && gprof_prepare
unknown's avatar
unknown committed
1264

1265 1266
if [ -z "$USE_RUNNING_SERVER" ]
then
1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279
  if [ -z "$FAST_START" ]
  then
    # Ensure that no old mysqld test servers are running
    $MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root -O connect_timeout=5 -O shutdown_timeout=20 shutdown > /dev/null 2>&1
    $MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root -O connect_timeout=5 -O shutdown_timeout=20 shutdown > /dev/null 2>&1
    $MYSQLADMIN --no-defaults --host=$hostname --port=$MASTER_MYPORT -u root -O connect_timeout=5 -O shutdown_timeout=20 shutdown > /dev/null 2>&1
    $MYSQLADMIN --no-defaults --host=$hostname --port=$SLAVE_MYPORT -u root -O connect_timeout=5 -O shutdown_timeout=20 shutdown > /dev/null 2>&1
    $MYSQLADMIN --no-defaults --host=$hostname --port=`expr $SLAVE_MYPORT + 1` -u root -O connect_timeout=5 -O shutdown_timeout=20 shutdown > /dev/null 2>&1
    sleep_until_file_deleted 0 $MASTER_MYPID
    sleep_until_file_deleted 0 $SLAVE_MYPID
  else
    rm $MASTER_MYPID $SLAVE_MYPID
  fi
unknown's avatar
unknown committed
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295

  # Kill any running managers
  if [ -f "$MANAGER_PID_FILE" ]
  then
    kill `cat $MANAGER_PID_FILE`
    sleep 1
    if [ -f "$MANAGER_PID_FILE" ]
    then
      kill -9 `cat $MANAGER_PID_FILE`
      sleep 1
    fi
  fi

  # Remove files that can cause problems
  $RM -f $MYSQL_TEST_DIR/var/run/* $MYSQL_TEST_DIR/var/tmp/*

unknown's avatar
unknown committed
1296 1297
  wait_for_master=$SLEEP_TIME_FOR_FIRST_MASTER
  wait_for_slave=$SLEEP_TIME_FOR_FIRST_SLAVE
1298 1299
  $ECHO "Installing Test Databases"
  mysql_install_db
unknown's avatar
unknown committed
1300
  start_manager
unknown's avatar
unknown committed
1301 1302 1303

# Do not automagically start deamons if we are in gdb or running only one test
# case
1304 1305 1306 1307 1308 1309
  if [ -z "$DO_GDB" ] && [ -z "$DO_DDD" ]
  then
    mysql_start
  fi
  $ECHO  "Loading Standard Test Databases"
  mysql_loadstd
unknown's avatar
unknown committed
1310 1311
fi

1312 1313 1314 1315
if [ "x$START_AND_EXIT" = "x1" ] ; then
 echo "Servers started, exiting"
 exit
fi
unknown's avatar
unknown committed
1316

1317
$ECHO  "Starting Tests"
unknown's avatar
unknown committed
1318

unknown's avatar
unknown committed
1319 1320
if [ "$DO_BENCH" = 1 ]
then
unknown's avatar
unknown committed
1321 1322 1323 1324
  BENCHDIR=$BASEDIR/sql-bench/
  savedir=`pwd`
  cd $BENCHDIR
  if [ -z "$1" ]
unknown's avatar
unknown committed
1325
  then
unknown's avatar
unknown committed
1326
    ./run-all-tests --socket=$MASTER_MYSOCK --user=root
unknown's avatar
unknown committed
1327
  else
unknown's avatar
unknown committed
1328 1329 1330 1331 1332 1333
    if [ -x "./$1" ]
    then
       ./$1 --socket=$MASTER_MYSOCK --user=root
    else
      echo "benchmark $1 not found"
    fi
unknown's avatar
unknown committed
1334
  fi
unknown's avatar
unknown committed
1335 1336 1337 1338
  cd $savedir
  mysql_stop
  stop_manager
  exit
unknown's avatar
unknown committed
1339 1340
fi

unknown's avatar
unknown committed
1341
$ECHO
unknown's avatar
unknown committed
1342
$ECHO " TEST                         USER   SYSTEM  ELAPSED        RESULT"
unknown's avatar
unknown committed
1343 1344
$ECHO $DASH72

unknown's avatar
unknown committed
1345
if [ -z "$1" ] ;
unknown's avatar
unknown committed
1346
then
1347
 if [ x$RECORD = x1 ]; then
1348
  $ECHO "Will not run in record mode without a specific test case."
1349 1350 1351 1352 1353
 else
  for tf in $TESTDIR/*.$TESTSUFFIX
  do
    run_testcase $tf
  done
1354
  $RM -f $TIMEFILE	# Remove for full test
1355
 fi
unknown's avatar
unknown committed
1356
else
unknown's avatar
unknown committed
1357 1358 1359 1360 1361 1362 1363 1364 1365 1366
  while [ ! -z "$1" ]; do
    tname=`$BASENAME $1 .test`
    tf=$TESTDIR/$tname.$TESTSUFFIX
    if [ -f $tf ] ; then
      run_testcase $tf
    else
      $ECHO "Test case $tf does not exist."
    fi
    shift
  done
unknown's avatar
unknown committed
1367
fi
unknown's avatar
unknown committed
1368

unknown's avatar
unknown committed
1369 1370
$ECHO $DASH72
$ECHO
1371

1372
if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
unknown's avatar
unknown committed
1373 1374 1375
then
    mysql_stop
fi
unknown's avatar
unknown committed
1376

unknown's avatar
unknown committed
1377
stop_manager
unknown's avatar
unknown committed
1378
report_stats
unknown's avatar
unknown committed
1379
$ECHO
unknown's avatar
unknown committed
1380

unknown's avatar
unknown committed
1381
[ "$DO_GCOV" ] && gcov_collect # collect coverage information
unknown's avatar
unknown committed
1382
[ "$DO_GPROF" ] && gprof_collect # collect coverage information
unknown's avatar
unknown committed
1383

unknown's avatar
unknown committed
1384
exit 0