patch 4.0
This commit is contained in:
216
unittest/share/schema/test_server_priv_service.cpp
Normal file
216
unittest/share/schema/test_server_priv_service.cpp
Normal file
@ -0,0 +1,216 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define private public
|
||||
#define protected public
|
||||
#include <gtest/gtest.h>
|
||||
#include "db_initializer.h"
|
||||
#include "lib/time/ob_time_utility.h"
|
||||
#include "share/schema/ob_schema_service_sql_impl.h"
|
||||
#include "share/inner_table/ob_inner_table_schema.h"
|
||||
#include "lib/mysqlclient/ob_mysql_transaction.h"
|
||||
#include "share/schema/ob_schema_manager.h"
|
||||
#include "lib/string/ob_sql_string.h"
|
||||
#include "share/schema/ob_server_schema_service.h"
|
||||
#include "share/schema/ob_multi_version_schema_service.h"
|
||||
#include "ob_schema_test_utils.cpp"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace share
|
||||
{
|
||||
namespace schema
|
||||
{
|
||||
using namespace common;
|
||||
class TestServerSchemaService : public ::testing::Test
|
||||
{
|
||||
public:
|
||||
virtual void SetUp();
|
||||
virtual void TearDown() {}
|
||||
protected:
|
||||
DBInitializer db_initer_;
|
||||
ObSchemaServiceSQLImpl schema_service_;
|
||||
ObMultiVersionSchemaService multi_schema_;
|
||||
};
|
||||
|
||||
void TestServerSchemaService::SetUp()
|
||||
{
|
||||
int ret = db_initer_.init();
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
const bool only_core_tables = false;
|
||||
ret = db_initer_.create_system_table(only_core_tables);
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
ret = db_initer_.fill_sys_stat_table();
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
ret = schema_service_.init(&db_initer_.get_sql_proxy());
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
ret = multi_schema_.init(&db_initer_.get_sql_proxy(), &db_initer_.get_config(), OB_MAX_VERSION_COUNT, OB_MAX_VERSION_COUNT_FOR_MERGE, false/*with timestamp*/);
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
}
|
||||
|
||||
TEST_F(TestServerSchemaService, refresh_priv)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS, db_initer_.create_tenant_space(2));
|
||||
// insert system tenant, make refresh tenant succeed,
|
||||
// ob_schema_test_utils.cpp is ugly, it need schema_service_ of type schema_serivce_sql_impl_ be
|
||||
// defined
|
||||
ObTableSchema table_schema;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && NULL != share::sys_table_schema_creators[i]; ++i)
|
||||
{
|
||||
table_schema.reset();
|
||||
table_schema.set_expire_info(ObString::make_string("a > b"));
|
||||
ASSERT_EQ(OB_SUCCESS, (*share::sys_table_schema_creators[i])(table_schema));
|
||||
ObSchemaTestUtils::table_set_tenant(table_schema, OB_SYS_TENANT_ID);
|
||||
CREATE_USER_TABLE_SCHEMA(ret, table_schema);
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && NULL != share::core_table_schema_creators[i]; ++i)
|
||||
{
|
||||
table_schema.reset();
|
||||
table_schema.set_expire_info(ObString::make_string("a > b"));
|
||||
ASSERT_EQ(OB_SUCCESS, (*share::core_table_schema_creators[i])(table_schema));
|
||||
ObSchemaTestUtils::table_set_tenant(table_schema, OB_SYS_TENANT_ID);
|
||||
CREATE_USER_TABLE_SCHEMA(ret, table_schema);
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && NULL != share::virtual_table_schema_creators[i]; ++i)
|
||||
{
|
||||
table_schema.reset();
|
||||
ASSERT_EQ(OB_SUCCESS, (*share::virtual_table_schema_creators[i])(table_schema));
|
||||
ObSchemaTestUtils::table_set_tenant(table_schema, OB_SYS_TENANT_ID);
|
||||
CREATE_USER_TABLE_SCHEMA(ret, table_schema);
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && NULL != share::information_schema_table_schema_creators[i]; ++i)
|
||||
{
|
||||
table_schema.reset();
|
||||
ASSERT_EQ(OB_SUCCESS, (*share::information_schema_table_schema_creators[i])(table_schema));
|
||||
ObSchemaTestUtils::table_set_tenant(table_schema, OB_SYS_TENANT_ID);
|
||||
CREATE_USER_TABLE_SCHEMA(ret, table_schema);
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && NULL != share::mysql_table_schema_creators[i]; ++i)
|
||||
{
|
||||
table_schema.reset();
|
||||
ASSERT_EQ(OB_SUCCESS, (*share::mysql_table_schema_creators[i])(table_schema));
|
||||
ObSchemaTestUtils::table_set_tenant(table_schema, OB_SYS_TENANT_ID);
|
||||
CREATE_USER_TABLE_SCHEMA(ret, table_schema);
|
||||
}
|
||||
|
||||
// create sys_tenant default tablespace and database
|
||||
|
||||
ObTablegroupSchema sys_ts_schema;
|
||||
ObDatabaseSchema sys_db_schema;
|
||||
FILL_TABLEGROUP_SCHEMA(sys_ts_schema, OB_SYS_TENANT_ID,
|
||||
OB_SYS_TABLEGROUP_ID, "default ts", "default ts");
|
||||
FILL_DATABASE_SCHEMA(sys_db_schema, OB_SYS_TENANT_ID,
|
||||
OB_SYS_DATABASE_ID, "default db", "default db");
|
||||
CREATE_TABLEGROUP_SCHEMA(ret, sys_ts_schema);
|
||||
CREATE_DATABASE_SCHEMA(ret, sys_db_schema);
|
||||
ret = multi_schema_.refresh_and_add_schema();
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
ObTenantSchema tenant;
|
||||
ObArray<ObString> zone_list;
|
||||
zone_list.push_back("127.0.0.1");
|
||||
FILL_TENANT_INFO(tenant, 1, "sys", 3, zone_list, "127.0.0.1", 0, "");
|
||||
tenant.set_locality("");
|
||||
CREATE_TENANT(ret, tenant);
|
||||
tenant.reset();
|
||||
FILL_TENANT_INFO(tenant, 2, "ob", 3, zone_list, "127.0.0.1", 0, "");
|
||||
tenant.set_locality("");
|
||||
CREATE_TENANT(ret, tenant);
|
||||
|
||||
ObUserInfo user;
|
||||
//user: tenant_id, user_id, user_name, passwd, info, is_locked, priv_set
|
||||
FILL_USER_INFO(user, OB_SYS_TENANT_ID, 1, "lilei", "lilei", "student in class one", false,
|
||||
OB_PRIV_ALL);
|
||||
|
||||
//create user
|
||||
CREATE_USER_PRIV(ret, user);
|
||||
|
||||
//first refresh_and_add_schema
|
||||
ret = multi_schema_.refresh_and_add_schema();
|
||||
ASSERT_TRUE(NULL != multi_schema_.schema_manager_for_cache_.get_const_priv_mgr().get_user_info(ObTenantUserId(OB_SYS_TENANT_ID, 1)));
|
||||
uint64_t tenant_id = OB_INVALID_ID;
|
||||
multi_schema_.schema_manager_for_cache_.get_const_priv_mgr().get_tenant_id("sys", tenant_id);
|
||||
ASSERT_TRUE(1 == tenant_id);
|
||||
ASSERT_TRUE(NULL != multi_schema_.schema_manager_for_cache_.get_const_priv_mgr().get_tenant_info(1));
|
||||
ASSERT_TRUE(NULL != multi_schema_.schema_manager_for_cache_.get_const_priv_mgr().get_tenant_info(2));
|
||||
|
||||
FILL_USER_INFO(user, 2, 2, "hh", "hh", "student in class one", false,
|
||||
OB_PRIV_SELECT | OB_PRIV_CREATE);
|
||||
//create user
|
||||
CREATE_USER_PRIV(ret, user);
|
||||
|
||||
ObOriginalDBKey db_priv_key;
|
||||
//db_priv_org_key:tenant_id, user_id, database_name
|
||||
FILL_DB_PRIV_ORG_KEY(db_priv_key, 2, 1, "test");
|
||||
|
||||
//grant database privilege
|
||||
GRANT_DATABASE_PRIV(ret, db_priv_key, OB_PRIV_SELECT | OB_PRIV_CREATE);
|
||||
|
||||
//grant table privilege
|
||||
ObTablePrivSortKey table_priv_key;
|
||||
//table_priv_key: tenant_id, user_id, user_name, table_name
|
||||
FILL_TABLE_PRIV_KEY(table_priv_key, 2, 1, "test", "table_priv");
|
||||
//grant table priv
|
||||
GRANT_TABLE_PRIV(ret, table_priv_key, OB_PRIV_SELECT | OB_PRIV_INSERT);
|
||||
|
||||
//second refresh_and_add_schema(get increment)
|
||||
ret = multi_schema_.refresh_and_add_schema();
|
||||
|
||||
const ObSchemaManager *schema_manager;
|
||||
schema_manager = multi_schema_.get_schema_manager_by_version(0);
|
||||
ASSERT_TRUE(NULL != schema_manager);
|
||||
const ObPrivManager &priv_mgr_first = schema_manager->get_const_priv_mgr();
|
||||
ASSERT_TRUE(NULL != priv_mgr_first.get_user_info(ObTenantUserId(OB_SYS_TENANT_ID, 1)));
|
||||
|
||||
ASSERT_TRUE(NULL != priv_mgr_first.get_user_info(ObTenantUserId(2, 2)));
|
||||
ASSERT_TRUE(NULL != priv_mgr_first.get_user_info(ObTenantUserId(OB_SYS_TENANT_ID, 1)));
|
||||
ASSERT_TRUE(NULL != priv_mgr_first.get_db_priv(db_priv_key));
|
||||
ASSERT_TRUE(NULL != priv_mgr_first.get_table_priv(table_priv_key));
|
||||
|
||||
ret = multi_schema_.rewrite_switch();
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
FILL_TABLE_PRIV_KEY(table_priv_key, 2, 2, "test", "table_priv");
|
||||
//grant table priv
|
||||
GRANT_TABLE_PRIV(ret, table_priv_key, OB_PRIV_SELECT | OB_PRIV_INSERT);
|
||||
schema_manager = multi_schema_.get_schema_manager_by_version(0);
|
||||
ASSERT_TRUE(NULL != schema_manager);
|
||||
const ObPrivManager &priv_mgr_second = schema_manager->get_const_priv_mgr();
|
||||
ASSERT_TRUE(NULL != priv_mgr_second.get_tenant_info(1));
|
||||
priv_mgr_second.get_tenant_id("sys", tenant_id);
|
||||
ASSERT_TRUE(1 == tenant_id);
|
||||
ASSERT_TRUE(NULL != priv_mgr_second.get_user_info(ObTenantUserId(2, 2)));
|
||||
ASSERT_TRUE(NULL != priv_mgr_second.get_db_priv(db_priv_key));
|
||||
FILL_TABLE_PRIV_KEY(table_priv_key, 2, 1, "test", "table_priv");
|
||||
ASSERT_TRUE(NULL != priv_mgr_second.get_table_priv(table_priv_key));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
OB_LOGGER.set_log_level("WARN");
|
||||
OB_LOGGER.set_log_level("WARN");
|
||||
::testing::InitGoogleTest(&argc,argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Reference in New Issue
Block a user