mysql_test_run_new.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:49k
源码类别:
MySQL数据库
开发平台:
Visual C++
- /*
- 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,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- 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
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #ifndef __WIN__
- #include <dirent.h>
- #endif
- #include <string.h>
- #ifdef __NETWARE__
- #include <screen.h>
- #include <nks/vm.h>
- #endif
- #include <ctype.h>
- #include <sys/stat.h>
- #ifndef __WIN__
- #include <unistd.h>
- #endif
- #include <fcntl.h>
- #ifdef __NETWARE__
- #include <sys/mode.h>
- #endif
- #ifdef __WIN__
- #include <windows.h>
- #include <shlwapi.h>
- #include <direct.h>
- #endif
- #include "my_manage.h"
- /******************************************************************************
- macros
- ******************************************************************************/
- #define HEADER "TEST 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"
- const char *TEST_PASS= "[ pass ]";
- const char *TEST_SKIP= "[ skip ]";
- const char *TEST_FAIL= "[ fail ]";
- const char *TEST_BAD= "[ bad ]";
- const char *TEST_IGNORE= "[ignore]";
- /******************************************************************************
- global variables
- ******************************************************************************/
- #ifdef __NETWARE__
- static char base_dir[FN_REFLEN]= "sys:/mysql";
- #else
- static char base_dir[FN_REFLEN]= "..";
- #endif
- static char db[FN_LEN]= "test";
- static char user[FN_LEN]= "root";
- static char password[FN_LEN]= "";
- int master_port= 9306;
- int slave_port= 9307;
- #if !defined(__NETWARE__) && !defined(__WIN__)
- static char master_socket[FN_REFLEN]= "./var/tmp/master.sock";
- static char slave_socket[FN_REFLEN]= "./var/tmp/slave.sock";
- #endif
- #define MAX_COUNT_TESTES 1024
- #ifdef __WIN__
- # define sting_compare_func _stricmp
- #else
- # ifdef HAVE_STRCASECMP
- # define sting_compare_func strcasecmp
- # else
- # define sting_compare_func strcmp
- # endif
- #endif
- /* comma delimited list of tests to skip or empty string */
- #ifndef __WIN__
- static char skip_test[FN_REFLEN]= " lowercase_table3 , system_mysql_db_fix ";
- #else
- /*
- The most ignore testes contain the calls of system command
- lowercase_table3 is disabled by Gerg
- system_mysql_db_fix is disabled by Gerg
- sp contains a command system
- rpl_EE_error contains a command system
- rpl_loaddatalocal contains a command system
- ndb_autodiscover contains a command system
- rpl_rotate_logs contains a command system
- repair contains a command system
- rpl_trunc_binlog contains a command system
- mysqldump contains a command system
- rpl000001 makes non-exit loop...temporary skiped
- */
- static char skip_test[FN_REFLEN]=
- " lowercase_table3 ,"
- " system_mysql_db_fix ,"
- " sp ,"
- " rpl_EE_error ,"
- " rpl_loaddatalocal ,"
- " ndb_autodiscover ,"
- " rpl_rotate_logs ,"
- " repair ,"
- " rpl_trunc_binlog ,"
- " mysqldump ,"
- " rpl000001 ,"
- " derived ,"
- " group_by ,"
- " select ,"
- " rpl000015 ,"
- " subselect ";
- #endif
- static char ignore_test[FN_REFLEN]= "";
- static char bin_dir[FN_REFLEN];
- static char mysql_test_dir[FN_REFLEN];
- static char test_dir[FN_REFLEN];
- static char mysql_tmp_dir[FN_REFLEN];
- static char result_dir[FN_REFLEN];
- static char master_dir[FN_REFLEN];
- static char slave_dir[FN_REFLEN];
- static char slave1_dir[FN_REFLEN];
- static char slave2_dir[FN_REFLEN];
- static char lang_dir[FN_REFLEN];
- static char char_dir[FN_REFLEN];
- static char mysqladmin_file[FN_REFLEN];
- static char mysqld_file[FN_REFLEN];
- static char mysqltest_file[FN_REFLEN];
- #ifndef __WIN__
- static char master_pid[FN_REFLEN];
- static char slave_pid[FN_REFLEN];
- static char sh_file[FN_REFLEN]= "/bin/sh";
- #else
- static HANDLE master_pid;
- static HANDLE slave_pid;
- #endif
- static char master_opt[FN_REFLEN]= "";
- static char slave_opt[FN_REFLEN]= "";
- static char slave_master_info[FN_REFLEN]= "";
- static char master_init_script[FN_REFLEN]= "";
- static char slave_init_script[FN_REFLEN]= "";
- /* OpenSSL */
- static char ca_cert[FN_REFLEN];
- static char server_cert[FN_REFLEN];
- static char server_key[FN_REFLEN];
- static char client_cert[FN_REFLEN];
- static char client_key[FN_REFLEN];
- int total_skip= 0;
- int total_pass= 0;
- int total_fail= 0;
- int total_test= 0;
- int total_ignore= 0;
- int use_openssl= FALSE;
- int master_running= FALSE;
- int slave_running= FALSE;
- int skip_slave= TRUE;
- int single_test= TRUE;
- int restarts= 0;
- FILE *log_fd= NULL;
- static char argument[FN_REFLEN];
- /******************************************************************************
- 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(const char *, va_list);
- void mlog(const char *, ...);
- void log_info(const char *, ...);
- void log_error(const char *, ...);
- void log_errno(const char *, ...);
- void die(const char *);
- char *str_tok(char* dest, char *string, const char *delim);
- #ifndef __WIN__
- void run_init_script(const char *script_name);
- #endif
- /******************************************************************************
- report_stats()
- Report the gathered statistics.
- ******************************************************************************/
- void report_stats()
- {
- if (total_fail == 0)
- {
- mlog("nAll %d test(s) were successful.n", total_test);
- }
- else
- {
- double percent= ((double)total_pass / total_test) * 100;
- mlog("nFailed %u/%u test(s), %.02f%% successful.n",
- total_fail, total_test, percent);
- mlog("nThe .out and .err files in %s may give you somen", result_dir);
- mlog("hint of what when wrong.n");
- mlog("nIf you want to report this error, please first read "
- "the documentationn");
- mlog("at: http://www.mysql.com/doc/M/y/MySQL_test_suite.htmln");
- }
- }
- /******************************************************************************
- install_db()
- Install the a database.
- ******************************************************************************/
- void install_db(char *datadir)
- {
- arg_list_t al;
- int err;
- char input[FN_REFLEN];
- char output[FN_REFLEN];
- char error[FN_REFLEN];
- /* input file */
- #ifdef __NETWARE__
- snprintf(input, FN_REFLEN, "%s/bin/init_db.sql", base_dir);
- #else
- snprintf(input, FN_REFLEN, "%s/mysql-test/init_db.sql", base_dir);
- #endif
- snprintf(output, FN_REFLEN, "%s/install.out", datadir);
- snprintf(error, FN_REFLEN, "%s/install.err", datadir);
- if (create_system_files(datadir,input, TRUE))
- die("Unable to create init_db.sql.");
- /* args */
- init_args(&al);
- add_arg(&al, mysqld_file);
- add_arg(&al, "--no-defaults");
- 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-ndbcluster");
- add_arg(&al, "--skip-bdb");
- #ifndef __NETWARE__
- add_arg(&al, "--character-sets-dir=%s", char_dir);
- add_arg(&al, "--language=%s", lang_dir);
- #endif
- // added
- add_arg(&al, "--default-character-set=latin1");
- add_arg(&al, "--innodb_data_file_path=ibdata1:50M");
- /* spawn */
- if ((err= spawn(mysqld_file, &al, TRUE, input, output, error, NULL)) != 0)
- {
- die("Unable to create database.");
- }
- /* free args */
- free_args(&al);
- }
- /******************************************************************************
- mysql_install_db()
- Install the test databases.
- ******************************************************************************/
- void mysql_install_db()
- {
- char temp[FN_REFLEN];
- /* var directory */
- snprintf(temp, FN_REFLEN, "%s/var", mysql_test_dir);
- /* create var directory */
- #ifndef __WIN__
- mkdir(temp, S_IRWXU);
- /* create subdirectories */
- mlog("Creating test-suite folders...n");
- snprintf(temp, FN_REFLEN, "%s/var/run", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/master-data/mysql", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/master-data/test", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave-data/mysql", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave-data/test", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave1-data", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave1-data/mysql", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave1-data/test", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave2-data", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave2-data/mysql", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- snprintf(temp, FN_REFLEN, "%s/var/slave2-data/test", mysql_test_dir);
- mkdir(temp, S_IRWXU);
- #else
- mkdir(temp);
- /* create subdirectories */
- mlog("Creating test-suite folders...n");
- snprintf(temp, FN_REFLEN, "%s/var/run", mysql_test_dir);
- mkdir(temp);
- snprintf(temp, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
- mkdir(temp);
- snprintf(temp, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
- mkdir(temp);
- snprintf(temp, FN_REFLEN, "%s/var/master-data/mysql", mysql_test_dir);
- mkdir(temp);
- snprintf(temp, FN_REFLEN, "%s/var/master-data/test", mysql_test_dir);
- mkdir(temp);
- snprintf(temp, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
- mkdir(temp);
- snprintf(temp, FN_REFLEN, "%s/var/slave-data/mysql", mysql_test_dir);
- mkdir(temp);
- snprintf(temp, FN_REFLEN, "%s/var/slave-data/test", mysql_test_dir);
- mkdir(temp);
- #endif
- /* install databases */
- mlog("Creating test databases for master... n");
- install_db(master_dir);
- mlog("Creating test databases for slave... n");
- install_db(slave_dir);
- install_db(slave1_dir);
- install_db(slave2_dir);
- }
- /******************************************************************************
- start_master()
- Start the master server.
- ******************************************************************************/
- void start_master()
- {
- arg_list_t al;
- int err;
- char master_out[FN_REFLEN];
- char master_err[FN_REFLEN];
- char temp2[FN_REFLEN];
- /* remove old berkeley db log files that can confuse the server */
- removef("%s/log.*", master_dir);
- /* remove stale binary logs */
- removef("%s/var/log/*-bin.*", mysql_test_dir);
- /* remove stale binary logs */
- removef("%s/var/log/*.index", mysql_test_dir);
- /* 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);
- /* init script */
- if (master_init_script[0] != 0)
- {
- #ifdef __NETWARE__
- /* TODO: use the scripts */
- if (strinstr(master_init_script, "repair_part2-master.sh") != 0)
- {
- FILE *fp;
- /* create an empty index file */
- snprintf(temp, FN_REFLEN, "%s/test/t1.MYI", master_dir);
- fp= fopen(temp, "wb+");
- fputs("1", fp);
- fclose(fp);
- }
- #elif !defined(__WIN__)
- run_init_script(master_init_script);
- #endif
- }
- /* redirection files */
- snprintf(master_out, FN_REFLEN, "%s/var/run/master%u.out",
- mysql_test_dir, restarts);
- snprintf(master_err, FN_REFLEN, "%s/var/run/master%u.err",
- mysql_test_dir, restarts);
- #ifndef __WIN__
- snprintf(temp2,FN_REFLEN,"%s/var",mysql_test_dir);
- mkdir(temp2,S_IRWXU);
- snprintf(temp2,FN_REFLEN,"%s/var/log",mysql_test_dir);
- mkdir(temp2,S_IRWXU);
- #else
- snprintf(temp2,FN_REFLEN,"%s/var",mysql_test_dir);
- mkdir(temp2);
- snprintf(temp2,FN_REFLEN,"%s/var/log",mysql_test_dir);
- mkdir(temp2);
- #endif
- /* args */
- init_args(&al);
- add_arg(&al, "%s", mysqld_file);
- add_arg(&al, "--no-defaults");
- add_arg(&al, "--log-bin=%s/var/log/master-bin",mysql_test_dir);
- add_arg(&al, "--server-id=1");
- add_arg(&al, "--basedir=%s", base_dir);
- add_arg(&al, "--port=%u", master_port);
- #if !defined(__NETWARE__) && !defined(__WIN__)
- add_arg(&al, "--socket=%s",master_socket);
- #endif
- add_arg(&al, "--local-infile");
- add_arg(&al, "--core");
- add_arg(&al, "--datadir=%s", master_dir);
- #ifndef __WIN__
- add_arg(&al, "--pid-file=%s", master_pid);
- #endif
- add_arg(&al, "--character-sets-dir=%s", char_dir);
- add_arg(&al, "--tmpdir=%s", mysql_tmp_dir);
- add_arg(&al, "--language=%s", lang_dir);
- add_arg(&al, "--rpl-recovery-rank=1");
- add_arg(&al, "--init-rpl-role=master");
- add_arg(&al, "--default-character-set=latin1");
- // add_arg(&al, "--innodb_data_file_path=ibdata1:50M");
- #ifdef DEBUG /* only for debug builds */
- add_arg(&al, "--debug");
- #endif
- 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);
- }
- /* $MASTER_40_ARGS */
- add_arg(&al, "--rpl-recovery-rank=1");
- add_arg(&al, "--init-rpl-role=master");
- /* $SMALL_SERVER */
- 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");
- /* $EXTRA_MASTER_OPT */
- if (master_opt[0] != 0)
- {
- char *p;
- p= (char *)str_tok(argument, master_opt, " t");
- if (!strstr(master_opt, "timezone"))
- {
- while (p)
- {
- add_arg(&al, "%s", p);
- p= (char *)str_tok(argument, NULL, " t");
- }
- }
- }
- /* remove the pid file if it exists */
- #ifndef __WIN__
- remove(master_pid);
- #endif
- /* spawn */
- #ifdef __WIN__
- if ((err= spawn(mysqld_file, &al, FALSE, NULL,
- master_out, master_err, &master_pid)) == 0)
- #else
- if ((err= spawn(mysqld_file, &al, FALSE, NULL,
- master_out, master_err, master_pid)) == 0)
- #endif
- {
- sleep_until_file_exists(master_pid);
- if ((err= wait_for_server_start(bin_dir, mysqladmin_file, user, password,
- master_port, mysql_tmp_dir)) == 0)
- {
- master_running= TRUE;
- }
- else
- {
- log_error("The master server went down early.");
- }
- }
- else
- {
- log_error("Unable to start master server.");
- }
- /* free_args */
- free_args(&al);
- }
- /******************************************************************************
- start_slave()
- Start the slave server.
- ******************************************************************************/
- void start_slave()
- {
- arg_list_t al;
- int err;
- char slave_out[FN_REFLEN];
- char slave_err[FN_REFLEN];
- /* 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] != 0)
- {
- #ifdef __NETWARE__
- /* TODO: use the scripts */
- if (strinstr(slave_init_script, "rpl000016-slave.sh") != 0)
- {
- /* create empty master.info file */
- snprintf(temp, FN_REFLEN, "%s/master.info", slave_dir);
- close(open(temp, O_WRONLY | O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO));
- }
- else if (strinstr(slave_init_script, "rpl000017-slave.sh") != 0)
- {
- FILE *fp;
- /* create a master.info file */
- snprintf(temp, FN_REFLEN, "%s/master.info", slave_dir);
- fp= fopen(temp, "wb+");
- fputs("master-bin.000001n", fp);
- fputs("4n", fp);
- fputs("127.0.0.1n", fp);
- fputs("replicaten", fp);
- fputs("aaaaaaaaaaaaaaabn", fp);
- fputs("9306n", fp);
- fputs("1n", fp);
- fputs("0n", fp);
- fclose(fp);
- }
- else if (strinstr(slave_init_script, "rpl_rotate_logs-slave.sh") != 0)
- {
- /* create empty master.info file */
- snprintf(temp, FN_REFLEN, "%s/master.info", slave_dir);
- close(open(temp, O_WRONLY | O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO));
- }
- #elif !defined(__WIN__)
- run_init_script(slave_init_script);
- #endif
- }
- /* redirection files */
- snprintf(slave_out, FN_REFLEN, "%s/var/run/slave%u.out",
- mysql_test_dir, restarts);
- snprintf(slave_err, FN_REFLEN, "%s/var/run/slave%u.err",
- mysql_test_dir, restarts);
- /* args */
- 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);
- #if !defined(__NETWARE__) && !defined(__WIN__)
- add_arg(&al, "--socket=%s",slave_socket);
- #endif
- add_arg(&al, "--port=%u", slave_port);
- add_arg(&al, "--datadir=%s", slave_dir);
- #ifndef __WIN__
- add_arg(&al, "--pid-file=%s", slave_pid);
- #endif
- 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);
- 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");
- add_arg(&al, "--log-slave-updates");
- add_arg(&al, "--log=%s/var/log/slave.log", mysql_test_dir);
- add_arg(&al, "--default-character-set=latin1");
- add_arg(&al, "--skip-ndbcluster");
- #ifdef DEBUG /* only for debug builds */
- add_arg(&al, "--debug");
- #endif
- 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);
- }
- /* slave master info */
- if (slave_master_info[0] != 0)
- {
- char *p;
- p= (char *)str_tok(argument, slave_master_info, " t");
- while (p)
- {
- add_arg(&al, "%s", p);
- p= (char *)str_tok(argument, NULL, " t");
- }
- }
- else
- {
- 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");
- }
- /* small server */
- 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");
- /* opt args */
- if (slave_opt[0] != 0)
- {
- char *p;
- p= (char *)str_tok(argument, slave_opt, " t");
- while (p)
- {
- add_arg(&al, "%s", p);
- p= (char *)str_tok(argument, NULL, " t");
- }
- }
- /* remove the pid file if it exists */
- #ifndef __WIN__
- remove(slave_pid);
- #endif
- /* spawn */
- #ifdef __WIN__
- if ((err= spawn(mysqld_file, &al, FALSE, NULL,
- slave_out, slave_err, &slave_pid)) == 0)
- #else
- if ((err= spawn(mysqld_file, &al, FALSE, NULL,
- slave_out, slave_err, slave_pid)) == 0)
- #endif
- {
- sleep_until_file_exists(slave_pid);
- if ((err= wait_for_server_start(bin_dir, mysqladmin_file, user, password,
- slave_port, mysql_tmp_dir)) == 0)
- {
- slave_running= TRUE;
- }
- else
- {
- log_error("The slave server went down early.");
- }
- }
- else
- {
- log_error("Unable to start slave server.");
- }
- /* free args */
- free_args(&al);
- }
- /******************************************************************************
- mysql_start()
- Start the mysql servers.
- ******************************************************************************/
- void mysql_start()
- {
- printf("loading master...r");
- start_master();
- printf("loading slave...r");
- start_slave();
- /* activate the test screen */
- #ifdef __NETWARE__
- ActivateScreen(getscreenhandle());
- #endif
- }
- /******************************************************************************
- stop_slave()
- Stop the slave server.
- ******************************************************************************/
- void stop_slave()
- {
- int err;
- /* running? */
- if (!slave_running) return;
- /* stop */
- if ((err= stop_server(bin_dir, mysqladmin_file, user, password,
- slave_port, slave_pid, mysql_tmp_dir)) == 0)
- {
- slave_running= FALSE;
- }
- else
- {
- log_error("Unable to stop slave server.");
- }
- }
- /******************************************************************************
- stop_master()
- Stop the master server.
- ******************************************************************************/
- void stop_master()
- {
- int err;
- /* running? */
- if (!master_running) return;
- if ((err= stop_server(bin_dir, mysqladmin_file, user, password,
- master_port, master_pid, mysql_tmp_dir)) == 0)
- {
- master_running= FALSE;
- }
- else
- {
- log_error("Unable to stop master server.");
- }
- }
- /******************************************************************************
- mysql_stop()
- Stop the mysql servers.
- ******************************************************************************/
- void mysql_stop()
- {
- stop_master();
- stop_slave();
- /* activate the test screen */
- #ifdef __NETWARE__
- ActivateScreen(getscreenhandle());
- #endif
- }
- /******************************************************************************
- mysql_restart()
- Restart the mysql servers.
- ******************************************************************************/
- void mysql_restart()
- {
- /* log_info("Restarting the MySQL server(s): %u", ++restarts); */
- mysql_stop();
- mlog(DASH);
- sleep(1);
- mysql_start();
- }
- /******************************************************************************
- read_option()
- Read the option file.
- ******************************************************************************/
- int read_option(char *opt_file, char *opt)
- {
- int fd, err;
- char *p;
- char buf[FN_REFLEN];
- /* copy current option */
- strncpy(buf, opt, FN_REFLEN);
- /* open options file */
- fd= open(opt_file, O_RDONLY);
- err= read(fd, opt, FN_REFLEN);
- close(fd);
- if (err > 0)
- {
- /* terminate string */
- if ((p= strchr(opt, 'n')) != NULL)
- {
- *p= 0;
- /* check for a 'r' */
- if ((p= strchr(opt, 'r')) != NULL)
- {
- *p= 0;
- }
- }
- else
- {
- opt[err]= 0;
- }
- /* check for $MYSQL_TEST_DIR */
- if ((p= strstr(opt, "$MYSQL_TEST_DIR")) != NULL)
- {
- char temp[FN_REFLEN];
- *p= 0;
- strcpy(temp, p + strlen("$MYSQL_TEST_DIR"));
- strcat(opt, mysql_test_dir);
- strcat(opt, temp);
- }
- /* Check for double backslash and replace it with single bakslash */
- if ((p= strstr(opt, "\\")) != NULL)
- {
- /* bmove is guranteed to work byte by byte */
- bmove(p, p+1, strlen(p)+1);
- }
- }
- else
- {
- /* clear option */
- *opt= 0;
- }
- /* compare current option with previous */
- return strcmp(opt, buf);
- }
- /******************************************************************************
- run_test()
- Run the given test case.
- ******************************************************************************/
- void run_test(char *test)
- {
- char temp[FN_REFLEN];
- const char *rstr;
- int skip= FALSE, ignore=FALSE;
- int restart= FALSE;
- int flag= FALSE;
- struct stat info;
- /* skip tests in the skip list */
- snprintf(temp, FN_REFLEN, " %s ", test);
- skip= (strinstr(skip_test, temp) != 0);
- if (skip == FALSE)
- ignore= (strinstr(ignore_test, temp) != 0);
- snprintf(master_init_script, FN_REFLEN, "%s/%s-master.sh", test_dir, test);
- snprintf(slave_init_script, FN_REFLEN, "%s/%s-slave.sh", test_dir, test);
- #ifdef __WIN__
- if (! stat(master_init_script, &info))
- skip= TRUE;
- if (!stat(slave_init_script, &info))
- skip= TRUE;
- #endif
- if (ignore)
- {
- /* show test */
- mlog("%-46s ", test);
- /* ignore */
- rstr= TEST_IGNORE;
- ++total_ignore;
- }
- else if (!skip) /* skip test? */
- {
- char test_file[FN_REFLEN];
- char master_opt_file[FN_REFLEN];
- char slave_opt_file[FN_REFLEN];
- char slave_master_info_file[FN_REFLEN];
- char result_file[FN_REFLEN];
- char reject_file[FN_REFLEN];
- char out_file[FN_REFLEN];
- char err_file[FN_REFLEN];
- int err;
- arg_list_t al;
- /* skip slave? */
- flag= skip_slave;
- skip_slave= (strncmp(test, "rpl", 3) != 0);
- if (flag != skip_slave) restart= TRUE;
- /* create files */
- snprintf(master_opt_file, FN_REFLEN, "%s/%s-master.opt", test_dir, test);
- snprintf(slave_opt_file, FN_REFLEN, "%s/%s-slave.opt", test_dir, test);
- snprintf(slave_master_info_file, FN_REFLEN, "%s/%s.slave-mi",
- test_dir, test);
- snprintf(reject_file, FN_REFLEN, "%s/%s%s",
- result_dir, test, REJECT_SUFFIX);
- snprintf(out_file, FN_REFLEN, "%s/%s%s", result_dir, test, OUT_SUFFIX);
- snprintf(err_file, FN_REFLEN, "%s/%s%s", result_dir, test, ERR_SUFFIX);
- /* netware specific files */
- snprintf(test_file, FN_REFLEN, "%s/%s%s", test_dir, test, NW_TEST_SUFFIX);
- if (stat(test_file, &info))
- {
- snprintf(test_file, FN_REFLEN, "%s/%s%s", test_dir, test, TEST_SUFFIX);
- if (access(test_file,0))
- {
- printf("Invalid test name %s, %s file not foundn",test,test_file);
- return;
- }
- }
- snprintf(result_file, FN_REFLEN, "%s/%s%s",
- result_dir, test, NW_RESULT_SUFFIX);
- if (stat(result_file, &info))
- {
- snprintf(result_file, FN_REFLEN, "%s/%s%s",
- result_dir, test, RESULT_SUFFIX);
- }
- /* init scripts */
- if (stat(master_init_script, &info))
- master_init_script[0]= 0;
- else
- restart= TRUE;
- if (stat(slave_init_script, &info))
- slave_init_script[0]= 0;
- 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();
- /* show test */
- mlog("%-46s ", test);
- /* args */
- init_args(&al);
- add_arg(&al, "%s", mysqltest_file);
- add_arg(&al, "--no-defaults");
- add_arg(&al, "--port=%u", master_port);
- #if !defined(__NETWARE__) && !defined(__WIN__)
- add_arg(&al, "--socket=%s", master_socket);
- add_arg(&al, "--tmpdir=%s", mysql_tmp_dir);
- #endif
- 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, "--skip-safemalloc");
- add_arg(&al, "-v");
- add_arg(&al, "-R");
- add_arg(&al, "%s", result_file);
- 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);
- }
- /* spawn */
- err= spawn(mysqltest_file, &al, TRUE, test_file, out_file, err_file, NULL);
- /* free args */
- free_args(&al);
- remove_empty_file(out_file);
- remove_empty_file(err_file);
- 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 */
- mlog("%-46s ", test);
- /* skip */
- rstr= TEST_SKIP;
- ++total_skip;
- }
- /* result */
- mlog("%-14sn", rstr);
- }
- /******************************************************************************
- vlog()
- Log the message.
- ******************************************************************************/
- void vlog(const 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.
- ******************************************************************************/
- void mlog(const char *format, ...)
- {
- va_list ap;
- va_start(ap, format);
- vlog(format, ap);
- va_end(ap);
- }
- /******************************************************************************
- log_info()
- Log the given information.
- ******************************************************************************/
- void log_info(const char *format, ...)
- {
- va_list ap;
- va_start(ap, format);
- mlog("-- INFO : ");
- vlog(format, ap);
- mlog("n");
- va_end(ap);
- }
- /******************************************************************************
- log_error()
- Log the given error.
- ******************************************************************************/
- void log_error(const char *format, ...)
- {
- va_list ap;
- va_start(ap, format);
- mlog("-- ERROR: ");
- vlog(format, ap);
- mlog("n");
- va_end(ap);
- }
- /******************************************************************************
- log_errno()
- Log the given error and errno.
- ******************************************************************************/
- void log_errno(const char *format, ...)
- {
- va_list ap;
- va_start(ap, format);
- mlog("-- ERROR: (%003u) ", errno);
- vlog(format, ap);
- mlog("n");
- va_end(ap);
- }
- /******************************************************************************
- die()
- Exit the application.
- ******************************************************************************/
- void die(const char *msg)
- {
- log_error(msg);
- #ifdef __NETWARE__
- pressanykey();
- #endif
- exit(-1);
- }
- /******************************************************************************
- setup()
- Setup the mysql test enviornment.
- ******************************************************************************/
- void setup(char *file __attribute__((unused)))
- {
- char temp[FN_REFLEN];
- #if defined(__WIN__) || defined(__NETWARE__)
- char file_path[FN_REFLEN*2];
- #endif
- char *p;
- int position;
- /* set the timezone for the timestamp test */
- #ifdef __WIN__
- _putenv( "TZ=GMT-3" );
- #else
- putenv((char *)"TZ=GMT-3");
- #endif
- /* find base dir */
- #ifdef __NETWARE__
- strcpy(temp, strlwr(file));
- while ((p= strchr(temp, '\')) != NULL) *p= '/';
- #else
- getcwd(temp, FN_REFLEN);
- position= strlen(temp);
- temp[position]= '/';
- temp[position+1]= 0;
- #ifdef __WIN__
- while ((p= strchr(temp, '\')) != NULL) *p= '/';
- #endif
- #endif
- if ((position= strinstr(temp, "/mysql-test/")) != 0)
- {
- p= temp + position - 1;
- *p= 0;
- strcpy(base_dir, temp);
- }
- log_info("Currect directory: %s",base_dir);
- #ifdef __NETWARE__
- /* setup paths */
- snprintf(bin_dir, FN_REFLEN, "%s/bin", base_dir);
- snprintf(mysql_test_dir, FN_REFLEN, "%s/mysql-test", base_dir);
- snprintf(test_dir, FN_REFLEN, "%s/t", mysql_test_dir);
- snprintf(mysql_tmp_dir, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
- snprintf(result_dir, FN_REFLEN, "%s/r", mysql_test_dir);
- snprintf(master_dir, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
- snprintf(slave_dir, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
- snprintf(lang_dir, FN_REFLEN, "%s/share/english", base_dir);
- snprintf(char_dir, FN_REFLEN, "%s/share/charsets", base_dir);
- #ifdef HAVE_OPENSSL
- use_openssl= TRUE;
- #endif /* HAVE_OPENSSL */
- /* OpenSSL paths */
- snprintf(ca_cert, FN_REFLEN, "%s/SSL/cacert.pem", base_dir);
- snprintf(server_cert, FN_REFLEN, "%s/SSL/server-cert.pem", base_dir);
- snprintf(server_key, FN_REFLEN, "%s/SSL/server-key.pem", base_dir);
- snprintf(client_cert, FN_REFLEN, "%s/SSL/client-cert.pem", base_dir);
- snprintf(client_key, FN_REFLEN, "%s/SSL/client-key.pem", base_dir);
- /* setup files */
- snprintf(mysqld_file, FN_REFLEN, "%s/mysqld", bin_dir);
- snprintf(mysqltest_file, FN_REFLEN, "%s/mysqltest", bin_dir);
- snprintf(mysqladmin_file, FN_REFLEN, "%s/mysqladmin", bin_dir);
- snprintf(master_pid, FN_REFLEN, "%s/var/run/master.pid", mysql_test_dir);
- snprintf(slave_pid, FN_REFLEN, "%s/var/run/slave.pid", mysql_test_dir);
- #elif __WIN__
- /* setup paths */
- #ifdef _DEBUG
- snprintf(bin_dir, FN_REFLEN, "%s/client_debug", base_dir);
- #else
- snprintf(bin_dir, FN_REFLEN, "%s/client_release", base_dir);
- #endif
- snprintf(mysql_test_dir, FN_REFLEN, "%s/mysql-test", base_dir);
- snprintf(test_dir, FN_REFLEN, "%s/t", mysql_test_dir);
- snprintf(mysql_tmp_dir, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
- snprintf(result_dir, FN_REFLEN, "%s/r", mysql_test_dir);
- snprintf(master_dir, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
- snprintf(slave_dir, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
- snprintf(lang_dir, FN_REFLEN, "%s/share/english", base_dir);
- snprintf(char_dir, FN_REFLEN, "%s/share/charsets", base_dir);
- #ifdef HAVE_OPENSSL
- use_openssl= TRUE;
- #endif /* HAVE_OPENSSL */
- /* OpenSSL paths */
- snprintf(ca_cert, FN_REFLEN, "%s/SSL/cacert.pem", base_dir);
- snprintf(server_cert, FN_REFLEN, "%s/SSL/server-cert.pem", base_dir);
- snprintf(server_key, FN_REFLEN, "%s/SSL/server-key.pem", base_dir);
- snprintf(client_cert, FN_REFLEN, "%s/SSL/client-cert.pem", base_dir);
- snprintf(client_key, FN_REFLEN, "%s/SSL/client-key.pem", base_dir);
- /* setup files */
- #ifdef _DEBUG
- snprintf(mysqld_file, FN_REFLEN, "%s/mysqld-debug.exe", bin_dir);
- #else
- snprintf(mysqld_file, FN_REFLEN, "%s/mysqld.exe", bin_dir);
- #endif
- snprintf(mysqltest_file, FN_REFLEN, "%s/mysqltest.exe", bin_dir);
- snprintf(mysqladmin_file, FN_REFLEN, "%s/mysqladmin.exe", bin_dir);
- #else
- /* setup paths */
- snprintf(bin_dir, FN_REFLEN, "%s/client", base_dir);
- snprintf(mysql_test_dir, FN_REFLEN, "%s/mysql-test", base_dir);
- snprintf(test_dir, FN_REFLEN, "%s/t", mysql_test_dir);
- snprintf(mysql_tmp_dir, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
- snprintf(result_dir, FN_REFLEN, "%s/r", mysql_test_dir);
- snprintf(master_dir, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
- snprintf(slave_dir, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
- snprintf(slave1_dir, FN_REFLEN, "%s/var/slave1-data", mysql_test_dir);
- snprintf(slave2_dir, FN_REFLEN, "%s/var/slave2-data", mysql_test_dir);
- snprintf(lang_dir, FN_REFLEN, "%s/sql/share/english", base_dir);
- snprintf(char_dir, FN_REFLEN, "%s/sql/share/charsets", base_dir);
- #ifdef HAVE_OPENSSL
- use_openssl= TRUE;
- #endif /* HAVE_OPENSSL */
- /* OpenSSL paths */
- snprintf(ca_cert, FN_REFLEN, "%s/SSL/cacert.pem", base_dir);
- snprintf(server_cert, FN_REFLEN, "%s/SSL/server-cert.pem", base_dir);
- snprintf(server_key, FN_REFLEN, "%s/SSL/server-key.pem", base_dir);
- snprintf(client_cert, FN_REFLEN, "%s/SSL/client-cert.pem", base_dir);
- snprintf(client_key, FN_REFLEN, "%s/SSL/client-key.pem", base_dir);
- /* setup files */
- snprintf(mysqld_file, FN_REFLEN, "%s/sql/mysqld", base_dir);
- snprintf(mysqltest_file, FN_REFLEN, "%s/mysqltest", bin_dir);
- snprintf(mysqladmin_file, FN_REFLEN, "%s/mysqladmin", bin_dir);
- snprintf(master_pid, FN_REFLEN, "%s/var/run/master.pid", mysql_test_dir);
- snprintf(slave_pid, FN_REFLEN, "%s/var/run/slave.pid", mysql_test_dir);
- snprintf(master_socket,FN_REFLEN, "%s/var/tmp/master.sock", mysql_test_dir);
- snprintf(slave_socket,FN_REFLEN, "%s/var/tmp/slave.sock", mysql_test_dir);
- #endif
- /* create log file */
- snprintf(temp, FN_REFLEN, "%s/mysql-test-run.log", mysql_test_dir);
- if ((log_fd= fopen(temp, "w+")) == NULL)
- {
- log_errno("Unable to create log file.");
- }
- /* prepare skip test list */
- while ((p= strchr(skip_test, ',')) != NULL) *p= ' ';
- strcpy(temp, strlwr(skip_test));
- snprintf(skip_test, FN_REFLEN, " %s ", temp);
- /* environment */
- #ifdef __NETWARE__
- setenv("MYSQL_TEST_DIR", mysql_test_dir, 1);
- snprintf(file_path, FN_REFLEN*2,
- "%s/client/mysqldump --no-defaults -u root --port=%u",
- bin_dir, master_port);
- setenv("MYSQL_DUMP", file_path, 1);
- snprintf(file_path, FN_REFLEN*2,
- "%s/client/mysqlbinlog --no-defaults --local-load=%s",
- bin_dir, mysql_tmp_dir);
- setenv("MYSQL_BINLOG", file_path, 1);
- #elif __WIN__
- snprintf(file_path,FN_REFLEN,"MYSQL_TEST_DIR=%s",mysql_test_dir);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "MYSQL_DUMP=%s/mysqldump.exe --no-defaults -uroot --port=%u",
- bin_dir, master_port);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "MYSQL_BINLOG=%s/mysqlbinlog.exe --no-defaults --local-load=%s",
- bin_dir, mysql_tmp_dir);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "TESTS_BINDIR=%s/tests", base_dir);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "CHARSETSDIR=%s/sql/share/charsets", base_dir);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "MYSQL=%s/mysql --port=%u ",
- bin_dir, master_port);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "MYSQL_FIX_SYSTEM_TABLES=%s/scripts/mysql_fix_privilege_tables --no-defaults "
- "--host=localhost --port=%u "
- "--basedir=%s --bindir=%s --verbose",
- base_dir,master_port, base_dir, bin_dir);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "NDB_TOOLS_DIR=%s/ndb/tools", base_dir);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "CLIENT_BINDIR=%s", bin_dir);
- _putenv(file_path);
- snprintf(file_path, FN_REFLEN*2,
- "MYSQL_CLIENT_TEST=%s/tests/mysql_client_test --no-defaults --testcase "
- "--user=root --port=%u --silent",
- base_dir, master_port);
- _putenv(file_path);
- #else
- {
- static char env_MYSQL_TEST_DIR[FN_REFLEN*2];
- static char env_MYSQL_DUMP[FN_REFLEN*2];
- static char env_MYSQL_BINLOG[FN_REFLEN*2];
- static char env_MASTER_MYSOCK[FN_REFLEN*2];
- static char env_TESTS_BINDIR[FN_REFLEN*2];
- static char env_CHARSETSDIR[FN_REFLEN*2];
- static char env_MYSQL[FN_REFLEN*2];
- static char env_MYSQL_FIX_SYSTEM_TABLES[FN_REFLEN*2];
- static char env_NDB_TOOLS_DIR[FN_REFLEN*2];
- static char env_CLIENT_BINDIR[FN_REFLEN*2];
- static char env_MYSQL_CLIENT_TEST[FN_REFLEN*2];
- snprintf(env_MYSQL_TEST_DIR,FN_REFLEN*2,
- "MYSQL_TEST_DIR=%s",mysql_test_dir);
- putenv(env_MYSQL_TEST_DIR);
- snprintf(env_MYSQL_DUMP, FN_REFLEN*2,"MYSQL_DUMP=%s/mysqldump --no-defaults "
- "-uroot --port=%u --socket=%s ",
- bin_dir, master_port, master_socket);
- putenv(env_MYSQL_DUMP);
- snprintf(env_MYSQL_BINLOG, FN_REFLEN*2,
- "MYSQL_BINLOG=%s/mysqlbinlog --no-defaults --local-load=%s -uroot ",
- bin_dir, mysql_tmp_dir);
- putenv(env_MYSQL_BINLOG);
- snprintf(env_MASTER_MYSOCK, FN_REFLEN*2,
- "MASTER_MYSOCK=%s", master_socket);
- putenv(env_MASTER_MYSOCK);
- snprintf(env_TESTS_BINDIR, FN_REFLEN*2,
- "TESTS_BINDIR=%s/tests", base_dir);
- putenv(env_TESTS_BINDIR);
- snprintf(env_CHARSETSDIR, FN_REFLEN*2,
- "CHARSETSDIR=%s/sql/share/charsets", base_dir);
- putenv(env_CHARSETSDIR);
- snprintf(env_MYSQL, FN_REFLEN*2,
- "MYSQL=%s/mysql --port=%u --socket=%s -uroot ",
- bin_dir, master_port, master_socket);
- putenv(env_MYSQL);
- snprintf(env_MYSQL_FIX_SYSTEM_TABLES, FN_REFLEN*2,
- "MYSQL_FIX_SYSTEM_TABLES=%s/scripts/mysql_fix_privilege_tables --no-defaults "
- "--host=localhost --port=%u --socket=%s "
- "--basedir=%s --bindir=%s --verbose -uroot ",
- base_dir,master_port, master_socket, base_dir, bin_dir);
- putenv(env_MYSQL_FIX_SYSTEM_TABLES);
- snprintf(env_NDB_TOOLS_DIR, FN_REFLEN*2,
- "NDB_TOOLS_DIR=%s/ndb/tools", base_dir);
- putenv(env_NDB_TOOLS_DIR);
- snprintf(env_CLIENT_BINDIR, FN_REFLEN*2,
- "CLIENT_BINDIR=%s", bin_dir);
- putenv(env_CLIENT_BINDIR);
- snprintf(env_MYSQL_CLIENT_TEST, FN_REFLEN*2,
- "MYSQL_CLIENT_TEST=%s/tests/mysql_client_test --no-defaults --testcase "
- "--user=root --socket=%s --port=%u --silent",
- base_dir, master_socket, master_port);
- putenv(env_MYSQL_CLIENT_TEST);
- }
- #endif
- #ifndef __WIN__
- putenv((char *)"MASTER_MYPORT=9306");
- putenv((char *)"SLAVE_MYPORT=9307");
- putenv((char *)"MYSQL_TCP_PORT=3306");
- #else
- _putenv("MASTER_MYPORT=9306");
- _putenv("SLAVE_MYPORT=9307");
- _putenv("MYSQL_TCP_PORT=3306");
- #endif
- }
- /*
- Compare names of testes for right order
- */
- int compare( const void *arg1, const void *arg2 )
- {
- return sting_compare_func( * ( char** ) arg1, * ( char** ) arg2 );
- }
- /******************************************************************************
- main()
- ******************************************************************************/
- int main(int argc, char **argv)
- {
- int is_ignore_list= 0;
- char **names= 0;
- char **testes= 0;
- int name_index;
- int index;
- char var_dir[FN_REFLEN];
- /* setup */
- setup(argv[0]);
- /* delete all file in var */
- snprintf(var_dir,FN_REFLEN,"%s/var",mysql_test_dir);
- del_tree(var_dir);
- /*
- 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=str_tok(argument, temp, ","); token != NULL;
- token=str_tok(argument, NULL, ","))
- {
- if (strlen(ignore_test) + strlen(token) + 2 <= FN_REFLEN-1)
- sprintf(ignore_test+strlen(ignore_test), " %s ", token);
- else
- {
- free(temp);
- die("ignore list too long.");
- }
- }
- free(temp);
- is_ignore_list= 1;
- }
- /* header */
- #ifndef __WIN__
- mlog("MySQL Server %s, for %s (%s)nn", VERSION, SYSTEM_TYPE, MACHINE_TYPE);
- #else
- mlog("MySQL Server ---, for %s (%s)nn", SYSTEM_TYPE, MACHINE_TYPE);
- #endif
- mlog("Initializing Tests...n");
- /* install test databases */
- mysql_install_db();
- mlog("Starting Tests...n");
- mlog("n");
- mlog(HEADER);
- mlog(DASH);
- if ( argc > 1 + is_ignore_list )
- {
- int i;
- /* single test */
- single_test= TRUE;
- for (i= 1 + is_ignore_list; i < argc; i++)
- {
- /* run given test */
- run_test(argv[i]);
- }
- }
- else
- {
- /* run all tests */
- testes= malloc(MAX_COUNT_TESTES*sizeof(void*));
- if (!testes)
- die("can not allcate memory for sorting");
- names= testes;
- name_index= 0;
- #ifndef __WIN__
- struct dirent *entry;
- DIR *parent;
- char test[FN_LEN];
- int position;
- /* FIXME are we sure the list is sorted if using readdir()? */
- if ((parent= opendir(test_dir)) == NULL) /* Not thread safe */
- die("Unable to open tests directory.");
- else
- {
- while ((entry= readdir(parent)) != NULL) /* Not thread safe */
- {
- strcpy(test, strlwr(entry->d_name));
- /* find the test suffix */
- if ((position= strinstr(test, TEST_SUFFIX)) != 0)
- {
- if (name_index < MAX_COUNT_TESTES)
- {
- /* null terminate at the suffix */
- *(test + position - 1)= ' ';
- /* insert test */
- *names= malloc(FN_REFLEN);
- strcpy(*names,test);
- names++;
- name_index++;
- }
- else
- die("can not sort files, array is overloaded");
- }
- }
- closedir(parent);
- }
- #else
- {
- struct _finddata_t dir;
- int* handle;
- char test[FN_LEN];
- char mask[FN_REFLEN];
- int position;
- /* single test */
- single_test= FALSE;
- snprintf(mask,FN_REFLEN,"%s/*.test",test_dir);
- if ((handle=_findfirst(mask,&dir)) == -1L)
- {
- die("Unable to open tests directory.");
- }
- do
- {
- if (!(dir.attrib & _A_SUBDIR))
- {
- strcpy(test, strlwr(dir.name));
- /* find the test suffix */
- if ((position= strinstr(test, TEST_SUFFIX)) != 0)
- {
- if (name_index < MAX_COUNT_TESTES)
- {
- /* null terminate at the suffix */
- *(test + position - 1)= ' ';
- /* insert test */
- *names= malloc(FN_REFLEN);
- strcpy(*names,test);
- names++;
- name_index++;
- }
- else
- die("can not sort files, array is overloaded");
- }
- }
- }while (_findnext(handle,&dir) == 0);
- _findclose(handle);
- }
- #endif
- qsort( (void *)testes, name_index, sizeof( char * ), compare );
- for (index= 0; index < name_index; index++)
- {
- run_test(testes[index]);
- free(testes[index]);
- }
- free(testes);
- }
- /* stop server */
- mysql_stop();
- mlog(DASH);
- mlog("n");
- mlog("Ending Tests...n");
- /* report stats */
- report_stats();
- /* close log */
- if (log_fd) fclose(log_fd);
- /* keep results up */
- #ifdef __NETWARE__
- pressanykey();
- #endif
- return 0;
- }
- /*
- Synopsis:
- This function breaks the string into a sequence of tokens. The difference
- between this function and strtok is that it respects the quoted string i.e.
- it skips any delimiter character within the quoted part of the string.
- It return tokens by eliminating quote character. It modifies the input string
- passed. It will work with whitespace delimeter but may not work properly with
- other delimeter. If the delimeter will contain any quote character, then
- function will not tokenize and will return null string.
- e.g. if input string is
- --init-slave="set global max_connections=500" --skip-external-locking
- then the output will two string i.e.
- --init-slave=set global max_connections=500
- --skip-external-locking
- Arguments:
- string: input string
- delim: set of delimiter character
- Output:
- return the null terminated token of NULL.
- */
- char *str_tok(char* dest, char *string, const char *delim)
- {
- char *token;
- char *ptr_end_token= NULL;
- char *ptr_quote= NULL;
- char *ptr_token= NULL;
- int count_quotes= 0;
- *dest = ' ';
- if (strchr(delim,''') || strchr(delim,'"'))
- return NULL;
- token= (char*)strtok(string, delim);
- if (token)
- {
- /* double quote is found */
- if (strchr(token,'"'))
- {
- do
- {
- if (count_quotes & 1)
- {
- if (*dest == ' ')
- sprintf(dest,"%s", ptr_token);
- else
- sprintf(dest,"%s %s", dest, ptr_token);
- ptr_token= (char*)strtok(NULL, delim);
- if (!ptr_token)
- break;
- }
- else
- {
- ptr_token= token;
- }
- if (ptr_quote = strchr(ptr_token,'"'))
- {
- ptr_end_token= ptr_token + strlen(ptr_token);
- do
- {
- #ifndef __WIN__
- bmove(ptr_quote, ptr_quote+1, ptr_end_token - ptr_quote);
- #endif
- count_quotes++;
- } while (ptr_quote != NULL && (ptr_quote = strchr(ptr_quote+1,'"')));
- }
- /* there are unpair quotes we have to search next quote*/
- } while (count_quotes & 1);
- if (ptr_token != NULL)
- {
- if (*dest == ' ')
- sprintf(dest,"%s", ptr_token);
- else
- sprintf(dest,"%s %s",dest,ptr_token);
- }
- }
- else
- {
- sprintf(dest,"%s",token);
- }
- }
- return token ? dest : NULL;
- }
- #ifndef __WIN__
- /*
- Synopsis:
- This function run scripts files on Linux and Netware
- Arguments:
- script_name: name of script file
- Output:
- nothing
- */
- void run_init_script(const char *script_name)
- {
- arg_list_t al;
- int err;
- /* args */
- init_args(&al);
- add_arg(&al, sh_file);
- add_arg(&al, script_name);
- /* spawn */
- if ((err= spawn(sh_file, &al, TRUE, NULL, NULL, NULL, NULL)) != 0)
- {
- die("Unable to run script.");
- }
- /* free args */
- free_args(&al);
- }
- #endif