245 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			8.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 "lib/allocator/ob_tc_malloc.h"
 | |
| #include "lib/utility/utility.h"
 | |
| #include "share/schema/ob_schema_struct.h"
 | |
| #include "ob_schema_test_utils.cpp"
 | |
| using namespace oceanbase::common;
 | |
| using namespace oceanbase::share::schema;
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_tenant_user_id)
 | |
| {
 | |
|   ObTenantUserId tenant_user_id(2, 1);
 | |
|   ObTenantUserId tenant_user_id_eq(2, 1);
 | |
|   ObTenantUserId tenant_user_id_big(2, 2);
 | |
| 
 | |
|   ASSERT_TRUE(tenant_user_id == tenant_user_id_eq);
 | |
|   ASSERT_TRUE(tenant_user_id.hash() == tenant_user_id_eq.hash());
 | |
|   ASSERT_FALSE(tenant_user_id == tenant_user_id_big);
 | |
|   ASSERT_TRUE(tenant_user_id < tenant_user_id_big);
 | |
| 
 | |
|   const int64_t buf_len = 256;
 | |
|   char buffer[buf_len];
 | |
|   int64_t pos = 0;
 | |
|   tenant_user_id.serialize(buffer, buf_len, pos);
 | |
|   ObTenantUserId tenant_user_id_des;
 | |
|   pos = 0;
 | |
|   tenant_user_id_des.deserialize(buffer, buf_len, pos);
 | |
|   ASSERT_TRUE(tenant_user_id == tenant_user_id_des);
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_priv)
 | |
| {
 | |
|   ObPrivSet priv_set = OB_PRIV_CREATE | OB_PRIV_SELECT;
 | |
|   ObPrivSet priv_set_other = OB_PRIV_CREATE | OB_PRIV_ALTER;
 | |
| 
 | |
|   const int64_t schema_version = INT64_MAX;
 | |
|   ObPriv ob_priv(2, 1, schema_version, priv_set);
 | |
|   ObPriv ob_priv_eq(2, 1, schema_version, priv_set);
 | |
|   ObPriv ob_priv_big(2, 2, schema_version, priv_set_other);
 | |
| 
 | |
|   ASSERT_EQ(priv_set, ob_priv.get_priv_set());
 | |
|   ASSERT_EQ(priv_set_other, ob_priv_big.get_priv_set());
 | |
|   //cmp_tenant_user_id lhs->get_tenant_user_id < tenant_user_id
 | |
|   ASSERT_TRUE(ObPriv::cmp_tenant_user_id(&ob_priv, ob_priv_big.get_tenant_user_id()));
 | |
|   ASSERT_FALSE(ObPriv::cmp_tenant_user_id(&ob_priv, ob_priv_eq.get_tenant_user_id()));
 | |
|   ASSERT_FALSE(ObPriv::cmp_tenant_user_id(&ob_priv_big, ObTenantUserId(2, 2)));
 | |
|   ASSERT_TRUE(ObPriv::equal_tenant_user_id(&ob_priv, ob_priv_eq.get_tenant_user_id()));
 | |
| 
 | |
|   ob_priv.set_tenant_id(3);
 | |
|   ASSERT_EQ(3UL, ob_priv.get_tenant_id());
 | |
|   ASSERT_TRUE(ObPriv::cmp_tenant_id(&ob_priv_eq, ob_priv.get_tenant_id()));
 | |
|   ob_priv.set_user_id(4);
 | |
|   ASSERT_EQ(4UL, ob_priv.get_user_id());
 | |
| 
 | |
|   ob_priv.set_priv_set(priv_set_other);
 | |
|   ASSERT_EQ(priv_set_other, ob_priv.get_priv_set());
 | |
| 
 | |
|   const int64_t buf_len = 256;
 | |
|   char buffer[buf_len];
 | |
|   int64_t pos = 0;
 | |
|   ob_priv.serialize(buffer, buf_len, pos);
 | |
|   pos = 0;
 | |
|   ObPriv ob_priv_des;
 | |
|   ob_priv_des.deserialize(buffer, buf_len, pos);
 | |
|   ASSERT_EQ(ob_priv.get_tenant_id(), ob_priv_des.get_tenant_id());
 | |
|   ASSERT_EQ(ob_priv.get_user_id(), ob_priv_des.get_user_id());
 | |
|   ASSERT_EQ(ob_priv.get_priv_set(), ob_priv_des.get_priv_set());
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_user_info_hash_wrapper)
 | |
