261 lines
6.9 KiB
C++
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();
|
|
}
|