Files
oceanbase/unittest/logminer/test_ob_log_miner_args.cpp
2024-05-31 14:23:36 +08:00

1084 lines
32 KiB
C++

/**
* Copyright (c) 2023 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"
#include "lib/allocator/page_arena.h"
#include "lib/string/ob_string_buffer.h"
#include "ob_log_miner_args.h"
#include "lib/oblog/ob_log.h"
using namespace oceanbase;
namespace oceanbase
{
namespace oblogminer
{
struct CmdArgs {
explicit CmdArgs(ObIAllocator &alloc):
allocator(alloc),
argc(0) {}
~CmdArgs() {
reset();
}
void build_cmd_args(const char* prog_name, ...) {
reset();
va_list ap;
va_start(ap, prog_name);
argv[argc] = (char*)allocator.alloc(strlen(prog_name)+1);
strncpy(argv[argc], prog_name, strlen(prog_name));
argv[argc][strlen(prog_name)] = '\0';
argc++;
const char* next = nullptr;
while ((next = va_arg(ap, const char*)) != nullptr && argc < 100) {
argv[argc] = (char*)allocator.alloc(strlen(next)+1);
strncpy(argv[argc], next, strlen(next));
argv[argc][strlen(next)] = '\0';
argc++;
}
va_end(ap);
}
void reset() {
for (int i = 0; i < argc; i++) {
allocator.free(argv[i]);
argv[i] = nullptr;
}
argc = 0;
optind = 1;
}
ObIAllocator &allocator;
int argc;
char *argv[100];
};
TEST(ObLogMinerArgs, test_log_miner_args)
{
ObMalloc allocator("TestMnrCmdArgs");
CmdArgs *args = new CmdArgs(allocator);
ObLogMinerCmdArgs miner_cmd_args;
ObLogMinerArgs miner_args;
EXPECT_NE(nullptr, args);
// test commands for analysis mode
// set analyze archvie
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// set analyze online
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// unknown arguments, unexpected
args->build_cmd_args("oblogminer",
"-x", "unknown_arg",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// unknown mode, OB_INVALID_ARGUMENT
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-m", "unknown_mode",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// both archive dest and online are set
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack online params
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// archive_dest and part online arguments are given
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-c", "cluster_url",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack output
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack table-list, default not filter any table
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack start time
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// recovery path is set in analysis mode
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-r", "recovery_path",
nullptr);
EXPECT_EQ(OB_ERR_UNEXPECTED, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// source_db1.table is set in analysis mode
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-S", "db1.table1",
nullptr);
EXPECT_EQ(OB_ERR_UNEXPECTED, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// target table is set in analysis mode
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-t", "db1.tmp_table1",
nullptr);
EXPECT_EQ(OB_ERR_UNEXPECTED, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// test commands for analysis mode
// args are correctly set
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack cluster_url
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-u", "username@tenant#cluster",
"-p", "password",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack recovery_path
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack source table
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-r", "recovery_path",
"-t", "db1.tmp_table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// lack output_dest
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "11111",
"-e", "22222",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// archvie_dest is set in flashback mode
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-a", "archvie_dest",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_ERR_UNEXPECTED, miner_cmd_args.init(args->argc, args->argv));
// table_list is set in flashback mode
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-l", "table-list",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_ERR_UNEXPECTED, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// verbose
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-v",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// timezone
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-z", "+8:00",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// timezone
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-z", "-8:00",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
// unspecified end time
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-o", "output_dest",
"-z", "+0:00",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_cmd_args.init(args->argc, args->argv));
miner_cmd_args.reset();
delete args;
}
TEST(ObLogMinerArgs, test_log_miner_analyzer_flashbacker_args) {
ObMalloc allocator("TestMnrCmdArgs");
CmdArgs *args = new CmdArgs(allocator);
ObLogMinerCmdArgs miner_args;
AnalyzerArgs analyzer_args;
FlashbackerArgs flashbacker_args;
EXPECT_NE(nullptr, args);
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
EXPECT_EQ(OB_ERR_UNEXPECTED, flashbacker_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
flashbacker_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "aaaaa",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_DATE_FORMAT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
// incorrect time range
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "22222",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-c", "cluster_addr",
"-u", "user_name@tenant",
"-p", "password",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "22221",
"-e", "22222",
"-o", "output_progress",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, flashbacker_args.init(miner_args));
EXPECT_EQ(OB_ERR_UNEXPECTED, analyzer_args.init(miner_args));
miner_args.reset();
flashbacker_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-20 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-20 16:35:20",
"-o", "output_dest",
"-z", "-8:00",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-20 16:35:20",
"-o", "output_dest",
"-z", "xxx",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_ERR_UNKNOWN_TIME_ZONE, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-20 16:35:20",
"-e", "2023-12-20 16:35:20",
"-o", "output_dest",
"-z", "+8:00",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-20 16:35:20",
"-e", "2023-12-20 16:35:20.000001",
"-o", "output_dest",
"-z", "+8:00",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-20 16:35:20",
"-e", "2023-12-20 16:35:20.000001",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-32 16:35:20",
"-e", "2023-12-32 16:35:20.000001",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_DATE_VALUE, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
// check user-name
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
// check password
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
// table list check
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "db1.table1",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "tenant.db1.table1",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.*.*",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "fake.db1.*",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*..",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.*|tenant.db2.*",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "*.db1.*|fake.db2.*",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-O", "insert|delete",
"-m", "analysis",
"-l", "tenant.db1.*",
"-s", "2023-12-31 16:35:20",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
miner_args.reset();
analyzer_args.reset();
// incorrect time range
args->build_cmd_args("oblogminer",
"-m", "flashback",
"-c", "cluster_addr",
"-u", "user_name",
"-p", "password",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.tmp_table1",
"-s", "22222",
"-e", "22222",
"-o", "output_progress",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_INVALID_ARGUMENT, flashbacker_args.init(miner_args));
miner_args.reset();
flashbacker_args.reset();
if (nullptr != args) {
delete args;
}
}
TEST(ObLogMinerArgs, test_ob_log_miner_args)
{
ObMalloc allocator("TestMnrCmdArgs");
CmdArgs *args = new CmdArgs(allocator);
ObLogMinerArgs miner_args;
EXPECT_NE(nullptr, args);
// test commands for analysis mode
// set analyze archvie
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
miner_args.reset();
OB_LOGGER.set_log_level("DEBUG");
OB_LOGGER.set_mod_log_levels("ALL.*:INFO;PALF.*:WARN;SHARE.SCHEMA:WARN");
// set analyze online
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
miner_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "flashback",
"-r", "recovery_path",
"-S", "db1.table1",
"-t", "db1.table1_tmp",
"-s", "11111",
"-e", "22222",
"-o", "progress_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
miner_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "flashback",
"-S", "db1.table1",
"-t", "db1.table1_tmp",
"-s", "23333",
"-e", "22222",
"-o", "progress_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_args.init(args->argc, args->argv));
miner_args.reset();
// unknown arguments, unexpected
args->build_cmd_args("oblogminer",
"-x", "unknown_arg",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_args.init(args->argc, args->argv));
miner_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-r", "recovery_path",
nullptr);
EXPECT_EQ(OB_ERR_UNEXPECTED, miner_args.init(args->argc, args->argv));
miner_args.reset();
args->build_cmd_args("oblogminer",
"-c", "cluster_url",
"-u", "username@tenant#cluster",
"-p", "password",
"-m", "flashback",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
"-r", "recovery_path",
nullptr);
EXPECT_EQ(OB_INVALID_ARGUMENT, miner_args.init(args->argc, args->argv));
miner_args.reset();
if (nullptr != args) {
delete args;
}
}
TEST(ObLogMinerArgs, test_log_miner_analyzer_args_serialize)
{
ObMalloc allocator("TestMnrCmdArgs");
CmdArgs *args = new CmdArgs(allocator);
ObLogMinerCmdArgs miner_args;
AnalyzerArgs analyzer_args;
EXPECT_NE(nullptr, args);
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
EXPECT_EQ(OB_SUCCESS, analyzer_args.init(miner_args));
int64_t pos = 0;
const char *expect_buf = "cluster_addr=\nuser_name=\npassword=\narchive_dest=archive_dest\ntable_list=*.db1.table1\n"
"column_cond=\noperations=insert|delete|update\noutput_dest=output_dest\nlog_level=\n"
"start_time_us=11111\nend_time_us=22222\ntimezone=+8:00\nrecord_format=CSV\n";
char tmp_buf[1000] = {0};
EXPECT_EQ(OB_SUCCESS, analyzer_args.serialize(tmp_buf, 1000, pos));
EXPECT_STREQ(tmp_buf, expect_buf);
analyzer_args.reset();
pos = 0;
EXPECT_EQ(OB_SUCCESS, analyzer_args.deserialize(expect_buf, strlen(expect_buf), pos));
EXPECT_STREQ(analyzer_args.archive_dest_, "archive_dest");
EXPECT_STREQ(analyzer_args.table_list_, "*.db1.table1");
EXPECT_EQ(analyzer_args.start_time_us_, 11111);
EXPECT_EQ(analyzer_args.end_time_us_, 22222);
EXPECT_STREQ(analyzer_args.output_dst_, "output_dest");
pos = 0;
memset(tmp_buf, 0, sizeof(tmp_buf));
EXPECT_EQ(OB_SUCCESS, analyzer_args.serialize(tmp_buf, 1000, pos));
tmp_buf[pos+1] = '\0';
EXPECT_STREQ(expect_buf, tmp_buf);
pos = 0;
const char *buf2 = "cluster_addr=\nuser_name=\n";
analyzer_args.reset();
EXPECT_EQ(OB_SIZE_OVERFLOW, analyzer_args.deserialize(buf2, strlen(buf2), pos));
pos = 0;
const char *buf3 = "cluster_addr=\nuser_name=\npassword=\narchive_dest=archive_dest\ntable_list=db1.table1\n"
"operations=insert|delete|update\noutput_dest=output_dest\nlog_level=ALL.*:INFO;PALF.*:WARN;SHARE.SCHEMA:WARN\n"
"start_time_us=11a11\nend_time_us=22222\ntimezone=+8:00\nrecord_format=CSV\n";
EXPECT_EQ(OB_INVALID_DATA, analyzer_args.deserialize(buf3, strlen(buf3), pos));
analyzer_args.reset();
miner_args.reset();
if (nullptr != args) {
delete args;
}
}
TEST(ObLogMinerArgs, test_log_miner_args_serialize)
{
ObMalloc allocator("TestMnrArgs");
CmdArgs *args = new CmdArgs(allocator);
ObLogMinerArgs miner_args;
EXPECT_NE(nullptr, args);
// test commands for analysis mode
// set analyze archvie
args->build_cmd_args("oblogminer",
"-a", "archive_dest",
"-m", "analysis",
"-l", "*.db1.table1",
"-s", "11111",
"-e", "22222",
"-o", "output_dest",
nullptr);
EXPECT_EQ(OB_SUCCESS, miner_args.init(args->argc, args->argv));
int64_t pos = 0;
const char *expect_buf = "mode=ANALYSIS\ncluster_addr=\nuser_name=\npassword=\n"
"archive_dest=archive_dest\ntable_list=*.db1.table1\ncolumn_cond=\noperations=insert|delete|update\n"
"output_dest=output_dest\nlog_level=ALL.*:INFO;PALF.*:WARN;SHARE.SCHEMA:WARN\nstart_time_us=11111\n"
"end_time_us=22222\ntimezone=+8:00\nrecord_format=CSV\n";
char tmp_buf[1000] = {0};
EXPECT_EQ(OB_SUCCESS, miner_args.serialize(tmp_buf, 1000, pos));
EXPECT_STREQ(tmp_buf, expect_buf);
pos = 0;
EXPECT_EQ(OB_SUCCESS, miner_args.deserialize(expect_buf, strlen(expect_buf), pos));
EXPECT_EQ(miner_args.mode_, LogMinerMode::ANALYSIS);
EXPECT_STREQ(miner_args.analyzer_args_.archive_dest_, "archive_dest");
EXPECT_STREQ(miner_args.analyzer_args_.table_list_, "*.db1.table1");
EXPECT_EQ(miner_args.analyzer_args_.start_time_us_, 11111);
EXPECT_EQ(miner_args.analyzer_args_.end_time_us_, 22222);
EXPECT_STREQ(miner_args.analyzer_args_.output_dst_, "output_dest");
pos = 0;
memset(tmp_buf, 0, sizeof(tmp_buf));
EXPECT_EQ(OB_SUCCESS, miner_args.serialize(tmp_buf, 1000, pos));
tmp_buf[pos+1] = '\0';
EXPECT_STREQ(expect_buf, tmp_buf);
if (nullptr != args) {
delete args;
}
}
}
}
int main(int argc, char **argv)
{
// testing::FLAGS_gtest_filter = "DO_NOT_RUN";
system("rm -f test_log_miner_args.log");
ObLogger &logger = ObLogger::get_logger();
logger.set_file_name("test_log_miner_args.log", true, false);
logger.set_log_level("DEBUG");
logger.set_enable_async_log(false);
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}