| {
 | |
|   ObUserInfoHashWrapper user_info_hash(2, ObString::make_string("user"));
 | |
|   ObUserInfoHashWrapper user_info_hash_eq(2, ObString::make_string("user"));
 | |
|   ObUserInfoHashWrapper user_info_hash_diff(2, ObString::make_string("other"));
 | |
| 
 | |
|   ASSERT_EQ(2UL, user_info_hash.get_tenant_id());
 | |
|   ASSERT_TRUE(ObString::make_string("user") == user_info_hash.get_user_name());
 | |
|   ASSERT_TRUE(user_info_hash == user_info_hash_eq);
 | |
|   ASSERT_TRUE(user_info_hash.hash() == user_info_hash_eq.hash());
 | |
|   ASSERT_FALSE(user_info_hash == user_info_hash_diff);
 | |
|   ASSERT_FALSE(user_info_hash.hash() == user_info_hash_diff.hash());
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_user_info)
 | |
| {
 | |
|   ObUserInfo user_info;
 | |
|   ObUserInfo user_info_eq;
 | |
|   ObUserInfo user_info_other;
 | |
|   ObPrivSet priv_set = OB_PRIV_CREATE | OB_PRIV_SELECT;
 | |
|   FILL_USER_INFO(user_info, 2, 2, "user", "123", "", false, priv_set);
 | |
|   FILL_USER_INFO(user_info_eq, 2, 2, "user", "123", "", false, priv_set);
 | |
|   FILL_USER_INFO(user_info_other, 2, 3, "LiLei", "123", "", false, priv_set);
 | |
| 
 | |
|   ASSERT_TRUE(ObUserInfo::cmp(&user_info, &user_info_other));
 | |
|   ASSERT_FALSE(ObUserInfo::cmp(&user_info, &user_info_eq));
 | |
|   ASSERT_TRUE(ObUserInfo::equal(&user_info, &user_info_eq));
 | |
|   ASSERT_FALSE(ObUserInfo::equal(&user_info, &user_info_other));
 | |
| 
 | |
|   const int64_t buf_len = 256;
 | |
|   char buffer[buf_len];
 | |
|   int64_t pos = 0;
 | |
|   user_info.serialize(buffer, buf_len, pos);
 | |
|   pos = 0;
 | |
|   ObUserInfo user_info_des;
 | |
|   user_info_des.deserialize(buffer, buf_len, pos);
 | |
|   ASSERT_TRUE(ObUserInfo::equal(&user_info, &user_info_des));
 | |
|   ASSERT_TRUE(ObString::make_string("user") == user_info_des.get_user_name_str());
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_db_priv_sort_key)
 | |
| {
 | |
|   ObDBPrivSortKey db_priv_key(2, 2, 3);
 | |
|   ObDBPrivSortKey db_priv_key_eq(2, 2, 3);
 | |
|   ObDBPrivSortKey db_priv_key_big(2, 3, 3);
 | |
|   ObDBPrivSortKey db_priv_key_little(2, 2, 100);
 | |
| 
 | |
|   ASSERT_TRUE(db_priv_key == db_priv_key_eq);
 | |
|   ASSERT_FALSE(db_priv_key == db_priv_key_little);
 | |
|   ASSERT_TRUE(db_priv_key != db_priv_key_little);
 | |
|   ASSERT_FALSE(db_priv_key != db_priv_key_eq);
 | |
| 
 | |
|   //sort value from big to small
 | |
|   ASSERT_TRUE(db_priv_key_little < db_priv_key);
 | |
|   ASSERT_TRUE(db_priv_key < db_priv_key_big);
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_org_db_key)
 | |
| {
 | |
|   ObOriginalDBKey org_key(2, 2, ObString::make_string("test"));
 | |
|   ObOriginalDBKey org_key_eq(2, 2, ObString::make_string("test"));
 | |
|   ObOriginalDBKey org_key_diff1(2, 3, ObString::make_string("test"));
 | |
|   ObOriginalDBKey org_key_diff2(2, 2, ObString::make_string("db"));
 | |
| 
 | |
|   ASSERT_EQ(org_key.hash(), org_key_eq.hash());
 | |
|   ASSERT_NE(org_key.hash(), org_key_diff1.hash());
 | |
|   ASSERT_NE(org_key.hash(), org_key_diff2.hash());
 | |
|   //operator== cmp tenant_id, user_id, db_name
 | |
|   ASSERT_TRUE(org_key == org_key_eq);
 | |
|   ASSERT_FALSE(org_key == org_key_diff1);
 | |
|   ASSERT_FALSE(org_key == org_key_diff2);
 | |
| 
 | |
|   //operator< cmp tenant_id, user_id
 | |
|   ASSERT_TRUE(org_key < org_key_diff1);
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_db_priv)
 | |
