mysql_test_run.c 30.4 KB
Newer Older
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1 2 3 4 5 6 7 8 9
/*
  Copyright (c) 2002, 2003 Novell, Inc. All Rights Reserved. 

  This program is free software; you can redistribute it and/or modify 
  it under the terms of the GNU General Public License as published by 
  the Free Software Foundation; either version 2 of the License, or 
  (at your option) any later version. 

  This program is distributed in the hope that it will be useful, 
10
  but WITHOUT ANY WARRANTY; without even the implied warranty of
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
11 12 13 14 15 16 17 18
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  GNU General Public License for more details. 

  You should have received a copy of the GNU General Public License 
  along with this program; if not, write to the Free Software 
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ 

19 20
#include <my_global.h>
#include <m_string.h>
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
21 22 23 24 25
#include <dirent.h>
#include <screen.h>
#include <nks/vm.h>
#include <ctype.h>
#include <sys/stat.h>
26
#include <sys/mode.h>
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
27 28 29

#include "my_manage.h"

30 31 32 33
#ifdef __NETWARE__
#define strindex(a,b) ((char*)strindex(a,b))
#endif

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
/******************************************************************************

  macros
  
******************************************************************************/

#define HEADER  "TEST                                           ELAPSED      RESULT      \n"
#define DASH    "------------------------------------------------------------------------\n"

#define NW_TEST_SUFFIX    ".nw-test"
#define NW_RESULT_SUFFIX  ".nw-result"
#define TEST_SUFFIX		    ".test"
#define RESULT_SUFFIX	    ".result"
#define REJECT_SUFFIX	    ".reject"
#define OUT_SUFFIX		    ".out"
#define ERR_SUFFIX		    ".err"

#define TEST_PASS		"[ pass ]"
#define TEST_SKIP		"[ skip ]"
#define TEST_FAIL		"[ fail ]"
#define TEST_BAD		"[ bad  ]"
monty@mysql.com's avatar
monty@mysql.com committed
55
#define TEST_IGNORE		"[ignore]"
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

/******************************************************************************

  global variables
  
******************************************************************************/

char base_dir[PATH_MAX]   = "sys:/mysql";
char db[PATH_MAX]         = "test";
char user[PATH_MAX]       = "root";
char password[PATH_MAX]   = "";

int master_port           = 9306;
int slave_port            = 9307;

// comma delimited list of tests to skip or empty string
monty@mysql.com's avatar
monty@mysql.com committed
72 73
char skip_test[PATH_MAX]  = " lowercase_table3 , system_mysql_db_fix ";
char ignore_test[PATH_MAX]  = "";
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98

char bin_dir[PATH_MAX];
char mysql_test_dir[PATH_MAX];
char test_dir[PATH_MAX];
char mysql_tmp_dir[PATH_MAX];
char result_dir[PATH_MAX];
char master_dir[PATH_MAX];
char slave_dir[PATH_MAX];
char lang_dir[PATH_MAX];
char char_dir[PATH_MAX];

char mysqladmin_file[PATH_MAX];
char mysqld_file[PATH_MAX];
char mysqltest_file[PATH_MAX];
char master_pid[PATH_MAX];
char slave_pid[PATH_MAX];

char master_opt[PATH_MAX] = "";
char slave_opt[PATH_MAX]  = "";

char slave_master_info[PATH_MAX]  = "";

char master_init_script[PATH_MAX]  = "";
char slave_init_script[PATH_MAX]  = "";

99 100 101 102 103 104 105
// OpenSSL
char ca_cert[PATH_MAX];
char server_cert[PATH_MAX];
char server_key[PATH_MAX];
char client_cert[PATH_MAX];
char client_key[PATH_MAX];

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
106 107 108 109 110
int total_skip    = 0;
int total_pass    = 0;
int total_fail    = 0;
int total_test    = 0;

monty@mysql.com's avatar
monty@mysql.com committed
111
int total_ignore  = 0;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
112 113
double total_time = 0;

114
int use_openssl     = FALSE;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
int master_running  = FALSE;
int slave_running   = FALSE;
int skip_slave      = TRUE;
int single_test     = TRUE;

int restarts  = 0;

FILE *log_fd  = NULL;

/******************************************************************************

  functions
  
******************************************************************************/

/******************************************************************************

  prototypes
  
******************************************************************************/

void report_stats();
void install_db(char *);
void mysql_install_db();
void start_master();
void start_slave();
void mysql_start();
void stop_slave();
void stop_master();
void mysql_stop();
void mysql_restart();
int read_option(char *, char *);
void run_test(char *);
void setup(char *);
void vlog(char *, va_list);
150
void mtr_log(char *, ...);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
void log_info(char *, ...);
void log_error(char *, ...);
void log_errno(char *, ...);
void die(char *);

