106 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <maxscale/cdefs.h>
 | |
| 
 | |
| #include "../mariadbclient/mysql_client.cc"
 | |
| 
 | |
| #define NO_THREAD_ID 0
 | |
| 
 | |
| int test_one_query(const char *query, bool should_succeed, uint64_t expected_tid,
 | |
|                    int expected_kt, std::string expected_user)
 | |
| {
 | |
|     char *query_copy = MXS_STRDUP_A(query);
 | |
|     uint64_t result_tid = 1111111;
 | |
|     kill_type_t result_kt = KT_QUERY;
 | |
|     std::string user;
 | |
| 
 | |
|     /* If the parse fails, these should remain unchanged */
 | |
|     if (!should_succeed)
 | |
|     {
 | |
|         result_tid = expected_tid;
 | |
|         result_kt = (kill_type_t)expected_kt;
 | |
|     }
 | |
|     bool success = parse_kill_query(query_copy, &result_tid, &result_kt, &user);
 | |
|     MXS_FREE(query_copy);
 | |
| 
 | |
|     if (success == should_succeed && result_tid == expected_tid &&
 | |
|         result_kt == expected_kt && expected_user == user)
 | |
|     {
 | |
|         return 0;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         printf("Result wrong on query: '%s'.\n", query);
 | |
|         if (success != should_succeed)
 | |
|         {
 | |
|             printf("Expected success '%d', got '%d'.\n", should_succeed, success);
 | |
|         }
 | |
|         if (result_tid != expected_tid)
 | |
|         {
 | |
|             printf("Expected thread id '%" PRIu64 "', got '%" PRIu64 "'.\n", expected_tid, result_tid);
 | |
|         }
 | |
|         if (result_kt != expected_kt)
 | |
|         {
 | |
|             printf("Expected kill type '%u', got '%u'.\n", expected_kt, result_kt);
 | |
|         }
 | |
|         if (expected_user != user)
 | |
|         {
 | |
|             printf("Expected user '%s', got '%s'.\n", expected_user.c_str(), user.c_str());
 | |
|         }
 | |
|         printf("\n");
 | |
|         return 1;
 | |
|     }
 | |
| }
 | |
| typedef struct test_t
 | |
| {
 | |
|     const char *query;
 | |
|     bool should_succeed;
 | |
|     uint64_t correct_id;
 | |
|     int correct_kt;
 | |
|     const char* correct_user;
 | |
| } test_t;
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|     test_t tests[] =
 | |
|     {
 | |
|         {" kill ConNectioN 123  ",        true, 123, KT_CONNECTION},
 | |
|         {"kIlL  coNNectioN 987654321  ;", true, 987654321, KT_CONNECTION},
 | |
|         {" Ki5L CoNNectioN 987654321  ",  false, 0, KT_CONNECTION},
 | |
|         {"1",                             false, 0, KT_CONNECTION},
 | |
|         {"kILL 1",                        true, 1, KT_CONNECTION},
 | |
|         {"\n\t kill \nQueRy 456",         true, 456, KT_QUERY},
 | |
|         {"     A         kill 1;     ",   false, 0, KT_CONNECTION},
 | |
|         {" kill connection 1A",           false, 0, KT_CONNECTION},
 | |
|         {" kill connection 1 A ",         false, 0, KT_CONNECTION},
 | |
|         {"kill query 7 ; select * ",      false, 0, KT_CONNECTION},
 | |
|         {"KIll query 12345678901234567890", false, 0, KT_QUERY}, // 32-bit integer overflow
 | |
|         {"KIll query   \t    \n    \t   21  \n \t   ", true, 21, KT_QUERY},
 | |
|         {"KIll   \t    \n    \t   -6  \n \t   ",       false, 0, KT_CONNECTION},
 | |
|         {"KIll 12345678901234567890123456  \n \t   ",  false, 0, KT_CONNECTION},
 | |
|         {"kill ;", false, 0, KT_QUERY},
 | |
|         {" kill ConNectioN 123 HARD",        false, 123, KT_CONNECTION},
 | |
|         {" kill ConNectioN 123 SOFT",        false, 123, KT_CONNECTION},
 | |
|         {" kill ConNectioN SOFT 123",        false, 123, KT_CONNECTION},
 | |
|         {" kill  HARD ConNectioN 123",       true,  123, KT_CONNECTION | KT_HARD},
 | |
|         {" kill  SOFT ConNectioN 123",       true,  123, KT_CONNECTION | KT_SOFT},
 | |
|         {" kill  HARD 123",                  true,  123, KT_CONNECTION | KT_HARD},
 | |
|         {" kill  SOFT 123",                  true,  123, KT_CONNECTION | KT_SOFT},
 | |
|         {"KIll soft query 21 ",              true, 21, KT_QUERY | KT_SOFT},
 | |
|         {"KIll query soft 21 ",              false, 21, KT_QUERY},
 | |
|         {"KIll query user maxuser ",         true, NO_THREAD_ID, KT_QUERY, "maxuser"},
 | |
|         {"KIll user query  maxuser ",        false, NO_THREAD_ID, KT_QUERY}
 | |
|     };
 | |
|     int result = 0;
 | |
|     int arr_size = sizeof(tests) / sizeof(test_t);
 | |
|     for (int i = 0; i < arr_size; i++)
 | |
|     {
 | |
|         const char *query = tests[i].query;
 | |
|         bool should_succeed = tests[i].should_succeed;
 | |
|         uint64_t expected_tid = tests[i].correct_id;
 | |
|         int expected_kt = tests[i].correct_kt;
 | |
|         std::string expected_user = tests[i].correct_user ? tests[i].correct_user : "";
 | |
|         result += test_one_query(query, should_succeed, expected_tid,
 | |
|                                  expected_kt, expected_user);
 | |
|     }
 | |
|     return result;
 | |
| }
 | 
