147 lines
4.7 KiB
C++
147 lines
4.7 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>
|
|
|
|
#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();
|
|
}
|