/******************************************************************************

  report_stats()
  
  Report the gathered statistics.

******************************************************************************/
void report_stats()
{
  if (total_fail == 0)
  {
167
    mtr_log("\nAll %d test(s) were successful.\n", total_test);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
168 169 170 171 172
  }
  else
  {
    double percent = ((double)total_pass / total_test) * 100;
    
173
    mtr_log("\nFailed %u/%u test(s), %.02f%% successful.\n",
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
174
      total_fail, total_test, percent);
175
		mtr_log("\nThe .out and .err files in %s may give you some\n", result_dir);
176
		mtr_log("hint of what went wrong.\n");
177 178
		mtr_log("\nIf you want to report this error, please first read the documentation\n");
		mtr_log("at: http://www.mysql.com/doc/M/y/MySQL_test_suite.html\n");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
179 180
  }

181
  mtr_log("\n%.02f total minutes elapsed in the test cases\n\n", total_time / 60);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
182 183 184 185 186 187 188 189 190 191 192
}

/******************************************************************************

  install_db()
  
  Install the a database.

******************************************************************************/
void install_db(char *datadir)
{
193
  arg_list_t al;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
194 195 196 197
  int err, i;
  char input[PATH_MAX];
  char output[PATH_MAX];
  char error[PATH_MAX];
198

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
199 200 201 202 203 204
  // input file
  snprintf(input, PATH_MAX, "%s/bin/init_db.sql", base_dir);
  snprintf(output, PATH_MAX, "%s/install.out", datadir);
  snprintf(error, PATH_MAX, "%s/install.err", datadir);
  
  // args
205 206
  init_args(&al);
  add_arg(&al, mysqld_file);
207
  add_arg(&al, "--no-defaults");
208 209 210 211 212 213
  add_arg(&al, "--bootstrap");
  add_arg(&al, "--skip-grant-tables");
  add_arg(&al, "--basedir=%s", base_dir);
  add_arg(&al, "--datadir=%s", datadir);
  add_arg(&al, "--skip-innodb");
  add_arg(&al, "--skip-bdb");
214

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
215
  // spawn
216
  if ((err = spawn(mysqld_file, &al, TRUE, input, output, error)) != 0)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
217 218 219 220 221
  {
    die("Unable to create database.");
  }
  
  // free args
222
  free_args(&al);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
}

/******************************************************************************

  mysql_install_db()
  
  Install the test databases.

******************************************************************************/
void mysql_install_db()
{
  char temp[PATH_MAX];
  
  // var directory
  snprintf(temp, PATH_MAX, "%s/var", mysql_test_dir);
  
  // clean up old direcotry
  del_tree(temp);
  
  // create var directory
  mkdir(temp, S_IRWXU);
  
  // create subdirectories
  snprintf(temp, PATH_MAX, "%s/var/run", mysql_test_dir);
  mkdir(temp, S_IRWXU);
  snprintf(temp, PATH_MAX, "%s/var/tmp", mysql_test_dir);
  mkdir(temp, S_IRWXU);
  snprintf(temp, PATH_MAX, "%s/var/master-data", mysql_test_dir);
  mkdir(temp, S_IRWXU);
  snprintf(temp, PATH_MAX, "%s/var/master-data/mysql", mysql_test_dir);
  mkdir(temp, S_IRWXU);
  snprintf(temp, PATH_MAX, "%s/var/master-data/test", mysql_test_dir);
  mkdir(temp, S_IRWXU);
  snprintf(temp, PATH_MAX, "%s/var/slave-data", mysql_test_dir);
  mkdir(temp, S_IRWXU);
  snprintf(temp, PATH_MAX, "%s/var/slave-data/mysql", mysql_test_dir);
  mkdir(temp, S_IRWXU);
  snprintf(temp, PATH_MAX, "%s/var/slave-data/test", mysql_test_dir);
  mkdir(temp, S_IRWXU);

  // install databases
  install_db(master_dir);
  install_db(slave_dir);
}

