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