168 lines
5.7 KiB
C++
168 lines
5.7 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 "share/table/ob_table_config_util.h"
|
|
#include "lib/time/ob_time_utility.h"
|
|
#include "share/parameter/ob_parameter_macro.h"
|
|
#include <gtest/gtest.h>
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace share;
|
|
namespace common
|
|
{
|
|
ObConfigContainer l_container;
|
|
static ObConfigContainer *local_container()
|
|
{
|
|
return &l_container;
|
|
}
|
|
class TestObKvConfig : public ::testing::Test
|
|
{
|
|
public:
|
|
#undef OB_CLUSTER_PARAMETER
|
|
#define OB_CLUSTER_PARAMETER(args...) args
|
|
DEF_MODE_WITH_PARSER(_obkv_feature_mode, OB_CLUSTER_PARAMETER, "", common::ObKvFeatureModeParser,
|
|
"_obkv_feature_mode is a option list to control specified OBKV features on/off.",
|
|
ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE));
|
|
#undef OB_CLUSTER_PARAMETER
|
|
};
|
|
|
|
TEST_F(TestObKvConfig, test_process_item)
|
|
{
|
|
ObString key;
|
|
ObString value;
|
|
char str1[100] = {"ttl=off"};
|
|
ASSERT_EQ(OB_SUCCESS, ObModeConfigParserUitl::parse_item_to_kv(str1, key, value));
|
|
ASSERT_EQ(key, ObString("ttl"));
|
|
ASSERT_EQ(value, ObString("off"));
|
|
|
|
char str2[100] = {" ttl = off "};
|
|
ASSERT_EQ(OB_SUCCESS, ObModeConfigParserUitl::parse_item_to_kv(str2, key, value));
|
|
ASSERT_EQ(key, ObString("ttl"));
|
|
ASSERT_EQ(value, ObString("off"));
|
|
|
|
char str3[100] = {" rerouting =off "};
|
|
ASSERT_EQ(OB_SUCCESS, ObModeConfigParserUitl::parse_item_to_kv(str3, key, value));
|
|
ASSERT_EQ(key, ObString("rerouting"));
|
|
ASSERT_EQ(value, ObString("off"));
|
|
|
|
char str4[100] = {"ttl=on, rerouting=off"};
|
|
common::ObSEArray<std::pair<ObString, ObString>, 8> kv_list;
|
|
ASSERT_EQ(OB_SUCCESS, ObModeConfigParserUitl::get_kv_list(str4, kv_list));
|
|
ASSERT_EQ(2, kv_list.count());
|
|
ASSERT_EQ(kv_list.at(0).first, ObString("ttl"));
|
|
ASSERT_EQ(kv_list.at(0).second, ObString("on"));
|
|
ASSERT_EQ(kv_list.at(1).first, ObString("rerouting"));
|
|
ASSERT_EQ(kv_list.at(1).second, ObString("off"));
|
|
}
|
|
|
|
|
|
TEST_F(TestObKvConfig, test_parse)
|
|
{
|
|
ObKvFeatureModeParser parser;
|
|
uint8_t arr[32];
|
|
ASSERT_EQ(true, parser.parse("ttl=on, rerouting=off", arr, 32));
|
|
ASSERT_EQ(arr[0], 0b00001001);
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(true, parser.parse("ttl=on, ttl=off, rerouting=on", arr, 32));
|
|
ASSERT_EQ(arr[0], 0b0000110);
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(true, parser.parse("ttl=on, ttl=off", arr, 32));
|
|
ASSERT_EQ(arr[0], 0b00000010);
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(true, parser.parse("ttl=on, hotkey=on, rerouting=on", arr, 32));
|
|
ASSERT_EQ(arr[0], 0b00010101);
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(false, parser.parse("ttl=on, ttt=off", arr, 32));
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(false, parser.parse("ttl=on, rerouting=default", arr, 32));
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(true, parser.parse("", arr, 32));
|
|
ASSERT_EQ(arr[0], 0);
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(false, parser.parse("ttl=on, ttt=off, ", arr, 32));
|
|
|
|
MEMSET(arr, 0, 32);
|
|
ASSERT_EQ(false, parser.parse("ttl=on, ttt=off,", arr, 32));
|
|
}
|
|
|
|
TEST_F(TestObKvConfig, test_obkv_feature_mode)
|
|
{
|
|
const uint8_t *value = _obkv_feature_mode;
|
|
ASSERT_NE((void*)NULL, (void*)value);
|
|
ASSERT_EQ(value[0], 0);
|
|
ASSERT_EQ(true, _obkv_feature_mode.set_value("ttl=off, rerouting=on, hotkey=on"));
|
|
const uint8_t *value1 = _obkv_feature_mode.get();
|
|
ASSERT_NE((void*)NULL, (void*)value1);
|
|
ASSERT_EQ(value1[0], 0b00010110);
|
|
// bad case
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value("hotkey=off="));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value("=off"));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value(","));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value(" , "));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value(" ,hotkey=off"));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value(",hotkey=off"));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value("ttl=off,, hotkey=off"));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value("ttl=off, , hotkey=off"));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value("ttl=off, rerouting=on, "));
|
|
ASSERT_EQ(false, _obkv_feature_mode.set_value("ttl=off, rerouting=on,"));
|
|
}
|
|
|
|
TEST_F(TestObKvConfig, testObKVFeatureMode)
|
|
{
|
|
// rerouting=off, ttl=on
|
|
uint8_t values[1] = {0b001001};
|
|
ObKVFeatureMode kv_mode(values);
|
|
ASSERT_EQ(true, kv_mode.is_ttl_enable());
|
|
ASSERT_EQ(false, kv_mode.is_rerouting_enable());
|
|
// default
|
|
ObKVFeatureMode kv_mode_1;
|
|
ASSERT_EQ(false, kv_mode_1.is_valid());
|
|
kv_mode_1.set_ttl_mode(0b10);
|
|
kv_mode_1.set_rerouting_mode(0b01);
|
|
kv_mode_1.set_hotkey_mode(0b01);
|
|
ASSERT_EQ(true, kv_mode_1.is_valid());
|
|
ASSERT_EQ(false, kv_mode_1.is_ttl_enable());
|
|
ASSERT_EQ(true, kv_mode_1.is_rerouting_enable());
|
|
ASSERT_EQ(true, kv_mode_1.is_hotkey_enable());
|
|
kv_mode_1.set_value(0b11101001);
|
|
ASSERT_EQ(true, kv_mode_1.is_valid());
|
|
ASSERT_EQ(true, kv_mode_1.is_ttl_enable());
|
|
ASSERT_EQ(false, kv_mode_1.is_rerouting_enable());
|
|
ASSERT_EQ(false, kv_mode_1.is_hotkey_enable());
|
|
// bad case
|
|
kv_mode_1.set_ttl_mode(0b11);
|
|
ASSERT_EQ(false, kv_mode_1.is_valid());
|
|
kv_mode_1.set_hotkey_mode(0b11);
|
|
ASSERT_EQ(false, kv_mode_1.is_valid());
|
|
kv_mode_1.set_rerouting_mode(0b11);
|
|
ASSERT_EQ(false, kv_mode_1.is_valid());
|
|
kv_mode_1.set_value(0b00111111);
|
|
ASSERT_EQ(false, kv_mode_1.is_valid());
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
|
|
testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
} |