/******************************************************************************

  start_master()
  
  Start the master server.

******************************************************************************/
void start_master()
{
277
  arg_list_t al;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
278 279 280
  int err, i;
  char master_out[PATH_MAX];
  char master_err[PATH_MAX];
281 282
  char temp[PATH_MAX], temp2[PATH_MAX];

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
283 284
  // remove old berkeley db log files that can confuse the server
  removef("%s/log.*", master_dir);
285

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
286
  // remove stale binary logs
287
  removef("%s/var/log/*-bin.*", mysql_test_dir);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
288 289

  // remove stale binary logs
290
  removef("%s/var/log/*.index", mysql_test_dir);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
291 292 293 294 295 296 297 298 299

  // remove master.info file
  removef("%s/master.info", master_dir);

  // remove relay files
  removef("%s/var/log/*relay*", mysql_test_dir);

  // remove relay-log.info file
  removef("%s/relay-log.info", master_dir);
300

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
301 302 303 304
  // init script
  if (master_init_script[0] != NULL)
  {
    // run_init_script(master_init_script);
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319

    // TODO: use the scripts
    if (strindex(master_init_script, "repair_part2-master.sh") != NULL)
    {
      FILE *fp;

      // create an empty index file
      snprintf(temp, PATH_MAX, "%s/test/t1.MYI", master_dir);
      fp = fopen(temp, "wb+");

      fputs("1", fp);

      fclose(fp);
    }

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
320 321 322 323 324 325 326
  }

  // redirection files
  snprintf(master_out, PATH_MAX, "%s/var/run/master%u.out",
           mysql_test_dir, restarts);
  snprintf(master_err, PATH_MAX, "%s/var/run/master%u.err",
           mysql_test_dir, restarts);
327 328 329 330 331 332

  snprintf(temp2,PATH_MAX,"%s/var",mysql_test_dir);
  mkdir(temp2,0);
  snprintf(temp2,PATH_MAX,"%s/var/log",mysql_test_dir);
  mkdir(temp2,0);

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
333
  // args
334 335 336
  init_args(&al);
  add_arg(&al, "%s", mysqld_file);
  add_arg(&al, "--no-defaults");
337
  add_arg(&al, "--log-bin=%s/var/log/master-bin",mysql_test_dir);
338 339 340 341 342 343 344 345 346 347
  add_arg(&al, "--server-id=1");
  add_arg(&al, "--basedir=%s", base_dir);
  add_arg(&al, "--port=%u", master_port);
  add_arg(&al, "--local-infile");
  add_arg(&al, "--core");
  add_arg(&al, "--datadir=%s", master_dir);
  add_arg(&al, "--pid-file=%s", master_pid);
  add_arg(&al, "--character-sets-dir=%s", char_dir);
  add_arg(&al, "--tmpdir=%s", mysql_tmp_dir);
  add_arg(&al, "--language=%s", lang_dir);
348 349 350 351 352 353 354 355

  if (use_openssl)
  {
    add_arg(&al, "--ssl-ca=%s", ca_cert);
    add_arg(&al, "--ssl-cert=%s", server_cert);
    add_arg(&al, "--ssl-key=%s", server_key);
  }

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
356
  // $MASTER_40_ARGS
357 358
  add_arg(&al, "--rpl-recovery-rank=1");
  add_arg(&al, "--init-rpl-role=master");
359

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
360
  // $SMALL_SERVER
361 362 363 364 365 366
  add_arg(&al, "-O");
  add_arg(&al, "key_buffer_size=1M");
  add_arg(&al, "-O");
  add_arg(&al, "sort_buffer=256K");
  add_arg(&al, "-O");
  add_arg(&al, "max_heap_table_size=1M");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
367 368 369 370 371

  // $EXTRA_MASTER_OPT
  if (master_opt[0] != NULL)
  {
    char *p;
372
    char *temp;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
373 374 375

    p = (char *)strtok(master_opt, " \t");

376
    if ((temp = strstr(p, "timezone")) == NULL)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
377
    {
378 379 380 381 382 383 384 385 386
      while(p)
      {
        add_arg(&al, "%s", p);
        p = (char *)strtok(NULL, " \t");
      }
    }
    else
    {
      //do nothing
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
387 388
    }
  }
389

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
390 391 392 393
  // remove the pid file if it exists
  remove(master_pid);

  // spawn
394
  if ((err = spawn(mysqld_file, &al, FALSE, NULL, master_out, master_err)) == 0)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
395 396
  {
    sleep_until_file_exists(master_pid);
397

monty@mysql.com's avatar
monty@mysql.com committed
398
	if ((err = wait_for_server_start(bin_dir, user, password, master_port,mysql_tmp_dir)) == 0)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
399 400 401 402 403 404 405 406 407 408 409 410
    {
      master_running = TRUE;
    }
    else
    {
	  log_error("The master server went down early.");
    }
  }
  else
  {
    log_error("Unable to start master server.");
  }
411

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
412
  // free_args
413
  free_args(&al);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
414 415 416 417 418 419 420 421 422 423 424
}

