mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 21:12:26 +01:00
d1846e3b95
This patch corrects a defect in the building of the DELETE commands for disabling a plugin whereby only the original plugin data was deleted. If there were other plugins, the delete did not remove the rows. The code has been changed to remove all rows from the mysql.plugin table that were inserted when the plugin was loaded. The test has also been changed to correctly identify if all rows have been deleted.
326 lines
10 KiB
Text
326 lines
10 KiB
Text
#
|
|
# 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
|
|
|
|
# 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 $plugindir_ini= "$ENV{PLUGIN_DIR}/daemon_example.ini";
|
|
my $notfound= "";
|
|
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";
|
|
}
|
|
if ((!-e $plugindir_ini) || (!-r $plugindir_ini))
|
|
{
|
|
print FILE "let \$PLUGIN_DIR= $not_found;\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 ($PLUGIN_DIR == '')
|
|
{
|
|
if ($DAEMONEXAMPLE_DIR == '')
|
|
{
|
|
--skip Test requires known location of daemon_example.ini file.
|
|
}
|
|
let $PLUGIN_DIR = $DAEMONEXAMPLE_DIR;
|
|
}
|
|
|
|
# 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 #
|
|
let $expect_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect;
|
|
# MTR will remove this file later, but this might be too late.
|
|
--error 0,1
|
|
--remove_file $expect_file
|
|
--write_file $expect_file
|
|
wait
|
|
EOF
|
|
--shutdown_server 10
|
|
--source include/wait_until_disconnected.inc
|
|
|
|
#
|
|
# Enable the plugin
|
|
#
|
|
--exec $MYSQL_PLUGIN_CMD ENABLE daemon_example
|
|
|
|
#
|
|
# Ensure enabling an enabled plugin doesn't fail
|
|
--exec $MYSQL_PLUGIN_CMD ENABLE daemon_example
|
|
|
|
#
|
|
# Restart the server
|
|
#
|
|
--append_file $expect_file
|
|
restart
|
|
EOF
|
|
--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 #
|
|
eval INSERT INTO mysql.plugin VALUES ('wicky', '$DAEMONEXAMPLE');
|
|
eval INSERT INTO mysql.plugin VALUES ('wacky', '$DAEMONEXAMPLE');
|
|
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;
|
|
|
|
--echo #
|
|
--echo # Disable the plugin...
|
|
--echo #
|
|
# MTR will remove this file later, but this might be too late.
|
|
--error 0,1
|
|
--remove_file $expect_file
|
|
--write_file $expect_file
|
|
wait
|
|
EOF
|
|
--shutdown_server 10
|
|
--source include/wait_until_disconnected.inc
|
|
|
|
#
|
|
# Disable the plugin
|
|
#
|
|
--exec $MYSQL_PLUGIN_CMD DISABLE daemon_example
|
|
|
|
#
|
|
# Restart the server
|
|
#
|
|
--append_file $expect_file
|
|
restart
|
|
EOF
|
|
--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
|
|
#
|
|
let $expect_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect;
|
|
# MTR will remove this file later, but this might be too late.
|
|
--error 0,1
|
|
--remove_file $expect_file
|
|
--write_file $expect_file
|
|
wait
|
|
EOF
|
|
--shutdown_server 10
|
|
--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 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 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 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 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 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 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 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 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 DISABLE daemon_example 2>&1
|
|
|
|
--echo #
|
|
--echo # Show the help.
|
|
--echo #
|
|
replace_result $MYSQL_PLUGIN mysql_plugin;
|
|
--replace_regex /Ver [0-9.]+ Distrib [0-9.]+/Ver V.V.VV Distrib XX.XX.XX/ /XX-m[0-9]+/XX/
|
|
--exec $MYSQL_PLUGIN --help
|
|
|
|
replace_result $MYSQL_PLUGIN mysql_plugin;
|
|
--replace_regex /Ver [0-9.]+ Distrib [0-9.]+/Ver V.V.VV Distrib XX.XX.XX/ /XX-m[0-9]+/XX/
|
|
--exec $MYSQL_PLUGIN --version
|
|
|
|
#
|
|
# Restart the server
|
|
#
|
|
--append_file $expect_file
|
|
restart
|
|
EOF
|
|
--enable_reconnect
|
|
--source include/wait_until_connected_again.inc
|
|
|
|
#
|
|
# Cleanup
|
|
# MTR will remove this file later, but this might be too late.
|
|
--error 0,1
|
|
--remove_file $expect_file
|
|
|
|
# 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
|