MXS-3158 Add test case

Test that monitor does not alter event charset or collation.
This commit is contained in:
Esa Korhonen 2020-12-09 19:07:16 +02:00
parent 0c904eae5e
commit 4dd057d99d
2 changed files with 77 additions and 2 deletions

View File

@ -80,7 +80,8 @@ add_test_executable_ex(NAME mysqlmon_switchover_stress SOURCE mysqlmon_switchove
add_test_executable_ex(NAME mysqlmon_external_master SOURCE mysqlmon_external_master.cpp
CONFIG mysqlmon_external_master.cnf VMS repl_backend LABELS mysqlmon)
# Check failover, switchover and rejoin with scheduled server events, uses config of mysqlmon_rejoin_good
# Check failover, switchover and rejoin with scheduled server events
# Also, MXS-3158
add_test_executable_ex(NAME mysqlmon_fail_switch_events SOURCE mysqlmon_fail_switch_events.cpp
CONFIG mysqlmon_rejoin_good.cnf VMS repl_backend LABELS mysqlmon)

View File

@ -14,6 +14,7 @@
#include <maxtest/testconnections.hh>
#include "failover_common.cpp"
#include <string>
#include <maxtest/envv.hh>
using std::string;
@ -28,6 +29,10 @@ const char EV_STATE_SLAVE_DISABLED[] = "SLAVESIDE_DISABLED";
const char WRONG_MASTER_FMT[] = "%s is not master as expected. Current master id: %i.";
void expect_event_charset_collation(TestConnections& test, const string& event_name,
const string& client_charset, const string& collation_connection,
const string& database_collation);
int read_incremented_field(TestConnections& test)
{
int rval = -1;
@ -307,7 +312,7 @@ int main(int argc, char** argv)
if (test.ok())
{
// Check that all other nodes are slaves.
// Check that all other nodes are slaves.
for (int i = 1; i < N; i++)
{
string server_name = server_names[i];
@ -316,6 +321,42 @@ int main(int argc, char** argv)
}
}
if (test.ok())
{
// MXS-3158 Check that monitor preserves the character set and collation of an even when altering it.
test.tprintf("Checking event handling with non-default charset and collation.");
const char def_charset[] = "latin1";
const char def_collation[] = "latin1_swedish_ci";
expect_event_charset_collation(test, EVENT_NAME, def_charset, def_collation, def_collation);
if (test.ok())
{
// Alter event charset to utf8.
const char new_charset[] = "utf8mb4";
const char new_collation[] = "utf8mb4_estonian_ci";
auto conn = test.repl->nodes[0];
test.try_query(conn, "SET NAMES %s COLLATE %s; ALTER EVENT %s ENABLE;",
new_charset, new_collation, EVENT_NAME);
check_event_status(test, server1_ind, EVENT_NAME, EV_STATE_ENABLED);
expect_event_charset_collation(test, EVENT_NAME, new_charset, new_collation, def_collation);
if (test.ok())
{
switchover(test, server2_name);
if (test.ok())
{
check_event_status(test, server2_ind, EVENT_NAME, EV_STATE_ENABLED);
expect_event_charset_collation(test, EVENT_NAME, new_charset, new_collation,
def_collation);
}
// Switchover back.
switchover(test, server1_name);
}
}
}
try_delete_event(test);
if (test.global_result != 0)
{
@ -323,3 +364,36 @@ int main(int argc, char** argv)
}
return test.global_result;
}
void expect_event_charset_collation(TestConnections& test, const string& event_name,
const string& client_charset, const string& collation_connection,
const string& database_collation)
{
auto conn = test.maxscales->rwsplit();
conn.connect();
string query = string_printf("select CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION "
"from information_schema.EVENTS where EVENT_NAME = '%s';",
event_name.c_str());
Row row = conn.row(query);
if (!row.empty())
{
string& found_charset = row[0];
string& found_collation = row[1];
string& found_dbcoll = row[2];
test.tprintf("Event '%s': CHARACTER_SET_CLIENT is '%s', COLLATION_CONNECTION is '%s', "
"DATABASE_COLLATION is '%s'",
EVENT_NAME, found_charset.c_str(), found_collation.c_str(), found_dbcoll.c_str());
const char error_fmt[] = "Wrong %s. Found %s, expected %s.";
test.expect(found_charset == client_charset, error_fmt, "CHARACTER_SET_CLIENT",
found_charset.c_str(), client_charset.c_str());
test.expect(found_collation == collation_connection, error_fmt, "COLLATION_CONNECTION",
found_collation.c_str(), collation_connection.c_str());
test.expect(found_dbcoll == database_collation, error_fmt, "DATABASE_COLLATION",
found_dbcoll.c_str(), database_collation.c_str());
}
else
{
test.expect(false, "Query '%s' failed.", query.c_str());
}
}