/******************************************************************************

  start_slave()
  
  Start the slave server.

******************************************************************************/
void start_slave()
{
425
  arg_list_t al;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
  int err, i;
  char slave_out[PATH_MAX];
  char slave_err[PATH_MAX];
  char temp[PATH_MAX];
  
  // skip?
  if (skip_slave) return;

  // remove stale binary logs
  removef("%s/*-bin.*", slave_dir);

  // remove stale binary logs
  removef("%s/*.index", slave_dir);

  // remove master.info file
  removef("%s/master.info", slave_dir);

  // remove relay files
  removef("%s/var/log/*relay*", mysql_test_dir);

  // remove relay-log.info file
  removef("%s/relay-log.info", slave_dir);

  // init script
  if (slave_init_script[0] != NULL)
  {
    // run_init_script(slave_init_script);
    
    // TODO: use the scripts
    if (strindex(slave_init_script, "rpl000016-slave.sh") != NULL)
    {
      // create empty master.info file
      snprintf(temp, PATH_MAX, "%s/master.info", slave_dir);
459
      close(open(temp, O_WRONLY | O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO));
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
    }
    else if (strindex(slave_init_script, "rpl000017-slave.sh") != NULL)
    {
      FILE *fp;
      
      // create a master.info file
      snprintf(temp, PATH_MAX, "%s/master.info", slave_dir);
      fp = fopen(temp, "wb+");
      
      fputs("master-bin.001\n", fp);
      fputs("4\n", fp);
      fputs("127.0.0.1\n", fp);
      fputs("replicate\n", fp);
      fputs("aaaaaaaaaaaaaaabthispartofthepasswordisnotused\n", fp);
      fputs("9306\n", fp);
      fputs("1\n", fp);
      fputs("0\n", fp);

      fclose(fp);
    }
    else if (strindex(slave_init_script, "rpl_rotate_logs-slave.sh") != NULL)
    {
      // create empty master.info file
      snprintf(temp, PATH_MAX, "%s/master.info", slave_dir);
484
      close(open(temp, O_WRONLY | O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO));
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
485 486 487 488 489 490 491 492 493 494
    }
  }

  // redirection files
  snprintf(slave_out, PATH_MAX, "%s/var/run/slave%u.out",
           mysql_test_dir, restarts);
  snprintf(slave_err, PATH_MAX, "%s/var/run/slave%u.err",
           mysql_test_dir, restarts);
  
  // args
495 496 497 498 499 500 501 502 503 504 505 506 507
  init_args(&al);
  add_arg(&al, "%s", mysqld_file);
  add_arg(&al, "--no-defaults");
  add_arg(&al, "--log-bin=slave-bin");
  add_arg(&al, "--relay_log=slave-relay-bin");
  add_arg(&al, "--basedir=%s", base_dir);
  add_arg(&al, "--port=%u", slave_port);
  add_arg(&al, "--datadir=%s", slave_dir);
  add_arg(&al, "--pid-file=%s", slave_pid);
  add_arg(&al, "--character-sets-dir=%s", char_dir);
  add_arg(&al, "--core");
  add_arg(&al, "--tmpdir=%s", mysql_tmp_dir);
  add_arg(&al, "--language=%s", lang_dir);
508

509 510 511 512 513 514 515 516 517 518 519 520 521 522
  add_arg(&al, "--exit-info=256");
  add_arg(&al, "--log-slave-updates");
  add_arg(&al, "--init-rpl-role=slave");
  add_arg(&al, "--skip-innodb");
  add_arg(&al, "--skip-slave-start");
  add_arg(&al, "--slave-load-tmpdir=../../var/tmp");
  
  add_arg(&al, "--report-user=%s", user);
	add_arg(&al, "--report-host=127.0.0.1");
  add_arg(&al, "--report-port=%u", slave_port);

  add_arg(&al, "--master-retry-count=10");
  add_arg(&al, "-O");
  add_arg(&al, "slave_net_timeout=10");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
523

524 525 526 527 528 529 530
  if (use_openssl)
  {
    add_arg(&al, "--ssl-ca=%s", ca_cert);
    add_arg(&al, "--ssl-cert=%s", server_cert);
    add_arg(&al, "--ssl-key=%s", server_key);
  }

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
531 532 533 534 535 536 537 538 539
  // slave master info
  if (slave_master_info[0] != NULL)
  {
    char *p;

    p = (char *)strtok(slave_master_info, " \t");

    while(p)
    {
540
      add_arg(&al, "%s", p);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
541 542 543 544 545 546
      
      p = (char *)strtok(NULL, " \t");
    }
  }
  else
  {
547 548 549 550 551 552 553
    add_arg(&al, "--master-user=%s", user);
    add_arg(&al, "--master-password=%s", password);
    add_arg(&al, "--master-host=127.0.0.1");
    add_arg(&al, "--master-port=%u", master_port);
    add_arg(&al, "--master-connect-retry=1");
    add_arg(&al, "--server-id=2");
    add_arg(&al, "--rpl-recovery-rank=2");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
554 555 556
  }
  
  // small server
557 558 559 560 561 562
  add_arg(&al, "-O");
  add_arg(&al, "key_buffer_size=1M");
  add_arg(&al, "-O");
  add_arg(&al, "sort_buffer=256K");
  add_arg(&al, "-O");
  add_arg(&al, "max_heap_table_size=1M");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
563 564 565 566 567 568 569 570 571 572

  // opt args
  if (slave_opt[0] != NULL)
  {
    char *p;

    p = (char *)strtok(slave_opt, " \t");

    while(p)
    {
573
      add_arg(&al, "%s", p);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
574 575 576 577 578 579 580 581 582
      
      p = (char *)strtok(NULL, " \t");
    }
  }
  
  // remove the pid file if it exists
  remove(slave_pid);

  // spawn
583
  if ((err = spawn(mysqld_file, &al, FALSE, NULL, slave_out, slave_err)) == 0)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
584 585 586
  {
    sleep_until_file_exists(slave_pid);
    
monty@mysql.com's avatar
monty@mysql.com committed
587
    if ((err = wait_for_server_start(bin_dir, user, password, slave_port,mysql_tmp_dir)) == 0)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
588 589 590 591 592 593 594 595 596 597 598 599 600 601
    {
      slave_running = TRUE;
    }
    else
    {
      log_error("The slave server went down early.");
    }
  }
  else
  {
    log_error("Unable to start slave server.");
  }
  
  // free args
602
  free_args(&al);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
603 604 605 606 607 608 609 610 611 612 613
}

