mysql_test_run_new.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:49k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.   Copyright (c) 2002, 2003 Novell, Inc. All Rights Reserved. 
  3.   This program is free software; you can redistribute it and/or modify 
  4.   it under the terms of the GNU General Public License as published by 
  5.   the Free Software Foundation; either version 2 of the License, or 
  6.   (at your option) any later version. 
  7.   This program is distributed in the hope that it will be useful, 
  8.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  10.   GNU General Public License for more details. 
  11.   You should have received a copy of the GNU General Public License 
  12.   along with this program; if not, write to the Free Software 
  13.   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  14. */ 
  15. #include <stdlib.h>
  16. #include <stdio.h>
  17. #include <errno.h>
  18. #ifndef __WIN__
  19. #include <dirent.h>
  20. #endif
  21. #include <string.h>
  22. #ifdef __NETWARE__
  23. #include <screen.h>
  24. #include <nks/vm.h>
  25. #endif
  26. #include <ctype.h>
  27. #include <sys/stat.h>
  28. #ifndef __WIN__
  29. #include <unistd.h>
  30. #endif
  31. #include <fcntl.h>
  32. #ifdef __NETWARE__
  33. #include <sys/mode.h>
  34. #endif
  35. #ifdef __WIN__
  36. #include <windows.h>
  37. #include <shlwapi.h>
  38. #include <direct.h>
  39. #endif
  40. #include "my_manage.h"
  41. /******************************************************************************
  42.   macros
  43. ******************************************************************************/
  44. #define HEADER  "TEST                                           RESULT  n"
  45. #define DASH    "-------------------------------------------------------n"
  46. #define NW_TEST_SUFFIX   ".nw-test"
  47. #define NW_RESULT_SUFFIX ".nw-result"
  48. #define TEST_SUFFIX      ".test"
  49. #define RESULT_SUFFIX     ".result"
  50. #define REJECT_SUFFIX    ".reject"
  51. #define OUT_SUFFIX       ".out"
  52. #define ERR_SUFFIX       ".err"
  53. const char *TEST_PASS=   "[ pass ]";
  54. const char *TEST_SKIP=   "[ skip ]";
  55. const char *TEST_FAIL=   "[ fail ]";
  56. const char *TEST_BAD=    "[ bad  ]";
  57. const char *TEST_IGNORE= "[ignore]";
  58. /******************************************************************************
  59.   global variables
  60. ******************************************************************************/
  61. #ifdef __NETWARE__
  62. static char base_dir[FN_REFLEN]= "sys:/mysql";
  63. #else
  64. static char base_dir[FN_REFLEN]= "..";
  65. #endif
  66. static char db[FN_LEN]=       "test";
  67. static char user[FN_LEN]=     "root";
  68. static char password[FN_LEN]= "";
  69. int master_port= 9306;
  70. int slave_port=  9307;
  71. #if !defined(__NETWARE__) && !defined(__WIN__)
  72. static char master_socket[FN_REFLEN]= "./var/tmp/master.sock";
  73. static char slave_socket[FN_REFLEN]=  "./var/tmp/slave.sock";
  74. #endif
  75. #define MAX_COUNT_TESTES 1024
  76. #ifdef __WIN__
  77. #  define sting_compare_func _stricmp
  78. #else
  79. #  ifdef HAVE_STRCASECMP
  80. #    define sting_compare_func strcasecmp
  81. #  else
  82. #    define sting_compare_func strcmp
  83. #  endif
  84. #endif
  85. /* comma delimited list of tests to skip or empty string */
  86. #ifndef __WIN__
  87. static char skip_test[FN_REFLEN]= " lowercase_table3 , system_mysql_db_fix ";
  88. #else
  89. /*
  90.   The most ignore testes contain the calls of system command
  91.   lowercase_table3 is disabled by Gerg
  92.   system_mysql_db_fix  is disabled by Gerg
  93.   sp contains a command system
  94.   rpl_EE_error contains a command system
  95.   rpl_loaddatalocal contains a command system
  96.   ndb_autodiscover contains a command system
  97.   rpl_rotate_logs contains a command system
  98.   repair contains a command system
  99.   rpl_trunc_binlog contains a command system
  100.   mysqldump contains a command system
  101.   rpl000001 makes non-exit loop...temporary skiped
  102. */
  103. static char skip_test[FN_REFLEN]=
  104. " lowercase_table3 ,"
  105. " system_mysql_db_fix ,"
  106. " sp ,"
  107. " rpl_EE_error ,"
  108. " rpl_loaddatalocal ,"
  109. " ndb_autodiscover ,"
  110. " rpl_rotate_logs ,"
  111. " repair ,"
  112. " rpl_trunc_binlog ,"
  113. " mysqldump ,"
  114. " rpl000001 ,"
  115. " derived ,"
  116. " group_by ,"
  117. " select ,"
  118. " rpl000015 ,"
  119. " subselect ";
  120. #endif
  121. static char ignore_test[FN_REFLEN]= "";
  122. static char bin_dir[FN_REFLEN];
  123. static char mysql_test_dir[FN_REFLEN];
  124. static char test_dir[FN_REFLEN];
  125. static char mysql_tmp_dir[FN_REFLEN];
  126. static char result_dir[FN_REFLEN];
  127. static char master_dir[FN_REFLEN];
  128. static char slave_dir[FN_REFLEN];
  129. static char slave1_dir[FN_REFLEN];
  130. static char slave2_dir[FN_REFLEN];
  131. static char lang_dir[FN_REFLEN];
  132. static char char_dir[FN_REFLEN];
  133. static char mysqladmin_file[FN_REFLEN];
  134. static char mysqld_file[FN_REFLEN];
  135. static char mysqltest_file[FN_REFLEN];
  136. #ifndef __WIN__
  137. static char master_pid[FN_REFLEN];
  138. static char slave_pid[FN_REFLEN];
  139. static char sh_file[FN_REFLEN]= "/bin/sh";
  140. #else
  141. static HANDLE master_pid;
  142. static HANDLE slave_pid;
  143. #endif
  144. static char master_opt[FN_REFLEN]= "";
  145. static char slave_opt[FN_REFLEN]= "";
  146. static char slave_master_info[FN_REFLEN]= "";
  147. static char master_init_script[FN_REFLEN]= "";
  148. static char slave_init_script[FN_REFLEN]= "";
  149. /* OpenSSL */
  150. static char ca_cert[FN_REFLEN];
  151. static char server_cert[FN_REFLEN];
  152. static char server_key[FN_REFLEN];
  153. static char client_cert[FN_REFLEN];
  154. static char client_key[FN_REFLEN];
  155. int total_skip= 0;
  156. int total_pass= 0;
  157. int total_fail= 0;
  158. int total_test= 0;
  159. int total_ignore= 0;
  160. int use_openssl=    FALSE;
  161. int master_running= FALSE;
  162. int slave_running=  FALSE;
  163. int skip_slave=     TRUE;
  164. int single_test=    TRUE;
  165. int restarts= 0;
  166. FILE *log_fd= NULL;
  167. static char argument[FN_REFLEN];
  168. /******************************************************************************
  169.   functions
  170. ******************************************************************************/
  171. /******************************************************************************
  172.   prototypes
  173. ******************************************************************************/
  174. void report_stats();
  175. void install_db(char *);
  176. void mysql_install_db();
  177. void start_master();
  178. void start_slave();
  179. void mysql_start();
  180. void stop_slave();
  181. void stop_master();
  182. void mysql_stop();
  183. void mysql_restart();
  184. int read_option(char *, char *);
  185. void run_test(char *);
  186. void setup(char *);
  187. void vlog(const char *, va_list);
  188. void mlog(const char *, ...);
  189. void log_info(const char *, ...);
  190. void log_error(const char *, ...);
  191. void log_errno(const char *, ...);
  192. void die(const char *);
  193. char *str_tok(char* dest, char *string, const char *delim);
  194. #ifndef __WIN__
  195. void run_init_script(const char *script_name);
  196. #endif
  197. /******************************************************************************
  198.   report_stats()
  199.   Report the gathered statistics.
  200. ******************************************************************************/
  201. void report_stats()
  202. {
  203.   if (total_fail == 0)
  204.   {
  205.     mlog("nAll %d test(s) were successful.n", total_test);
  206.   }
  207.   else
  208.   {
  209.     double percent= ((double)total_pass / total_test) * 100;
  210.     mlog("nFailed %u/%u test(s), %.02f%% successful.n",
  211.          total_fail, total_test, percent);
  212.     mlog("nThe .out and .err files in %s may give you somen", result_dir);
  213.     mlog("hint of what when wrong.n");
  214.     mlog("nIf you want to report this error, please first read "
  215.          "the documentationn");
  216.     mlog("at: http://www.mysql.com/doc/M/y/MySQL_test_suite.htmln");
  217.   }
  218. }
  219. /******************************************************************************
  220.   install_db()
  221.   Install the a database.
  222. ******************************************************************************/
  223. void install_db(char *datadir)
  224. {
  225.   arg_list_t al;
  226.   int err;
  227.   char input[FN_REFLEN];
  228.   char output[FN_REFLEN];
  229.   char error[FN_REFLEN];
  230.   /* input file */
  231. #ifdef __NETWARE__
  232.   snprintf(input, FN_REFLEN, "%s/bin/init_db.sql", base_dir);
  233. #else
  234.   snprintf(input, FN_REFLEN, "%s/mysql-test/init_db.sql", base_dir);
  235. #endif
  236.   snprintf(output, FN_REFLEN, "%s/install.out", datadir);
  237.   snprintf(error, FN_REFLEN, "%s/install.err", datadir);
  238.   if (create_system_files(datadir,input, TRUE))
  239.     die("Unable to create init_db.sql.");
  240.   /* args */
  241.   init_args(&al);
  242.   add_arg(&al, mysqld_file);
  243.   add_arg(&al, "--no-defaults");
  244.   add_arg(&al, "--bootstrap");
  245.   add_arg(&al, "--skip-grant-tables");
  246.   add_arg(&al, "--basedir=%s", base_dir);
  247.   add_arg(&al, "--datadir=%s", datadir);
  248.   add_arg(&al, "--skip-innodb");
  249.   add_arg(&al, "--skip-ndbcluster");
  250.   add_arg(&al, "--skip-bdb");
  251. #ifndef __NETWARE__
  252.   add_arg(&al, "--character-sets-dir=%s", char_dir);
  253.   add_arg(&al, "--language=%s", lang_dir);
  254. #endif
  255. // added 
  256.   add_arg(&al, "--default-character-set=latin1");
  257.   add_arg(&al, "--innodb_data_file_path=ibdata1:50M");
  258.   /* spawn */
  259.   if ((err= spawn(mysqld_file, &al, TRUE, input, output, error, NULL)) != 0)
  260.   {
  261.     die("Unable to create database.");
  262.   }
  263.   /* free args */
  264.   free_args(&al);
  265. }
  266. /******************************************************************************
  267.   mysql_install_db()
  268.   Install the test databases.
  269. ******************************************************************************/
  270. void mysql_install_db()
  271. {
  272.   char temp[FN_REFLEN];
  273.   /* var directory */
  274.   snprintf(temp, FN_REFLEN, "%s/var", mysql_test_dir);
  275.   /* create var directory */
  276. #ifndef __WIN__
  277.   mkdir(temp, S_IRWXU);
  278.   /* create subdirectories */
  279.   mlog("Creating test-suite folders...n");
  280.   snprintf(temp, FN_REFLEN, "%s/var/run", mysql_test_dir);
  281.   mkdir(temp, S_IRWXU);
  282.   snprintf(temp, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
  283.   mkdir(temp, S_IRWXU);
  284.   snprintf(temp, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
  285.   mkdir(temp, S_IRWXU);
  286.   snprintf(temp, FN_REFLEN, "%s/var/master-data/mysql", mysql_test_dir);
  287.   mkdir(temp, S_IRWXU);
  288.   snprintf(temp, FN_REFLEN, "%s/var/master-data/test", mysql_test_dir);
  289.   mkdir(temp, S_IRWXU);
  290.   
  291.   snprintf(temp, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
  292.   mkdir(temp, S_IRWXU);
  293.   snprintf(temp, FN_REFLEN, "%s/var/slave-data/mysql", mysql_test_dir);
  294.   mkdir(temp, S_IRWXU);
  295.   snprintf(temp, FN_REFLEN, "%s/var/slave-data/test", mysql_test_dir);
  296.   mkdir(temp, S_IRWXU);
  297.   
  298.   snprintf(temp, FN_REFLEN, "%s/var/slave1-data", mysql_test_dir);
  299.   mkdir(temp, S_IRWXU);
  300.   snprintf(temp, FN_REFLEN, "%s/var/slave1-data/mysql", mysql_test_dir);
  301.   mkdir(temp, S_IRWXU);
  302.   snprintf(temp, FN_REFLEN, "%s/var/slave1-data/test", mysql_test_dir);
  303.   mkdir(temp, S_IRWXU);
  304.   
  305.   snprintf(temp, FN_REFLEN, "%s/var/slave2-data", mysql_test_dir);
  306.   mkdir(temp, S_IRWXU);
  307.   snprintf(temp, FN_REFLEN, "%s/var/slave2-data/mysql", mysql_test_dir);
  308.   mkdir(temp, S_IRWXU);
  309.   snprintf(temp, FN_REFLEN, "%s/var/slave2-data/test", mysql_test_dir);
  310.   mkdir(temp, S_IRWXU);
  311. #else
  312.   mkdir(temp);
  313.   /* create subdirectories */
  314.   mlog("Creating test-suite folders...n");
  315.   snprintf(temp, FN_REFLEN, "%s/var/run", mysql_test_dir);
  316.   mkdir(temp);
  317.   snprintf(temp, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
  318.   mkdir(temp);
  319.   snprintf(temp, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
  320.   mkdir(temp);
  321.   snprintf(temp, FN_REFLEN, "%s/var/master-data/mysql", mysql_test_dir);
  322.   mkdir(temp);
  323.   snprintf(temp, FN_REFLEN, "%s/var/master-data/test", mysql_test_dir);
  324.   mkdir(temp);
  325.   snprintf(temp, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
  326.   mkdir(temp);
  327.   snprintf(temp, FN_REFLEN, "%s/var/slave-data/mysql", mysql_test_dir);
  328.   mkdir(temp);
  329.   snprintf(temp, FN_REFLEN, "%s/var/slave-data/test", mysql_test_dir);
  330.   mkdir(temp);
  331. #endif
  332.   /* install databases */
  333.   mlog("Creating test databases for master... n");
  334.   install_db(master_dir);
  335.   mlog("Creating test databases for slave... n");
  336.   install_db(slave_dir);
  337.   install_db(slave1_dir);
  338.   install_db(slave2_dir);
  339. }
  340. /******************************************************************************
  341.   start_master()
  342.   Start the master server.
  343. ******************************************************************************/
  344. void start_master()
  345. {
  346.   arg_list_t al;
  347.   int err;
  348.   char master_out[FN_REFLEN];
  349.   char master_err[FN_REFLEN];
  350.   char temp2[FN_REFLEN];
  351.   /* remove old berkeley db log files that can confuse the server */
  352.   removef("%s/log.*", master_dir);
  353.   /* remove stale binary logs */
  354.   removef("%s/var/log/*-bin.*", mysql_test_dir);
  355.   /* remove stale binary logs */
  356.   removef("%s/var/log/*.index", mysql_test_dir);
  357.   /* remove master.info file */
  358.   removef("%s/master.info", master_dir);
  359.   /* remove relay files */
  360.   removef("%s/var/log/*relay*", mysql_test_dir);
  361.   /* remove relay-log.info file */
  362.   removef("%s/relay-log.info", master_dir);
  363.   /* init script */
  364.   if (master_init_script[0] != 0)
  365.   {
  366. #ifdef __NETWARE__
  367.     /* TODO: use the scripts */
  368.     if (strinstr(master_init_script, "repair_part2-master.sh") != 0)
  369.     {
  370.       FILE *fp;
  371.       /* create an empty index file */
  372.       snprintf(temp, FN_REFLEN, "%s/test/t1.MYI", master_dir);
  373.       fp= fopen(temp, "wb+");
  374.       fputs("1", fp);
  375.       fclose(fp);
  376.     }
  377. #elif !defined(__WIN__)
  378.     run_init_script(master_init_script);
  379. #endif
  380.   }
  381.   /* redirection files */
  382.   snprintf(master_out, FN_REFLEN, "%s/var/run/master%u.out",
  383.            mysql_test_dir, restarts);
  384.   snprintf(master_err, FN_REFLEN, "%s/var/run/master%u.err",
  385.            mysql_test_dir, restarts);
  386. #ifndef __WIN__
  387.   snprintf(temp2,FN_REFLEN,"%s/var",mysql_test_dir);
  388.   mkdir(temp2,S_IRWXU);
  389.   snprintf(temp2,FN_REFLEN,"%s/var/log",mysql_test_dir);
  390.   mkdir(temp2,S_IRWXU);
  391. #else
  392.   snprintf(temp2,FN_REFLEN,"%s/var",mysql_test_dir);
  393.   mkdir(temp2);
  394.   snprintf(temp2,FN_REFLEN,"%s/var/log",mysql_test_dir);
  395.   mkdir(temp2);
  396. #endif
  397.   /* args */
  398.   init_args(&al);
  399.   add_arg(&al, "%s", mysqld_file);
  400.   add_arg(&al, "--no-defaults");
  401.   add_arg(&al, "--log-bin=%s/var/log/master-bin",mysql_test_dir);
  402.   add_arg(&al, "--server-id=1");
  403.   add_arg(&al, "--basedir=%s", base_dir);
  404.   add_arg(&al, "--port=%u", master_port);
  405. #if !defined(__NETWARE__) && !defined(__WIN__)
  406.   add_arg(&al, "--socket=%s",master_socket);
  407. #endif
  408.   add_arg(&al, "--local-infile");
  409.   add_arg(&al, "--core");
  410.   add_arg(&al, "--datadir=%s", master_dir);
  411. #ifndef __WIN__
  412.   add_arg(&al, "--pid-file=%s", master_pid);
  413. #endif
  414.   add_arg(&al, "--character-sets-dir=%s", char_dir);
  415.   add_arg(&al, "--tmpdir=%s", mysql_tmp_dir);
  416.   add_arg(&al, "--language=%s", lang_dir);
  417.  
  418.   add_arg(&al, "--rpl-recovery-rank=1");
  419.   add_arg(&al, "--init-rpl-role=master");
  420.   add_arg(&al, "--default-character-set=latin1");
  421. //  add_arg(&al, "--innodb_data_file_path=ibdata1:50M");
  422. #ifdef DEBUG /* only for debug builds */
  423.   add_arg(&al, "--debug");
  424. #endif
  425.   if (use_openssl)
  426.   {
  427.     add_arg(&al, "--ssl-ca=%s", ca_cert);
  428.     add_arg(&al, "--ssl-cert=%s", server_cert);
  429.     add_arg(&al, "--ssl-key=%s", server_key);
  430.   }
  431.   /* $MASTER_40_ARGS */
  432.   add_arg(&al, "--rpl-recovery-rank=1");
  433.   add_arg(&al, "--init-rpl-role=master");
  434.   /* $SMALL_SERVER */
  435.   add_arg(&al, "-O");
  436.   add_arg(&al, "key_buffer_size=1M");
  437.   add_arg(&al, "-O");
  438.   add_arg(&al, "sort_buffer=256K");
  439.   add_arg(&al, "-O");
  440.   add_arg(&al, "max_heap_table_size=1M");
  441.   /* $EXTRA_MASTER_OPT */
  442.   if (master_opt[0] != 0)
  443.   {
  444.     char *p;
  445.     p= (char *)str_tok(argument, master_opt, " t");
  446.     if (!strstr(master_opt, "timezone"))
  447.     {
  448.       while (p)
  449.       {
  450.         add_arg(&al, "%s", p);
  451.         p= (char *)str_tok(argument, NULL, " t");
  452.       }
  453.     }
  454.   }
  455.   /* remove the pid file if it exists */
  456. #ifndef __WIN__
  457.   remove(master_pid);
  458. #endif
  459.   /* spawn */
  460. #ifdef __WIN__
  461.   if ((err= spawn(mysqld_file, &al, FALSE, NULL,
  462.                   master_out, master_err, &master_pid)) == 0)
  463. #else
  464.   if ((err= spawn(mysqld_file, &al, FALSE, NULL,
  465.                   master_out, master_err, master_pid)) == 0)
  466. #endif
  467.   {
  468.     sleep_until_file_exists(master_pid);
  469.     if ((err= wait_for_server_start(bin_dir, mysqladmin_file, user, password,
  470.                                     master_port, mysql_tmp_dir)) == 0)
  471.     {
  472.       master_running= TRUE;
  473.     }
  474.     else
  475.     {
  476.       log_error("The master server went down early.");
  477.     }
  478.   }
  479.   else
  480.   {
  481.     log_error("Unable to start master server.");
  482.   }
  483.   /* free_args */
  484.   free_args(&al);
  485. }
  486. /******************************************************************************
  487.   start_slave()
  488.   Start the slave server.
  489. ******************************************************************************/
  490. void start_slave()
  491. {
  492.   arg_list_t al;
  493.   int err;
  494.   char slave_out[FN_REFLEN];
  495.   char slave_err[FN_REFLEN];
  496.   /* skip? */
  497.   if (skip_slave) return;
  498.   /* remove stale binary logs */
  499.   removef("%s/*-bin.*", slave_dir);
  500.   /* remove stale binary logs */
  501.   removef("%s/*.index", slave_dir);
  502.   /* remove master.info file */
  503.   removef("%s/master.info", slave_dir);
  504.   /* remove relay files */
  505.   removef("%s/var/log/*relay*", mysql_test_dir);
  506.   /* remove relay-log.info file */
  507.   removef("%s/relay-log.info", slave_dir);
  508.   /* init script */
  509.   if (slave_init_script[0] != 0)
  510.   {
  511. #ifdef __NETWARE__
  512.     /* TODO: use the scripts */
  513.     if (strinstr(slave_init_script, "rpl000016-slave.sh") != 0)
  514.     {
  515.       /* create empty master.info file */
  516.       snprintf(temp, FN_REFLEN, "%s/master.info", slave_dir);
  517.       close(open(temp, O_WRONLY | O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO));
  518.     }
  519.     else if (strinstr(slave_init_script, "rpl000017-slave.sh") != 0)
  520.     {
  521.       FILE *fp;
  522.       /* create a master.info file */
  523.       snprintf(temp, FN_REFLEN, "%s/master.info", slave_dir);
  524.       fp= fopen(temp, "wb+");
  525.       fputs("master-bin.000001n", fp);
  526.       fputs("4n", fp);
  527.       fputs("127.0.0.1n", fp);
  528.       fputs("replicaten", fp);
  529.       fputs("aaaaaaaaaaaaaaabn", fp);
  530.       fputs("9306n", fp);
  531.       fputs("1n", fp);
  532.       fputs("0n", fp);
  533.       fclose(fp);
  534.     }
  535.     else if (strinstr(slave_init_script, "rpl_rotate_logs-slave.sh") != 0)
  536.     {
  537.       /* create empty master.info file */
  538.       snprintf(temp, FN_REFLEN, "%s/master.info", slave_dir);
  539.       close(open(temp, O_WRONLY | O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO));
  540.     }
  541. #elif !defined(__WIN__)
  542.     run_init_script(slave_init_script);
  543. #endif
  544.   }
  545.   /* redirection files */
  546.   snprintf(slave_out, FN_REFLEN, "%s/var/run/slave%u.out",
  547.            mysql_test_dir, restarts);
  548.   snprintf(slave_err, FN_REFLEN, "%s/var/run/slave%u.err",
  549.            mysql_test_dir, restarts);
  550.   /* args */
  551.   init_args(&al);
  552.   add_arg(&al, "%s", mysqld_file);
  553.   add_arg(&al, "--no-defaults");
  554.   add_arg(&al, "--log-bin=slave-bin");
  555.   add_arg(&al, "--relay_log=slave-relay-bin");
  556.   add_arg(&al, "--basedir=%s", base_dir);
  557. #if !defined(__NETWARE__) && !defined(__WIN__)
  558.   add_arg(&al, "--socket=%s",slave_socket);
  559. #endif
  560.   add_arg(&al, "--port=%u", slave_port);
  561.   add_arg(&al, "--datadir=%s", slave_dir);
  562. #ifndef __WIN__
  563.   add_arg(&al, "--pid-file=%s", slave_pid);
  564. #endif
  565.   add_arg(&al, "--character-sets-dir=%s", char_dir);
  566.   add_arg(&al, "--core");
  567.   add_arg(&al, "--tmpdir=%s", mysql_tmp_dir);
  568.   add_arg(&al, "--language=%s", lang_dir);
  569.   add_arg(&al, "--exit-info=256");
  570.   add_arg(&al, "--log-slave-updates");
  571.   add_arg(&al, "--init-rpl-role=slave");
  572.   add_arg(&al, "--skip-innodb");
  573.   add_arg(&al, "--skip-slave-start");
  574.   add_arg(&al, "--slave-load-tmpdir=../../var/tmp");
  575.   add_arg(&al, "--report-user=%s", user);
  576.   add_arg(&al, "--report-host=127.0.0.1");
  577.   add_arg(&al, "--report-port=%u", slave_port);
  578.   add_arg(&al, "--master-retry-count=10");
  579.   add_arg(&al, "-O");
  580.   add_arg(&al, "slave_net_timeout=10");
  581.   add_arg(&al, "--log-slave-updates");
  582.   add_arg(&al, "--log=%s/var/log/slave.log", mysql_test_dir);
  583.   add_arg(&al, "--default-character-set=latin1");
  584.   add_arg(&al, "--skip-ndbcluster");
  585.   
  586. #ifdef DEBUG /* only for debug builds */
  587.   add_arg(&al, "--debug");
  588. #endif      
  589.            
  590.   if (use_openssl)
  591.   {
  592.     add_arg(&al, "--ssl-ca=%s", ca_cert);
  593.     add_arg(&al, "--ssl-cert=%s", server_cert);
  594.     add_arg(&al, "--ssl-key=%s", server_key);
  595.   }
  596.   /* slave master info */
  597.   if (slave_master_info[0] != 0)
  598.   {
  599.     char *p;
  600.     p= (char *)str_tok(argument, slave_master_info, " t");
  601.     while (p)
  602.     {
  603.       add_arg(&al, "%s", p);
  604.       p= (char *)str_tok(argument, NULL, " t");
  605.     }
  606.   }
  607.   else
  608.   {
  609.     add_arg(&al, "--master-user=%s", user);
  610.     add_arg(&al, "--master-password=%s", password);
  611.     add_arg(&al, "--master-host=127.0.0.1");
  612.     add_arg(&al, "--master-port=%u", master_port);
  613.     add_arg(&al, "--master-connect-retry=1");
  614.     add_arg(&al, "--server-id=2");
  615.     add_arg(&al, "--rpl-recovery-rank=2");
  616.   }
  617.   /* small server */
  618.   add_arg(&al, "-O");
  619.   add_arg(&al, "key_buffer_size=1M");
  620.   add_arg(&al, "-O");
  621.   add_arg(&al, "sort_buffer=256K");
  622.   add_arg(&al, "-O");
  623.   add_arg(&al, "max_heap_table_size=1M");
  624.   /* opt args */
  625.   if (slave_opt[0] != 0)
  626.   {
  627.     char *p;
  628.     p= (char *)str_tok(argument, slave_opt, " t");
  629.     while (p)
  630.     {
  631.       add_arg(&al, "%s", p);
  632.       p= (char *)str_tok(argument, NULL, " t");
  633.     } 
  634.   }
  635.   /* remove the pid file if it exists */
  636. #ifndef __WIN__
  637.   remove(slave_pid);
  638. #endif
  639.   /* spawn */
  640. #ifdef __WIN__
  641.   if ((err= spawn(mysqld_file, &al, FALSE, NULL,
  642.                   slave_out, slave_err, &slave_pid)) == 0)
  643. #else
  644.   if ((err= spawn(mysqld_file, &al, FALSE, NULL,
  645.                   slave_out, slave_err, slave_pid)) == 0)
  646. #endif
  647.   {
  648.     sleep_until_file_exists(slave_pid);
  649.     if ((err= wait_for_server_start(bin_dir, mysqladmin_file, user, password,
  650.                                     slave_port, mysql_tmp_dir)) == 0)
  651.     {
  652.       slave_running= TRUE;
  653.     }
  654.     else
  655.     {
  656.       log_error("The slave server went down early.");
  657.     }
  658.   }
  659.   else
  660.   {
  661.     log_error("Unable to start slave server.");
  662.   }
  663.   /* free args */
  664.   free_args(&al);
  665. }
  666. /******************************************************************************
  667.   mysql_start()
  668.   Start the mysql servers.
  669. ******************************************************************************/
  670. void mysql_start()
  671. {
  672.   printf("loading master...r");
  673.   start_master();
  674.   printf("loading slave...r");
  675.   start_slave();
  676.   /* activate the test screen */
  677. #ifdef __NETWARE__
  678.   ActivateScreen(getscreenhandle());
  679. #endif
  680. }
  681. /******************************************************************************
  682.   stop_slave()
  683.   Stop the slave server.
  684. ******************************************************************************/
  685. void stop_slave()
  686. {
  687.   int err;
  688.   /* running? */
  689.   if (!slave_running) return;
  690.   /* stop */
  691.   if ((err= stop_server(bin_dir, mysqladmin_file, user, password,
  692.                         slave_port, slave_pid, mysql_tmp_dir)) == 0)
  693.   {
  694.     slave_running= FALSE;
  695.   }
  696.   else
  697.   {
  698.     log_error("Unable to stop slave server.");
  699.   }
  700. }
  701. /******************************************************************************
  702.   stop_master()
  703.   Stop the master server.
  704. ******************************************************************************/
  705. void stop_master()
  706. {
  707.   int err;
  708.   /* running? */
  709.   if (!master_running) return;
  710.   if ((err= stop_server(bin_dir, mysqladmin_file, user, password,
  711.                         master_port, master_pid, mysql_tmp_dir)) == 0)
  712.   {
  713.     master_running= FALSE;
  714.   }
  715.   else
  716.   {
  717.     log_error("Unable to stop master server.");
  718.   }
  719. }
  720. /******************************************************************************
  721.   mysql_stop()
  722.   Stop the mysql servers.
  723. ******************************************************************************/
  724. void mysql_stop()
  725. {
  726.   stop_master();
  727.   stop_slave();
  728.   /* activate the test screen */
  729. #ifdef __NETWARE__
  730.   ActivateScreen(getscreenhandle());
  731. #endif
  732. }
  733. /******************************************************************************
  734.   mysql_restart()
  735.   Restart the mysql servers.
  736. ******************************************************************************/
  737. void mysql_restart()
  738. {
  739. /*  log_info("Restarting the MySQL server(s): %u", ++restarts); */
  740.   mysql_stop();
  741.   mlog(DASH);
  742.   sleep(1);
  743.   mysql_start();
  744. }
  745. /******************************************************************************
  746.   read_option()
  747.   Read the option file.
  748. ******************************************************************************/
  749. int read_option(char *opt_file, char *opt)
  750. {
  751.   int fd, err;
  752.   char *p;
  753.   char buf[FN_REFLEN];
  754.   /* copy current option */
  755.   strncpy(buf, opt, FN_REFLEN);
  756.   /* open options file */
  757.   fd= open(opt_file, O_RDONLY);
  758.   err= read(fd, opt, FN_REFLEN);
  759.   close(fd);
  760.   if (err > 0)
  761.   {
  762.     /* terminate string */
  763.     if ((p= strchr(opt, 'n')) != NULL)
  764.     {
  765.       *p= 0;
  766.       /* check for a 'r' */
  767.       if ((p= strchr(opt, 'r')) != NULL)
  768.       {
  769.         *p= 0;
  770.       }
  771.     }
  772.     else
  773.     {
  774.       opt[err]= 0;
  775.     }
  776.     /* check for $MYSQL_TEST_DIR */
  777.     if ((p= strstr(opt, "$MYSQL_TEST_DIR")) != NULL)
  778.     {
  779.       char temp[FN_REFLEN];
  780.       *p= 0;
  781.       strcpy(temp, p + strlen("$MYSQL_TEST_DIR"));
  782.       strcat(opt, mysql_test_dir);
  783.       strcat(opt, temp);
  784.     }
  785.     /* Check for double backslash and replace it with single bakslash */
  786.     if ((p= strstr(opt, "\\")) != NULL)
  787.     {
  788.       /* bmove is guranteed to work byte by byte */
  789.       bmove(p, p+1, strlen(p)+1);
  790.     }
  791.   }
  792.   else
  793.   {
  794.     /* clear option */
  795.     *opt= 0;
  796.   }
  797.   /* compare current option with previous */
  798.   return strcmp(opt, buf);
  799. }
  800. /******************************************************************************
  801.   run_test()
  802.   Run the given test case.
  803. ******************************************************************************/
  804. void run_test(char *test)
  805. {
  806.   char temp[FN_REFLEN];
  807.   const char *rstr;
  808.   int skip= FALSE, ignore=FALSE;
  809.   int restart= FALSE;
  810.   int flag= FALSE;
  811.   struct stat info;
  812.   /* skip tests in the skip list */
  813.   snprintf(temp, FN_REFLEN, " %s ", test);
  814.   skip= (strinstr(skip_test, temp) != 0);
  815.   if (skip == FALSE)
  816.     ignore= (strinstr(ignore_test, temp) != 0);
  817.   snprintf(master_init_script, FN_REFLEN, "%s/%s-master.sh", test_dir, test);
  818.   snprintf(slave_init_script, FN_REFLEN, "%s/%s-slave.sh", test_dir, test);
  819. #ifdef __WIN__
  820.   if (! stat(master_init_script, &info))
  821.       skip= TRUE;
  822.   if (!stat(slave_init_script, &info))
  823.       skip= TRUE;
  824. #endif
  825.   if (ignore)
  826.   {
  827.     /* show test */
  828.     mlog("%-46s ", test);
  829.     /* ignore */
  830.     rstr= TEST_IGNORE;
  831.     ++total_ignore;
  832.   }
  833.   else if (!skip)     /* skip test? */
  834.   {
  835.     char test_file[FN_REFLEN];
  836.     char master_opt_file[FN_REFLEN];
  837.     char slave_opt_file[FN_REFLEN];
  838.     char slave_master_info_file[FN_REFLEN];
  839.     char result_file[FN_REFLEN];
  840.     char reject_file[FN_REFLEN];
  841.     char out_file[FN_REFLEN];
  842.     char err_file[FN_REFLEN];
  843.     int err;
  844.     arg_list_t al;
  845.     /* skip slave? */
  846.     flag= skip_slave;
  847.     skip_slave= (strncmp(test, "rpl", 3) != 0);
  848.     if (flag != skip_slave) restart= TRUE;
  849.     /* create files */
  850.     snprintf(master_opt_file, FN_REFLEN, "%s/%s-master.opt", test_dir, test);
  851.     snprintf(slave_opt_file, FN_REFLEN, "%s/%s-slave.opt", test_dir, test);
  852.     snprintf(slave_master_info_file, FN_REFLEN, "%s/%s.slave-mi",
  853.              test_dir, test);
  854.     snprintf(reject_file, FN_REFLEN, "%s/%s%s",
  855.              result_dir, test, REJECT_SUFFIX);
  856.     snprintf(out_file, FN_REFLEN, "%s/%s%s", result_dir, test, OUT_SUFFIX);
  857.     snprintf(err_file, FN_REFLEN, "%s/%s%s", result_dir, test, ERR_SUFFIX);
  858.     /* netware specific files */
  859.     snprintf(test_file, FN_REFLEN, "%s/%s%s", test_dir, test, NW_TEST_SUFFIX);
  860.     if (stat(test_file, &info))
  861.     {
  862.       snprintf(test_file, FN_REFLEN, "%s/%s%s", test_dir, test, TEST_SUFFIX);
  863.       if (access(test_file,0))
  864.       {
  865.         printf("Invalid test name %s, %s file not foundn",test,test_file);
  866.         return;
  867.       }
  868.     }
  869.     snprintf(result_file, FN_REFLEN, "%s/%s%s",
  870.              result_dir, test, NW_RESULT_SUFFIX);
  871.     if (stat(result_file, &info))
  872.     {
  873.       snprintf(result_file, FN_REFLEN, "%s/%s%s",
  874.                result_dir, test, RESULT_SUFFIX);
  875.     }
  876.     /* init scripts */
  877.     if (stat(master_init_script, &info))
  878.       master_init_script[0]= 0;
  879.     else
  880.       restart= TRUE;
  881.     if (stat(slave_init_script, &info))
  882.       slave_init_script[0]= 0;
  883.     else
  884.       restart= TRUE;
  885.     /* read options */
  886.     if (read_option(master_opt_file, master_opt)) restart= TRUE;
  887.     if (read_option(slave_opt_file, slave_opt)) restart= TRUE;
  888.     if (read_option(slave_master_info_file, slave_master_info)) restart= TRUE;
  889.     /* cleanup previous run */
  890.     remove(reject_file);
  891.     remove(out_file);
  892.     remove(err_file);
  893.     /* start or restart? */
  894.     if (!master_running) mysql_start();
  895.       else if (restart) mysql_restart();
  896.     /* show test */
  897.     mlog("%-46s ", test);
  898.     /* args */
  899.     init_args(&al);
  900.     add_arg(&al, "%s", mysqltest_file);
  901.     add_arg(&al, "--no-defaults");
  902.     add_arg(&al, "--port=%u", master_port);
  903. #if !defined(__NETWARE__) && !defined(__WIN__)
  904.     add_arg(&al, "--socket=%s", master_socket);
  905.     add_arg(&al, "--tmpdir=%s", mysql_tmp_dir);
  906. #endif
  907.     add_arg(&al, "--database=%s", db);
  908.     add_arg(&al, "--user=%s", user);
  909.     add_arg(&al, "--password=%s", password);
  910.     add_arg(&al, "--silent");
  911.     add_arg(&al, "--basedir=%s/", mysql_test_dir);
  912.     add_arg(&al, "--host=127.0.0.1");
  913.     add_arg(&al, "--skip-safemalloc");
  914.     add_arg(&al, "-v");
  915.     add_arg(&al, "-R");
  916.     add_arg(&al, "%s", result_file);
  917.     
  918.     
  919.     if (use_openssl)
  920.     {
  921.       add_arg(&al, "--ssl-ca=%s", ca_cert);
  922.       add_arg(&al, "--ssl-cert=%s", client_cert);
  923.       add_arg(&al, "--ssl-key=%s", client_key);
  924.     }
  925.     /* spawn */
  926.     err= spawn(mysqltest_file, &al, TRUE, test_file, out_file, err_file, NULL);
  927.     /* free args */
  928.     free_args(&al);
  929.     remove_empty_file(out_file);
  930.     remove_empty_file(err_file);
  931.     if (err == 0)
  932.     {
  933.       /* pass */
  934.       rstr= TEST_PASS;
  935.       ++total_pass;
  936.       /* increment total */
  937.       ++total_test;
  938.     }
  939.     else if (err == 2)
  940.     {
  941.       /* skip */
  942.       rstr= TEST_SKIP;
  943.       ++total_skip;
  944.     }
  945.     else if (err == 1)
  946.     {
  947.       /* fail */
  948.       rstr= TEST_FAIL;
  949.       ++total_fail;
  950.       /* increment total */
  951.       ++total_test;
  952.     }
  953.     else
  954.     {
  955.       rstr= TEST_BAD;
  956.     }
  957.   }
  958.   else /* early skips */
  959.   {
  960.     /* show test */
  961.     mlog("%-46s ", test);
  962.     /* skip */
  963.     rstr= TEST_SKIP;
  964.     ++total_skip;
  965.   }
  966.   /* result */
  967.   mlog("%-14sn", rstr);
  968. }
  969. /******************************************************************************
  970.   vlog()
  971.   Log the message.
  972. ******************************************************************************/
  973. void vlog(const char *format, va_list ap)
  974. {
  975.   vfprintf(stdout, format, ap);
  976.   fflush(stdout);
  977.   if (log_fd)
  978.   {
  979.     vfprintf(log_fd, format, ap);
  980.     fflush(log_fd);
  981.   }
  982. }
  983. /******************************************************************************
  984.   log()
  985.   Log the message.
  986. ******************************************************************************/
  987. void mlog(const char *format, ...)
  988. {
  989.   va_list ap;
  990.   va_start(ap, format);
  991.   vlog(format, ap);
  992.   va_end(ap);
  993. }
  994. /******************************************************************************
  995.   log_info()
  996.   Log the given information.
  997. ******************************************************************************/
  998. void log_info(const char *format, ...)
  999. {
  1000.   va_list ap;
  1001.   va_start(ap, format);
  1002.   mlog("-- INFO : ");
  1003.   vlog(format, ap);
  1004.   mlog("n");
  1005.   va_end(ap);
  1006. }
  1007. /******************************************************************************
  1008.   log_error()
  1009.   Log the given error.
  1010. ******************************************************************************/
  1011. void log_error(const char *format, ...)
  1012. {
  1013.   va_list ap;
  1014.   va_start(ap, format);
  1015.   mlog("-- ERROR: ");
  1016.   vlog(format, ap);
  1017.   mlog("n");
  1018.   va_end(ap);
  1019. }
  1020. /******************************************************************************
  1021.   log_errno()
  1022.   Log the given error and errno.
  1023. ******************************************************************************/
  1024. void log_errno(const char *format, ...)
  1025. {
  1026.   va_list ap;
  1027.   va_start(ap, format);
  1028.   mlog("-- ERROR: (%003u) ", errno);
  1029.   vlog(format, ap);
  1030.   mlog("n");
  1031.   va_end(ap);
  1032. }
  1033. /******************************************************************************
  1034.   die()
  1035.   Exit the application.
  1036. ******************************************************************************/
  1037. void die(const char *msg)
  1038. {
  1039.   log_error(msg);
  1040. #ifdef __NETWARE__
  1041.   pressanykey();
  1042. #endif
  1043.   exit(-1);
  1044. }
  1045. /******************************************************************************
  1046.   setup()
  1047.   Setup the mysql test enviornment.
  1048. ******************************************************************************/
  1049. void setup(char *file __attribute__((unused)))
  1050. {
  1051.   char temp[FN_REFLEN];
  1052. #if defined(__WIN__) || defined(__NETWARE__)  
  1053.   char file_path[FN_REFLEN*2];
  1054. #endif  
  1055.   char *p;
  1056.   int position;
  1057.   /* set the timezone for the timestamp test */
  1058. #ifdef __WIN__
  1059.   _putenv( "TZ=GMT-3" );
  1060. #else
  1061.   putenv((char *)"TZ=GMT-3");
  1062. #endif
  1063.   /* find base dir */
  1064. #ifdef __NETWARE__
  1065.   strcpy(temp, strlwr(file));
  1066.   while ((p= strchr(temp, '\')) != NULL) *p= '/';
  1067. #else
  1068.   getcwd(temp, FN_REFLEN);
  1069.   position= strlen(temp);
  1070.   temp[position]= '/';
  1071.   temp[position+1]= 0;
  1072. #ifdef __WIN__
  1073.   while ((p= strchr(temp, '\')) != NULL) *p= '/';
  1074. #endif
  1075. #endif
  1076.   if ((position= strinstr(temp, "/mysql-test/")) != 0)
  1077.   {
  1078.     p= temp + position - 1;
  1079.     *p= 0;
  1080.     strcpy(base_dir, temp);
  1081.   }
  1082.   log_info("Currect directory: %s",base_dir);
  1083. #ifdef __NETWARE__
  1084.   /* setup paths */
  1085.   snprintf(bin_dir, FN_REFLEN, "%s/bin", base_dir);
  1086.   snprintf(mysql_test_dir, FN_REFLEN, "%s/mysql-test", base_dir);
  1087.   snprintf(test_dir, FN_REFLEN, "%s/t", mysql_test_dir);
  1088.   snprintf(mysql_tmp_dir, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
  1089.   snprintf(result_dir, FN_REFLEN, "%s/r", mysql_test_dir);
  1090.   snprintf(master_dir, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
  1091.   snprintf(slave_dir, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
  1092.   snprintf(lang_dir, FN_REFLEN, "%s/share/english", base_dir);
  1093.   snprintf(char_dir, FN_REFLEN, "%s/share/charsets", base_dir);
  1094. #ifdef HAVE_OPENSSL
  1095.   use_openssl= TRUE;
  1096. #endif /* HAVE_OPENSSL */
  1097.   /* OpenSSL paths */
  1098.   snprintf(ca_cert, FN_REFLEN, "%s/SSL/cacert.pem", base_dir);
  1099.   snprintf(server_cert, FN_REFLEN, "%s/SSL/server-cert.pem", base_dir);
  1100.   snprintf(server_key, FN_REFLEN, "%s/SSL/server-key.pem", base_dir);
  1101.   snprintf(client_cert, FN_REFLEN, "%s/SSL/client-cert.pem", base_dir);
  1102.   snprintf(client_key, FN_REFLEN, "%s/SSL/client-key.pem", base_dir);
  1103.   /* setup files */
  1104.   snprintf(mysqld_file, FN_REFLEN, "%s/mysqld", bin_dir);
  1105.   snprintf(mysqltest_file, FN_REFLEN, "%s/mysqltest", bin_dir);
  1106.   snprintf(mysqladmin_file, FN_REFLEN, "%s/mysqladmin", bin_dir);
  1107.   snprintf(master_pid, FN_REFLEN, "%s/var/run/master.pid", mysql_test_dir);
  1108.   snprintf(slave_pid, FN_REFLEN, "%s/var/run/slave.pid", mysql_test_dir);
  1109. #elif __WIN__
  1110.   /* setup paths */
  1111. #ifdef _DEBUG
  1112.   snprintf(bin_dir, FN_REFLEN, "%s/client_debug", base_dir);
  1113. #else
  1114.   snprintf(bin_dir, FN_REFLEN, "%s/client_release", base_dir);
  1115. #endif
  1116.   snprintf(mysql_test_dir, FN_REFLEN, "%s/mysql-test", base_dir);
  1117.   snprintf(test_dir, FN_REFLEN, "%s/t", mysql_test_dir);
  1118.   snprintf(mysql_tmp_dir, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
  1119.   snprintf(result_dir, FN_REFLEN, "%s/r", mysql_test_dir);
  1120.   snprintf(master_dir, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
  1121.   snprintf(slave_dir, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
  1122.   snprintf(lang_dir, FN_REFLEN, "%s/share/english", base_dir);
  1123.   snprintf(char_dir, FN_REFLEN, "%s/share/charsets", base_dir);
  1124. #ifdef HAVE_OPENSSL
  1125.   use_openssl= TRUE;
  1126. #endif /* HAVE_OPENSSL */
  1127.   /* OpenSSL paths */
  1128.   snprintf(ca_cert, FN_REFLEN, "%s/SSL/cacert.pem", base_dir);
  1129.   snprintf(server_cert, FN_REFLEN, "%s/SSL/server-cert.pem", base_dir);
  1130.   snprintf(server_key, FN_REFLEN, "%s/SSL/server-key.pem", base_dir);
  1131.   snprintf(client_cert, FN_REFLEN, "%s/SSL/client-cert.pem", base_dir);
  1132.   snprintf(client_key, FN_REFLEN, "%s/SSL/client-key.pem", base_dir);
  1133.   /* setup files */
  1134. #ifdef _DEBUG 
  1135.   snprintf(mysqld_file, FN_REFLEN, "%s/mysqld-debug.exe", bin_dir);
  1136. #else
  1137.   snprintf(mysqld_file, FN_REFLEN, "%s/mysqld.exe", bin_dir);
  1138. #endif
  1139.   snprintf(mysqltest_file, FN_REFLEN, "%s/mysqltest.exe", bin_dir);
  1140.   snprintf(mysqladmin_file, FN_REFLEN, "%s/mysqladmin.exe", bin_dir);
  1141. #else
  1142.   /* setup paths */
  1143.   snprintf(bin_dir, FN_REFLEN, "%s/client", base_dir);
  1144.   snprintf(mysql_test_dir, FN_REFLEN, "%s/mysql-test", base_dir);
  1145.   snprintf(test_dir, FN_REFLEN, "%s/t", mysql_test_dir);
  1146.   snprintf(mysql_tmp_dir, FN_REFLEN, "%s/var/tmp", mysql_test_dir);
  1147.   snprintf(result_dir, FN_REFLEN, "%s/r", mysql_test_dir);
  1148.   snprintf(master_dir, FN_REFLEN, "%s/var/master-data", mysql_test_dir);
  1149.   snprintf(slave_dir, FN_REFLEN, "%s/var/slave-data", mysql_test_dir);
  1150.   snprintf(slave1_dir, FN_REFLEN, "%s/var/slave1-data", mysql_test_dir);
  1151.   snprintf(slave2_dir, FN_REFLEN, "%s/var/slave2-data", mysql_test_dir);
  1152.   snprintf(lang_dir, FN_REFLEN, "%s/sql/share/english", base_dir);
  1153.   snprintf(char_dir, FN_REFLEN, "%s/sql/share/charsets", base_dir);
  1154. #ifdef HAVE_OPENSSL
  1155.   use_openssl= TRUE;
  1156. #endif /* HAVE_OPENSSL */
  1157.   /* OpenSSL paths */
  1158.   snprintf(ca_cert, FN_REFLEN, "%s/SSL/cacert.pem", base_dir);
  1159.   snprintf(server_cert, FN_REFLEN, "%s/SSL/server-cert.pem", base_dir);
  1160.   snprintf(server_key, FN_REFLEN, "%s/SSL/server-key.pem", base_dir);
  1161.   snprintf(client_cert, FN_REFLEN, "%s/SSL/client-cert.pem", base_dir);
  1162.   snprintf(client_key, FN_REFLEN, "%s/SSL/client-key.pem", base_dir);
  1163.   /* setup files */
  1164.   snprintf(mysqld_file, FN_REFLEN, "%s/sql/mysqld", base_dir);
  1165.   snprintf(mysqltest_file, FN_REFLEN, "%s/mysqltest", bin_dir);
  1166.   snprintf(mysqladmin_file, FN_REFLEN, "%s/mysqladmin", bin_dir);
  1167.   snprintf(master_pid, FN_REFLEN, "%s/var/run/master.pid", mysql_test_dir);
  1168.   snprintf(slave_pid, FN_REFLEN, "%s/var/run/slave.pid", mysql_test_dir);
  1169.   snprintf(master_socket,FN_REFLEN, "%s/var/tmp/master.sock", mysql_test_dir);
  1170.   snprintf(slave_socket,FN_REFLEN, "%s/var/tmp/slave.sock", mysql_test_dir);
  1171. #endif
  1172.   /* create log file */
  1173.   snprintf(temp, FN_REFLEN, "%s/mysql-test-run.log", mysql_test_dir);
  1174.   if ((log_fd= fopen(temp, "w+")) == NULL)
  1175.   {
  1176.     log_errno("Unable to create log file.");
  1177.   }
  1178.   /* prepare skip test list */
  1179.   while ((p= strchr(skip_test, ',')) != NULL) *p= ' ';
  1180.   strcpy(temp, strlwr(skip_test));
  1181.   snprintf(skip_test, FN_REFLEN, " %s ", temp);
  1182.   /* environment */
  1183. #ifdef __NETWARE__
  1184.   setenv("MYSQL_TEST_DIR", mysql_test_dir, 1);
  1185.   snprintf(file_path, FN_REFLEN*2,
  1186.            "%s/client/mysqldump --no-defaults -u root --port=%u",
  1187.            bin_dir, master_port);
  1188.   setenv("MYSQL_DUMP", file_path, 1);
  1189.   snprintf(file_path, FN_REFLEN*2,
  1190.            "%s/client/mysqlbinlog --no-defaults --local-load=%s",
  1191.            bin_dir, mysql_tmp_dir);
  1192.   setenv("MYSQL_BINLOG", file_path, 1);
  1193. #elif __WIN__
  1194.   snprintf(file_path,FN_REFLEN,"MYSQL_TEST_DIR=%s",mysql_test_dir);
  1195.   _putenv(file_path);
  1196.   snprintf(file_path, FN_REFLEN*2,
  1197.            "MYSQL_DUMP=%s/mysqldump.exe --no-defaults -uroot --port=%u",
  1198.            bin_dir, master_port);
  1199.   _putenv(file_path);
  1200.   snprintf(file_path, FN_REFLEN*2,
  1201.           "MYSQL_BINLOG=%s/mysqlbinlog.exe --no-defaults --local-load=%s",
  1202.            bin_dir, mysql_tmp_dir);
  1203.   _putenv(file_path);
  1204.     
  1205.   snprintf(file_path, FN_REFLEN*2,
  1206.           "TESTS_BINDIR=%s/tests", base_dir);
  1207.   _putenv(file_path);
  1208.   snprintf(file_path, FN_REFLEN*2,
  1209.            "CHARSETSDIR=%s/sql/share/charsets", base_dir);
  1210.   _putenv(file_path);
  1211.   snprintf(file_path, FN_REFLEN*2,
  1212.            "MYSQL=%s/mysql --port=%u ", 
  1213.            bin_dir, master_port);
  1214.   _putenv(file_path);
  1215.     
  1216.   snprintf(file_path, FN_REFLEN*2,
  1217.            "MYSQL_FIX_SYSTEM_TABLES=%s/scripts/mysql_fix_privilege_tables --no-defaults "
  1218.            "--host=localhost --port=%u "
  1219.            "--basedir=%s --bindir=%s --verbose",
  1220.            base_dir,master_port, base_dir, bin_dir);
  1221.   _putenv(file_path);
  1222.      
  1223.   snprintf(file_path, FN_REFLEN*2,
  1224.            "NDB_TOOLS_DIR=%s/ndb/tools", base_dir);
  1225.   _putenv(file_path);
  1226.     
  1227.   snprintf(file_path, FN_REFLEN*2,
  1228.            "CLIENT_BINDIR=%s", bin_dir);
  1229.   _putenv(file_path);
  1230.   snprintf(file_path, FN_REFLEN*2,
  1231.              "MYSQL_CLIENT_TEST=%s/tests/mysql_client_test --no-defaults --testcase "
  1232.      "--user=root --port=%u --silent", 
  1233.      base_dir, master_port);
  1234.   _putenv(file_path);
  1235. #else
  1236.   {
  1237.     static char env_MYSQL_TEST_DIR[FN_REFLEN*2];
  1238.     static char env_MYSQL_DUMP[FN_REFLEN*2];
  1239.     static char env_MYSQL_BINLOG[FN_REFLEN*2];
  1240.     static char env_MASTER_MYSOCK[FN_REFLEN*2];
  1241.     static char env_TESTS_BINDIR[FN_REFLEN*2];
  1242.     static char env_CHARSETSDIR[FN_REFLEN*2];
  1243.     static char env_MYSQL[FN_REFLEN*2];
  1244.     static char env_MYSQL_FIX_SYSTEM_TABLES[FN_REFLEN*2];
  1245.     static char env_NDB_TOOLS_DIR[FN_REFLEN*2];
  1246.     static char env_CLIENT_BINDIR[FN_REFLEN*2];
  1247.     static char env_MYSQL_CLIENT_TEST[FN_REFLEN*2];
  1248.     
  1249.     snprintf(env_MYSQL_TEST_DIR,FN_REFLEN*2,
  1250.              "MYSQL_TEST_DIR=%s",mysql_test_dir);
  1251.     putenv(env_MYSQL_TEST_DIR);
  1252.     
  1253.     snprintf(env_MYSQL_DUMP, FN_REFLEN*2,"MYSQL_DUMP=%s/mysqldump --no-defaults "
  1254.              "-uroot --port=%u --socket=%s ", 
  1255.              bin_dir, master_port, master_socket);    
  1256.     putenv(env_MYSQL_DUMP);
  1257.     
  1258.     snprintf(env_MYSQL_BINLOG, FN_REFLEN*2,
  1259.              "MYSQL_BINLOG=%s/mysqlbinlog --no-defaults --local-load=%s -uroot ",
  1260.              bin_dir, mysql_tmp_dir);
  1261.     putenv(env_MYSQL_BINLOG);
  1262.     
  1263.     snprintf(env_MASTER_MYSOCK, FN_REFLEN*2,
  1264.              "MASTER_MYSOCK=%s", master_socket);
  1265.     putenv(env_MASTER_MYSOCK);
  1266.     snprintf(env_TESTS_BINDIR, FN_REFLEN*2,
  1267.              "TESTS_BINDIR=%s/tests", base_dir);
  1268.     putenv(env_TESTS_BINDIR);
  1269.     snprintf(env_CHARSETSDIR, FN_REFLEN*2,
  1270.              "CHARSETSDIR=%s/sql/share/charsets", base_dir);
  1271.     putenv(env_CHARSETSDIR);
  1272.     snprintf(env_MYSQL, FN_REFLEN*2,
  1273.              "MYSQL=%s/mysql --port=%u --socket=%s -uroot ", 
  1274.      bin_dir, master_port, master_socket);
  1275.     putenv(env_MYSQL);
  1276.     
  1277.     snprintf(env_MYSQL_FIX_SYSTEM_TABLES, FN_REFLEN*2,
  1278.              "MYSQL_FIX_SYSTEM_TABLES=%s/scripts/mysql_fix_privilege_tables --no-defaults "
  1279.      "--host=localhost --port=%u --socket=%s "
  1280.      "--basedir=%s --bindir=%s --verbose -uroot ",
  1281.      base_dir,master_port, master_socket, base_dir, bin_dir);
  1282.     putenv(env_MYSQL_FIX_SYSTEM_TABLES);
  1283.      
  1284.     snprintf(env_NDB_TOOLS_DIR, FN_REFLEN*2,
  1285.              "NDB_TOOLS_DIR=%s/ndb/tools", base_dir);
  1286.     putenv(env_NDB_TOOLS_DIR);
  1287.     
  1288.     snprintf(env_CLIENT_BINDIR, FN_REFLEN*2,
  1289.              "CLIENT_BINDIR=%s", bin_dir);
  1290.     putenv(env_CLIENT_BINDIR);
  1291.     snprintf(env_MYSQL_CLIENT_TEST, FN_REFLEN*2,
  1292.              "MYSQL_CLIENT_TEST=%s/tests/mysql_client_test --no-defaults --testcase "
  1293.      "--user=root --socket=%s --port=%u --silent", 
  1294.      base_dir, master_socket, master_port);
  1295.     putenv(env_MYSQL_CLIENT_TEST);
  1296.     
  1297.   }
  1298.   
  1299. #endif
  1300. #ifndef __WIN__
  1301.   putenv((char *)"MASTER_MYPORT=9306");
  1302.   putenv((char *)"SLAVE_MYPORT=9307");
  1303.   putenv((char *)"MYSQL_TCP_PORT=3306");
  1304. #else
  1305.   _putenv("MASTER_MYPORT=9306");
  1306.   _putenv("SLAVE_MYPORT=9307");
  1307.   _putenv("MYSQL_TCP_PORT=3306");
  1308. #endif
  1309. }
  1310. /*
  1311.   Compare names of testes for right order
  1312. */
  1313. int compare( const void *arg1, const void *arg2 )
  1314. {
  1315.   return sting_compare_func( * ( char** ) arg1, * ( char** ) arg2 );
  1316. }
  1317. /******************************************************************************
  1318.   main()
  1319. ******************************************************************************/
  1320. int main(int argc, char **argv)
  1321. {
  1322.   int is_ignore_list= 0;
  1323.   char **names= 0;
  1324.   char **testes= 0;
  1325.   int name_index;
  1326.   int index;
  1327.   char var_dir[FN_REFLEN];
  1328.   /* setup */
  1329.   setup(argv[0]);
  1330.   
  1331.   /* delete all file in var */
  1332.   snprintf(var_dir,FN_REFLEN,"%s/var",mysql_test_dir);
  1333.   del_tree(var_dir);
  1334.   /*
  1335.     The --ignore option is comma saperated list of test cases to skip and
  1336.     should be very first command line option to the test suite.
  1337.     The usage is now:
  1338.     mysql_test_run --ignore=test1,test2 test3 test4
  1339.     where test1 and test2 are test cases to ignore
  1340.     and test3 and test4 are test cases to run.
  1341.   */
  1342.   if (argc >= 2 && !strnicmp(argv[1], "--ignore=", sizeof("--ignore=")-1))
  1343.   {
  1344.     char *temp, *token;
  1345.     temp= strdup(strchr(argv[1],'=') + 1);
  1346.     for (token=str_tok(argument, temp, ","); token != NULL; 
  1347.          token=str_tok(argument, NULL, ","))
  1348.     {
  1349.       if (strlen(ignore_test) + strlen(token) + 2 <= FN_REFLEN-1)
  1350.         sprintf(ignore_test+strlen(ignore_test), " %s ", token);
  1351.       else
  1352.       {
  1353.         free(temp);
  1354.         die("ignore list too long.");
  1355.       }
  1356.     }
  1357.     free(temp);
  1358.     is_ignore_list= 1;
  1359.   }
  1360.   /* header */
  1361. #ifndef __WIN__
  1362.   mlog("MySQL Server %s, for %s (%s)nn", VERSION, SYSTEM_TYPE, MACHINE_TYPE);
  1363. #else
  1364.   mlog("MySQL Server ---, for %s (%s)nn", SYSTEM_TYPE, MACHINE_TYPE);
  1365. #endif
  1366.   mlog("Initializing Tests...n");
  1367.   /* install test databases */
  1368.   mysql_install_db();
  1369.   
  1370.   mlog("Starting Tests...n");
  1371.   mlog("n");
  1372.   mlog(HEADER);
  1373.   mlog(DASH);
  1374.   if ( argc > 1 + is_ignore_list )
  1375.   {
  1376.     int i;
  1377.     /* single test */
  1378.     single_test= TRUE;
  1379.     for (i= 1 + is_ignore_list; i < argc; i++)
  1380.     {
  1381.       /* run given test */
  1382.       run_test(argv[i]);
  1383.     }
  1384.   }
  1385.   else
  1386.   {
  1387.     /* run all tests */
  1388.     testes= malloc(MAX_COUNT_TESTES*sizeof(void*));
  1389.     if (!testes)
  1390.       die("can not allcate memory for sorting");
  1391.     names= testes;
  1392.     name_index= 0;
  1393. #ifndef __WIN__
  1394.     struct dirent *entry;
  1395.     DIR *parent;
  1396.     char test[FN_LEN];
  1397.     int position;
  1398.     /* FIXME are we sure the list is sorted if using readdir()? */
  1399.     if ((parent= opendir(test_dir)) == NULL)    /* Not thread safe */
  1400.       die("Unable to open tests directory.");
  1401.     else
  1402.     {
  1403.       while ((entry= readdir(parent)) != NULL)  /* Not thread safe */
  1404.       {
  1405.         strcpy(test, strlwr(entry->d_name));
  1406.         /* find the test suffix */
  1407.         if ((position= strinstr(test, TEST_SUFFIX)) != 0)
  1408.         {
  1409.   if (name_index < MAX_COUNT_TESTES)
  1410.   {
  1411.             /* null terminate at the suffix */
  1412.             *(test + position - 1)= '';
  1413.             /* insert test */
  1414.             *names= malloc(FN_REFLEN);
  1415.             strcpy(*names,test);
  1416.             names++;
  1417.             name_index++;
  1418.           }
  1419.   else
  1420.     die("can not sort files, array is overloaded");
  1421.         }
  1422.       }
  1423.       closedir(parent);
  1424.     }
  1425. #else
  1426.     {
  1427.       struct _finddata_t dir;
  1428.       int* handle;
  1429.       char test[FN_LEN];
  1430.       char mask[FN_REFLEN];
  1431.       int position;
  1432.       /* single test */
  1433.       single_test= FALSE;
  1434.       snprintf(mask,FN_REFLEN,"%s/*.test",test_dir);
  1435.       if ((handle=_findfirst(mask,&dir)) == -1L)
  1436.       {
  1437.         die("Unable to open tests directory.");
  1438.       }
  1439.       do
  1440.       {
  1441.         if (!(dir.attrib & _A_SUBDIR))
  1442.         {
  1443.           strcpy(test, strlwr(dir.name));
  1444.           /* find the test suffix */
  1445.           if ((position= strinstr(test, TEST_SUFFIX)) != 0)
  1446.           {
  1447.             if (name_index < MAX_COUNT_TESTES)
  1448.     {
  1449.               /* null terminate at the suffix */
  1450.               *(test + position - 1)= '';
  1451.               /* insert test */
  1452.               *names= malloc(FN_REFLEN);
  1453.               strcpy(*names,test);
  1454.               names++;
  1455.               name_index++;
  1456.     }
  1457.     else
  1458.       die("can not sort files, array is overloaded");
  1459.           }
  1460.         }
  1461.       }while (_findnext(handle,&dir) == 0);
  1462.       _findclose(handle);
  1463.     }
  1464. #endif
  1465.     qsort( (void *)testes, name_index, sizeof( char * ), compare );
  1466.     for (index= 0; index < name_index; index++)
  1467.     {
  1468.       run_test(testes[index]);
  1469.       free(testes[index]);
  1470.     }
  1471.     free(testes);
  1472.   }
  1473.   /* stop server */
  1474.   mysql_stop();
  1475.   mlog(DASH);
  1476.   mlog("n");
  1477.   mlog("Ending Tests...n");
  1478.   /* report stats */
  1479.   report_stats();
  1480.   /* close log */
  1481.   if (log_fd) fclose(log_fd);
  1482.   /* keep results up */
  1483. #ifdef __NETWARE__
  1484.   pressanykey();
  1485. #endif
  1486.   return 0;
  1487. }
  1488. /*
  1489.  Synopsis:
  1490.   This function breaks the string into a sequence of tokens. The difference
  1491.   between this function and strtok is that it respects the quoted string i.e.
  1492.   it skips  any delimiter character within the quoted part of the string.
  1493.   It return tokens by eliminating quote character. It modifies the input string
  1494.   passed. It will work with whitespace delimeter but may not work properly with
  1495.   other delimeter. If the delimeter will contain any quote character, then
  1496.   function will not tokenize and will return null string.
  1497.   e.g. if input string is
  1498.      --init-slave="set global max_connections=500" --skip-external-locking
  1499.   then the output will two string i.e.
  1500.      --init-slave=set global max_connections=500
  1501.      --skip-external-locking
  1502. Arguments:
  1503.   string:  input string
  1504.   delim:   set of delimiter character
  1505. Output:
  1506.   return the null terminated token of NULL.
  1507. */
  1508. char *str_tok(char* dest, char *string, const char *delim)
  1509. {
  1510.   char *token;            
  1511.   char *ptr_end_token= NULL;
  1512.   char *ptr_quote= NULL;
  1513.   char *ptr_token= NULL;
  1514.   int count_quotes= 0;
  1515.   *dest = '';
  1516.   if (strchr(delim,''') || strchr(delim,'"'))
  1517.     return NULL;
  1518.   token= (char*)strtok(string, delim);
  1519.   if (token) 
  1520.   {
  1521.     /* double quote is found */
  1522.     if (strchr(token,'"'))
  1523.     {
  1524.       do
  1525.       {
  1526.         if (count_quotes & 1)
  1527.         {
  1528.   if (*dest == '')
  1529.             sprintf(dest,"%s", ptr_token);
  1530.   else
  1531.             sprintf(dest,"%s %s", dest, ptr_token);
  1532.           ptr_token= (char*)strtok(NULL, delim);
  1533.           if (!ptr_token)
  1534.             break;
  1535.         }
  1536.         else
  1537.         {
  1538.           ptr_token= token;
  1539.         }
  1540.         if (ptr_quote = strchr(ptr_token,'"'))
  1541.         {
  1542.           ptr_end_token= ptr_token + strlen(ptr_token);
  1543.           do
  1544.           {
  1545. #ifndef __WIN__
  1546.             bmove(ptr_quote, ptr_quote+1, ptr_end_token - ptr_quote);
  1547. #endif
  1548.             count_quotes++;
  1549.           } while (ptr_quote != NULL && (ptr_quote = strchr(ptr_quote+1,'"')));
  1550.         }
  1551.       /* there are unpair quotes we have to search next quote*/
  1552.       } while (count_quotes & 1);
  1553.       if (ptr_token != NULL)
  1554.       {
  1555.         if (*dest == '')
  1556.           sprintf(dest,"%s", ptr_token);
  1557. else
  1558.           sprintf(dest,"%s %s",dest,ptr_token);
  1559.       }
  1560.     }
  1561.     else
  1562.     {
  1563.       sprintf(dest,"%s",token);
  1564.     }
  1565.   }
  1566.   return token ? dest : NULL;
  1567. }
  1568. #ifndef __WIN__
  1569. /*
  1570.  Synopsis:
  1571.   This function run scripts files on Linux and Netware
  1572. Arguments:
  1573.   script_name:  name of script file
  1574. Output:
  1575.   nothing
  1576. */
  1577. void run_init_script(const char *script_name)
  1578. {
  1579.   arg_list_t al;
  1580.   int err;
  1581.   /* args */
  1582.   init_args(&al);
  1583.   add_arg(&al, sh_file);
  1584.   add_arg(&al, script_name);
  1585.   /* spawn */
  1586.   if ((err= spawn(sh_file, &al, TRUE, NULL, NULL, NULL, NULL)) != 0)
  1587.   {
  1588.     die("Unable to run script.");
  1589.   }
  1590.   /* free args */
  1591.   free_args(&al);
  1592. }
  1593. #endif