119e95205Sopenharmony_ci/* 219e95205Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 419e95205Sopenharmony_ci * you may not use this file except in compliance with the License. 519e95205Sopenharmony_ci * You may obtain a copy of the License at 619e95205Sopenharmony_ci * 719e95205Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 819e95205Sopenharmony_ci * 919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and 1319e95205Sopenharmony_ci * limitations under the License. 1419e95205Sopenharmony_ci */ 1519e95205Sopenharmony_ci#include <gmock/gmock.h> 1619e95205Sopenharmony_ci#include <gtest/gtest.h> 1719e95205Sopenharmony_ci#include "bluetooth_pbap_client.h" 1819e95205Sopenharmony_ci#include "bluetooth_host.h" 1919e95205Sopenharmony_ci 2019e95205Sopenharmony_ciusing namespace testing; 2119e95205Sopenharmony_ciusing namespace testing::ext; 2219e95205Sopenharmony_ciusing namespace std; 2319e95205Sopenharmony_ci 2419e95205Sopenharmony_cinamespace OHOS { 2519e95205Sopenharmony_cinamespace Bluetooth { 2619e95205Sopenharmony_ciconstexpr int TIME = 2; 2719e95205Sopenharmony_ci 2819e95205Sopenharmony_ciclass PbapClientObserverCommon : public PbapClientObserver { 2919e95205Sopenharmony_cipublic: 3019e95205Sopenharmony_ci PbapClientObserverCommon() = default; 3119e95205Sopenharmony_ci virtual ~PbapClientObserverCommon() = default; 3219e95205Sopenharmony_ci 3319e95205Sopenharmony_ci void OnServiceConnectionStateChanged(const BluetoothRemoteDevice &device, int state) {} 3419e95205Sopenharmony_ci void OnServicePasswordRequired(const BluetoothRemoteDevice &device, 3519e95205Sopenharmony_ci const std::vector<uint8_t> &description, uint8_t charset, bool fullAccess = true) {} 3619e95205Sopenharmony_ci void OnActionCompleted( 3719e95205Sopenharmony_ci const BluetoothRemoteDevice &device, int respCode, int actionType, const PbapPhoneBookData &result) {} 3819e95205Sopenharmony_ci 3919e95205Sopenharmony_ciprivate: 4019e95205Sopenharmony_ci}; 4119e95205Sopenharmony_ci 4219e95205Sopenharmony_cistatic PbapClientObserverCommon observer_; 4319e95205Sopenharmony_cistatic PbapClient *profile_; 4419e95205Sopenharmony_ci 4519e95205Sopenharmony_ci 4619e95205Sopenharmony_ciclass PbapClientTest : public testing::Test { 4719e95205Sopenharmony_cipublic: 4819e95205Sopenharmony_ci PbapClientTest() 4919e95205Sopenharmony_ci {} 5019e95205Sopenharmony_ci ~PbapClientTest() 5119e95205Sopenharmony_ci {} 5219e95205Sopenharmony_ci static void SetUpTestCase(void); 5319e95205Sopenharmony_ci static void TearDownTestCase(void); 5419e95205Sopenharmony_ci void SetUp(); 5519e95205Sopenharmony_ci void TearDown(); 5619e95205Sopenharmony_ci BluetoothHost *host_; 5719e95205Sopenharmony_ci}; 5819e95205Sopenharmony_ci 5919e95205Sopenharmony_ci 6019e95205Sopenharmony_civoid PbapClientTest::SetUpTestCase(void) {} 6119e95205Sopenharmony_civoid PbapClientTest::TearDownTestCase(void) {} 6219e95205Sopenharmony_ci 6319e95205Sopenharmony_civoid PbapClientTest::SetUp() 6419e95205Sopenharmony_ci{ 6519e95205Sopenharmony_ci host_ = &BluetoothHost::GetDefaultHost(); 6619e95205Sopenharmony_ci host_->EnableBt(); 6719e95205Sopenharmony_ci host_->EnableBle(); 6819e95205Sopenharmony_ci sleep(TIME); 6919e95205Sopenharmony_ci} 7019e95205Sopenharmony_ci 7119e95205Sopenharmony_civoid PbapClientTest::TearDown() 7219e95205Sopenharmony_ci{ 7319e95205Sopenharmony_ci host_->DisableBt(); 7419e95205Sopenharmony_ci host_->DisableBle(); 7519e95205Sopenharmony_ci host_ = nullptr; 7619e95205Sopenharmony_ci sleep(TIME); 7719e95205Sopenharmony_ci} 7819e95205Sopenharmony_ci 7919e95205Sopenharmony_ci/* 8019e95205Sopenharmony_ci * @tc.number: PbapClientUnit001 8119e95205Sopenharmony_ci * @tc.name: Connect 8219e95205Sopenharmony_ci * @tc.desc: Initiate the establishment of a service level connection to remote pbapclient device. 8319e95205Sopenharmony_ci*/ 8419e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_Connect, TestSize.Level1) 8519e95205Sopenharmony_ci{ 8619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_Connect start"; 8719e95205Sopenharmony_ci 8819e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 8919e95205Sopenharmony_ci BluetoothRemoteDevice device; 9019e95205Sopenharmony_ci bool isOK = profile_->Connect(device); 9119e95205Sopenharmony_ci EXPECT_EQ(isOK, true); 9219e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_Connect end"; 9319e95205Sopenharmony_ci} 9419e95205Sopenharmony_ci 9519e95205Sopenharmony_ci/* 9619e95205Sopenharmony_ci * @tc.number: PbapClientUnit002 9719e95205Sopenharmony_ci * @tc.name: Disconnect 9819e95205Sopenharmony_ci * @tc.desc: Release the connection from pbapclient device. 9919e95205Sopenharmony_ci*/ 10019e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_Disconnect, TestSize.Level1) 10119e95205Sopenharmony_ci{ 10219e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_Disconnect start"; 10319e95205Sopenharmony_ci 10419e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 10519e95205Sopenharmony_ci BluetoothRemoteDevice device; 10619e95205Sopenharmony_ci bool isOK = profile_->Disconnect(device); 10719e95205Sopenharmony_ci EXPECT_EQ(isOK, true); 10819e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_Disconnect end"; 10919e95205Sopenharmony_ci} 11019e95205Sopenharmony_ci 11119e95205Sopenharmony_ci/* 11219e95205Sopenharmony_ci * @tc.number: PbapClientUnit003 11319e95205Sopenharmony_ci * @tc.name: RegisterObserver 11419e95205Sopenharmony_ci * @tc.desc: Register PbapClient observer instance. 11519e95205Sopenharmony_ci*/ 11619e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_RegisterObserver, TestSize.Level1) 11719e95205Sopenharmony_ci{ 11819e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_RegisterObserver start"; 11919e95205Sopenharmony_ci 12019e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 12119e95205Sopenharmony_ci profile_->RegisterObserver(&observer_); 12219e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_RegisterObserver end"; 12319e95205Sopenharmony_ci} 12419e95205Sopenharmony_ci 12519e95205Sopenharmony_ci/* 12619e95205Sopenharmony_ci * @tc.number: PbapClientUnit004 12719e95205Sopenharmony_ci * @tc.name: DeregisterObserver 12819e95205Sopenharmony_ci * @tc.desc: Deregister PbapClient observer instance. 12919e95205Sopenharmony_ci*/ 13019e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_DeregisterObserver, TestSize.Level1) 13119e95205Sopenharmony_ci{ 13219e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_DeregisterObserver start"; 13319e95205Sopenharmony_ci 13419e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 13519e95205Sopenharmony_ci profile_->DeregisterObserver(&observer_); 13619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_DeregisterObserver end"; 13719e95205Sopenharmony_ci} 13819e95205Sopenharmony_ci 13919e95205Sopenharmony_ci/* 14019e95205Sopenharmony_ci * @tc.number: PbapClientUnit005 14119e95205Sopenharmony_ci * @tc.name: GetConnectedDevices 14219e95205Sopenharmony_ci * @tc.desc: Get remote PbapClient device list which are in the connected state. 14319e95205Sopenharmony_ci*/ 14419e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_GetConnectedDevices, TestSize.Level1) 14519e95205Sopenharmony_ci{ 14619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetConnectedDevices start"; 14719e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 14819e95205Sopenharmony_ci vector<BluetoothRemoteDevice> devices = profile_->GetConnectedDevices(); 14919e95205Sopenharmony_ci int vectorSize = devices.size(); 15019e95205Sopenharmony_ci EXPECT_EQ(vectorSize, 0); 15119e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetConnectedDevices end"; 15219e95205Sopenharmony_ci} 15319e95205Sopenharmony_ci 15419e95205Sopenharmony_ci/* 15519e95205Sopenharmony_ci * @tc.number: PbapClientUnit006 15619e95205Sopenharmony_ci * @tc.name: GetDevicesByStates 15719e95205Sopenharmony_ci * @tc.desc: Get remote PbapClient device list which are in the specified states. 15819e95205Sopenharmony_ci*/ 15919e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_GetDevicesByStates, TestSize.Level1) 16019e95205Sopenharmony_ci{ 16119e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetDevicesByStates start"; 16219e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 16319e95205Sopenharmony_ci vector<int> states = {static_cast<int>(BTConnectState::CONNECTED)}; 16419e95205Sopenharmony_ci vector<BluetoothRemoteDevice> devices = profile_->GetDevicesByStates(states); 16519e95205Sopenharmony_ci int vectorSize = devices.size(); 16619e95205Sopenharmony_ci EXPECT_EQ(vectorSize, 0); 16719e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetDevicesByStates end"; 16819e95205Sopenharmony_ci} 16919e95205Sopenharmony_ci 17019e95205Sopenharmony_ci/* 17119e95205Sopenharmony_ci * @tc.number: PbapClientUnit007 17219e95205Sopenharmony_ci * @tc.name: GetDeviceState 17319e95205Sopenharmony_ci * @tc.desc: Get remote PbapClient device state which are in the specified states. 17419e95205Sopenharmony_ci*/ 17519e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_GetDeviceState, TestSize.Level1) 17619e95205Sopenharmony_ci{ 17719e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetDeviceState start"; 17819e95205Sopenharmony_ci 17919e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 18019e95205Sopenharmony_ci BluetoothRemoteDevice device; 18119e95205Sopenharmony_ci int state = profile_->GetDeviceState(device); 18219e95205Sopenharmony_ci EXPECT_EQ(state, -1); 18319e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetDevicesByStates end"; 18419e95205Sopenharmony_ci} 18519e95205Sopenharmony_ci 18619e95205Sopenharmony_ci/* 18719e95205Sopenharmony_ci * @tc.number: PbapClientUnit008 18819e95205Sopenharmony_ci * @tc.name: SetConnectionStrategy 18919e95205Sopenharmony_ci * @tc.desc: set the strategy with the specified remote device 19019e95205Sopenharmony_ci*/ 19119e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_SetConnectionStrategy, TestSize.Level1) 19219e95205Sopenharmony_ci{ 19319e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_SetConnectionStrategy start"; 19419e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 19519e95205Sopenharmony_ci BluetoothRemoteDevice device; 19619e95205Sopenharmony_ci int strategy = 0; 19719e95205Sopenharmony_ci bool isOk = profile_->SetConnectionStrategy(device, strategy); 19819e95205Sopenharmony_ci EXPECT_EQ(isOk, false); 19919e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_SetConnectionStrategy end"; 20019e95205Sopenharmony_ci} 20119e95205Sopenharmony_ci 20219e95205Sopenharmony_ci/* 20319e95205Sopenharmony_ci * @tc.number: PbapClientUnit009 20419e95205Sopenharmony_ci * @tc.name: GetConnectionStrategy 20519e95205Sopenharmony_ci * @tc.desc: get the strategy with the specified remote device 20619e95205Sopenharmony_ci*/ 20719e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_GetConnectionStrategy, TestSize.Level1) 20819e95205Sopenharmony_ci{ 20919e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetConnectionStrategy start"; 21019e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 21119e95205Sopenharmony_ci BluetoothRemoteDevice device; 21219e95205Sopenharmony_ci int state = profile_->GetConnectionStrategy(device); 21319e95205Sopenharmony_ci EXPECT_EQ(state, -1); 21419e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_GetConnectionStrategy end"; 21519e95205Sopenharmony_ci} 21619e95205Sopenharmony_ci 21719e95205Sopenharmony_ci/* 21819e95205Sopenharmony_ci * @tc.number: PbapClientUnit010 21919e95205Sopenharmony_ci * @tc.name: SetDevicePassword 22019e95205Sopenharmony_ci * @tc.desc: Set device's password. please call after OnServicePasswordRequired event. 22119e95205Sopenharmony_ci*/ 22219e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_SetDevicePassword, TestSize.Level1) 22319e95205Sopenharmony_ci{ 22419e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_SetDevicePassword start"; 22519e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 22619e95205Sopenharmony_ci BluetoothRemoteDevice device; 22719e95205Sopenharmony_ci string password = "123"; 22819e95205Sopenharmony_ci string userId = "123"; 22919e95205Sopenharmony_ci int state = profile_->SetDevicePassword(device, password, userId); 23019e95205Sopenharmony_ci EXPECT_EQ(state, -1); 23119e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_SetDevicePassword end"; 23219e95205Sopenharmony_ci} 23319e95205Sopenharmony_ci 23419e95205Sopenharmony_ci/* 23519e95205Sopenharmony_ci * @tc.number: PbapClientUnit011 23619e95205Sopenharmony_ci * @tc.name: PullPhoneBook 23719e95205Sopenharmony_ci * @tc.desc: Pull phone book from remote device after connected. 23819e95205Sopenharmony_ci*/ 23919e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_PullPhoneBook, TestSize.Level1) 24019e95205Sopenharmony_ci{ 24119e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_PullPhoneBook start"; 24219e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 24319e95205Sopenharmony_ci BluetoothRemoteDevice device; 24419e95205Sopenharmony_ci PbapPullPhoneBookParam param; 24519e95205Sopenharmony_ci int state = profile_->PullPhoneBook(device, param); 24619e95205Sopenharmony_ci EXPECT_EQ(state, -1); 24719e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_PullPhoneBook end"; 24819e95205Sopenharmony_ci} 24919e95205Sopenharmony_ci 25019e95205Sopenharmony_ci/* 25119e95205Sopenharmony_ci * @tc.number: PbapClientUnit012 25219e95205Sopenharmony_ci * @tc.name: SetPhoneBook 25319e95205Sopenharmony_ci * @tc.desc: Set phone book from remote device after connected. 25419e95205Sopenharmony_ci*/ 25519e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_SetPhoneBook, TestSize.Level1) 25619e95205Sopenharmony_ci{ 25719e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_SetPhoneBook start"; 25819e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 25919e95205Sopenharmony_ci BluetoothRemoteDevice device; 26019e95205Sopenharmony_ci std::u16string name = {'a', 'b', 'c', 0}; 26119e95205Sopenharmony_ci int flag = 0; 26219e95205Sopenharmony_ci int state = profile_->SetPhoneBook(device, name, flag); 26319e95205Sopenharmony_ci EXPECT_EQ(state, -1); 26419e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_SetPhoneBook end"; 26519e95205Sopenharmony_ci} 26619e95205Sopenharmony_ci 26719e95205Sopenharmony_ci/* 26819e95205Sopenharmony_ci * @tc.number: PbapClientUnit013 26919e95205Sopenharmony_ci * @tc.name: PullvCardListing 27019e95205Sopenharmony_ci * @tc.desc: Pull vCard listing from remote device after connected. 27119e95205Sopenharmony_ci*/ 27219e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_PullvCardListing, TestSize.Level1) 27319e95205Sopenharmony_ci{ 27419e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_PullvCardListing start"; 27519e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 27619e95205Sopenharmony_ci BluetoothRemoteDevice device; 27719e95205Sopenharmony_ci PbapPullvCardListingParam param; 27819e95205Sopenharmony_ci int state = profile_->PullvCardListing(device, param); 27919e95205Sopenharmony_ci EXPECT_EQ(state, -1); 28019e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_PullvCardListing end"; 28119e95205Sopenharmony_ci} 28219e95205Sopenharmony_ci 28319e95205Sopenharmony_ci/* 28419e95205Sopenharmony_ci * @tc.number: PbapClientUnit014 28519e95205Sopenharmony_ci * @tc.name: PullvCardEntry 28619e95205Sopenharmony_ci * @tc.desc: Pull vCard entry from remote device after connected. 28719e95205Sopenharmony_ci*/ 28819e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_PullvCardEntry, TestSize.Level1) 28919e95205Sopenharmony_ci{ 29019e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_PullvCardEntry start"; 29119e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 29219e95205Sopenharmony_ci BluetoothRemoteDevice device; 29319e95205Sopenharmony_ci PbapPullvCardEntryParam param; 29419e95205Sopenharmony_ci int state = profile_->PullvCardEntry(device, param); 29519e95205Sopenharmony_ci EXPECT_EQ(state, -1); 29619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_PullvCardEntry end"; 29719e95205Sopenharmony_ci} 29819e95205Sopenharmony_ci 29919e95205Sopenharmony_ci/* 30019e95205Sopenharmony_ci * @tc.number: PbapClientUnit015 30119e95205Sopenharmony_ci * @tc.name: IsDownloading 30219e95205Sopenharmony_ci * @tc.desc: Check if local device is downloading phonebook from remote device. 30319e95205Sopenharmony_ci*/ 30419e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_IsDownloading, TestSize.Level1) 30519e95205Sopenharmony_ci{ 30619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_IsDownloading start"; 30719e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 30819e95205Sopenharmony_ci BluetoothRemoteDevice device; 30919e95205Sopenharmony_ci bool isOk = profile_->IsDownloading(device); 31019e95205Sopenharmony_ci EXPECT_EQ(isOk, false); 31119e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_IsDownloading end"; 31219e95205Sopenharmony_ci} 31319e95205Sopenharmony_ci 31419e95205Sopenharmony_ci/* 31519e95205Sopenharmony_ci * @tc.number: PbapClientUnit015 31619e95205Sopenharmony_ci * @tc.name: AbortDownloading 31719e95205Sopenharmony_ci * @tc.desc: Abort downloading phonebook from remote device. 31819e95205Sopenharmony_ci*/ 31919e95205Sopenharmony_ciHWTEST_F(PbapClientTest, PbapClient_UnitTest_AbortDownloading, TestSize.Level1) 32019e95205Sopenharmony_ci{ 32119e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_AbortDownloading start"; 32219e95205Sopenharmony_ci profile_ = PbapClient::GetProfile(); 32319e95205Sopenharmony_ci BluetoothRemoteDevice device; 32419e95205Sopenharmony_ci int state = profile_->AbortDownloading(device); 32519e95205Sopenharmony_ci EXPECT_EQ(state, -1); 32619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "PbapClient_UnitTest_AbortDownloading end"; 32719e95205Sopenharmony_ci} 32819e95205Sopenharmony_ci} // namespace Bluetooth 32919e95205Sopenharmony_ci} // namespace OHOS