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

#++
# Access Definitions
#--
DB=test
13
DBPASSWD=
14
VERBOSE=""
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
15
USE_MANAGER=0
16
TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work
bk@work.mysql.com's avatar
bk@work.mysql.com committed
17

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

monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
22
PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin
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
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
34
      if test -f $dir/$file
35 36 37 38 39 40 41 42
      then
        echo "$dir/$file"
        continue 2
      fi
    done
    echo "which: no $file in ($PATH)"
    exit 1
  done
43
  IFS="$save_ifs"
44 45 46
}


monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
47 48 49
sleep_until_file_deleted ()
{
  file=$1
50
  loop=$SLEEP_TIME_FOR_DELETE
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
51 52
  while (test $loop -gt 0)
  do
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
53
    if [ ! -r $file ]
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
54
    then
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
55
      sleep $SLEEP_TIME_AFTER_RESTART
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
56 57 58 59 60 61
      return
    fi
    loop=`expr $loop - 1`
  done
}

62
sleep_until_file_created ()
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
63 64
{
  file=$1
65 66
  loop=$2
  org_time=$2
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
67 68
  while (test $loop -gt 0)
  do
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
69
    if [ -r $file ]
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
70 71 72
    then
      return
    fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
73
    sleep 1
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
74 75
    loop=`expr $loop - 1`
  done
76
  echo "ERROR: $file was not created in $org_time seconds;  Aborting"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
77 78 79
  exit 1;
}

80 81 82
# No paths below as we can't be sure where the program is!

BASENAME=`which basename | head -1`
83
DIFF=`which diff | head -1`
84 85
CAT=cat
CUT=cut
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
86
HEAD=head
87 88 89 90 91 92 93 94 95 96
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`
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
97
SED=sed
98 99 100 101 102

# Are we using a source or a binary distribution?

testdir=@testdir@
if [ -d bin/mysqld ] && [ -d mysql-test ] ; then
103 104
 cd mysql-test
else
105 106
 if [ -d $testdir/mysql-test ] ; then
   cd $testdir
107
 fi
108 109 110 111 112 113 114
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."
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
115
  exit 1
116
fi
117

bk@work.mysql.com's avatar
bk@work.mysql.com committed
118 119 120
#++
# Misc. Definitions
#--
121

122 123 124 125 126
if [ -d ../sql ] ; then
   SOURCE_DIST=1
else
   BINARY_DIST=1
fi
127

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
128
#BASEDIR is always one above mysql-test directory
bk@work.mysql.com's avatar
bk@work.mysql.com committed
129 130 131 132
CWD=`pwd`
cd ..
BASEDIR=`pwd`
cd $CWD
133
MYSQL_TEST_DIR=$BASEDIR/mysql-test
134
export MYSQL_TEST_DIR
135
STD_DATA=$MYSQL_TEST_DIR/std_data
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
136
hostname=`hostname`		# Installed in the mysql privilege table
137

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
138
MANAGER_QUIET_OPT="-q"
139
TESTDIR="$MYSQL_TEST_DIR/t"
140
TESTSUFFIX=test
141
TOT_SKIP=0
bk@work.mysql.com's avatar
bk@work.mysql.com committed
142 143 144
TOT_PASS=0
TOT_FAIL=0
TOT_TEST=0
145 146 147
USERT=0
SYST=0
REALT=0
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
148
MYSQL_TMP_DIR=$MYSQL_TEST_DIR/var/tmp
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
149
SLAVE_LOAD_TMPDIR=../../var/tmp #needs to be same length to test logging
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
150
RES_SPACE="      "
151 152
MYSQLD_SRC_DIRS="strings mysys include extra regex isam merge myisam \
 myisammrg heap sql"
153
MY_LOG_DIR="$MYSQL_TEST_DIR/var/log" 
154 155 156
#
# Set LD_LIBRARY_PATH if we are using shared libraries
#
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
157
LD_LIBRARY_PATH="$BASEDIR/lib:$BASEDIR/libmysql/.libs:$LD_LIBRARY_PATH"
158
export LD_LIBRARY_PATH
159

sasha@mysql.sashanet.com's avatar
fixed  
sasha@mysql.sashanet.com committed
160
MASTER_RUNNING=0
161
MASTER_MYPORT=9306
sasha@mysql.sashanet.com's avatar
fixed  
sasha@mysql.sashanet.com committed
162
SLAVE_RUNNING=0
163
SLAVE_MYPORT=9307
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
164 165 166 167
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
168
NO_SLAVE=0
169
USER_TEST=
170

171
EXTRA_MASTER_OPT=""
172 173 174 175
EXTRA_MYSQL_TEST_OPT=""
USE_RUNNING_SERVER=1
DO_GCOV=""
DO_GDB=""
176
MANUAL_GDB=""
177
DO_DDD=""
178
DO_CLIENT_GDB=""
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
179
SLEEP_TIME_AFTER_RESTART=1
180
SLEEP_TIME_FOR_DELETE=10
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
181
SLEEP_TIME_FOR_FIRST_MASTER=400		# Enough time to create innodb tables
182
SLEEP_TIME_FOR_SECOND_MASTER=30
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
183
SLEEP_TIME_FOR_FIRST_SLAVE=400
184
SLEEP_TIME_FOR_SECOND_SLAVE=30
185
CHARACTER_SET=latin1
186
DBUSER=""
187 188
START_WAIT_TIMEOUT=10
STOP_WAIT_TIMEOUT=10
189 190 191

while test $# -gt 0; do
  case "$1" in
192 193
    --user=*) DBUSER=`$ECHO "$1" | $SED -e "s;--user=;;"` ;;
    --force)  FORCE=1 ;;
194
    --verbose-manager)  MANAGER_QUIET_OPT="" ;;
195 196 197 198 199
    --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=;;"` ;;