| {
 | |
|   ObDBPriv db_priv;
 | |
|   ObDBPriv db_priv_eq;
 | |
|   ObDBPriv db_priv_diff1;
 | |
|   ObDBPriv db_priv_diff2;
 | |
|   ObPrivSet priv_set = OB_PRIV_CREATE | OB_PRIV_SELECT;
 | |
|   FILL_DB_PRIV(db_priv, 2, 2, ObString::make_string("test"), priv_set);
 | |
|   FILL_DB_PRIV(db_priv_eq, 2, 2, ObString::make_string("db"), priv_set);
 | |
|   FILL_DB_PRIV(db_priv_diff1, 2, 2, ObString::make_string("db%"), priv_set);
 | |
|   FILL_DB_PRIV(db_priv_diff2, 2, 3, ObString::make_string("db"), priv_set);
 | |
| 
 | |
|   //db% is less specific;
 | |
|   ASSERT_TRUE(ObDBPriv::cmp(&db_priv, &db_priv_diff1));
 | |
|   ASSERT_TRUE(ObDBPriv::cmp(&db_priv, &db_priv_diff2));
 | |
|   ASSERT_TRUE(ObDBPriv::equal(&db_priv, &db_priv_eq));
 | |
| 
 | |
|   const int64_t buf_len = 256;
 | |
|   char buffer[buf_len];
 | |
|   int64_t pos = 0;
 | |
|   db_priv.serialize(buffer, buf_len, pos);
 | |
|   pos = 0;
 | |
|   ObDBPriv db_priv_des;
 | |
|   db_priv_des.deserialize(buffer, buf_len, pos);
 | |
| 
 | |
|   ASSERT_EQ(db_priv.get_tenant_id(), db_priv_des.get_tenant_id());
 | |
|   ASSERT_EQ(db_priv.get_user_id(), db_priv_des.get_user_id());
 | |
|   ASSERT_TRUE(db_priv.get_database_name_str() == db_priv_des.get_database_name_str());
 | |
|   ASSERT_EQ(db_priv.get_priv_set(), db_priv_des.get_priv_set());
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_table_priv_db_key)
 | |
| {
 | |
|   ObTablePrivDBKey table_db_key(2, 2, ObString::make_string("test"));
 | |
|   ObTablePrivDBKey table_db_key_eq(2, 2, ObString::make_string("test"));
 | |
|   ObTablePrivDBKey table_db_key_diff(2, 2, ObString::make_string("db"));
 | |
| 
 | |
|   ASSERT_TRUE(table_db_key == table_db_key_eq);
 | |
|   ASSERT_TRUE(table_db_key_diff < table_db_key);
 | |
| 
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_table_priv_sort_key)
 | |
| {
 | |
|   ObTablePrivSortKey table_priv_key(2, 2, "test", "table");
 | |
|   ObTablePrivSortKey table_priv_key_eq(2, 2, "test", "table");
 | |
|   ObTablePrivSortKey table_priv_key_diff1(2, 2, "test", "index");
 | |
|   ObTablePrivSortKey table_priv_key_diff2(2, 3, "test", "table");
 | |
| 
 | |
|   ASSERT_TRUE(table_priv_key == table_priv_key_eq);
 | |
|   ASSERT_TRUE(table_priv_key_diff1 < table_priv_key);
 | |
|   ASSERT_TRUE(table_priv_key < table_priv_key_diff2);
 | |
| 
 | |
|   ASSERT_EQ(table_priv_key.hash(), table_priv_key_eq.hash());
 | |
|   ASSERT_NE(table_priv_key.hash(), table_priv_key_diff1.hash());
 | |
| }
 | |
| 
 | |
| TEST(ObPrivStructTest, ob_table_priv)
 | |
| {
 | |
|   ObTablePriv table_priv;
 | |
|   ObTablePriv table_priv_eq;
 | |
|   ObTablePriv table_priv_diff1;
 | |
|   ObTablePriv table_priv_diff2;
 | |
|   ObPrivSet priv_set = OB_PRIV_INSERT | OB_PRIV_SELECT;
 | |
|   FILL_TABLE_PRIV(table_priv, 2, 2, "test", "table", priv_set);
 | |
|   FILL_TABLE_PRIV(table_priv_eq, 2, 2, "test", "table", priv_set);
 | |
|   FILL_TABLE_PRIV(table_priv_diff1, 2, 2, "test", "index", priv_set);
 | |
|   FILL_TABLE_PRIV(table_priv_diff2, 2, 3, "test", "table", priv_set);
 | |
| 
 | |
|   ASSERT_TRUE(ObTablePriv::equal(&table_priv, &table_priv_eq));
 | |
|   ASSERT_TRUE(ObTablePriv::cmp(&table_priv_diff1, &table_priv));
 | |
|   ASSERT_TRUE(ObTablePriv::cmp(&table_priv, &table_priv_diff2));
 | |
| 
 | |
|   const int64_t buf_len = 256;
 | |
|   char buffer[buf_len];
 | |
|   int64_t pos = 0;
 | |
|   table_priv.serialize(buffer, buf_len, pos);
 | |
|   pos = 0;
 | |
|   ObTablePriv table_priv_des;
 | |
|   table_priv_des.deserialize(buffer, buf_len, pos);
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   OB_LOGGER.set_log_level("ERROR");
 | |
|   ::testing::InitGoogleTest(&argc,argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