/******************************************************************************

  mysql_start()
  
  Start the mysql servers.

******************************************************************************/
void mysql_start()
{
614
  log_info("Starting the MySQL server(s): %u", ++restarts);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
615 616 617
  start_master();

  start_slave();
618

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
619 620 621 622 623 624 625
  // activate the test screen
  ActivateScreen(getscreenhandle());
}

/******************************************************************************

  stop_slave()
626

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
627 628 629 630 631 632
  Stop the slave server.

******************************************************************************/
void stop_slave()
{
  int err;
633

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
634 635
  // running?
  if (!slave_running) return;
636

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
637
  // stop
monty@mysql.com's avatar
monty@mysql.com committed
638
  if ((err = stop_server(bin_dir, user, password, slave_port, slave_pid,mysql_tmp_dir)) == 0)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
639 640 641 642 643 644 645 646 647 648 649 650
  {
    slave_running = FALSE;
  }
  else
  {
    log_error("Unable to stop slave server.");
  }
}

/******************************************************************************

  stop_master()
651

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
652 653 654 655 656 657
  Stop the master server.

******************************************************************************/
void stop_master()
{
  int err;
658

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
659 660
  // running?
  if (!master_running) return;
661

monty@mysql.com's avatar
monty@mysql.com committed
662
  if ((err = stop_server(bin_dir, user, password, master_port, master_pid,mysql_tmp_dir)) == 0)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
663 664 665 666 667 668 669 670 671 672 673 674
  {
    master_running = FALSE;
  }
  else
  {
    log_error("Unable to stop master server.");
  }
}

/******************************************************************************

  mysql_stop()
675

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
676 677 678 679 680
  Stop the mysql servers.

******************************************************************************/
void mysql_stop()
{
681
  log_info("Stopping the MySQL server(s)...");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
682 683 684
  stop_master();

  stop_slave();
685

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
686 687 688 689 690 691 692
  // activate the test screen
  ActivateScreen(getscreenhandle());
}

/******************************************************************************

  mysql_restart()
693

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
694 695 696 697 698 699 700 701 702 703 704 705 706 707
  Restart the mysql servers.

******************************************************************************/
void mysql_restart()
{

  mysql_stop();

  mysql_start();
}

/******************************************************************************

  read_option()
708

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
709 710 711 712 713 714 715 716 717
  Read the option file.

******************************************************************************/
int read_option(char *opt_file, char *opt)
{
  int fd, err;
  int result;
  char *p;
  char buf[PATH_MAX];
718

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
719 720
  // copy current option
  strncpy(buf, opt, PATH_MAX);
721

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782
  // open options file
  fd = open(opt_file, O_RDONLY);
  
  err = read(fd, opt, PATH_MAX);
  
  close(fd);
  
  if (err > 0)
  {
    // terminate string
    if ((p = strchr(opt, '\n')) != NULL)
    {
      *p = NULL;
      
      // check for a '\r'
      if ((p = strchr(opt, '\r')) != NULL)
      {
        *p = NULL;
      }
    }
    else
    {
      opt[err] = NULL;
    }

    // check for $MYSQL_TEST_DIR
    if ((p = strstr(opt, "$MYSQL_TEST_DIR")) != NULL)
    {
      char temp[PATH_MAX];
      
      *p = NULL;
      
      strcpy(temp, p + strlen("$MYSQL_TEST_DIR"));
      
      strcat(opt, mysql_test_dir);
      
      strcat(opt, temp);
    }
  }
  else
  {
    // clear option
    *opt = NULL;
  }
  
  // compare current option with previous
  return strcmp(opt, buf);
}