200 201
    --local)   USE_RUNNING_SERVER="" ;;
    --tmpdir=*) MYSQL_TMP_DIR=`$ECHO "$1" | $SED -e "s;--tmpdir=;;"` ;;
202 203 204 205 206
    --local-master)
      MASTER_MYPORT=3306;
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --host=127.0.0.1 \
      --port=$MYSQL_MYPORT"
      LOCAL_MASTER=1 ;;
207 208
    --master_port=*) MASTER_MYPORT=`$ECHO "$1" | $SED -e "s;--master_port=;;"` ;;
    --slave_port=*) SLAVE_MYPORT=`$ECHO "$1" | $SED -e "s;--slave_port=;;"` ;;
209
    --manager-port=*) MYSQL_MANAGER_PORT=`$ECHO "$1" | $SED -e "s;--manager_port=;;"` ;;
210 211
    --with-openssl)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
tonu@x153.internalnet's avatar
tonu@x153.internalnet committed
212 213 214
     --ssl-ca=$BASEDIR/SSL/cacert.pem \
     --ssl-cert=$BASEDIR/SSL/server-cert.pem \
     --ssl-key=$BASEDIR/SSL/server-key.pem"
215
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
tonu@x153.internalnet's avatar
tonu@x153.internalnet committed
216 217 218
     --ssl-ca=$BASEDIR/SSL/cacert.pem \
     --ssl-cert=$BASEDIR/SSL/server-cert.pem \
     --ssl-key=$BASEDIR/SSL/server-key.pem" ;;
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
219
    --no-manager | --skip-manager) USE_MANAGER=0 ;;
220 221 222 223
    --manager)
     USE_MANAGER=1
     USE_RUNNING_SERVER=
     ;;
224 225
    --start-and-exit)
     START_AND_EXIT=1
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
226
     ;;
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
227 228 229
    --skip-innodb)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-innodb"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-innodb" ;;
230 231 232
    --skip-bdb)
     EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-bdb"
     EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-bdb" ;;
233
    --skip-rpl) NO_SLAVE=1 ;;
234
    --skip-test=*) SKIP_TEST=`$ECHO "$1" | $SED -e "s;--skip-test=;;"`;;
235
    --do-test=*) DO_TEST=`$ECHO "$1" | $SED -e "s;--do-test=;;"`;;
236 237 238
    --wait-timeout=*)
     START_WAIT_TIMEOUT=`$ECHO "$1" | $SED -e "s;--wait-timeout=;;"`
     STOP_WAIT_TIMEOUT=$START_WAIT_TIMEOUT;;
239 240 241
    --record)
      RECORD=1;
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
242 243 244
    --bench)
      DO_BENCH=1
      NO_SLAVE=1
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
245
      ;;
246 247
    --big*)			# Actually --big-test
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
248 249
    --compress)
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
250 251
    --sleep=*)
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1"
252
      SLEEP_TIME_AFTER_RESTART=`$ECHO "$1" | $SED -e "s;--sleep=;;"`
253
      ;;
254 255 256
    --user-test=*)
      USER_TEST=`$ECHO "$1" | $SED -e "s;--user-test=;;"`
      ;;
257
    --mysqld=*)
serg@serg.mysql.com's avatar
serg@serg.mysql.com committed
258
       TMP=`$ECHO "$1" | $SED -e "s;--mysqld=;;"`
259
       EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $TMP"
260
       EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $TMP"
261
       ;;
262 263 264 265 266 267 268
    --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
      ;;
269 270
    --gprof )
      DO_GPROF=1
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
271
      ;;
272
    --gdb )
273 274
      START_WAIT_TIMEOUT=300
      STOP_WAIT_TIMEOUT=300
275
      if [ x$BINARY_DIST = x1 ] ; then
276
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --gdb option"
277 278
      fi
      DO_GDB=1
279 280
      # This needs to be checked properly
      # USE_MANAGER=1
281
      USE_RUNNING_SERVER=""
282
      ;;
283 284 285 286 287 288
    --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
      ;;
289 290 291 292 293
    --manual-gdb )
      DO_GDB=1
      MANUAL_GDB=1
      USE_RUNNING_SERVER=""
      ;;
294 295
    --ddd )
      if [ x$BINARY_DIST = x1 ] ; then
296
	$ECHO "Note: you will get more meaningful output on a source distribution compiled with debugging option when running tests with --ddd option"
297 298
      fi
      DO_DDD=1
299
      USE_RUNNING_SERVER=""
300
      ;;
301 302 303 304
    --skip-*)
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $1"
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $1"
      ;;
305 306
    --strace-client )
      STRACE_CLIENT=1
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
307
      ;;
308
    --debug)
309
      EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \
310
       --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/master.trace"
311
      EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \
312
       --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/slave.trace"
313
      EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --debug"
