/** * 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 #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 tenant_user_ids; ObArray 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 db_priv_keys; ObArray 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 table_priv_keys; ObArray 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(); }