/** * 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 #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 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 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 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 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(); }