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;
 | |
| }
 | 
