[FEAT MERGE] patch obkv feature from 42x
This commit is contained in:
146
unittest/observer/tableapi/test_redis_parser.cpp
Normal file
146
unittest/observer/tableapi/test_redis_parser.cpp
Normal file
@ -0,0 +1,146 @@
|
||||
/**
|
||||
* 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>
|
||||
|
||||
#include "src/share/table/ob_redis_parser.h"
|
||||
#include "src/share/ob_errno.h"
|
||||
|
||||
using namespace oceanbase::common;
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace table
|
||||
{
|
||||
class TestRedisParser : public::testing::Test
|
||||
{
|
||||
public:
|
||||
TestRedisParser() {}
|
||||
virtual ~TestRedisParser() {}
|
||||
virtual void SetUp() {}
|
||||
virtual void TearDown() {}
|
||||
};
|
||||
|
||||
TEST_F(TestRedisParser, test_decode_inline) {
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
ObString redis_msg = "Monitor\r\n";
|
||||
ObString method;
|
||||
ObArray<ObString> args;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::decode(allocator, redis_msg, method, args));
|
||||
ASSERT_EQ(0, args.size());
|
||||
ObString expected = "MONITOR";
|
||||
ASSERT_EQ(method == expected, true);
|
||||
}
|
||||
|
||||
TEST_F(TestRedisParser, test_decode_array) {
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
ObString redis_msg = "*2\r\n$3\r\nGET\r\n$6\r\nfoobar\r\n";
|
||||
ObString method;
|
||||
ObArray<ObString> args;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::decode(allocator, redis_msg, method, args));
|
||||
ASSERT_EQ(1, args.size());
|
||||
ObString expected1 = "GET";
|
||||
ASSERT_EQ(method == expected1, true);
|
||||
ObString expected2 = "foobar";
|
||||
ASSERT_EQ(args[0] == expected2, true);
|
||||
}
|
||||
|
||||
TEST_F(TestRedisParser, test_decode_err) {
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
ObString method;
|
||||
ObArray<ObString> args;
|
||||
// invalid length
|
||||
ObString redis_msg = "*3\r\n$3\r\nGET\r\n$6\r\nfoobar\r\n";
|
||||
ASSERT_EQ(OB_KV_REDIS_PARSE_ERROR, ObRedisParser::decode(allocator, redis_msg, method, args));
|
||||
redis_msg = "*1\r\n$3\r\nGET\r\n$6\r\nfoobar\r\n";
|
||||
ASSERT_EQ(OB_KV_REDIS_PARSE_ERROR, ObRedisParser::decode(allocator, redis_msg, method, args));
|
||||
|
||||
// invalid end char
|
||||
redis_msg = "$2\r\n$3\r\nGET\r\n$6\nfoobar\r\n";
|
||||
ASSERT_EQ(OB_KV_REDIS_PARSE_ERROR, ObRedisParser::decode(allocator, redis_msg, method, args));
|
||||
redis_msg = "Monitor\n";
|
||||
ASSERT_EQ(OB_KV_REDIS_PARSE_ERROR, ObRedisParser::decode(allocator, redis_msg, method, args));
|
||||
|
||||
// invalid header
|
||||
redis_msg = "-2\r\n$3\r\nGET\r\n$6\nfoobar\r\n";
|
||||
ASSERT_EQ(OB_KV_REDIS_PARSE_ERROR, ObRedisParser::decode(allocator, redis_msg, method, args));
|
||||
}
|
||||
|
||||
TEST_F(TestRedisParser, test_encode_simple_string)
|
||||
{
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
ObString str = "OK";
|
||||
ObString encoded;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::encode_simple_string(allocator, str, encoded));
|
||||
ObString expected = "+OK\r\n";
|
||||
ASSERT_EQ(expected == encoded, true);
|
||||
}
|
||||
|
||||
TEST_F(TestRedisParser, test_encode_simple_error)
|
||||
{
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
ObString str = "ERR";
|
||||
ObString encoded;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::encode_error(allocator, str, encoded));
|
||||
ObString expected = "-ERR\r\n";
|
||||
ASSERT_EQ(expected == encoded, true);
|
||||
}
|
||||
|
||||
TEST_F(TestRedisParser, test_encode_integer)
|
||||
{
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
int64_t i = 1234568789;
|
||||
ObString encoded;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::encode_integer(allocator, i, encoded));
|
||||
ObString expected = ":1234568789\r\n";
|
||||
ASSERT_EQ(expected == encoded, true);
|
||||
|
||||
i = -1234568789;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::encode_integer(allocator, i, encoded));
|
||||
expected = ":-1234568789\r\n";
|
||||
ASSERT_EQ(expected == encoded, true);
|
||||
}
|
||||
|
||||
TEST_F(TestRedisParser, test_encode_bulk_string)
|
||||
{
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
ObString str = "This is a bulk string";
|
||||
ObString encoded;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::encode_bulk_string(allocator, str, encoded));
|
||||
ObString expected = "$21\r\nThis is a bulk string\r\n";
|
||||
ASSERT_EQ(expected == encoded, true);
|
||||
}
|
||||
|
||||
TEST_F(TestRedisParser, test_encode_array)
|
||||
{
|
||||
ObArenaAllocator allocator(ObModIds::TEST);
|
||||
ObArray<ObString> arr;
|
||||
ASSERT_EQ(OB_SUCCESS, arr.push_back("hello world"));
|
||||
ASSERT_EQ(OB_SUCCESS, arr.push_back("foobarbaz"));
|
||||
ObString encoded;
|
||||
ASSERT_EQ(OB_SUCCESS, ObRedisParser::encode_array(allocator, arr, encoded));
|
||||
ObString expected = "*2\r\n$11\r\nhello world\r\n$9\r\nfoobarbaz\r\n";
|
||||
std::cout << expected.ptr() << std::endl;
|
||||
std::cout << encoded.ptr() << std::endl;
|
||||
ASSERT_EQ(expected == encoded, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
|
||||
OB_LOGGER.set_log_level("INFO");
|
||||
OB_LOGGER.set_file_name("test_redis_parser.log", true);
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
Reference in New Issue
Block a user