110 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * MXS-2300: Session command history pruning
 | 
						|
 */
 | 
						|
 | 
						|
#include <maxtest/testconnections.hh>
 | 
						|
#include <sstream>
 | 
						|
 | 
						|
std::vector<int> ids;
 | 
						|
 | 
						|
void block_by_id(TestConnections& test, int id)
 | 
						|
{
 | 
						|
    for (size_t i = 0; i < ids.size(); i++)
 | 
						|
    {
 | 
						|
        if (ids[i] == id)
 | 
						|
        {
 | 
						|
            test.repl->block_node(i);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void unblock_by_id(TestConnections& test, int id)
 | 
						|
{
 | 
						|
    for (size_t i = 0; i < ids.size(); i++)
 | 
						|
    {
 | 
						|
        if (ids[i] == id)
 | 
						|
        {
 | 
						|
            test.repl->unblock_node(i);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char** argv)
 | 
						|
{
 | 
						|
    TestConnections test(argc, argv);
 | 
						|
 | 
						|
    test.repl->connect();
 | 
						|
    ids = test.repl->get_all_server_ids();
 | 
						|
    test.repl->disconnect();
 | 
						|
 | 
						|
    int master_id = test.get_master_server_id();
 | 
						|
    Connection conn = test.maxscales->rwsplit();
 | 
						|
    test.expect(conn.connect(), "Connection failed: %s", conn.error());
 | 
						|
 | 
						|
    test.tprintf("Get the ID of the server we first start with");
 | 
						|
    int first_id = std::stoi(conn.field("SELECT @@server_id"));
 | 
						|
 | 
						|
    test.tprintf("The history size is set to 10 commands, execute five and check that they are retained");
 | 
						|
    for (int i = 0; i < 5; i++)
 | 
						|
    {
 | 
						|
        std::stringstream query;
 | 
						|
        query << "SET @a" << i << " = " << i;
 | 
						|
        conn.query(query.str());
 | 
						|
    }
 | 
						|
 | 
						|
    block_by_id(test, first_id);
 | 
						|
    test.maxscales->wait_for_monitor();
 | 
						|
 | 
						|
    int second_id = std::stoi(conn.field("SELECT @@server_id"));
 | 
						|
 | 
						|
    test.tprintf("Make sure that a reconnection actually took place");
 | 
						|
    test.expect(first_id != second_id && second_id > 0, "Invalid server ID: %d", second_id);
 | 
						|
    test.expect(master_id != second_id, "SELECT should not go to the master");
 | 
						|
 | 
						|
    test.tprintf("Check that the values were correctly set");
 | 
						|
    for (int i = 0; i < 5; i++)
 | 
						|
    {
 | 
						|
        std::string value = std::to_string(i);
 | 
						|
        std::string query = "SELECT @a" + value;
 | 
						|
        test.expect(conn.check(query, value), "Invalid value for user variable @a%s", value.c_str());
 | 
						|
    }
 | 
						|
 | 
						|
    unblock_by_id(test, first_id);
 | 
						|
 | 
						|
    test.tprintf("Execute 15 commands and check that we lose the first five values");
 | 
						|
    for (int i = 0; i < 15; i++)
 | 
						|
    {
 | 
						|
        std::stringstream query;
 | 
						|
        query << "SET @b" << i << " =" << i;
 | 
						|
        conn.query(query.str());
 | 
						|
    }
 | 
						|
 | 
						|
    block_by_id(test, second_id);
 | 
						|
    test.maxscales->wait_for_monitor();
 | 
						|
 | 
						|
    int third_id = std::stoi(conn.field("SELECT @@server_id"));
 | 
						|
 | 
						|
    test.expect(third_id != second_id && third_id > 0, "Invalid server ID: %d", third_id);
 | 
						|
    test.expect(master_id != third_id, "SELECT should not go to the master");
 | 
						|
 | 
						|
    for (int i = 0; i < 5; i++)
 | 
						|
    {
 | 
						|
        std::string variable = "@b" + std::to_string(i);
 | 
						|
        std::string query = "SELECT IFNULL(" + variable + ", '" + variable + " is null')";
 | 
						|
        test.expect(conn.check(query, variable + " is null"), "%s should not be set", variable.c_str());
 | 
						|
    }
 | 
						|
 | 
						|
    test.tprintf("Check that the remaining values were correctly set");
 | 
						|
    for (int i = 5; i < 15; i++)
 | 
						|
    {
 | 
						|
        std::string value = std::to_string(i);
 | 
						|
        std::string query = "SELECT @b" + value;
 | 
						|
        std::string f = conn.field(query);
 | 
						|
        test.expect(conn.check(query, value), "Invalid value for user variable @b%s: %s", value.c_str(), f.c_str());
 | 
						|
    }
 | 
						|
 | 
						|
    unblock_by_id(test, second_id);
 | 
						|
 | 
						|
    return test.global_result;
 | 
						|
}
 |