/******************************************************************************

  run_test()
  
  Run the given test case.

******************************************************************************/
void run_test(char *test)
{
  char temp[PATH_MAX];
  char *rstr;
  double elapsed = 0;
monty@mysql.com's avatar
monty@mysql.com committed
783
  int skip = FALSE, ignore=FALSE;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
784 785 786 787 788
  int restart = FALSE;
  int flag = FALSE;
  struct stat info;
  
  // single test?
monty@mysql.com's avatar
monty@mysql.com committed
789
//  if (!single_test)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
790 791 792 793
  {
    // skip tests in the skip list
    snprintf(temp, PATH_MAX, " %s ", test);
    skip = (strindex(skip_test, temp) != NULL);
monty@mysql.com's avatar
monty@mysql.com committed
794 795
    if( skip == FALSE )
      ignore = (strindex(ignore_test, temp) != NULL);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
796 797
  }
    
monty@mysql.com's avatar
monty@mysql.com committed
798 799 800
  if(ignore)
  {
    // show test
801
    mtr_log("%-46s ", test);
monty@mysql.com's avatar
monty@mysql.com committed
802 803 804 805 806 807
         
    // ignore
    rstr = TEST_IGNORE;
    ++total_ignore;
  }  
  else if (!skip)     // skip test?
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
808 809 810 811 812 813 814 815 816 817
  {
    char test_file[PATH_MAX];
    char master_opt_file[PATH_MAX];
    char slave_opt_file[PATH_MAX];
    char slave_master_info_file[PATH_MAX];
    char result_file[PATH_MAX];
    char reject_file[PATH_MAX];
    char out_file[PATH_MAX];
    char err_file[PATH_MAX];
    int err;
818
    arg_list_t al;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
819 820 821 822 823 824 825 826 827 828
    NXTime_t start, stop;
    
    // skip slave?
    flag = skip_slave;
    skip_slave = (strncmp(test, "rpl", 3) != 0);
    if (flag != skip_slave) restart = TRUE;
    
    // create files
    snprintf(master_opt_file, PATH_MAX, "%s/%s-master.opt", test_dir, test);
    snprintf(slave_opt_file, PATH_MAX, "%s/%s-slave.opt", test_dir, test);
829
    snprintf(slave_master_info_file, PATH_MAX, "%s/%s.slave-mi", test_dir, test);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
830 831 832 833 834 835 836 837 838
    snprintf(reject_file, PATH_MAX, "%s/%s%s", result_dir, test, REJECT_SUFFIX);
    snprintf(out_file, PATH_MAX, "%s/%s%s", result_dir, test, OUT_SUFFIX);
    snprintf(err_file, PATH_MAX, "%s/%s%s", result_dir, test, ERR_SUFFIX);
    
    // netware specific files
    snprintf(test_file, PATH_MAX, "%s/%s%s", test_dir, test, NW_TEST_SUFFIX);
    if (stat(test_file, &info))
    {
      snprintf(test_file, PATH_MAX, "%s/%s%s", test_dir, test, TEST_SUFFIX);
839 840 841 842 843
      if(access(test_file,0))
      {
        printf("Invalid test name %s, %s file not found\n",test,test_file);
        return;
      }
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
844
    }
845

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
846 847 848 849 850
    snprintf(result_file, PATH_MAX, "%s/%s%s", result_dir, test, NW_RESULT_SUFFIX);
    if (stat(result_file, &info))
    {
      snprintf(result_file, PATH_MAX, "%s/%s%s", result_dir, test, RESULT_SUFFIX);
    }
851

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882
    // init scripts
    snprintf(master_init_script, PATH_MAX, "%s/%s-master.sh", test_dir, test);
    if (stat(master_init_script, &info))
      master_init_script[0] = NULL;
    else
      restart = TRUE;
    
    snprintf(slave_init_script, PATH_MAX, "%s/%s-slave.sh", test_dir, test);
    if (stat(slave_init_script, &info))
      slave_init_script[0] = NULL;
    else
      restart = TRUE;

    // read options
    if (read_option(master_opt_file, master_opt)) restart = TRUE;
    if (read_option(slave_opt_file, slave_opt)) restart = TRUE;
    if (read_option(slave_master_info_file, slave_master_info)) restart = TRUE;
    
    // cleanup previous run
    remove(reject_file);
    remove(out_file);
    remove(err_file);
    
    // start or restart?
    if (!master_running) mysql_start();
      else if (restart) mysql_restart();
    
    // let the system stabalize
    sleep(1);

    // show test
883
    mtr_log("%-46s ", test);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
884 885
    
    // args
886 887 888 889 890 891 892 893 894 895 896 897 898
    init_args(&al);
    add_arg(&al, "%s", mysqltest_file);
    add_arg(&al, "--no-defaults");
    add_arg(&al, "--port=%u", master_port);
    add_arg(&al, "--database=%s", db);
    add_arg(&al, "--user=%s", user);
    add_arg(&al, "--password=%s", password);
    add_arg(&al, "--silent");
    add_arg(&al, "--basedir=%s/", mysql_test_dir);
    add_arg(&al, "--host=127.0.0.1");
    add_arg(&al, "-v");
    add_arg(&al, "-R");
    add_arg(&al, "%s", result_file);
899 900 901 902 903 904 905 906

    if (use_openssl)
    {
      add_arg(&al, "--ssl-ca=%s", ca_cert);
      add_arg(&al, "--ssl-cert=%s", client_cert);
      add_arg(&al, "--ssl-key=%s", client_key);
    }

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
907 908 909 910
    // start timer
    NXGetTime(NX_SINCE_BOOT, NX_USECONDS, &start);
    
    // spawn
911
    err = spawn(mysqltest_file, &al, TRUE, test_file, out_file, err_file);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
912 913 914 915 916 917 918 919 920
    
    // stop timer
    NXGetTime(NX_SINCE_BOOT, NX_USECONDS, &stop);
    
    // calculate
    elapsed = ((double)(stop - start)) / NX_USECONDS;
    total_time += elapsed;
    
    // free args
921
    free_args(&al);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
    
    if (err == 0)
    {
      // pass
      rstr = TEST_PASS;
      ++total_pass;
      
      // increment total
      ++total_test;
    }
    else if (err == 2)
    {
      // skip
      rstr = TEST_SKIP;
      ++total_skip;
    }
    else if (err == 1)
    {
      // fail
      rstr = TEST_FAIL;
      ++total_fail;
      
      // increment total
      ++total_test;
    }
    else
    {
      rstr = TEST_BAD;
    }
  }
  else // early skips
  {
    // show test
955
    mtr_log("%-46s ", test);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
956 957 958 959 960 961 962
    
    // skip
    rstr = TEST_SKIP;
    ++total_skip;
  }
  
  // result
963
  mtr_log("%10.06f   %-14s\n", elapsed, rstr);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991
}

