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

261 lines
6.9 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 TestSSTable : public ObSSTableTest {
public:
TestSSTable();
virtual ~TestSSTable();
};
TestSSTable::TestSSTable() : ObSSTableTest()
{}
TestSSTable::~TestSSTable()
{}
TEST_F(TestSSTable, macro_block_iter)
{
int ret = OB_SUCCESS;
ObMacroBlockIterator macro_iter;
ObMacroBlockDesc block_desc;
// invalid argument
ret = macro_iter.init(NULL);
ASSERT_NE(OB_SUCCESS, ret);
ret = macro_iter.get_next_macro_block(block_desc);
ASSERT_NE(OB_SUCCESS, ret);
// normal argument
ret = macro_iter.init(&sstable_.get_macro_blocks());
ASSERT_EQ(OB_SUCCESS, ret);
for (int64_t i = 0; i < sstable_.get_macro_blocks().count(); ++i) {
ret = macro_iter.get_next_macro_block(block_desc);
ASSERT_EQ(OB_SUCCESS, ret);
}
ret = macro_iter.get_next_macro_block(block_desc);
ASSERT_EQ(OB_ITER_END, ret);
ret = macro_iter.get_next_macro_block(block_desc);
ASSERT_EQ(OB_ITER_END, ret);
// reset iter and get
macro_iter.reset();
ret = macro_iter.get_next_macro_block(block_desc);
ASSERT_NE(OB_SUCCESS, ret);
}
TEST_F(TestSSTable, init)
{
int ret = OB_SUCCESS;
// repeatedly init
ret = sstable_.init(table_key_);
ASSERT_NE(OB_SUCCESS, ret);
}
TEST_F(TestSSTable, open)
{
int ret = OB_SUCCESS;
// ObSSTable sstable;
ObSSTableBaseMeta sstable_meta;
ObTableSchema table_schema;
// fake meta
sstable_meta.index_id_ = 1;
sstable_meta.row_count_ = 1;
sstable_meta.occupy_size_ = 1;
sstable_meta.data_checksum_ = 1;
sstable_meta.row_checksum_ = 1;
sstable_meta.data_version_ = 1;
sstable_meta.rowkey_column_count_ = 1;
sstable_meta.table_type_ = 1;
sstable_meta.index_type_ = 0;
sstable_meta.available_version_ = 1;
sstable_meta.macro_block_count_ = 1;
sstable_meta.use_old_macro_block_count_ = 0;
sstable_meta.column_cnt_ = 2;
sstable_meta.total_sstable_count_ = 1;
sstable_meta.max_logic_block_index_ = -1;
sstable_meta.set_allocator(allocator_);
sstable_meta.set_capacity(sstable_meta.column_cnt_);
for (int64_t i = 0; i < sstable_meta.column_cnt_; ++i) {
ObSSTableColumnMeta column_meta;
column_meta.column_id_ = 16 + i;
column_meta.column_checksum_ = 1;
column_meta.column_default_checksum_ = 1;
ASSERT_EQ(OB_SUCCESS, sstable_meta.column_metas_.push_back(column_meta));
}
// open when not init
{
ObSSTable sstable;
ret = sstable.open(sstable_meta);
ASSERT_NE(OB_SUCCESS, ret);
}
{
ObSSTable sstable;
ret = sstable.open(sstable_meta);
ASSERT_NE(OB_SUCCESS, ret);
}
// invalid argument
{
ObSSTable sstable;
ret = sstable.init(table_key_);
ASSERT_EQ(OB_SUCCESS, ret);
ret = sstable.open(sstable_meta);
ASSERT_NE(OB_SUCCESS, ret);
}
{
ObSSTable sstable;
ret = sstable.init(table_key_);
ASSERT_EQ(OB_SUCCESS, ret);
ret = sstable.open(sstable_meta);
ASSERT_NE(OB_SUCCESS, ret);
}
// normal open
{
ObSSTable sstable;
ret = sstable.init(table_key_);
ASSERT_EQ(OB_SUCCESS, ret);
ret = sstable.open(sstable_meta);
ASSERT_EQ(OB_SUCCESS, ret);
}
// normal open with sstable meta
// sstable.destroy();
{
ObSSTable sstable;
ret = sstable.init(table_key_);
ASSERT_EQ(OB_SUCCESS, ret);
ret = sstable.open(sstable_meta);
ASSERT_EQ(OB_SUCCESS, ret);
}
}
TEST_F(TestSSTable, append)
{
int ret = OB_SUCCESS;
ObSSTable sstable;
ObStoreRow row;
MacroBlockId block_id;
ObObj cells[TEST_COLUMN_CNT];
row.row_val_.assign(cells, TEST_COLUMN_CNT);
// invalid append when not init
ret = sstable.append(block_id);
ASSERT_NE(OB_SUCCESS, ret);
// invalid append when not opened
ret = sstable.init(table_key_);
ASSERT_EQ(OB_SUCCESS, ret);
ret = sstable.append(block_id);
ASSERT_NE(OB_SUCCESS, ret);
// invalid row and block id
ObCreateSSTableParamWithTable sstable_param;
ObITable::TableKey table_key;
table_key.table_type_ = ObITable::MAJOR_SSTABLE;
table_key.pkey_.init(1, 0, 0);
table_key.table_id_ = 1;
table_key.version_ = 1;
sstable_param.table_key_ = table_key;
sstable_param.logical_data_version_ = table_key.version_;
sstable_param.schema_ = &table_schema_;
sstable_param.schema_version_ = table_schema_.get_schema_version();
sstable_param.create_snapshot_version_ = 1L;
sstable_param.checksum_method_ = blocksstable::CCM_VALUE_ONLY;
ret = sstable.open(sstable_param);
ASSERT_EQ(OB_SUCCESS, ret);
block_id.write_seq_ = 10;
ret = sstable.append(block_id);
ASSERT_NE(OB_SUCCESS, ret);
// normal append
ret = sstable.append(sstable_.get_macro_blocks().at(0));
ASSERT_EQ(OB_SUCCESS, ret);
// close sstable
ret = sstable.close();
ASSERT_EQ(OB_SUCCESS, ret);
// invalid append when have closed
ret = sstable.append(block_id);
ASSERT_NE(OB_SUCCESS, ret);
}
TEST_F(TestSSTable, serialize)
{
int ret = OB_SUCCESS;
ObSSTable sstable;
const int64_t size = sstable_.get_serialize_size();
char* buf = static_cast<char*>(allocator_.alloc(size));
ASSERT_TRUE(NULL != buf);
int64_t pos = 0;
// invalid argument
ret = sstable_.serialize(NULL, size, pos);
ASSERT_NE(OB_SUCCESS, ret);
ret = sstable_.serialize(buf, 1, pos);
ASSERT_NE(OB_SUCCESS, ret);
// normal serialize
pos = 0;
ret = sstable_.serialize(buf, size, pos);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(pos, size);
// deserialize when not init
ret = sstable.deserialize(buf, size, pos);
ASSERT_NE(OB_SUCCESS, ret);
// invalid deserialize argument
pos = 0;
ret = sstable.deserialize(NULL, size, pos);
ASSERT_NE(OB_SUCCESS, ret);
ret = sstable.deserialize(buf, 1, pos);
ASSERT_NE(OB_SUCCESS, ret);
// normal deserialize
pos = 0;
ret = sstable.init(table_key_);
ASSERT_EQ(OB_SUCCESS, ret);
ret = sstable.deserialize(buf, size, pos);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(pos, size);
ASSERT_TRUE(sstable.get_meta() == sstable_.get_meta());
}
} // end namespace unittest
} // end namespace oceanbase
int main(int argc, char** argv)
{
system("rm -f test_sstable.log*");
OB_LOGGER.set_file_name("test_sstable.log", true, true);
OB_LOGGER.set_log_level("INFO");
CLOG_LOG(INFO, "begin unittest: test_sstable");
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}