260 lines
6.8 KiB
C++
260 lines
6.8 KiB
C++
/**
|
|
* Copyright (c) 2021 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#include <fnmatch.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "share/ob_define.h"
|
|
|
|
#include "logservice/libobcdc/src/ob_log_table_matcher.h"
|
|
|
|
|
|
using namespace oceanbase;
|
|
using namespace common;
|
|
using namespace libobcdc;
|
|
|
|
namespace oceanbase
|
|
{
|
|
namespace unittest
|
|
{
|
|
|
|
/*
|
|
* TEST1.
|
|
* Test fnmatch.
|
|
* Used to study fnmatch().
|
|
*/
|
|
/*
|
|
* Test Functions.
|
|
* fnmatch Prototype:
|
|
* int fnmatch(const char *pattern, const char *string, int flags);
|
|
*/
|
|
void CASE_MATCH(const char *pattern, const char *string, int flags = 0)
|
|
{
|
|
int err = fnmatch(pattern, string, flags);
|
|
EXPECT_EQ(0, err);
|
|
fprintf(stderr, ">>> %s: \t\"%s\" -> \"%s\"\n",
|
|
(0 == err) ? "MATCH" : "NOMATCH",
|
|
pattern, string);
|
|
}
|
|
|
|
void CASE_NOMATCH(const char *pattern, const char *string, int flags = 0)
|
|
{
|
|
int err = fnmatch(pattern, string, flags);
|
|
EXPECT_EQ(FNM_NOMATCH, err);
|
|
fprintf(stderr, ">>> %s: \t\"%s\" -> \"%s\"\n",
|
|
(0 == err) ? "MATCH" : "NOMATCH",
|
|
pattern, string);
|
|
}
|
|
TEST(DISABLED_TableMatcher, Fnmatch1)
|
|
{
|
|
CASE_MATCH("sky*", "SkyBlue", FNM_CASEFOLD);
|
|
CASE_NOMATCH("sky*[!e]", "SkyBlue", FNM_CASEFOLD);
|
|
CASE_MATCH("ab\\0c", "ab\\0c");
|
|
}
|
|
|
|
/*
|
|
* TEST2.
|
|
* Test TableMatcher.
|
|
*/
|
|
TEST(TableMatcher, BasicTest1)
|
|
{
|
|
int err = OB_SUCCESS;
|
|
ObLogTableMatcher matcher;
|
|
const char *tb_whilte_list="TN1.DB-A*.table_1*|"
|
|
"TN2.DB-A*.TABLE_2*|"
|
|
"tn3.db-a*.table_*_tmp";
|
|
const char *tb_black_list="|";
|
|
const char *tg_whilte_list="*.*";
|
|
const char *tg_black_list="|";
|
|
|
|
err = matcher.init(tb_whilte_list, tb_black_list, tg_whilte_list, tg_black_list);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
int flag = FNM_CASEFOLD;
|
|
|
|
// Test match.
|
|
bool matched = false;
|
|
err = matcher.table_match("tn1", "db-a-1", "table_1_1", matched, flag);
|
|
EXPECT_TRUE(matched);
|
|
|
|
err = matcher.table_match("tn1", "db-b-1", "table_1_1", matched, flag);
|
|
EXPECT_FALSE(matched);
|
|
|
|
err = matcher.table_match("tn3", "db-a-2", "table_1_tmp", matched, flag);
|
|
EXPECT_TRUE(matched);
|
|
|
|
matcher.destroy();
|
|
}
|
|
|
|
/*
|
|
* TEST3.
|
|
* Test TableMatcher static match.
|
|
*/
|
|
TEST(TableMatcher, BasicTest2)
|
|
{
|
|
int err = OB_SUCCESS;
|
|
const char *tb_whilte_list="*.*.*";
|
|
const char *tb_black_list="|";
|
|
const char *tg_whilte_list="*.*";
|
|
const char *tg_black_list="|";
|
|
|
|
ObLogTableMatcher matcher;
|
|
|
|
err = matcher.init(tb_whilte_list, tb_black_list, tg_whilte_list, tg_black_list);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
int flag = FNM_CASEFOLD;
|
|
|
|
// Case 1. Match.
|
|
{
|
|
const char *pattern1 = "tn1.db1*|tn2.db2*|tn3.db3*|tn4.db4*";
|
|
ObArray<ObString> pattern2;
|
|
err = pattern2.push_back(ObString("tn1.db1"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
err = pattern2.push_back(ObString("tnx.dbx"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
bool matched = false;
|
|
err = matcher.match(pattern1, pattern2, matched, flag);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
EXPECT_TRUE(matched);
|
|
}
|
|
|
|
// Case 2. No match.
|
|
{
|
|
const char *pattern1 = "tn1.db1*|tn2.db2*|tn3.db3*|tn4.db4*";
|
|
ObArray<ObString> pattern2;
|
|
err = pattern2.push_back(ObString("tnx.dbx"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
err = pattern2.push_back(ObString("tny.dby"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
bool matched = false;
|
|
err = matcher.match(pattern1, pattern2, matched, flag);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
EXPECT_FALSE(matched);
|
|
}
|
|
|
|
// Case 3. Empty pattern1.
|
|
{
|
|
const char *pattern1 = "";
|
|
ObArray<ObString> pattern2;
|
|
err = pattern2.push_back(ObString("tnx.dbx"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
err = pattern2.push_back(ObString("tny.dby"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
bool matched = false;
|
|
err = matcher.match(pattern1, pattern2, matched, flag);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
EXPECT_FALSE(matched);
|
|
}
|
|
|
|
// Case 4. Invalid pattern1.
|
|
{
|
|
const char *pattern1 = "|";
|
|
ObArray<ObString> pattern2;
|
|
err = pattern2.push_back(ObString("tnx.dbx"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
err = pattern2.push_back(ObString("tny.dby"));
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
bool matched = false;
|
|
err = matcher.match(pattern1, pattern2, matched, flag);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
EXPECT_FALSE(matched);
|
|
}
|
|
|
|
matcher.destroy();
|
|
}
|
|
|
|
// test tablegroup
|
|
TEST(TableMatcher, BasicTest3)
|
|
{
|
|
int err = OB_SUCCESS;
|
|
ObLogTableMatcher matcher;
|
|
const char *tb_whilte_list="*.*.*";
|
|
const char *tb_black_list="|";
|
|
const char *tg_whilte_list="tt1.alitg*";
|
|
const char *tg_black_list="|";
|
|
|
|
err = matcher.init(tb_whilte_list, tb_black_list, tg_whilte_list, tg_black_list);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
int flag = FNM_CASEFOLD;
|
|
|
|
// Test match.
|
|
bool matched = false;
|
|
err = matcher.tablegroup_match("tt1", "alitg1", matched, flag);
|
|
EXPECT_TRUE(matched);
|
|
|
|
err = matcher.tablegroup_match("tt1", "alitg2", matched, flag);
|
|
EXPECT_TRUE(matched);
|
|
|
|
err = matcher.tablegroup_match("tt1", "alipaytg", matched, flag);
|
|
EXPECT_FALSE(matched);
|
|
|
|
err = matcher.tablegroup_match("tt2", "alitg1", matched, flag);
|
|
EXPECT_FALSE(matched);
|
|
|
|
matcher.destroy();
|
|
}
|
|
|
|
TEST(TableMatcher, BasicTest4)
|
|
{
|
|
int err = OB_SUCCESS;
|
|
ObLogTableMatcher matcher;
|
|
const char *tb_whilte_list="*.*.*";
|
|
const char *tb_black_list="|";
|
|
const char *tg_whilte_list="tt1.alitg*|tt1.anttg*";
|
|
const char *tg_black_list="tt1.alitg*";
|
|
|
|
err = matcher.init(tb_whilte_list, tb_black_list, tg_whilte_list, tg_black_list);
|
|
EXPECT_EQ(OB_SUCCESS, err);
|
|
|
|
int flag = FNM_CASEFOLD;
|
|
// Whitelist matches, but blacklist does not
|
|
|
|
// Test match.
|
|
bool matched = false;
|
|
err = matcher.tablegroup_match("tt1", "alitg1", matched, flag);
|
|
EXPECT_FALSE(matched);
|
|
|
|
err = matcher.tablegroup_match("tt1", "alitg2", matched, flag);
|
|
EXPECT_FALSE(matched);
|
|
|
|
err = matcher.tablegroup_match("tt1", "anttg1", matched, flag);
|
|
EXPECT_TRUE(matched);
|
|
|
|
err = matcher.tablegroup_match("tt1", "anttghello", matched, flag);
|
|
EXPECT_TRUE(matched);
|
|
|
|
err = matcher.tablegroup_match("tt2", "anttghello", matched, flag);
|
|
EXPECT_FALSE(matched);
|
|
|
|
matcher.destroy();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
//ObLogger::get_logger().set_mod_log_levels("ALL.*:DEBUG, TLOG.*:DEBUG");
|
|
ObLogger &logger = ObLogger::get_logger();
|
|
logger.set_file_name("test_ob_log_table_match.log", true);
|
|
logger.set_log_level(OB_LOG_LEVEL_INFO);
|
|
testing::InitGoogleTest(&argc,argv);
|
|
// testing::FLAGS_gtest_filter = "DO_NOT_RUN";
|
|
return RUN_ALL_TESTS();
|
|
}
|