Files
oceanbase/unittest/observer/table/test_table_audit.cpp
2024-09-20 07:38:41 +00:00

832 lines
30 KiB
C++

/**
* Copyright (c) 2024 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 <gtest/gtest.h>
#define private public // 获取private成员
#define protected public // 获取protect成员
#include "share/table/ob_table.h"
#include "observer/table/ob_table_filter.h"
using namespace oceanbase::common;
using namespace oceanbase::table;
using namespace oceanbase::sql;
using namespace oceanbase::share;
using namespace oceanbase::observer;
using namespace oceanbase::table::hfilter;
using namespace oceanbase::sql::stmt;
class TestTableAudit: public ::testing::Test
{
public:
TestTableAudit();
virtual ~TestTableAudit() {}
virtual void SetUp();
virtual void TearDown();
public:
template<typename... Args>
void construct_prop_names(const char *col, Args... args);
void construct_prop_names(){}
template<typename... Args>
void construct_select_names(const char *col, Args... args);
void construct_select_names(){}
template<typename... Args>
void construct_range_names(const char *col, Args... args);
void construct_range_names(){}
private:
ObTableEntity entity_;
ObTableQuery query_;
private:
// disallow copy
DISALLOW_COPY_AND_ASSIGN(TestTableAudit);
};
TestTableAudit::TestTableAudit()
{
}
void TestTableAudit::SetUp()
{
}
void TestTableAudit::TearDown()
{
entity_.reset();
query_.reset();
}
template<typename... Args>
void TestTableAudit::construct_prop_names(const char *col, Args... args) {
entity_.properties_names_.push_back(ObString::make_string(col));
construct_prop_names(args...);
}
template<typename... Args>
void TestTableAudit::construct_select_names(const char *col, Args... args) {
query_.select_columns_.push_back(ObString::make_string(col));
construct_select_names(args...);
}
template<typename... Args>
void TestTableAudit::construct_range_names(const char *col, Args... args) {
query_.scan_range_columns_.push_back(ObString::make_string(col));
construct_range_names(args...);
}
// 测试:表名为空
TEST_F(TestTableAudit, singleOpStmt1)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_empty_string();
ObTableOperation op;
op.entity_ = &entity_;
op.operation_type_ = ObTableOperationType::INSERT;
construct_prop_names("c1", "c2", "c3");
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "insert (null) \"c1\", \"c2\", \"c3\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
}
// 测试:列名为空
TEST_F(TestTableAudit, singleOpStmt2)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
ObTableOperation op;
op.entity_ = &entity_;
op.operation_type_ = ObTableOperationType::INSERT;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "insert test ";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
}
// 测试:buf为空
TEST_F(TestTableAudit, singleOpStmt3)
{
const int64_t buf_len = 128;
char *buf = nullptr;
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
ObTableOperation op;
op.entity_ = &entity_;
op.operation_type_ = ObTableOperationType::INSERT;
ASSERT_EQ(OB_INVALID_ARGUMENT, op.generate_stmt(table_name, buf, buf_len, pos));
ASSERT_EQ(0, pos);
}
// 测试:buf长度不足
TEST_F(TestTableAudit, singleOpStmt4)
{
const int64_t buf_len = 1;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
ObTableOperation op;
op.entity_ = &entity_;
op.operation_type_ = ObTableOperationType::INSERT;
ASSERT_EQ(OB_BUF_NOT_ENOUGH, op.generate_stmt(table_name, buf, buf_len, pos));
ASSERT_EQ(0, pos);
const int64_t buf_len2 = 10;
char buf2[buf_len2] = {0};
pos = 0;
ASSERT_EQ(OB_BUF_NOT_ENOUGH, op.generate_stmt(table_name, buf2, buf_len2, pos));
}
// 测试:操作类型
TEST_F(TestTableAudit, singleOpStmt5)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
ObTableOperation op;
op.entity_ = &entity_;
// get
op.operation_type_ = ObTableOperationType::GET;
construct_prop_names("c1");
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "get test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// insert
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::INSERT;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "insert test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// delete
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::DEL;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "delete test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// update
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::UPDATE;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "update test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// insertOrUpdate
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::INSERT_OR_UPDATE;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "insertOrUpdate test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// replace
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::REPLACE;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "replace test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// increment
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::INCREMENT;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "increment test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// append
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::APPEND;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "append test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// checkAndInsertUp
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::CHECK_AND_INSERT_UP;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "checkAndInsertUp test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// put
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::PUT;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "put test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// unknown
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::TTL;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "unknown test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// unknown
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::SCAN;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "unknown test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// unknown
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::TRIGGER;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "unknown test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
// unknown
MEMSET(buf, 0, buf_len);
pos = 0;
op.operation_type_ = ObTableOperationType::INVALID;
ASSERT_EQ(OB_SUCCESS, op.generate_stmt(table_name, buf, buf_len, pos));
result = "unknown test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(op.get_stmt_length(table_name), pos);
}
// 测试:表名为空
TEST_F(TestTableAudit, queryStmt1)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_empty_string();
construct_select_names("c1", "c2", "c3");
construct_range_names("c1", "c2", "c3");
query_.index_name_ = ObString::make_string("idx");
ASSERT_EQ(OB_SUCCESS, query_.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "query (null) \"c1\", \"c2\", \"c3\" range:\"c1\", \"c2\", \"c3\" index:idx";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(query_.get_stmt_length(table_name), pos);
}
// 测试:select column为空
TEST_F(TestTableAudit, queryStmt2)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
query_.index_name_ = ObString::make_string("idx");
construct_range_names("c1", "c2", "c3");
ASSERT_EQ(OB_SUCCESS, query_.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "query test range:\"c1\", \"c2\", \"c3\" index:idx";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(query_.get_stmt_length(table_name), pos);
}
// 测试:scan column为空
TEST_F(TestTableAudit, queryStmt3)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
query_.index_name_ = ObString::make_string("idx");
construct_select_names("c1", "c2", "c3");
ASSERT_EQ(OB_SUCCESS, query_.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "query test \"c1\", \"c2\", \"c3\" range: index:idx";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(query_.get_stmt_length(table_name), pos);
}
// 测试:scan column为空
TEST_F(TestTableAudit, queryStmt4)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
query_.index_name_ = ObString::make_string("idx");
construct_select_names("c1", "c2", "c3");
ASSERT_EQ(OB_SUCCESS, query_.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "query test \"c1\", \"c2\", \"c3\" range: index:idx";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(query_.get_stmt_length(table_name), pos);
}
// 测试:index name为空
TEST_F(TestTableAudit, queryStmt5)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
construct_select_names("c1", "c2", "c3");
construct_range_names("c1", "c2", "c3");
ASSERT_EQ(OB_SUCCESS, query_.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "query test \"c1\", \"c2\", \"c3\" range:\"c1\", \"c2\", \"c3\" index:(null)";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(query_.get_stmt_length(table_name), pos);
}
// 测试:buf为空
TEST_F(TestTableAudit, queryStmt6)
{
const int64_t buf_len = 128;
char *buf = nullptr;
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
query_.index_name_ = ObString::make_string("idx");
construct_select_names("c1", "c2", "c3");
construct_range_names("c1", "c2", "c3");
ASSERT_EQ(OB_INVALID_ARGUMENT, query_.generate_stmt(table_name, buf, buf_len, pos));
ASSERT_EQ(0, pos);
}
// 测试:buf长度不足
TEST_F(TestTableAudit, queryStmt7)
{
const int64_t buf_len = 1;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
query_.index_name_ = ObString::make_string("idx");
construct_select_names("c1", "c2", "c3");
construct_range_names("c1", "c2", "c3");
ASSERT_EQ(OB_BUF_NOT_ENOUGH, query_.generate_stmt(table_name, buf, buf_len, pos));
ASSERT_EQ(0, pos);
const int64_t buf_len2 = 10;
char buf2[buf_len2] = {0};
pos = 0;
ASSERT_EQ(OB_BUF_NOT_ENOUGH, query_.generate_stmt(table_name, buf2, buf_len2, pos));
const int64_t buf_len3 = 30;
char buf3[buf_len3] = {0};
pos = 0;
ASSERT_EQ(OB_BUF_NOT_ENOUGH, query_.generate_stmt(table_name, buf3, buf_len3, pos));
const int64_t buf_len4 = 30;
char buf4[buf_len4] = {0};
pos = 0;
ASSERT_EQ(OB_BUF_NOT_ENOUGH, query_.generate_stmt(table_name, buf4, buf_len4, pos));
}
// 测试:get_compare_op_name
TEST_F(TestTableAudit, get_compare_op_name)
{
ASSERT_STRCASEEQ("EQUAL", FilterUtils::get_compare_op_name(CompareOperator::EQUAL));
ASSERT_STRCASEEQ("GREATER", FilterUtils::get_compare_op_name(CompareOperator::GREATER));
ASSERT_STRCASEEQ("GREATER_OR_EQUAL", FilterUtils::get_compare_op_name(CompareOperator::GREATER_OR_EQUAL));
ASSERT_STRCASEEQ("LESS", FilterUtils::get_compare_op_name(CompareOperator::LESS));
ASSERT_STRCASEEQ("LESS_OR_EQUAL", FilterUtils::get_compare_op_name(CompareOperator::LESS_OR_EQUAL));
ASSERT_STRCASEEQ("NO_OP", FilterUtils::get_compare_op_name(CompareOperator::NO_OP));
ASSERT_STRCASEEQ("NOT_EQUAL", FilterUtils::get_compare_op_name(CompareOperator::NOT_EQUAL));
ASSERT_STRCASEEQ("IS", FilterUtils::get_compare_op_name(CompareOperator::IS));
ASSERT_STRCASEEQ("IS_NOT", FilterUtils::get_compare_op_name(CompareOperator::IS_NOT));
}
// 测试:RowFilter
TEST_F(TestTableAudit, RowFilter)
{
Comparable cmp(ObString::make_string("hello"));
RowFilter filter(CompareOperator::EQUAL, &cmp);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "RowFilter EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:QualifierFilter
TEST_F(TestTableAudit, QualifierFilter)
{
Comparable cmp(ObString::make_string("hello"));
QualifierFilter filter(CompareOperator::EQUAL, &cmp);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "QualifierFilter EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:ValueFilter
TEST_F(TestTableAudit, ValueFilter)
{
Comparable cmp(ObString::make_string("hello"));
ValueFilter filter(CompareOperator::EQUAL, &cmp);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "ValueFilter EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:FilterList
TEST_F(TestTableAudit, FilterList)
{
Comparable cmp(ObString::make_string("hello"));
ValueFilter vfilter1(CompareOperator::EQUAL, &cmp);
ValueFilter vfilter2(CompareOperator::GREATER, &cmp);
// FilterListAND
FilterListAND and_filter(FilterListBase::Operator::MUST_PASS_ALL);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, and_filter.filters_.push_back(&vfilter1));
ASSERT_EQ(OB_SUCCESS, and_filter.filters_.push_back(&vfilter2));
ASSERT_EQ(OB_SUCCESS, and_filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "FilterListAND AND ValueFilter EQUAL, ValueFilter GREATER";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(and_filter.get_format_filter_string_length(), pos);
// FilterListOR
FilterListOR or_filter(FilterListBase::Operator::MUST_PASS_ALL);
pos = 0;
ASSERT_EQ(OB_SUCCESS, or_filter.filters_.push_back(&vfilter1));
ASSERT_EQ(OB_SUCCESS, or_filter.filters_.push_back(&vfilter2));
ASSERT_EQ(OB_SUCCESS, or_filter.get_format_filter_string(buf, buf_len, pos));
result = "FilterListOR AND ValueFilter EQUAL, ValueFilter GREATER";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(or_filter.get_format_filter_string_length(), pos);
// ObTableFilterListAnd
ObTableFilterListAnd tb_and_filter(FilterListBase::Operator::MUST_PASS_ALL);
pos = 0;
ASSERT_EQ(OB_SUCCESS, tb_and_filter.filters_.push_back(&vfilter1));
ASSERT_EQ(OB_SUCCESS, tb_and_filter.filters_.push_back(&vfilter2));
ASSERT_EQ(OB_SUCCESS, tb_and_filter.get_format_filter_string(buf, buf_len, pos));
result = "ObTableFilterListAnd AND ValueFilter EQUAL, ValueFilter GREATER";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(tb_and_filter.get_format_filter_string_length(), pos);
// ObTableFilterListOr
ObTableFilterListOr tb_or_filter(FilterListBase::Operator::MUST_PASS_ALL);
pos = 0;
ASSERT_EQ(OB_SUCCESS, tb_or_filter.filters_.push_back(&vfilter1));
ASSERT_EQ(OB_SUCCESS, tb_or_filter.filters_.push_back(&vfilter2));
ASSERT_EQ(OB_SUCCESS, tb_or_filter.get_format_filter_string(buf, buf_len, pos));
result = "ObTableFilterListOr AND ValueFilter EQUAL, ValueFilter GREATER";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(tb_or_filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, tb_or_filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, tb_or_filter.get_format_filter_string(buf, 0, pos));
}
// 测试:SkipFilter
TEST_F(TestTableAudit, SkipFilter)
{
SkipFilter filter(nullptr);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "SkipFilter ";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
MEMSET(buf, 0, buf_len);
pos = 0;
Comparable cmp(ObString::make_string("hello"));
ValueFilter vfilter(CompareOperator::EQUAL, &cmp);
filter.filter_ = &vfilter;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
result = "SkipFilter ValueFilter EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:WhileMatchFilter
TEST_F(TestTableAudit, WhileMatchFilter)
{
WhileMatchFilter filter(nullptr);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "WhileMatchFilter ";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
MEMSET(buf, 0, buf_len);
pos = 0;
Comparable cmp(ObString::make_string("hello"));
ValueFilter vfilter(CompareOperator::EQUAL, &cmp);
filter.filter_ = &vfilter;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
result = "WhileMatchFilter ValueFilter EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:SingleColumnValueFilter
TEST_F(TestTableAudit, SingleColumnValueFilter)
{
ObString family = ObString::make_string("family1");
ObString qualifier = ObString::make_string("qualifier1");
Comparable cmp(ObString::make_string("hello"));
SingleColumnValueFilter filter(family, qualifier, CompareOperator::EQUAL, &cmp);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "SingleColumnValueFilter family1 qualifier1 EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:PageFilter
TEST_F(TestTableAudit, PageFilter)
{
PageFilter filter(1);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "PageFilter";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:ColumnCountGetFilter
TEST_F(TestTableAudit, ColumnCountGetFilter)
{
ColumnCountGetFilter filter(1);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "ColumnCountGetFilter";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:CheckAndMutateFilter
TEST_F(TestTableAudit, CheckAndMutateFilter)
{
ObString family = ObString::make_string("family1");
ObString qualifier = ObString::make_string("qualifier1");
Comparable cmp(ObString::make_string("hello"));
CheckAndMutateFilter filter(family, qualifier, CompareOperator::EQUAL, &cmp, false);
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "CheckAndMutateFilter family1 qualifier1 EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试:ObTableCompareFilter
TEST_F(TestTableAudit, ObTableCompareFilter)
{
Comparable cmp(ObString::make_string("hello"));
ObTableCompareFilter filter(CompareOperator::EQUAL, &cmp);
ObTableComparator comparator(ObString::make_string("c1"), ObString::make_string("hello"));
filter.comparator_ = &comparator;
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ASSERT_EQ(OB_SUCCESS, filter.get_format_filter_string(buf, buf_len, pos));
const char *result = "ObTableCompareFilter c1 EQUAL";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(filter.get_format_filter_string_length(), pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, filter.get_format_filter_string(nullptr, buf_len, pos));
ASSERT_EQ(OB_BUF_NOT_ENOUGH, filter.get_format_filter_string(buf, 0, pos));
}
// 测试: ObTableAuditUtils
TEST_F(TestTableAudit, ObTableAuditUtils)
{
ASSERT_EQ(StmtType::T_KV_GET, ObTableAuditUtils::get_stmt_type(ObTableOperationType::GET));
ASSERT_EQ(StmtType::T_KV_INSERT, ObTableAuditUtils::get_stmt_type(ObTableOperationType::INSERT));
ASSERT_EQ(StmtType::T_KV_DELETE, ObTableAuditUtils::get_stmt_type(ObTableOperationType::DEL));
ASSERT_EQ(StmtType::T_KV_UPDATE, ObTableAuditUtils::get_stmt_type(ObTableOperationType::UPDATE));
ASSERT_EQ(StmtType::T_KV_INSERT_OR_UPDATE, ObTableAuditUtils::get_stmt_type(ObTableOperationType::INSERT_OR_UPDATE));
ASSERT_EQ(StmtType::T_KV_REPLACE, ObTableAuditUtils::get_stmt_type(ObTableOperationType::REPLACE));
ASSERT_EQ(StmtType::T_KV_INCREMENT, ObTableAuditUtils::get_stmt_type(ObTableOperationType::INCREMENT));
ASSERT_EQ(StmtType::T_KV_APPEND, ObTableAuditUtils::get_stmt_type(ObTableOperationType::APPEND));
ASSERT_EQ(StmtType::T_KV_PUT, ObTableAuditUtils::get_stmt_type(ObTableOperationType::PUT));
ASSERT_EQ(StmtType::T_MAX, ObTableAuditUtils::get_stmt_type((ObTableOperationType::Type)-1)); // Test for invalid input
}
// 测试: ObTableAuditMultiOp
TEST_F(TestTableAudit, ObTableAuditMultiOp)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObTableOperationType::Type op_type = ObTableOperationType::Type::INSERT;
ObSEArray<ObTableOperation, 8> ops;
ObTableAuditMultiOp multi_op(op_type, ops);
// test1: empty table name
ObString table_name = ObString::make_empty_string();
ASSERT_EQ(OB_SUCCESS, multi_op.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "multi insert (null) ";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(multi_op.get_stmt_length(table_name), pos);
// test2: unknow operation type
MEMSET(buf, 0, buf_len);
pos = 0;
table_name = ObString::make_string("test");
multi_op.op_type_ = (ObTableOperationType::Type) - 1;
table_name = ObString::make_empty_string();
ASSERT_EQ(OB_SUCCESS, multi_op.generate_stmt(table_name, buf, buf_len, pos));
result = "multi unknown (null) ";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(multi_op.get_stmt_length(table_name), pos);
// test3: empty prop name
MEMSET(buf, 0, buf_len);
pos = 0;
ObTableOperation op;
op.set_type(op_type);
op.set_entity(entity_);
ASSERT_EQ(OB_SUCCESS, ops.push_back(op));
table_name = ObString::make_string("test");
multi_op.op_type_ = ObTableOperationType::Type::INSERT;
ASSERT_EQ(OB_SUCCESS, multi_op.generate_stmt(table_name, buf, buf_len, pos));
result = "multi insert test ";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(multi_op.get_stmt_length(table_name), pos);
// test4: one prop name
MEMSET(buf, 0, buf_len);
pos = 0;
ops.reset();
construct_prop_names("c1");
ASSERT_EQ(OB_SUCCESS, ops.push_back(op));
table_name = ObString::make_string("test");
multi_op.op_type_ = ObTableOperationType::Type::INSERT;
ASSERT_EQ(OB_SUCCESS, multi_op.generate_stmt(table_name, buf, buf_len, pos));
result = "multi insert test \"c1\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(multi_op.get_stmt_length(table_name), pos);
// test5: three prop name
MEMSET(buf, 0, buf_len);
pos = 0;
ops.reset();
entity_.reset();
construct_prop_names("c1", "c2", "c3");
ASSERT_EQ(OB_SUCCESS, ops.push_back(op));
table_name = ObString::make_string("test");
multi_op.op_type_ = ObTableOperationType::Type::INSERT;
ASSERT_EQ(OB_SUCCESS, multi_op.generate_stmt(table_name, buf, buf_len, pos));
result = "multi insert test \"c1\", \"c2\", \"c3\"";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(multi_op.get_stmt_length(table_name), pos);
// test6: buf not enough
ASSERT_EQ(OB_BUF_NOT_ENOUGH, multi_op.generate_stmt(table_name, buf, 0, pos));
// test7: buf is null
ASSERT_EQ(OB_INVALID_ARGUMENT, multi_op.generate_stmt(table_name, nullptr, buf_len, pos));
// test8: bug length too short
ASSERT_EQ(OB_BUF_NOT_ENOUGH, multi_op.generate_stmt(table_name, buf, 7, pos));
}
// 测试: ObTableAuditRedisOp
TEST_F(TestTableAudit, ObTableAuditRedisOp)
{
const int64_t buf_len = 128;
char buf[buf_len] = {0};
int64_t pos = 0;
ObString table_name = ObString::make_string("test");
ObString cmd_name = ObString::make_string("set");
ObTableAuditRedisOp redis_op(cmd_name);
// test1: empty table name
table_name = ObString::make_empty_string();
ASSERT_EQ(OB_SUCCESS, redis_op.generate_stmt(table_name, buf, buf_len, pos));
const char *result = "set";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(redis_op.get_stmt_length(table_name), pos);
// test2: empty cmd name
MEMSET(buf, 0, buf_len);
pos = 0;
cmd_name = ObString::make_empty_string();
ObTableAuditRedisOp redis_op1(cmd_name);
ASSERT_EQ(OB_SUCCESS, redis_op.generate_stmt(table_name, buf, buf_len, pos));
result = "(null)";
ASSERT_STRCASEEQ(result, buf);
ASSERT_EQ(strlen(result), pos);
ASSERT_EQ(redis_op.get_stmt_length(table_name), pos);
// test3: buf not enough
ASSERT_EQ(OB_BUF_NOT_ENOUGH, redis_op.generate_stmt(table_name, buf, 0, pos));
// test4: buf is null
ASSERT_EQ(OB_INVALID_ARGUMENT, redis_op.generate_stmt(table_name, nullptr, buf_len, pos));
// test5: bug length too short
ASSERT_EQ(OB_BUF_NOT_ENOUGH, redis_op.generate_stmt(table_name, buf, 7, pos));
}
int main(int argc, char **argv)
{
OB_LOGGER.set_log_level("INFO");
OB_LOGGER.set_file_name("test_table_audit.log", true);
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}