107 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.7 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>
 | |
| 
 | |
| #define private public
 | |
| 
 | |
| #include "storage/memtable/mvcc/ob_mvcc_trans_ctx.h"
 | |
| #include "storage/memtable/ob_memtable_context.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| namespace unittest {
 | |
| using namespace oceanbase::common;
 | |
| using namespace oceanbase::memtable;
 | |
| 
 | |
| class ObMockTransCallback : public ObITransCallback {
 | |
| public:
 | |
|   ObMockTransCallback(ObMemtable* mt) : fake_mt_(mt)
 | |
|   {}
 | |
| 
 | |
|   int callback(const int type, const bool for_replay, const bool need_lock_for_write, ObMemtable* memtable) override
 | |
|   {
 | |
|     int ret = OB_SUCCESS;
 | |
|     UNUSED(for_replay);
 | |
|     UNUSED(need_lock_for_write);
 | |
| 
 | |
|     if (TCB_REMOVE_CALLBACK == type) {
 | |
|       if (memtable == fake_mt_) {
 | |
|         del();
 | |
|       } else {
 | |
|         ret = OB_ITEM_NOT_MATCH;
 | |
|       }
 | |
|     } else {
 | |
|       abort();
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
|   }
 | |
| 
 | |
|   int del() override
 | |
|   {
 | |
|     int ret = OB_SUCCESS;
 | |
| 
 | |
|     ObITransCallback* cur = this;
 | |
| 
 | |
|     if (NULL == cur) {
 | |
|       ret = common::OB_INVALID_ARGUMENT;
 | |
|     } else {
 | |
|       ObITransCallback* prev = cur->prev_;
 | |
|       ObITransCallback* next = cur->next_;
 | |
|       if (NULL == prev || NULL == next) {
 | |
|         ret = common::OB_INVALID_ARGUMENT;
 | |
|       } else {
 | |
|         prev->next_ = next;
 | |
|         next->prev_ = prev;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
|   }
 | |
| 
 | |
|   ObMemtable* fake_mt_;
 | |
| };
 | |
| 
 | |
| TEST(TestObMvccCallback, remove_callback_test)
 | |
| {
 | |
|   uint64_t addr1 = 3;
 | |
|   ObMockTransCallback cb1((ObMemtable*)(addr1));
 | |
|   uint64_t addr2 = 1;
 | |
|   ObMockTransCallback cb2((ObMemtable*)(addr2));
 | |
|   uint64_t addr3 = 2;
 | |
|   int64_t cnt = 0;
 | |
| 
 | |
|   ObMemtableCtx mt_ctx;
 | |
|   ObTransCallbackMgr mgr(mt_ctx);
 | |
|   mgr.append(&cb1);
 | |
|   mgr.append(&cb2);
 | |
| 
 | |
|   ASSERT_EQ(2, mgr.count());
 | |
|   mgr.remove_callback_for_uncommited_txn((ObMemtable*)(addr1), cnt);
 | |
|   ASSERT_EQ(1, mgr.count());
 | |
|   mgr.remove_callback_for_uncommited_txn((ObMemtable*)(addr3), cnt);
 | |
|   ASSERT_EQ(1, mgr.count());
 | |
|   mgr.remove_callback_for_uncommited_txn((ObMemtable*)(addr2), cnt);
 | |
|   ASSERT_EQ(0, mgr.count());
 | |
| }
 | |
| 
 | |
| }  // namespace unittest
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|   oceanbase::common::ObLogger::get_logger().set_file_name("test_mvcc_trans_ctx.log", true);
 | |
|   oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | |
|   ::testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
