# # Test mysql_plugin tool # # This test contains test cases for testing the mysql_plugin client with # the daemon_example plugin. Test cases include tests for: # # - successful enable/disable # - incorrect paths # - missing paths/options # # Implementation Notes # # The mysql_plugin tool now accepts --mysqld the path to mysqld server. The # mysqld path is extracted from MYSQLD_BOOTSTRAP_CMD line. We also extract # the path of MYSQLD_BASEDIR (where mysql exists) and use it for the errmsg # file. The directories differ between Windows and Unix but the Perl script # included below will pick as per platform. # # The test is also designed to issue the --skip directive if the location of # the mysqld, my_print_defaults, or daemon_example.ini files cannot be found. # --source include/not_embedded.inc --source include/have_innodb_16k.inc call mtr.add_suppression('InnoDB: Resizing redo log'); call mtr.add_suppression('InnoDB: Starting to delete and rewrite log files'); call mtr.add_suppression('InnoDB: New log files created'); # Add the datadir, basedir, plugin_dir to the bootstrap command let $MYSQLD_DATADIR= `select @@datadir`; let $MYSQL_BASEDIR= `select @@basedir`; let $MYSQL_ERRMSG_BASEDIR=`select @@lc_messages_dir`; let $PLUGIN_DIR=`select @@plugin_dir`; --disable_abort_on_error # Perl script to extract the location of the basedir from environment # variables. This is needed to ensure the test will run on the PB machines # designed to test release as well as debug builds. It also checks for the # location of the my_print_defaults and daemon_example.ini files. perl; use File::Basename; my ($mysqld)= split " ", $ENV{MYSQLD_BOOTSTRAP_CMD}; my $mysqld_basedir=dirname($mysqld); my $my_print_defaults= $ENV{MYSQL_MY_PRINT_DEFAULTS}; my $my_print_defaults_basedir=dirname($my_print_defaults); my $daemonexample_ini= "$ENV{DAEMONEXAMPLE_DIR}/daemon_example.ini"; my $notfound= ""; $daemonexample_ini =~ s,/plugin/debug/,/plugin/,; open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/mysqld.inc") or die; print FILE "let \$MYSQLD_BASEDIR= $mysqld_basedir;\n"; print FILE "let \$MYSQL_MY_PRINT_DEFAULTS_BASEDIR= $my_print_defaults_basedir;\n"; if ((!-e $daemonexample_ini) || (!-r $daemonexample_ini)) { print FILE "let \$DAEMONEXAMPLE_DIR= $not_found;\n"; } else { print FILE "let \$MYSQL_PLUGIN_INI= $daemonexample_ini;\n"; } close FILE; EOF source $MYSQL_TMP_DIR/mysqld.inc; remove_file $MYSQL_TMP_DIR/mysqld.inc; # The mysql_plugin tool expects a directory structure like in the installed # mysql version, so errmsg.sys will be copied to "basedir/share", we create # and remove this structure. --mkdir $MYSQLD_BASEDIR/share --mkdir $MYSQLD_BASEDIR/share/mysql --copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/errmsg.sys --copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/mysql/errmsg.sys # The mysql_plugin tool now accepts --my-print-defaults which points to the # executable my_print_defaults.exe we can get this path from the variable # $MYSQL_MY_PRINT_DEFAULTS. # Check for my_print_defaults location. Skip if not found. if ($MYSQL_MY_PRINT_DEFAULTS_BASEDIR == '') { --skip Test requires known location of my_print_defaults executable. } # Check for mysqld location. Skip if not found. if ($MYSQLD == '') { --skip Test requires known location of mysqld executable. } # Check for daemon_example.ini location. Skip if not found in either # the plugin_dir path or the daemon_example_dir path. if ($DAEMONEXAMPLE_DIR == '') { --skip Test requires known location of daemon_example.ini file. } # Build client command for reuse. let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --echo # --echo # Ensure the plugin isn't loaded. --echo # SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; --echo # --echo # Enable the plugin... --echo # --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc # # Enable the plugin # --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI ENABLE daemon_example # Ensure enabling an enabled plugin doesn't fail --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI ENABLE daemon_example # # Restart the server # --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --echo # --echo # Simulate loading a plugin libary with multiple entry points. --echo # This will test the DISABLE to ensure all rows are removed. --echo # --replace_regex /\.dll/.so/ eval INSERT INTO mysql.plugin VALUES ('wicky', '$DAEMONEXAMPLE'); --replace_regex /\.dll/.so/ eval INSERT INTO mysql.plugin VALUES ('wacky', '$DAEMONEXAMPLE'); --replace_regex /\.dll/.so/ eval INSERT INTO mysql.plugin VALUES ('wonky', '$DAEMONEXAMPLE'); --echo # --echo # Ensure the plugin is now loaded. --echo # --replace_regex /\.dll/.so/ SELECT * FROM mysql.plugin WHERE dl like 'libdaemon%' ORDER BY name; --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc # # Disable the plugin - to remove winky, wonky entries # --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example # # Enable the plugin again # --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI ENABLE daemon_example # # Restart the server # --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --echo # --echo # Ensure the plugin is loaded. --echo # --replace_regex /\.dll/.so/ SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc # To test the case where the same plugin is reloaded with a different soname, # we must copy the example daemon to a new location renaming it. let $DAEMON_RELOAD = lib$DAEMONEXAMPLE; --copy_file $PLUGIN_DIR/$DAEMONEXAMPLE $PLUGIN_DIR/$DAEMON_RELOAD --copy_file include/libdaemon_example.ini $PLUGIN_DIR/libdaemon_example.ini # Now reload it and see that it is a different name. --exec $MYSQL_PLUGIN_CMD ENABLE libdaemon_example # # Restart the server # --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --echo # --echo # Ensure the plugin is replaced. --echo # --replace_regex /\.dll/.so/ SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; --echo # --echo # Disable the plugin... --echo # --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc # # Disable the plugin # --exec $MYSQL_PLUGIN_CMD DISABLE libdaemon_example # Remove files for last test case. --remove_file $PLUGIN_DIR/$DAEMON_RELOAD --remove_file $DAEMONEXAMPLE_DIR/libdaemon_example.ini # # Restart the server # --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --echo # --echo # Ensure the plugin isn't loaded. --echo # SELECT * FROM mysql.plugin WHERE dl like '%libdaemon%' ORDER BY name; # # Stop the server for error conditions # --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc --echo # --echo # Attempt to load non-existant plugin --echo # --error 1,2,256 --exec $MYSQL_PLUGIN_CMD DISABLE NOT_THERE_AT_ALL 2>&1 --echo # --echo # Attempt to use non-existant plugin.ini file --echo # --error 1,2,7,256 --exec $MYSQL_PLUGIN_CMD DISABLE daemon_example --plugin-ini=/NOT/THERE/pi.ini 2>&1 --echo # --echo # Attempt to omit the plugin --echo # --error 1,2,256 --exec $MYSQL_PLUGIN_CMD DISABLE 2>&1 --echo # --echo # Attempt to omit DISABLE|ENABLE --echo # --error 1,2,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - datadir --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=/data_not_there/ --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - basedir --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=/basedir_not_there/ --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; replace_result "/basedir_not_there//" "/basedir_not_there/"; --error 1,2,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - plugin_dir --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=/plugin_not_there/ --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - mysqld --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=/mysqld_not_there/ --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Attempt to use bad paths - my_print_defaults --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=/my_print_defaults_not_there/; --error 1,2,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Missing library --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_soname.ini --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 --exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Bad format for config file --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_format.ini --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,256 --exec $MYSQL_PLUGIN_CMD DISABLE daemon_example 2>&1 --echo # --echo # Missing base_dir option --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,139,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Missing data_dir option --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --basedir=$MYSQL_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,139,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Missing plugin_dir option --echo # let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQL_DATADIR --basedir=$MYSQL_BASEDIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; --error 1,2,139,256 --exec $MYSQL_PLUGIN_CMD --plugin-ini=$MYSQL_PLUGIN_INI DISABLE daemon_example 2>&1 --echo # --echo # Show the help. --echo # --replace_result $MYSQL_PLUGIN mysql_plugin $MYSQL_SERVER_VERSION XX.XX.XX --replace_regex /Ver [0-9.]+/Ver V.V.VV/ --exec $MYSQL_PLUGIN --help --replace_result $MYSQL_PLUGIN mysql_plugin $MYSQL_SERVER_VERSION XX.XX.XX --replace_regex /Ver [0-9.]+/Ver V.V.VV/ --exec $MYSQL_PLUGIN --version # # Restart the server # --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc # # Cleanup --remove_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Cleanup the share folder in the binary path. --remove_file $MYSQLD_BASEDIR/share/errmsg.sys --rmdir $MYSQLD_BASEDIR/share/mysql --rmdir $MYSQLD_BASEDIR/share --enable_abort_on_error