246 lines
8.4 KiB
C++
246 lines
8.4 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 "db_initializer.h"
|
|
#include "share/schema/ob_schema_service_sql_impl.h"
|
|
#include "share/inner_table/ob_inner_table_schema.h"
|
|
#include "share/schema/ob_schema_struct.h"
|
|
#include "share/schema/ob_schema_service.h"
|
|
#include "lib/mysqlclient/ob_mysql_transaction.h"
|
|
#include "lib/string/ob_sql_string.h"
|
|
#include "ob_schema_test_utils.cpp"
|
|
|
|
namespace oceanbase
|
|
{
|
|
namespace share
|
|
{
|
|
namespace schema
|
|
{
|
|
using namespace common;
|
|
|
|
class TestPrivServiceSQLImpl : public ::testing::Test
|
|
{
|
|
public:
|
|
|
|
virtual void SetUp();
|
|
virtual void TearDown() {}
|
|
|
|
protected:
|
|
DBInitializer db_initer_;
|
|
ObSchemaServiceSQLImpl schema_service_;
|
|
};
|
|
|
|
|
|
void TestPrivServiceSQLImpl::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);
|
|
}
|
|
|
|
TEST_F(TestPrivServiceSQLImpl, user_privilege_operations)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
const int64_t schema_version = INT64_MAX;
|
|
ObUserInfo user;
|
|
user.set_tenant_id(2);
|
|
user.set_user_id(1);
|
|
user.set_user_name("lilei");
|
|
user_info.set_host(OB_DEFAULT_HOST_NAME);
|
|
user.set_passwd("lilei");
|
|
user.set_info("student int class 1");
|
|
user.set_is_locked(false);
|
|
user.set_priv_set(OB_PRIV_SELECT | OB_PRIV_CREATE);
|
|
|
|
//create user
|
|
ASSERT_EQ(OB_SUCCESS, db_initer_.create_tenant_space(2));
|
|
ObISQLClient &sql_client = db_initer_.get_sql_proxy();
|
|
ret = schema_service_.create_user(user, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
//get batch of users
|
|
ObArray<ObTenantUserId> tenant_user_ids;
|
|
ObArray<ObUserInfo> user_info_array;
|
|
tenant_user_ids.push_back(ObTenantUserId(2, 1));
|
|
ret = schema_service_.get_batch_users(schema_version, tenant_user_ids, &sql_client, user_info_array);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(1, user_info_array.count());
|
|
//Equal test
|
|
EXPECT_EQ(user.get_tenant_id(), user_info_array[0].get_tenant_id());
|
|
EXPECT_EQ(user.get_user_id(), user_info_array[0].get_user_id());
|
|
EXPECT_EQ(user.get_user_name_str(), user_info_array[0].get_user_name_str());
|
|
EXPECT_EQ(user.get_passwd_str(), user_info_array[0].get_passwd_str());
|
|
EXPECT_EQ(user.get_info_str(), user_info_array[0].get_info_str());
|
|
EXPECT_EQ(user.get_is_locked(), user_info_array[0].get_is_locked());
|
|
EXPECT_EQ(user.get_priv_set(), user_info_array[0].get_priv_set());
|
|
user_info_array.reset();
|
|
|
|
//set passwd
|
|
ObString new_passwd("sql");
|
|
user.set_passwd("sql");
|
|
ret = schema_service_.set_passwd(user, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
ret = schema_service_.get_batch_users(schema_version, tenant_user_ids, &sql_client, user_info_array);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(1, user_info_array.count());
|
|
EXPECT_EQ(new_passwd, user_info_array[0].get_passwd_str());
|
|
user_info_array.reset();
|
|
|
|
//drop user
|
|
ret = schema_service_.drop_user(2, 1, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
ret = schema_service_.get_batch_users(schema_version, tenant_user_ids, &sql_client, user_info_array);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(0, user_info_array.count());
|
|
}
|
|
|
|
TEST_F(TestPrivServiceSQLImpl, database_privilege_operations)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
const int64_t schema_version = INT64_MAX;
|
|
ObOriginalDBKey db_priv_key;
|
|
db_priv_key.tenant_id_ = 2;
|
|
db_priv_key.user_id_ = 1;
|
|
db_priv_key.db_ = "test";
|
|
|
|
//grant database privilege
|
|
ASSERT_EQ(OB_SUCCESS, db_initer_.create_tenant_space(2));
|
|
ObISQLClient &sql_client = db_initer_.get_sql_proxy();
|
|
ret = schema_service_.grant_database(db_priv_key, OB_PRIV_SELECT | OB_PRIV_CREATE, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
//get batch of database privilege
|
|
ObArray<ObOriginalDBKey> db_priv_keys;
|
|
ObArray<ObDBPriv> db_priv_array;
|
|
db_priv_keys.push_back(db_priv_key);
|
|
ret = schema_service_.get_batch_db_privs(schema_version, db_priv_keys, &sql_client, db_priv_array);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(1, db_priv_array.count());
|
|
//Equal test
|
|
EXPECT_EQ(db_priv_key.tenant_id_, db_priv_array[0].get_tenant_id());
|
|
EXPECT_EQ(db_priv_key.user_id_, db_priv_array[0].get_user_id());
|
|
EXPECT_EQ(db_priv_key.db_, db_priv_array[0].get_database_name_str());
|
|
EXPECT_EQ(OB_PRIV_SELECT | OB_PRIV_CREATE, db_priv_array[0].get_priv_set());
|
|
db_priv_array.reset();
|
|
|
|
//Revoke database privilege
|
|
ret = schema_service_.revoke_database(db_priv_key, 0, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
db_priv_array.reset();
|
|
ret = schema_service_.get_batch_db_privs(schema_version, db_priv_keys, &sql_client, db_priv_array);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(0, db_priv_array.count());
|
|
|
|
//grant database privileges
|
|
ret = schema_service_.grant_database(db_priv_key, OB_PRIV_SELECT | OB_PRIV_CREATE, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
db_priv_key.user_id_ = 2;
|
|
ret = schema_service_.grant_database(db_priv_key, OB_PRIV_SELECT | OB_PRIV_CREATE, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
db_priv_array.reset();
|
|
db_priv_keys.reset();
|
|
|
|
ret = schema_service_.delete_db_priv(db_priv_key, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
}
|
|
|
|
TEST_F(TestPrivServiceSQLImpl, table_privilege_operations)
|
|
{
|
|
const int64_t schema_version = INT64_MAX;
|
|
int ret = OB_SUCCESS;
|
|
ObTablePrivSortKey table_priv_key;
|
|
table_priv_key.tenant_id_ = 2;
|
|
table_priv_key.user_id_ = 1;
|
|
table_priv_key.db_ = "test";
|
|
table_priv_key.table_ = "table_priv";
|
|
|
|
//grant table priv
|
|
ASSERT_EQ(OB_SUCCESS, db_initer_.create_tenant_space(2));
|
|
ObISQLClient &sql_client = db_initer_.get_sql_proxy();
|
|
ret = schema_service_.grant_table(table_priv_key, OB_PRIV_SELECT | OB_PRIV_INSERT, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
//get batch of table privs
|
|
ObArray<ObTablePrivSortKey> table_priv_keys;
|
|
ObArray<ObTablePriv> table_priv_array;
|
|
table_priv_keys.push_back(table_priv_key);
|
|
ret = schema_service_.get_batch_table_privs(schema_version, table_priv_keys, &sql_client, table_priv_array);
|
|
ASSERT_EQ(1, table_priv_array.count());
|
|
//Equal test
|
|
EXPECT_EQ(table_priv_key.tenant_id_, table_priv_array[0].get_tenant_id());
|
|
EXPECT_EQ(table_priv_key.user_id_, table_priv_array[0].get_user_id());
|
|
EXPECT_EQ(table_priv_key.db_, table_priv_array[0].get_database_name_str());
|
|
EXPECT_EQ(table_priv_key.table_, table_priv_array[0].get_table_name_str());
|
|
EXPECT_EQ(OB_PRIV_SELECT | OB_PRIV_INSERT, table_priv_array[0].get_priv_set());
|
|
table_priv_array.reset();
|
|
|
|
//Revoke table privilege
|
|
ret = schema_service_.revoke_table(table_priv_key, 0, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
ret = schema_service_.get_batch_table_privs(schema_version, table_priv_keys, &sql_client, table_priv_array);
|
|
ASSERT_EQ(0, table_priv_array.count());//No table privileges now.
|
|
|
|
//grant table priv
|
|
table_priv_key.user_id_ = 1;
|
|
ret = schema_service_.grant_table(table_priv_key, OB_PRIV_SELECT | OB_PRIV_INSERT, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
table_priv_key.user_id_ = 2;
|
|
ret = schema_service_.grant_table(table_priv_key, OB_PRIV_SELECT | OB_PRIV_INSERT, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
//delete table privilege
|
|
ret = schema_service_.delete_table_priv(table_priv_key, &sql_client);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
table_priv_keys.reset();
|
|
table_priv_keys.push_back(table_priv_key);
|
|
table_priv_array.reset();
|
|
ret = schema_service_.get_batch_table_privs(schema_version, table_priv_keys, &sql_client, table_priv_array);
|
|
ASSERT_EQ(0, table_priv_array.count());
|
|
|
|
table_priv_key.user_id_ = 1;
|
|
table_priv_keys.reset();
|
|
table_priv_keys.push_back(table_priv_key);
|
|
table_priv_array.reset();
|
|
ret = schema_service_.get_batch_table_privs(schema_version, table_priv_keys, &sql_client, table_priv_array);
|
|
ASSERT_EQ(1, table_priv_array.count());
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
testing::InitGoogleTest(&argc, argv);
|
|
OB_LOGGER.set_log_level("INFO");
|
|
OB_LOGGER.set_log_level("INFO");
|
|
return RUN_ALL_TESTS();
|
|
}
|