Files
oceanbase/unittest/storage/test_sstable_single_get.cpp
gm 4a92b6d7df reformat source code
according to code styles, 'AccessModifierOffset' should be -2.
2021-06-17 10:40:36 +08:00

156 lines
4.5 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 <gtest/gtest.h>
#include "ob_sstable_test.h"
namespace oceanbase {
using namespace blocksstable;
using namespace common;
using namespace storage;
using namespace share::schema;
namespace unittest {
class TestSSTableSingleGet : public ObSSTableTest {
public:
TestSSTableSingleGet();
virtual ~TestSSTableSingleGet();
void test_one_rowkey(const int64_t seed);
};
TestSSTableSingleGet::TestSSTableSingleGet() : ObSSTableTest("sstable_single_get")
{}
TestSSTableSingleGet::~TestSSTableSingleGet()
{}
void TestSSTableSingleGet::test_one_rowkey(const int64_t seed)
{
int ret = OB_SUCCESS;
ObStoreRowIterator* getter = NULL;
ObObj cells[TEST_COLUMN_CNT];
ObExtStoreRowkey ext_rowkey;
ObStoreRow row;
ObStoreRowkey rowkey;
const ObStoreRow* prow = NULL;
row.row_val_.assign(cells, TEST_COLUMN_CNT);
ret = row_generate_.get_next_row(seed, row);
ASSERT_EQ(OB_SUCCESS, ret);
rowkey.assign(cells, TEST_ROWKEY_COLUMN_CNT);
convert_rowkey(rowkey, ext_rowkey, allocator_);
ret = sstable_.get(param_, context_, ext_rowkey, getter);
ASSERT_EQ(OB_SUCCESS, ret);
ret = getter->get_next_row(prow);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_TRUE(row.row_val_ == prow->row_val_);
ret = getter->get_next_row(prow);
ASSERT_EQ(OB_ITER_END, ret);
ret = sstable_.get(param_, context_, ext_rowkey, getter);
ASSERT_EQ(OB_SUCCESS, ret);
ret = getter->get_next_row(prow);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_TRUE(row.row_val_ == prow->row_val_);
ret = getter->get_next_row(prow);
ASSERT_EQ(OB_ITER_END, ret);
}
TEST_F(TestSSTableSingleGet, test_border_of_single_get)
{
int ret = OB_SUCCESS;
ObStoreRowIterator* getter = NULL;
ObStoreRow row;
ObExtStoreRowkey ext_rowkey;
ObStoreRowkey rowkey;
const ObStoreRow* prow = NULL;
// prepare query param and context
const bool is_reverse_scan = false;
const int64_t limit = -1;
ret = prepare_query_param(is_reverse_scan, limit);
ASSERT_EQ(OB_SUCCESS, ret);
// left border rowkey
test_one_rowkey(0);
// invalid call with unreset getter
ret = sstable_.get(param_, context_, ext_rowkey, getter);
ASSERT_NE(OB_SUCCESS, ret);
// right border rowkey
test_one_rowkey(row_cnt_ - 1);
// non-exist rowkey
ObObj cells[TEST_COLUMN_CNT];
row.row_val_.assign(cells, TEST_COLUMN_CNT);
ret = row_generate_.get_next_row(row_cnt_, row);
ASSERT_EQ(OB_SUCCESS, ret);
rowkey.assign(cells, TEST_ROWKEY_COLUMN_CNT);
convert_rowkey(rowkey, ext_rowkey, allocator_);
ret = sstable_.get(param_, context_, ext_rowkey, getter);
ASSERT_EQ(OB_SUCCESS, ret);
ret = getter->get_next_row(prow);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_TRUE(prow->flag_ == ObActionFlag::OP_ROW_DOES_NOT_EXIST);
}
TEST_F(TestSSTableSingleGet, test_normal)
{
int ret = OB_SUCCESS;
// prepare query param and context
const bool is_reverse_scan = false;
const int64_t limit = -1;
ret = prepare_query_param(is_reverse_scan, limit);
ASSERT_EQ(OB_SUCCESS, ret);
// row in first macro
test_one_rowkey(3);
// row in middle macro
test_one_rowkey(row_cnt_ / 2);
// row in last macro, in cache
test_one_rowkey(row_cnt_ - 3);
}
TEST_F(TestSSTableSingleGet, random_test)
{
int ret = OB_SUCCESS;
ObRandom random;
const int64_t test_count = 10;
// prepare query param and context
const bool is_reverse_scan = false;
const int64_t limit = -1;
ret = prepare_query_param(is_reverse_scan, limit);
ASSERT_EQ(OB_SUCCESS, ret);
for (int64_t i = 0; OB_SUCC(ret) && i < test_count; ++i) {
const int64_t row_number = std::abs(random.get() % row_cnt_);
test_one_rowkey(row_number);
}
}
} // end namespace unittest
} // end namespace oceanbase
int main(int argc, char** argv)
{
system("rm -f test_sstable_single_get.log*");
OB_LOGGER.set_file_name("test_sstable_single_get.log");
OB_LOGGER.set_log_level("INFO");
CLOG_LOG(INFO, "begin unittest: test_sstable_single_get");
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}