314 315 316 317 318 319 320
      ;;
    -- )  shift; break ;;
    --* ) $ECHO "Unrecognized option: $1"; exit 1 ;;
    * ) break ;;
  esac
  shift
done
sasha@mysql.sashanet.com's avatar
fixed  
sasha@mysql.sashanet.com committed
321

bk@work.mysql.com's avatar
bk@work.mysql.com committed
322 323 324
#++
# mysqld Environment Parameters
#--
325

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
326
MYRUN_DIR=$MYSQL_TEST_DIR/var/run
327 328
MANAGER_PID_FILE="$MYRUN_DIR/manager.pid"

329
MASTER_MYDDIR="$MYSQL_TEST_DIR/var/master-data"
330
MASTER_MYSOCK="$MYSQL_TMP_DIR/master.sock"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
331 332 333
MASTER_MYPID="$MYRUN_DIR/master.pid"
MASTER_MYLOG="$MYSQL_TEST_DIR/var/log/master.log"
MASTER_MYERR="$MYSQL_TEST_DIR/var/log/master.err"
334 335

SLAVE_MYDDIR="$MYSQL_TEST_DIR/var/slave-data"
336
SLAVE_MYSOCK="$MYSQL_TMP_DIR/slave.sock"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
337 338 339
SLAVE_MYPID="$MYRUN_DIR/slave.pid"
SLAVE_MYLOG="$MYSQL_TEST_DIR/var/log/slave.log"
SLAVE_MYERR="$MYSQL_TEST_DIR/var/log/slave.err"
340

341 342
SMALL_SERVER="-O key_buffer_size=1M -O sort_buffer=256K -O max_heap_table_size=1M"

sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
343 344 345
export MASTER_MYPORT
export SLAVE_MYPORT

346 347 348 349
if [ x$SOURCE_DIST = x1 ] ; then
 MY_BASEDIR=$MYSQL_TEST_DIR
else
 MY_BASEDIR=$BASEDIR
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
350
fi
bk@work.mysql.com's avatar
bk@work.mysql.com committed
351

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
352 353 354 355 356 357 358 359 360
# 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

361
if test ${COLUMNS:-0} -lt 80 ; then COLUMNS=80 ; fi
362
E=`$EXPR $COLUMNS - 8`
363
DASH72=`$ECHO '------------------------------------------------------------------------'|$CUT -c 1-$E`
364

365 366 367 368
# 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"
369
 if [ -f "$BASEDIR/client/.libs/lt-mysqltest" ] ; then
370
   MYSQL_TEST="$BASEDIR/client/.libs/lt-mysqltest"
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
371 372
 elif [ -f "$BASEDIR/client/.libs/mysqltest" ] ; then
   MYSQL_TEST="$BASEDIR/client/.libs/mysqltest"
373 374 375
 else
   MYSQL_TEST="$BASEDIR/client/mysqltest"
 fi
376 377 378
 if [ -n "$STRACE_CLIENT" ]; then
  MYSQL_TEST="strace -o $MYSQL_TEST_DIR/var/log/mysqltest.strace $MYSQL_TEST"
 fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
379

380
 MYSQLADMIN="$BASEDIR/client/mysqladmin"
381 382 383
 MYSQL_MANAGER_CLIENT="$BASEDIR/client/mysqlmanagerc"
 MYSQL_MANAGER="$BASEDIR/tools/mysqlmanager"
 MYSQL_MANAGER_PWGEN="$BASEDIR/client/mysqlmanager-pwgen"
384
 MYSQL="$BASEDIR/client/mysql"
385
 LANGUAGE="$BASEDIR/sql/share/english/"
386
 CHARSETSDIR="$BASEDIR/sql/share/charsets"
387 388 389 390 391
 INSTALL_DB="./install_test_db"
else
 MYSQLD="$BASEDIR/bin/mysqld"
 MYSQL_TEST="$BASEDIR/bin/mysqltest"
 MYSQLADMIN="$BASEDIR/bin/mysqladmin"
392 393 394
 MYSQL_MANAGER="$BASEDIR/bin/mysqlmanager"
 MYSQL_MANAGER_CLIENT="$BASEDIR/bin/mysqlmanagerc"
 MYSQL_MANAGER_PWGEN="$BASEDIR/bin/mysqlmanager-pwgen"
395
 MYSQL="$BASEDIR/bin/mysql"
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
396
 INSTALL_DB="./install_test_db -bin"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
397
 if test -d "$BASEDIR/share/mysql/english"
398 399
 then
   LANGUAGE="$BASEDIR/share/mysql/english/"
400
   CHARSETSDIR="$BASEDIR/share/mysql/charsets"
401 402
 else
   LANGUAGE="$BASEDIR/share/english/"
403
   CHARSETSDIR="$BASEDIR/share/charsets"
404
  fi
405 406
fi

407 408 409 410 411 412 413 414 415 416
if [ -z "$MASTER_MYSQLD" ]
then
MASTER_MYSQLD=$MYSQLD
fi

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

417 418 419 420 421 422
# If we should run all tests cases, we will use a local server for that

if [ -z "$1" ]
then
   USE_RUNNING_SERVER=""
fi
423 424 425
if [ -n "$USE_RUNNING_SERVER" ]
then
   MASTER_MYSOCK="/tmp/mysql.sock"
426
   DBUSER=${DBUSER:-test}
427
else
428
   DBUSER=${DBUSER:-root}		# We want to do FLUSH xxx commands
