217 lines
8.1 KiB
C++
217 lines
8.1 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.
|
|
*/
|
|
|
|
#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();
|
|
}
|