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();
 | 
						|
}
 |