429
fi
430 431 432 433 434 435 436 437

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

438

439 440 441
MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB \
 --user=$DBUSER --password=$DBPASSWD --silent -v \
 --tmpdir=$MYSQL_TMP_DIR"
442 443 444
MYSQL_TEST_BIN=$MYSQL_TEST
MYSQL_TEST="$MYSQL_TEST $MYSQL_TEST_ARGS"
GDB_CLIENT_INIT=$MYSQL_TMP_DIR/gdbinit.client
445 446 447
GDB_MASTER_INIT=$MYSQL_TMP_DIR/gdbinit.master
GDB_SLAVE_INIT=$MYSQL_TMP_DIR/gdbinit.slave
GCOV_MSG=$MYSQL_TMP_DIR/mysqld-gcov.out
448 449 450 451
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
452
TIMEFILE="$MYSQL_TEST_DIR/var/log/mysqltest-time"
453
XTERM=`which xterm`
454

bk@work.mysql.com's avatar
bk@work.mysql.com committed
455 456 457
#++
# Function Definitions
#--
458
wait_for_server_start ()
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
459
{
monty@tik.mysql.fi's avatar
monty@tik.mysql.fi committed
460
   $MYSQLADMIN --no-defaults -u $DBUSER --silent -O connect_timeout=10 -w2 --host=$hostname --port=$1  ping >/dev/null 2>&1
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
461
}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
462

463 464
prompt_user ()
{
465
 $ECHO $1
466
 read unused
467 468
}

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
469
# We can't use diff -u or diff -a as these are not portable
470

471 472 473 474
show_failed_diff ()
{
  reject_file=r/$1.reject
  result_file=r/$1.result
475
  eval_file=r/$1.eval
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
476

477 478 479 480
  if [ -f $eval_file ]
  then
    result_file=$eval_file
  fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
481

482 483 484 485
  if [ -x "$DIFF" ] && [ -f $reject_file ]
  then
    echo "Below are the diffs between actual and expected results:"
    echo "-------------------------------------------------------"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
486
    $DIFF -c $result_file $reject_file
487
    echo "-------------------------------------------------------"
488 489 490
    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."
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
491
  fi
492
}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
493

494 495 496 497 498 499
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
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
500
  $XTERM -title "Client" -e gdb -x $GDB_CLIENT_INIT $MYSQL_TEST_BIN
501 502
}

bk@work.mysql.com's avatar
bk@work.mysql.com committed
503
error () {
504
    $ECHO  "Error:  $1"
bk@work.mysql.com's avatar
bk@work.mysql.com committed
505 506 507
    exit 1
}

508
error_is () {
monty@bitch.mysql.fi's avatar
monty@bitch.mysql.fi committed
509
    $CAT < $TIMEFILE | $SED -e 's/.* At line \(.*\)\: \(.*\)/   \>\> Error at line \1: \2<\</' | $HEAD -1
510 511
}

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
512
prefix_to_8() {
513
 $ECHO "        $1" | $SED -e 's:.*\(........\)$:\1:'
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
514 515
}

bk@work.mysql.com's avatar
bk@work.mysql.com committed
516
pass_inc () {
517
    TOT_PASS=`$EXPR $TOT_PASS + 1`
bk@work.mysql.com's avatar
bk@work.mysql.com committed
518 519 520
}

fail_inc () {
521
    TOT_FAIL=`$EXPR $TOT_FAIL + 1`
bk@work.mysql.com's avatar
bk@work.mysql.com committed
522 523
}

524 525 526 527
skip_inc () {
    TOT_SKIP=`$EXPR $TOT_SKIP + 1`
}

bk@work.mysql.com's avatar
bk@work.mysql.com committed
528
total_inc () {
529
    TOT_TEST=`$EXPR $TOT_TEST + 1`
bk@work.mysql.com's avatar
bk@work.mysql.com committed
530 531 532
}