/******************************************************************************

  vlog()
  
  Log the message.

******************************************************************************/
void vlog(char *format, va_list ap)
{
  vfprintf(stdout, format, ap);
  fflush(stdout);
  
  if (log_fd)
  {
    vfprintf(log_fd, format, ap);
    fflush(log_fd);
  }
}

/******************************************************************************

  log()
  
  Log the message.

******************************************************************************/
992
void mtr_log(char *format, ...)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
993 994
{
  va_list ap;
995

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
  va_start(ap, format);

  vlog(format, ap);
  
  va_end(ap);
}

/******************************************************************************

  log_info()
  
  Log the given information.

******************************************************************************/
void log_info(char *format, ...)
{
  va_list ap;
  
  va_start(ap, format);

1016
  mtr_log("-- INFO : ");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1017
  vlog(format, ap);
1018
  mtr_log("\n");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035

  va_end(ap);
}

/******************************************************************************

  log_error()
  
  Log the given error.

******************************************************************************/
void log_error(char *format, ...)
{
  va_list ap;
  
  va_start(ap, format);

1036
  mtr_log("-- ERROR: ");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1037
  vlog(format, ap);
1038
  mtr_log("\n");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055

  va_end(ap);
}

/******************************************************************************

  log_errno()
  
  Log the given error and errno.

******************************************************************************/
void log_errno(char *format, ...)
{
  va_list ap;
  
  va_start(ap, format);

1056
  mtr_log("-- ERROR: (%003u) ", errno);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1057
  vlog(format, ap);
1058
  mtr_log("\n");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088

  va_end(ap);
}

/******************************************************************************

  die()
  
  Exit the application.

******************************************************************************/
void die(char *msg)
{
  log_error(msg);

  pressanykey();

  exit(-1);
}

/******************************************************************************

  setup()
  
  Setup the mysql test enviornment.

******************************************************************************/
void setup(char *file)
{
  char temp[PATH_MAX];
1089 1090
  char mysqldump_load[PATH_MAX*2],mysqlbinlog_load[PATH_MAX*2];

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1091
  char *p;
1092

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
  // set the timezone for the timestamp test
  setenv("TZ", "GMT-3", TRUE);

  // find base dir
  strcpy(temp, strlwr(file));
  while((p = strchr(temp, '\\')) != NULL) *p = '/';
  
  if ((p = strindex(temp, "/mysql-test/")) != NULL)
  {
    *p = NULL;
    strcpy(base_dir, temp);
  }
1105

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
  // setup paths
  snprintf(bin_dir, PATH_MAX, "%s/bin", base_dir);
  snprintf(mysql_test_dir, PATH_MAX, "%s/mysql-test", base_dir);
  snprintf(test_dir, PATH_MAX, "%s/t", mysql_test_dir);
  snprintf(mysql_tmp_dir, PATH_MAX, "%s/var/tmp", mysql_test_dir);
  snprintf(result_dir, PATH_MAX, "%s/r", mysql_test_dir);
  snprintf(master_dir, PATH_MAX, "%s/var/master-data", mysql_test_dir);
  snprintf(slave_dir, PATH_MAX, "%s/var/slave-data", mysql_test_dir);
  snprintf(lang_dir, PATH_MAX, "%s/share/english", base_dir);
  snprintf(char_dir, PATH_MAX, "%s/share/charsets", base_dir);
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127

#ifdef HAVE_OPENSSL
  use_openssl = TRUE;
#endif // HAVE_OPENSSL

  // OpenSSL paths
  snprintf(ca_cert, PATH_MAX, "%s/SSL/cacert.pem", base_dir);
  snprintf(server_cert, PATH_MAX, "%s/SSL/server-cert.pem", base_dir);
  snprintf(server_key, PATH_MAX, "%s/SSL/server-key.pem", base_dir);
  snprintf(client_cert, PATH_MAX, "%s/SSL/client-cert.pem", base_dir);
  snprintf(client_key, PATH_MAX, "%s/SSL/client-key.pem", base_dir);

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
  // setup files
  snprintf(mysqld_file, PATH_MAX, "%s/mysqld", bin_dir);
  snprintf(mysqltest_file, PATH_MAX, "%s/mysqltest", bin_dir);
  snprintf(mysqladmin_file, PATH_MAX, "%s/mysqladmin", bin_dir);
  snprintf(master_pid, PATH_MAX, "%s/var/run/master.pid", mysql_test_dir);
  snprintf(slave_pid, PATH_MAX, "%s/var/run/slave.pid", mysql_test_dir);

  // create log file
  snprintf(temp, PATH_MAX, "%s/mysql-test-run.log", mysql_test_dir);
  if ((log_fd = fopen(temp, "w+")) == NULL)
  {
    log_errno("Unable to create log file.");
  }
1141

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1142 1143 1144 1145
  // prepare skip test list
  while((p = strchr(skip_test, ',')) != NULL) *p = ' ';
  strcpy(temp, strlwr(skip_test));
  snprintf(skip_test, PATH_MAX, " %s ", temp);
1146 1147 1148 1149

  snprintf(mysqlbinlog_load,PATH_MAX*2,"%s/mysqlbinlog --no-defaults --local-load=%s",bin_dir,mysql_tmp_dir);
  snprintf(mysqldump_load,PATH_MAX*2,"%s/mysqldump --no-defaults -uroot --port=%d",bin_dir,master_port);
  // environment
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1150
  setenv("MYSQL_TEST_DIR", mysql_test_dir, 1);
1151 1152 1153
  setenv("MYSQL_DUMP", mysqldump_load, 1);
  setenv("MYSQL_BINLOG", mysqlbinlog_load, 1);
  setenv("MASTER_MYPORT", "9306", 1);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1154 1155 1156 1157 1158 1159 1160 1161 1162
}

