Add MariaDBMonitor Gtid unit test
Tests the class with different inputs. Also fixes a bug found by the test.
This commit is contained in:
		@ -139,6 +139,16 @@ uint64_t GtidList::events_ahead(const GtidList& rhs, substraction_mode_t domain_
 | 
				
			|||||||
            ind_rhs++;
 | 
					            ind_rhs++;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // If LHS has domains with higher id:s than at RHS, those domains need to be iterated here.
 | 
				
			||||||
 | 
					    // This only affects the result if the LHS_ADD-mode is used.
 | 
				
			||||||
 | 
					    if (domain_substraction_mode == MISSING_DOMAIN_LHS_ADD)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        for (; ind_lhs < n_lhs; ind_lhs++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            events += m_triplets[ind_lhs].m_sequence;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    return events;
 | 
					    return events;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,7 @@
 | 
				
			|||||||
add_executable(test_cycle_find test_cycle_find.cc)
 | 
					add_executable(test_cycle_find test_cycle_find.cc)
 | 
				
			||||||
target_link_libraries(test_cycle_find mariadbmon maxscale-common)
 | 
					target_link_libraries(test_cycle_find mariadbmon maxscale-common)
 | 
				
			||||||
add_test(test_mariadbmon_cycle_find test_cycle_find)
 | 
					add_test(test_mariadbmon_cycle_find test_cycle_find)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_executable(test_gtid test_gtid.cc)
 | 
				
			||||||
 | 
					target_link_libraries(test_gtid mariadbmon maxscale-common)
 | 
				
			||||||
 | 
					add_test(test_mariadbmon_gtid test_gtid)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										123
									
								
								server/modules/monitor/mariadbmon/test/test_gtid.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								server/modules/monitor/mariadbmon/test/test_gtid.cc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,123 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2018 MariaDB Corporation Ab
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Use of this software is governed by the Business Source License included
 | 
				
			||||||
 | 
					 * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Change Date: 2022-01-01
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * On the date above, in accordance with the Business Source License, use
 | 
				
			||||||
 | 
					 * of this software will be governed by version 2 or later of the General
 | 
				
			||||||
 | 
					 * Public License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../gtid.hh"
 | 
				
			||||||
 | 
					#include "maxbase/log.hh"
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <maxbase/maxbase.hh>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using std::string;
 | 
				
			||||||
 | 
					using std::cout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Test parsing.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return Number of errors
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int test1()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct TestCase
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        string input;
 | 
				
			||||||
 | 
					        string result;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::vector<TestCase> cases = {
 | 
				
			||||||
 | 
					        {"0-1-1", "0-1-1"},
 | 
				
			||||||
 | 
					        {"4321-1234-4321", "4321-1234-4321"},
 | 
				
			||||||
 | 
					        {"blah", ""},
 | 
				
			||||||
 | 
					        {"1x2x3", ""},
 | 
				
			||||||
 | 
					        {"1-2-3-4", ""},
 | 
				
			||||||
 | 
					        {"45-54-123456789,0-1-2", "0-1-2,45-54-123456789"},
 | 
				
			||||||
 | 
					        {"1-1-1,2-2-2,287-234-134,9-9-9,7-7-7", "1-1-1,2-2-2,7-7-7,9-9-9,287-234-134"},
 | 
				
			||||||
 | 
					        {"1-1-1,3-3-3,a-b-c", ""},
 | 
				
			||||||
 | 
					        {"-2--2--2",""},
 | 
				
			||||||
 | 
					        {"2-2-i",""},
 | 
				
			||||||
 | 
					        {"2-i-2",""},
 | 
				
			||||||
 | 
					        {"i-2-2",""},
 | 
				
			||||||
 | 
					        {"1-1-1,",""},
 | 
				
			||||||
 | 
					        {"3-1-0,3-2-4", "3-1-0,3-2-4"}, // Invalid triplet, but this case is not detected by the parser.
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int errors = 0;
 | 
				
			||||||
 | 
					    for (auto& test_case : cases)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        string output = GtidList::from_string(test_case.input).to_string();
 | 
				
			||||||
 | 
					        if (output != test_case.result)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << "Wrong result: '" << test_case.input << "' produced '" << output << "' while '" <<
 | 
				
			||||||
 | 
					                    test_case.result << "' was expected.\n";
 | 
				
			||||||
 | 
					            errors++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return errors;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Test parsing + calculations
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return Number of errors
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int test2()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    using sub_mode = GtidList::substraction_mode_t;
 | 
				
			||||||
 | 
					    auto ignore = sub_mode::MISSING_DOMAIN_IGNORE;
 | 
				
			||||||
 | 
					    auto lhs_add = sub_mode::MISSING_DOMAIN_LHS_ADD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct TestCase
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        string input1;
 | 
				
			||||||
 | 
					        string input2;
 | 
				
			||||||
 | 
					        sub_mode mode;
 | 
				
			||||||
 | 
					        uint64_t result;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::vector<TestCase> cases = {
 | 
				
			||||||
 | 
					        {"1-2-3", "1-2-3", ignore, 0},
 | 
				
			||||||
 | 
					        {"1-2-3,2-3-4", "1-2-3", lhs_add, 4},
 | 
				
			||||||
 | 
					        {"1-2-3,2-3-4", "1-2-3", ignore, 0},
 | 
				
			||||||
 | 
					        {"3-2-1,4-3-2", "4-3-1,3-1-0", lhs_add, 2},
 | 
				
			||||||
 | 
					        {"1-2-3,2-2-4,3-2-5", "1-2-3", lhs_add, 9},
 | 
				
			||||||
 | 
					        {"1-1-1000000,2-2-2000000", "1-1-1,2-2-2", ignore, 2999997},
 | 
				
			||||||
 | 
					        {"4-4-4,7-4-7,5-4-5,6-4-6,", "1-4-1", lhs_add, 0},
 | 
				
			||||||
 | 
					        {"4-4-4,7-4-7,5-4-5,6-4-6", "1-4-1", lhs_add, 22},
 | 
				
			||||||
 | 
					        {"5-1-4,", "5-1-2", ignore, 0},
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int errors = 0;
 | 
				
			||||||
 | 
					    for (auto& test_case : cases)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        auto gtid1 = GtidList::from_string(test_case.input1);
 | 
				
			||||||
 | 
					        auto gtid2 = GtidList::from_string(test_case.input2);
 | 
				
			||||||
 | 
					        auto output = gtid1.events_ahead(gtid2, test_case.mode);
 | 
				
			||||||
 | 
					        if (output != test_case.result)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << "Wrong result: '" << test_case.input1 << "' and '" << test_case.input2 <<
 | 
				
			||||||
 | 
					                    "' produced '" << output << "' while '" << test_case.result << "' was expected.\n";
 | 
				
			||||||
 | 
					            errors++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return errors;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    maxbase::init();
 | 
				
			||||||
 | 
					    maxbase::Log log;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int result = 0;
 | 
				
			||||||
 | 
					    result += test1();
 | 
				
			||||||
 | 
					    result += test2();
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user