report_stats () {
533
    if [ $TOT_FAIL = 0 ]; then
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
534
	$ECHO "All $TOT_TEST tests were successful."
bk@work.mysql.com's avatar
bk@work.mysql.com committed
535
    else
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
536 537 538 539 540 541
	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`
542
	$ECHO  "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful."
543
	$ECHO ""
544
        $ECHO "The log files in $MY_LOG_DIR may give you some hint"
545 546 547
	$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"
bk@work.mysql.com's avatar
bk@work.mysql.com committed
548 549
    fi
}
550

bk@work.mysql.com's avatar
bk@work.mysql.com committed
551
mysql_install_db () {
552
    $ECHO "Removing Stale Files"
553
    $RM -rf $MASTER_MYDDIR $SLAVE_MYDDIR $MY_LOG_DIR/* 
554
    $ECHO "Installing Master Databases"
555 556 557 558 559
    $INSTALL_DB
    if [ $? != 0 ]; then
	error "Could not install master test DBs"
	exit 1
    fi
560
    $ECHO "Installing Slave Databases"
561
    $INSTALL_DB -slave
562
    if [ $? != 0 ]; then
563
	error "Could not install slave test DBs"
564
	exit 1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
565
    fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
566

567 568
    for slave_num in 1 2 ;
    do
569 570 571 572
      $RM -rf var/slave$slave_num-data/
      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
573
    done
bk@work.mysql.com's avatar
bk@work.mysql.com committed
574 575 576
    return 0
}

577 578
gprof_prepare ()
{
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
579 580
 $RM -rf $GPROF_DIR
 mkdir -p $GPROF_DIR
581 582 583 584 585
}

gprof_collect ()
{
 if [ -f $MASTER_MYDDIR/gmon.out ]; then
586
   gprof $MASTER_MYSQLD $MASTER_MYDDIR/gmon.out > $GPROF_MASTER
587 588 589
   echo "Master execution profile has been saved in $GPROF_MASTER"
 fi
 if [ -f $SLAVE_MYDDIR/gmon.out ]; then
590
   gprof $SLAVE_MYSQLD $SLAVE_MYDDIR/gmon.out > $GPROF_SLAVE
591 592 593 594
   echo "Slave execution profile has been saved in $GPROF_SLAVE"
 fi
}

595
gcov_prepare () {
596 597
    $FIND $BASEDIR -name \*.gcov \
    -or -name \*.da | $XARGS $RM
598 599 600
}

gcov_collect () {
601
    $ECHO "Collecting source coverage info..."
602 603
    [ -f $GCOV_MSG ] && $RM $GCOV_MSG
    [ -f $GCOV_ERR ] && $RM $GCOV_ERR
604 605 606
    for d in $MYSQLD_SRC_DIRS; do
	cd $BASEDIR/$d
	for f in *.h *.cc *.c; do
607
	    $GCOV $f 2>>$GCOV_ERR  >>$GCOV_MSG
608
	done
609
	cd $MYSQL_TEST_DIR
610 611
    done

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
612
    $ECHO "gcov info in $GCOV_MSG, errors in $GCOV_ERR"
613 614
}

615 616 617 618 619
abort_if_failed()
{
 if [ ! $? = 0 ] ; then
  echo $1
  exit 1
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
620
 fi
621 622 623 624
}

start_manager()
{
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
625
 if [ $USE_MANAGER = 0 ] ; then
626 627
   echo "Manager disabled, skipping manager start."
   $RM -f $MYSQL_MANAGER_LOG
628 629
  return
 fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
630
 $ECHO "Starting MySQL Manager"
631 632 633 634 635 636 637 638 639
 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

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
640
 $RM -f $MANAGER_PID_FILE
641 642
 MYSQL_MANAGER_PW=`$MYSQL_MANAGER_PWGEN -u $MYSQL_MANAGER_USER \
 -o $MYSQL_MANAGER_PW_FILE`
643
 $MYSQL_MANAGER --log=$MYSQL_MANAGER_LOG --port=$MYSQL_MANAGER_PORT \
644
  --password-file=$MYSQL_MANAGER_PW_FILE --pid-file=$MANAGER_PID_FILE
645
  abort_if_failed "Could not start MySQL manager"
646 647
  mysqltest_manager_args="--manager-host=localhost \
  --manager-user=$MYSQL_MANAGER_USER \
648 649 650 651 652
  --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"
653 654 655 656
  while [ ! -f $MANAGER_PID_FILE ] ; do
   sleep 1
  done
  echo "Manager started"
657 658
}

659 660
stop_manager()
{
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
661
 if [ $USE_MANAGER = 0 ] ; then
662 663
  return
 fi
664 665 666 667
 $MYSQL_MANAGER_CLIENT $MANAGER_QUIET_OPT -u$MYSQL_MANAGER_USER \
  -p$MYSQL_MANAGER_PW -P $MYSQL_MANAGER_PORT <<EOF
shutdown
EOF
668 669
 echo "Manager terminated"

670 671 672
}

manager_launch()
673
{
674 675
  ident=$1
  shift
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
676
  if [ $USE_MANAGER = 0 ] ; then
677
   $@  >$CUR_MYERR 2>&1  &
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
678
   sleep 2 #hack
679 680
   return
  fi
681
  $MYSQL_MANAGER_CLIENT $MANAGER_QUIET_OPT --user=$MYSQL_MANAGER_USER \
682
   --password=$MYSQL_MANAGER_PW  --port=$MYSQL_MANAGER_PORT <<EOF
683 684 685 686 687
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
688 689 690
EOF
 abort_if_failed "Could not execute manager command"
}
691

692 693 694 695
manager_term()
{
  ident=$1
  shift
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
696
  if [ $USE_MANAGER = 0 ] ; then
697
    $MYSQLADMIN --no-defaults -uroot --socket=$MYSQL_TMP_DIR/$ident.sock -O \
698
    connect_timeout=5 -O shutdown_timeout=20 shutdown >> $MYSQL_MANAGER_LOG 2>&1
699
    return
700
  fi
701 702
  $MYSQL_MANAGER_CLIENT $MANAGER_QUIET_OPT --user=$MYSQL_MANAGER_USER \
   --password=$MYSQL_MANAGER_PW  --port=$MYSQL_MANAGER_PORT <<EOF
703
stop_exec $ident $STOP_WAIT_TIMEOUT
704 705 706 707 708
EOF
 abort_if_failed "Could not execute manager command"
}


709 710
start_master()
{
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729
  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.*

  #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 \
730 731
  	    --server-id=1  \
          --basedir=$MY_BASEDIR \
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
732
          --port=$MASTER_MYPORT \
733
          --local-infile \
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
734 735 736 737 738 739 740 741 742 743 744
          --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 \
745
	   $MASTER_40_ARGS \
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
746 747 748 749 750 751 752
           $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 \
753
          --local-infile \
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
754 755 756 757 758 759 760 761 762
          --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 \
763
	   $MASTER_40_ARGS \
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
764 765 766 767 768 769 770 771 772 773 774
           $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 \
775
    "gdb -x $GDB_MASTER_INIT" $MASTER_MYSQLD
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
776 777
  elif [ x$DO_GDB = x1 ]
  then
778 779 780 781
    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:"
782
      $ECHO "cd $CWD ; gdb -x $GDB_MASTER_INIT $MASTER_MYSQLD"
783 784 785 786
      wait_for_master=1500
    else
      ( $ECHO set args $master_args;
      if [ $USE_MANAGER = 0 ] ; then
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
787
    cat <<EOF
serg@serg.mysql.com's avatar
serg@serg.mysql.com committed
788 789
b mysql_parse
commands 1
790
disa 1
serg@serg.mysql.com's avatar
serg@serg.mysql.com committed
791
end
792 793
r
EOF
794 795
      fi )  > $GDB_MASTER_INIT
      manager_launch master $XTERM -display $DISPLAY \
796
      -title "Master" -e gdb -x $GDB_MASTER_INIT $MASTER_MYSQLD
797
    fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
798
  else
799
    manager_launch master $MASTER_MYSQLD $master_args
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
800
  fi
801
  sleep_until_file_created $MASTER_MYPID $wait_for_master
802
  wait_for_master=$SLEEP_TIME_FOR_SECOND_MASTER
803 804 805 806 807
  MASTER_RUNNING=1
}

start_slave()
{
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
  [ x$SKIP_SLAVE = x1 ] && return
  eval "this_slave_running=\$SLAVE$1_RUNNING"
  [ x$this_slave_running = 1 ] && return
  #when testing fail-safe replication, we will have more than one slave
  #in this case, we start secondary slaves with an argument
  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
  # Remove stale binary logs
  $RM -f $MYSQL_TEST_DIR/var/log/$slave_ident-bin.*

  #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 \
          --master-password= \
          --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 \
858
          --relay-log=$MYSQL_TEST_DIR/var/log/$slave_ident-relay-bin \
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888
          --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 \
          --master-retry-count=5 \
           $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
    $ECHO "set args $slave_args" > $GDB_SLAVE_INIT
889 890 891
    if [ x$MANUAL_GDB = x1 ]
    then
      echo "To start gdb for the slave, type in another window:"
892
      echo "cd $CWD ; gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD"
893 894 895 896 897
      wait_for_slave=1500
    else
      manager_launch $slave_ident $XTERM -display $DISPLAY -title "Slave" -e \
      gdb -x $GDB_SLAVE_INIT $SLAVE_MYSQLD
    fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
898 899 900 901
  else
    manager_launch $slave_ident $SLAVE_MYSQLD $slave_args
  fi
  eval "SLAVE$1_RUNNING=1"
902
  sleep_until_file_created $slave_pid $wait_for_slave
903
  wait_for_slave=$SLEEP_TIME_FOR_SECOND_SLAVE
904 905
}

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
906 907 908 909 910 911 912
mysql_start ()
{
  $ECHO "Starting MySQL daemon"
  start_master
  start_slave
  cd $MYSQL_TEST_DIR
  return 1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
913 914
}

915 916
stop_slave ()
{
917 918 919
  eval "this_slave_running=\$SLAVE$1_RUNNING"
  slave_ident="slave$1"
  if [ -n "$1" ] ;
920
  then
921 922 923
   slave_pid="$MYRUN_DIR/mysqld-$slave_ident.pid"
  else
   slave_pid=$SLAVE_MYPID
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
924
  fi
925 926 927 928
  if [ x$this_slave_running = x1 ]
  then
    manager_term $slave_ident
    if [ $? != 0 ] && [ -f $slave_pid ]
929
    then # try harder!
930 931 932 933 934 935 936 937 938 939 940 941
      $ECHO "slave not cooperating with mysqladmin, will try manual kill"
      kill `$CAT $slave_pid`
      sleep_until_file_deleted $slave_pid
      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
942
    fi
943
    eval "SLAVE$1_RUNNING=0"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
944
  fi
945
}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
946

947 948 949 950
stop_master ()
{
  if [ x$MASTER_RUNNING = x1 ]
  then
951
    manager_term master
952 953
    if [ $? != 0 ] && [ -f $MASTER_MYPID ]
    then # try harder!
954 955 956 957 958 959 960 961 962 963 964 965
      $ECHO "master not cooperating with mysqladmin, will try manual kill"
      kill `$CAT $MASTER_MYPID`
      sleep_until_file_deleted $MASTER_MYPID
      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
966
    fi
967 968 969
    MASTER_RUNNING=0
  fi
}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
970

971 972
mysql_stop ()
{
973 974
 $ECHO  "Ending Tests"
 $ECHO  "Shutting-down MySQL daemon"
975
 $ECHO  ""
976
 stop_master
977
 $ECHO "Master shutdown finished"
978
 stop_slave
979 980
 stop_slave 1
 stop_slave 2
981
 $ECHO "Slave shutdown finished"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
982

983
 return 1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
984 985
}

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
986 987 988 989 990
mysql_restart ()
{
  mysql_stop
  mysql_start
  return 1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
991 992 993
}

mysql_loadstd () {
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
994 995

    # cp $STD_DATA/*.frm $STD_DATA/*.MRG $MASTER_MYDDIR/test
bk@work.mysql.com's avatar
bk@work.mysql.com committed
996 997 998
    return 1
}

999 1000 1001
run_testcase ()
{
 tf=$1
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1002
 tname=`$BASENAME $tf .test`
1003 1004
 master_opt_file=$TESTDIR/$tname-master.opt
 slave_opt_file=$TESTDIR/$tname-slave.opt
1005 1006
 master_init_script=$TESTDIR/$tname-master.sh
 slave_init_script=$TESTDIR/$tname-slave.sh
sasha@mysql.sashanet.com's avatar
fixed  
sasha@mysql.sashanet.com committed
1007
 slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt
1008
 SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0`
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1009
 if [ $USE_MANAGER = 1 ] ; then
1010
  many_slaves=`$EXPR \( $tname : rpl_failsafe \) != 0`
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1011 1012 1013
 fi

 if [ -n "$SKIP_TEST" ] ; then
1014
   SKIP_THIS_TEST=`$EXPR \( $tname : "$SKIP_TEST" \) != 0`
1015 1016 1017 1018 1019
   if [ x$SKIP_THIS_TEST = x1 ] ;
   then
    return;
   fi
  fi
1020

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1021
 if [ -n "$DO_TEST" ] ; then
1022 1023 1024 1025 1026 1027 1028 1029
   DO_THIS_TEST=`$EXPR \( $tname : "$DO_TEST" \) != 0`
   if [ x$DO_THIS_TEST = x0 ] ;
   then
    return;
   fi
  fi


1030 1031 1032 1033 1034 1035
 if [ x${NO_SLAVE}x$SKIP_SLAVE = x1x0 ] ;
 then
   USERT="    ...."
   SYST="    ...."
   REALT="    ...."
   timestr="$USERT $SYST $REALT"
1036 1037
   pname=`$ECHO "$tname                        "|$CUT -c 1-24`
   RES="$pname  $timestr"
1038
   skip_inc
1039 1040 1041 1042
   $ECHO "$RES$RES_SPACE [ skipped ]"
   return
 fi

1043
 if [ -z "$USE_RUNNING_SERVER" ] ;
1044
 then
1045 1046
   if [ -f $master_opt_file ] ;
   then
1047
     EXTRA_MASTER_OPT=`$CAT $master_opt_file | $SED -e "s;\\$MYSQL_TEST_DIR;$MYSQL_TEST_DIR;"`
1048 1049 1050 1051 1052 1053 1054 1055
     stop_master
     start_master
   else
     if [ ! -z "$EXTRA_MASTER_OPT" ] || [ x$MASTER_RUNNING != x1 ] ;
     then
       EXTRA_MASTER_OPT=""
       stop_master
       start_master
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1056
     fi
1057 1058
   fi
   do_slave_restart=0
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1059

1060 1061
   if [ -f $slave_opt_file ] ;
   then
1062
     EXTRA_SLAVE_OPT=`$CAT $slave_opt_file | $SED -e "s;\\$MYSQL_TEST_DIR;$MYSQL_TEST_DIR;"`
1063 1064 1065 1066 1067
     do_slave_restart=1
   else
    if [ ! -z "$EXTRA_SLAVE_OPT" ] || [ x$SLAVE_RUNNING != x1 ] ;
    then
      EXTRA_SLAVE_OPT=""
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1068 1069
      do_slave_restart=1
    fi
1070
   fi
sasha@mysql.sashanet.com's avatar
fixed  
sasha@mysql.sashanet.com committed
1071

1072 1073 1074 1075 1076 1077 1078
   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=""
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1079 1080
       do_slave_restart=1
     fi
1081 1082 1083 1084 1085 1086
   fi

   if [ x$do_slave_restart = x1 ] ; then
     stop_slave
     start_slave
   fi
1087 1088 1089 1090
   if [ x$many_slaves = x1 ]; then
    start_slave 1
    start_slave 2
   fi
sasha@mysql.sashanet.com's avatar
fixed  
sasha@mysql.sashanet.com committed
1091
 fi
1092
 cd $MYSQL_TEST_DIR
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1093

1094
 if [ -f $tf ] ; then
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1095
    $RM -f r/$tname.*reject
1096
    mysql_test_args="-R r/$tname.result $EXTRA_MYSQL_TEST_OPT"
1097 1098
    if [ -z "$DO_CLIENT_GDB" ] ; then
      mytime=`$TIME -p $MYSQL_TEST  $mysql_test_args < $tf 2> $TIMEFILE`
1099
    else
1100
      do_gdb_test "$mysql_test_args" "$tf"
1101
    fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1102

bk@work.mysql.com's avatar
bk@work.mysql.com committed
1103 1104
    res=$?

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1105
    if [ $res = 0 ]; then
1106
	mytime=`$CAT $TIMEFILE | $TAIL -3 | $TR '\n' ':'`
1107

1108
	USERT=`$ECHO $mytime | $CUT -d : -f 2 | $CUT -d ' ' -f 2`
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1109
        USERT=`prefix_to_8 $USERT`
1110
	SYST=`$ECHO $mytime | $CUT -d : -f 3 | $CUT -d ' ' -f 2`
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1111
        SYST=`prefix_to_8 $SYST`
1112
	REALT=`$ECHO $mytime | $CUT -d : -f 1 | $CUT -d ' ' -f 2`
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1113
        REALT=`prefix_to_8 $REALT`
1114
    else
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1115 1116 1117
	USERT="    ...."
	SYST="    ...."
	REALT="    ...."
1118 1119
    fi

1120
    timestr="$USERT $SYST $REALT"
1121 1122
    pname=`$ECHO "$tname                        "|$CUT -c 1-24`
    RES="$pname  $timestr"
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1123

1124 1125 1126 1127
    if [ x$many_slaves = x1 ] ; then
     stop_slave 1
     stop_slave 2
    fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1128

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1129
    if [ $res = 0 ]; then
1130 1131
      total_inc
      pass_inc
1132
      $ECHO "$RES$RES_SPACE [ pass ]"
1133
    else
1134
      # why the following ``if'' ? That is why res==1 is special ?
1135 1136 1137 1138
      if [ $res = 2 ]; then
        skip_inc
	$ECHO "$RES$RES_SPACE [ skipped ]"
      else
1139
	total_inc
1140
        fail_inc
1141
	$ECHO "$RES$RES_SPACE [ fail ]"
1142 1143
        $ECHO
	error_is
1144
	show_failed_diff $tname
1145
	$ECHO
1146
	if [ x$FORCE != x1 ] ; then
1147 1148
	 $ECHO "Aborting. To continue, re-run with '--force'."
	 $ECHO
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1149 1150 1151
         if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	 then
	   mysql_stop
1152
	   stop_manager
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1153
   	 fi
1154 1155
	 exit 1
	fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1156

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1157 1158 1159 1160
        if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
	then
	  mysql_restart
	fi
1161
	$ECHO "Resuming Tests"
1162
	$ECHO ""
1163
      fi
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1164
    fi
1165
  fi
1166 1167
}

monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1168 1169 1170 1171
######################################################################
# Main script starts here
######################################################################

1172 1173
[ "$DO_GCOV" -a ! -x "$GCOV" ] && error "No gcov found"

monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1174 1175
[ "$DO_GCOV" ] && gcov_prepare
[ "$DO_GPROF" ] && gprof_prepare
1176

1177 1178
if [ -z "$USE_RUNNING_SERVER" ]
then
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1179
  # Ensure that no old mysqld test servers are running
1180 1181
  $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
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202
  $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 $MASTER_MYPID
  sleep_until_file_deleted $SLAVE_MYPID

  # 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/*

1203 1204
  wait_for_master=$SLEEP_TIME_FOR_FIRST_MASTER
  wait_for_slave=$SLEEP_TIME_FOR_FIRST_SLAVE
1205 1206
  $ECHO "Installing Test Databases"
  mysql_install_db
1207
  start_manager
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1208 1209 1210

# Do not automagically start deamons if we are in gdb or running only one test
# case
1211 1212 1213 1214 1215 1216
  if [ -z "$DO_GDB" ] && [ -z "$DO_DDD" ]
  then
    mysql_start
  fi
  $ECHO  "Loading Standard Test Databases"
  mysql_loadstd
1217 1218
fi

1219 1220 1221 1222
if [ "x$START_AND_EXIT" = "x1" ] ; then
 echo "Servers started, exiting"
 exit