/******************************************************************************

  main()
  
******************************************************************************/
int main(int argc, char **argv)
{
monty@mysql.com's avatar
monty@mysql.com committed
1163
  int is_ignore_list = 0;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1164 1165 1166
  // setup
  setup(argv[0]);
  
monty@mysql.com's avatar
monty@mysql.com committed
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
  /* The --ignore option is comma saperated list of test cases to skip and should 
   * be very first command line option to the test suite. 
   * The usage is now:
   * mysql_test_run --ignore=test1,test2 test3 test4
   * where test1 and test2 are test cases to ignore
   * and test3 and test4 are test cases to run. */
  if( argc >= 2 && !strnicmp(argv[1], "--ignore=", sizeof("--ignore=")-1) )
  {
    char *temp, *token;
    temp=strdup(strchr(argv[1],'=') + 1);
    for(token=strtok(temp, ","); token != NULL; token=strtok(NULL, ","))
    {
      if( strlen(ignore_test) + strlen(token) + 2 <= PATH_MAX-1 )
        sprintf( ignore_test+strlen(ignore_test), " %s ", token);
      else
      {
        free(temp);
        die("ignore list too long.");
      }
    }
    free(temp);
    is_ignore_list = 1;
  }
1190
  // header
1191
  mtr_log("MySQL Server %s, for %s (%s)\n\n", VERSION, SYSTEM_TYPE, MACHINE_TYPE);
1192
  
1193
  mtr_log("Initializing Tests...\n");
1194 1195 1196 1197
  
  // install test databases
  mysql_install_db();
  
1198
  mtr_log("Starting Tests...\n");
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1199
  
1200 1201 1202
  mtr_log("\n");
  mtr_log(HEADER);
  mtr_log(DASH);
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1203

monty@mysql.com's avatar
monty@mysql.com committed
1204
  if ( argc > 1 + is_ignore_list )
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1205 1206 1207 1208
  {
    int i;

    // single test
1209
    single_test = TRUE;
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1210

monty@mysql.com's avatar
monty@mysql.com committed
1211
    for (i = 1 + is_ignore_list; i < argc; i++)
gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
    {
      // run given test
      run_test(argv[i]);
    }
  }
  else
  {
    // run all tests
    DIR *dir = opendir(test_dir);
    DIR *entry;
    char test[NAME_MAX];
    char *p;
    
    // single test
    single_test = FALSE;    

    if (dir == NULL)
    {
      die("Unable to open tests directory.");
    }
    
    while((entry = readdir(dir)) != NULL)
    {
      if (!S_ISDIR(entry->d_type))
      {
        strcpy(test, strlwr(entry->d_name));
        
        // find the test suffix
        if ((p = strindex(test, TEST_SUFFIX)) != NULL)
        {
          // null terminate at the suffix
          *p = '\0';

          // run test
          run_test(test);
        }
      }
    }
    
    closedir(dir);
  }

  // stop server
  mysql_stop();

1257 1258
  mtr_log(DASH);
  mtr_log("\n");
1259

1260
  mtr_log("Ending Tests...\n");
1261

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1262 1263
  // report stats
  report_stats();
1264

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1265 1266
  // close log
  if (log_fd) fclose(log_fd);
1267

gweir@work.mysql.com's avatar
gweir@work.mysql.com committed
1268 1269 1270 1271 1272
  // keep results up
  pressanykey();

  return 0;
}