fi
1223

1224
$ECHO  "Starting Tests"
1225

1226 1227
if [ "$DO_BENCH" = 1 ]
then
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1228 1229 1230 1231
  BENCHDIR=$BASEDIR/sql-bench/
  savedir=`pwd`
  cd $BENCHDIR
  if [ -z "$1" ]
1232
  then
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1233
    ./run-all-tests --socket=$MASTER_MYSOCK --user=root
1234
  else
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1235 1236 1237 1238 1239 1240
    if [ -x "./$1" ]
    then
       ./$1 --socket=$MASTER_MYSOCK --user=root
    else
      echo "benchmark $1 not found"
    fi
1241
  fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1242 1243 1244 1245
  cd $savedir
  mysql_stop
  stop_manager
  exit
1246 1247
fi

1248
$ECHO
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
1249
$ECHO " TEST                         USER   SYSTEM  ELAPSED        RESULT"
1250 1251
$ECHO $DASH72

1252
if [ -z "$1" ] ;
1253
then
1254
 if [ x$RECORD = x1 ]; then
1255
  $ECHO "Will not run in record mode without a specific test case."
1256 1257 1258 1259 1260
 else
  for tf in $TESTDIR/*.$TESTSUFFIX
  do
    run_testcase $tf
  done
1261
  $RM -f $TIMEFILE	# Remove for full test
1262
 fi
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1263
else
1264 1265 1266 1267 1268 1269 1270 1271 1272 1273
  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
1274
fi
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1275

1276 1277
$ECHO $DASH72
$ECHO
1278

1279
if [ -z "$DO_GDB" ] && [ -z "$USE_RUNNING_SERVER" ] && [ -z "$DO_DDD" ]
1280 1281 1282
then
    mysql_stop
fi
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1283

1284
stop_manager
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1285
report_stats
1286
$ECHO
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1287

1288
[ "$DO_GCOV" ] && gcov_collect # collect coverage information
1289
[ "$DO_GPROF" ] && gprof_collect # collect coverage information
1290

bk@work.mysql.com's avatar
bk@work.mysql.com committed
1291
exit 0