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 1619e95205Sopenharmony_ci#include "ble_test.h" 1719e95205Sopenharmony_ci#include "bluetooth_def.h" 1819e95205Sopenharmony_ci#include "bluetooth_errorcode.h" 1919e95205Sopenharmony_ci#include <thread> 2019e95205Sopenharmony_ci#include <mutex> 2119e95205Sopenharmony_ci#include <condition_variable> 2219e95205Sopenharmony_ci 2319e95205Sopenharmony_cinamespace OHOS { 2419e95205Sopenharmony_cinamespace Bluetooth { 2519e95205Sopenharmony_ciBleTest *BleTest::bleInstance_ = nullptr; 2619e95205Sopenharmony_cinamespace { 2719e95205Sopenharmony_ciconst static int defaultInt = 150; 2819e95205Sopenharmony_ciconst static int INTERVAL = 350; 2919e95205Sopenharmony_ciconst static int MIN_ADV_LENGTH = 31; 3019e95205Sopenharmony_ciconst static int MAX_ADV_LENGTH = 1650; 3119e95205Sopenharmony_ciBluetooth::UUID g_uuid = Bluetooth::UUID::FromString("00000000-0000-1000-8000-00805F9B34FB"); 3219e95205Sopenharmony_ciBluetooth::UUID g_serviceDataUuid = Bluetooth::UUID::FromString("00000000-0000-1000-8000-00805F9B34FA"); 3319e95205Sopenharmony_ciBluetooth::UUID g_serviceUuid = Bluetooth::UUID::FromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF"); 3419e95205Sopenharmony_ciBluetooth::UUID g_serviceUuidMask = Bluetooth::UUID::FromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF"); 3519e95205Sopenharmony_ciBluetooth::UUID g_serviceSolicitationUuid = Bluetooth::UUID::FromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF"); 3619e95205Sopenharmony_ciBluetooth::UUID g_serviceSolicitationUuidMask = Bluetooth::UUID::FromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF"); 3719e95205Sopenharmony_cistd::string g_serviceData = "123"; 3819e95205Sopenharmony_ciint g_manufacturerId = 24; 3919e95205Sopenharmony_cistd::string g_manufacturerData = "1567"; 4019e95205Sopenharmony_ci 4119e95205Sopenharmony_cistd::mutex g_mx; 4219e95205Sopenharmony_cistd::condition_variable g_cv; 4319e95205Sopenharmony_cibool g_ready = false; 4419e95205Sopenharmony_ciint g_wait_time = 3; 4519e95205Sopenharmony_ci} // namespace 4619e95205Sopenharmony_ci 4719e95205Sopenharmony_civoid BleTest::InitAdvertiseSettings() 4819e95205Sopenharmony_ci{ 4919e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_.SetConnectable(true); 5019e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_.SetLegacyMode(true); 5119e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_.SetInterval(INTERVAL); 5219e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_.SetTxPower(BLE_ADV_TX_POWER_LEVEL::BLE_ADV_TX_POWER_MEDIUM); 5319e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_.SetPrimaryPhy(PHY_TYPE::PHY_LE_ALL_SUPPORTED); 5419e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_.SetSecondaryPhy(PHY_TYPE::PHY_LE_2M); 5519e95205Sopenharmony_ci} 5619e95205Sopenharmony_civoid BleTest::InitScanSettings() 5719e95205Sopenharmony_ci{ 5819e95205Sopenharmony_ci BleTest::bleInstance_->bleScanSettings_.SetReportDelay(defaultInt); 5919e95205Sopenharmony_ci BleTest::bleInstance_->bleScanSettings_.SetScanMode(SCAN_MODE::SCAN_MODE_LOW_POWER); 6019e95205Sopenharmony_ci BleTest::bleInstance_->bleScanSettings_.SetLegacy(true); 6119e95205Sopenharmony_ci BleTest::bleInstance_->bleScanSettings_.SetPhy(PHY_TYPE::PHY_LE_ALL_SUPPORTED); 6219e95205Sopenharmony_ci} 6319e95205Sopenharmony_ci 6419e95205Sopenharmony_cibool BleTest::EnableBle() 6519e95205Sopenharmony_ci{ 6619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "enable ble start"; 6719e95205Sopenharmony_ci std::unique_lock lock(g_mx); 6819e95205Sopenharmony_ci bool isEnable = false; 6919e95205Sopenharmony_ci int32_t ret = host_->EnableBle(); 7019e95205Sopenharmony_ci if (ret == NO_ERROR) { 7119e95205Sopenharmony_ci isEnable = true; 7219e95205Sopenharmony_ci } 7319e95205Sopenharmony_ci EXPECT_TRUE(isEnable); 7419e95205Sopenharmony_ci while (!g_ready) { 7519e95205Sopenharmony_ci g_cv.wait(lock); 7619e95205Sopenharmony_ci } 7719e95205Sopenharmony_ci std::this_thread::sleep_for(std::chrono::seconds(g_wait_time)); 7819e95205Sopenharmony_ci EXPECT_TRUE(host_->IsBleEnabled()); 7919e95205Sopenharmony_ci GTEST_LOG_(INFO) << "enable ble end"; 8019e95205Sopenharmony_ci return isEnable; 8119e95205Sopenharmony_ci} 8219e95205Sopenharmony_ci 8319e95205Sopenharmony_cibool BleTest::DisableBle() 8419e95205Sopenharmony_ci{ 8519e95205Sopenharmony_ci GTEST_LOG_(INFO) << "disable ble start"; 8619e95205Sopenharmony_ci std::unique_lock lock(g_mx); 8719e95205Sopenharmony_ci bool isEnable = false; 8819e95205Sopenharmony_ci int ret = host_->DisableBle(); 8919e95205Sopenharmony_ci if (ret == NO_ERROR) { 9019e95205Sopenharmony_ci isEnable = true; 9119e95205Sopenharmony_ci } 9219e95205Sopenharmony_ci EXPECT_TRUE(isEnable); 9319e95205Sopenharmony_ci while (!g_ready) { 9419e95205Sopenharmony_ci g_cv.wait(lock); 9519e95205Sopenharmony_ci } 9619e95205Sopenharmony_ci std::this_thread::sleep_for(std::chrono::seconds(g_wait_time)); 9719e95205Sopenharmony_ci EXPECT_FALSE(host_->IsBleEnabled()); 9819e95205Sopenharmony_ci GTEST_LOG_(INFO) << "disable ble end"; 9919e95205Sopenharmony_ci return isEnable; 10019e95205Sopenharmony_ci} 10119e95205Sopenharmony_ci 10219e95205Sopenharmony_cibool BleTest::HaveUuid(Bluetooth::BleAdvertiserData advData) 10319e95205Sopenharmony_ci{ 10419e95205Sopenharmony_ci for (Bluetooth::UUID uuid : advData.GetServiceUuids()) { 10519e95205Sopenharmony_ci if (uuid.Equals(g_uuid)) { 10619e95205Sopenharmony_ci isHaveUuid = true; 10719e95205Sopenharmony_ci } 10819e95205Sopenharmony_ci } 10919e95205Sopenharmony_ci return isHaveUuid; 11019e95205Sopenharmony_ci} 11119e95205Sopenharmony_ci 11219e95205Sopenharmony_cibool BleTest::ManufacturerData(Bluetooth::BleAdvertiserData advData) 11319e95205Sopenharmony_ci{ 11419e95205Sopenharmony_ci if (advData.GetManufacturerData().empty()) { 11519e95205Sopenharmony_ci return false; 11619e95205Sopenharmony_ci } else { 11719e95205Sopenharmony_ci std::map<uint16_t, std::string> data = advData.GetManufacturerData(); 11819e95205Sopenharmony_ci std::map<uint16_t, std::string>::iterator iter = data.begin(); 11919e95205Sopenharmony_ci for (; iter != data.end(); ++iter) { 12019e95205Sopenharmony_ci if (g_manufacturerId == iter->first) { 12119e95205Sopenharmony_ci EXPECT_STREQ(g_manufacturerData.c_str(), iter->second.c_str()); 12219e95205Sopenharmony_ci } 12319e95205Sopenharmony_ci } 12419e95205Sopenharmony_ci } 12519e95205Sopenharmony_ci return true; 12619e95205Sopenharmony_ci} 12719e95205Sopenharmony_ci 12819e95205Sopenharmony_cibool BleTest::ServiceData(Bluetooth::BleAdvertiserData advData) 12919e95205Sopenharmony_ci{ 13019e95205Sopenharmony_ci if (advData.GetServiceData().empty()) { 13119e95205Sopenharmony_ci return false; 13219e95205Sopenharmony_ci } else { 13319e95205Sopenharmony_ci for (auto &iter : advData.GetServiceData()) { 13419e95205Sopenharmony_ci if (g_serviceData == iter.second) { 13519e95205Sopenharmony_ci EXPECT_STREQ(g_serviceData.c_str(), iter.second.c_str()); 13619e95205Sopenharmony_ci } 13719e95205Sopenharmony_ci } 13819e95205Sopenharmony_ci } 13919e95205Sopenharmony_ci return true; 14019e95205Sopenharmony_ci} 14119e95205Sopenharmony_ci 14219e95205Sopenharmony_ciBleTest::BleTest() 14319e95205Sopenharmony_ci{ 14419e95205Sopenharmony_ci bleInstance_ = this; 14519e95205Sopenharmony_ci host_ = &BluetoothHost::GetDefaultHost(); 14619e95205Sopenharmony_ci} 14719e95205Sopenharmony_ciBleTest::~BleTest() 14819e95205Sopenharmony_ci{} 14919e95205Sopenharmony_ci 15019e95205Sopenharmony_civoid BleTest::SetUpTestCase(void) 15119e95205Sopenharmony_ci{} 15219e95205Sopenharmony_ci 15319e95205Sopenharmony_civoid BleTest::TearDownTestCase(void) 15419e95205Sopenharmony_ci{} 15519e95205Sopenharmony_ci 15619e95205Sopenharmony_civoid BleTest::SetUp() 15719e95205Sopenharmony_ci{ 15819e95205Sopenharmony_ci GTEST_LOG_(INFO) << "SetUp"; 15919e95205Sopenharmony_ci bleHostObserverTest_ = std::make_shared<BleHostObserverTest>(); 16019e95205Sopenharmony_ci host_->RegisterObserver(bleHostObserverTest_); 16119e95205Sopenharmony_ci} 16219e95205Sopenharmony_ci 16319e95205Sopenharmony_civoid BleTest::TearDown() 16419e95205Sopenharmony_ci{ 16519e95205Sopenharmony_ci GTEST_LOG_(INFO) << "SetUp"; 16619e95205Sopenharmony_ci if (bleHostObserverTest_) { 16719e95205Sopenharmony_ci host_->DeregisterObserver(bleHostObserverTest_); 16819e95205Sopenharmony_ci } 16919e95205Sopenharmony_ci} 17019e95205Sopenharmony_ci 17119e95205Sopenharmony_civoid BleHostObserverTest::OnStateChanged(const int transport, const int status) 17219e95205Sopenharmony_ci{ 17319e95205Sopenharmony_ci GTEST_LOG_(INFO) << "OnStateChanged"; 17419e95205Sopenharmony_ci std::unique_lock lock(g_mx); 17519e95205Sopenharmony_ci if (transport == BT_TRANSPORT_BLE) { 17619e95205Sopenharmony_ci if (status == STATE_TURN_ON || status == STATE_TURN_OFF) { 17719e95205Sopenharmony_ci g_ready = true; 17819e95205Sopenharmony_ci g_cv.notify_all(); 17919e95205Sopenharmony_ci } 18019e95205Sopenharmony_ci } 18119e95205Sopenharmony_ci} 18219e95205Sopenharmony_ci 18319e95205Sopenharmony_ci 18419e95205Sopenharmony_ci/** 18519e95205Sopenharmony_ci * @tc.number: BLE_ModuleTest_StartAdvertising_00100 18619e95205Sopenharmony_ci * @tc.name: 18719e95205Sopenharmony_ci * @tc.desc: 18819e95205Sopenharmony_ci */ 18919e95205Sopenharmony_ciHWTEST_F(BleTest, BLE_ModuleTest_StartAdvertising_00100, TestSize.Level1) 19019e95205Sopenharmony_ci{ 19119e95205Sopenharmony_ci GTEST_LOG_(INFO) << "Ble_ModuleTest_StartAdvertising_00100 start"; 19219e95205Sopenharmony_ci 19319e95205Sopenharmony_ci EXPECT_TRUE(EnableBle()); 19419e95205Sopenharmony_ci BleTest::bleInstance_->InitAdvertiseSettings(); 19519e95205Sopenharmony_ci std::shared_ptr<BleAdvertiser> bleAdvertise = BleAdvertiser::CreateInstance(); 19619e95205Sopenharmony_ci BleAdvertiserData advData; 19719e95205Sopenharmony_ci BleAdvertiserData scanData; 19819e95205Sopenharmony_ci advData.AddServiceUuid(g_uuid); 19919e95205Sopenharmony_ci advData.AddManufacturerData(g_manufacturerId, g_manufacturerData); 20019e95205Sopenharmony_ci advData.AddServiceData(g_serviceDataUuid, g_serviceData); 20119e95205Sopenharmony_ci advData.SetAdvFlag(BLE_ADV_FLAG_GEN_DISC); 20219e95205Sopenharmony_ci bleAdvertise->StartAdvertising( 20319e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_, advData, scanData, 0, bleAdvertiseCallbackTest_); 20419e95205Sopenharmony_ci 20519e95205Sopenharmony_ci GTEST_LOG_(INFO) << "advData function test"; 20619e95205Sopenharmony_ci EXPECT_TRUE(BleTest::bleInstance_->HaveUuid(advData)); 20719e95205Sopenharmony_ci EXPECT_TRUE(BleTest::bleInstance_->ManufacturerData(advData)); 20819e95205Sopenharmony_ci EXPECT_TRUE(BleTest::bleInstance_->ServiceData(advData)); 20919e95205Sopenharmony_ci EXPECT_EQ(BLE_ADV_FLAG_GEN_DISC, advData.GetAdvFlag()); 21019e95205Sopenharmony_ci 21119e95205Sopenharmony_ci bleAdvertise->StopAdvertising(bleAdvertiseCallbackTest_); 21219e95205Sopenharmony_ci vector<uint8_t> advData1 = {1, 2, 3}; 21319e95205Sopenharmony_ci vector<uint8_t> scanData1 = {3, 2, 1}; 21419e95205Sopenharmony_ci bleAdvertise->StartAdvertising( 21519e95205Sopenharmony_ci BleTest::bleInstance_->bleAdvertiserSettings_, advData1, scanData1, 0, bleAdvertiseCallbackTest_); 21619e95205Sopenharmony_ci bleAdvertise->StopAdvertising(bleAdvertiseCallbackTest_); 21719e95205Sopenharmony_ci int32_t length = host_->GetBleMaxAdvertisingDataLength(); 21819e95205Sopenharmony_ci EXPECT_LE(MIN_ADV_LENGTH, length); 21919e95205Sopenharmony_ci EXPECT_GE(MAX_ADV_LENGTH, length); 22019e95205Sopenharmony_ci 22119e95205Sopenharmony_ci bleAdvertise->Close(bleAdvertiseCallbackTest_); 22219e95205Sopenharmony_ci EXPECT_TRUE(DisableBle()); 22319e95205Sopenharmony_ci GTEST_LOG_(INFO) << "Ble_ModuleTest_StartAdvertising_00100 end"; 22419e95205Sopenharmony_ci} 22519e95205Sopenharmony_ci 22619e95205Sopenharmony_ciHWTEST_F(BleTest, BLE_ModuleTest_StartAdvertising_00200, TestSize.Level1) 22719e95205Sopenharmony_ci{ 22819e95205Sopenharmony_ci GTEST_LOG_(INFO) << "BLE_ModuleTest_StartAdvertising_00200 start"; 22919e95205Sopenharmony_ci BleTest::bleInstance_->InitAdvertiseSettings(); 23019e95205Sopenharmony_ci EXPECT_TRUE(BleTest::bleInstance_->bleAdvertiserSettings_.IsConnectable()); 23119e95205Sopenharmony_ci EXPECT_TRUE(BleTest::bleInstance_->bleAdvertiserSettings_.IsLegacyMode()); 23219e95205Sopenharmony_ci EXPECT_EQ(static_cast<uint16_t>(INTERVAL), BleTest::bleInstance_->bleAdvertiserSettings_.GetInterval()); 23319e95205Sopenharmony_ci EXPECT_EQ( 23419e95205Sopenharmony_ci BLE_ADV_TX_POWER_LEVEL::BLE_ADV_TX_POWER_MEDIUM, BleTest::bleInstance_->bleAdvertiserSettings_.GetTxPower()); 23519e95205Sopenharmony_ci EXPECT_EQ(PHY_TYPE::PHY_LE_ALL_SUPPORTED, BleTest::bleInstance_->bleAdvertiserSettings_.GetPrimaryPhy()); 23619e95205Sopenharmony_ci EXPECT_EQ(PHY_TYPE::PHY_LE_2M, BleTest::bleInstance_->bleAdvertiserSettings_.GetSecondaryPhy()); 23719e95205Sopenharmony_ci GTEST_LOG_(INFO) << "BLE_ModuleTest_StartAdvertising_00200 end"; 23819e95205Sopenharmony_ci} 23919e95205Sopenharmony_ci 24019e95205Sopenharmony_ci/** 24119e95205Sopenharmony_ci * @tc.number: BLE_ModuleTest_StartCentralManager_00100 24219e95205Sopenharmony_ci * @tc.name: 24319e95205Sopenharmony_ci * @tc.desc: 24419e95205Sopenharmony_ci */ 24519e95205Sopenharmony_ciHWTEST_F(BleTest, BLE_ModuleTest_StartCentralManager_00100, TestSize.Level1) 24619e95205Sopenharmony_ci{ 24719e95205Sopenharmony_ci GTEST_LOG_(INFO) << "BLE_ModuleTest_StartCentralManager_00100 start"; 24819e95205Sopenharmony_ci EXPECT_TRUE(EnableBle()); 24919e95205Sopenharmony_ci 25019e95205Sopenharmony_ci std::vector<BleScanFilter> filters; 25119e95205Sopenharmony_ci BleScanFilter filter; 25219e95205Sopenharmony_ci std::string deviceId = "42:0B:AC:A0:A0:ED"; 25319e95205Sopenharmony_ci uint16_t manufacturerId = 0x4147; 25419e95205Sopenharmony_ci std::vector<uint8_t> serviceData = {0x1f, 0x77}; 25519e95205Sopenharmony_ci std::vector<uint8_t> serviceDataMask = {0xff, 0xff}; 25619e95205Sopenharmony_ci std::vector<uint8_t> manufactureData = {0x01, 0x09, 0x20, 0x02}; 25719e95205Sopenharmony_ci std::vector<uint8_t> manufactureDataMask = {0x01, 0x09, 0x20, 0x02}; 25819e95205Sopenharmony_ci filter.SetDeviceId(deviceId); 25919e95205Sopenharmony_ci filter.SetServiceUuid(g_serviceUuid); 26019e95205Sopenharmony_ci filter.SetServiceUuidMask(g_serviceUuidMask); 26119e95205Sopenharmony_ci filter.SetServiceSolicitationUuid(g_serviceSolicitationUuid); 26219e95205Sopenharmony_ci filter.SetServiceSolicitationUuidMask(g_serviceSolicitationUuidMask); 26319e95205Sopenharmony_ci filter.SetManufacturerId(manufacturerId); 26419e95205Sopenharmony_ci filter.SetServiceData(serviceData); 26519e95205Sopenharmony_ci filter.SetServiceDataMask(serviceDataMask); 26619e95205Sopenharmony_ci filter.SetManufactureData(manufactureData); 26719e95205Sopenharmony_ci filter.SetManufactureDataMask(manufactureDataMask); 26819e95205Sopenharmony_ci filters.push_back(filter); 26919e95205Sopenharmony_ci BleTest::bleInstance_->InitScanSettings(); 27019e95205Sopenharmony_ci BleCentralManager bleCentralManager(bleCentralManagerCallbackTest_); 27119e95205Sopenharmony_ci bleCentralManager.StartScan(BleTest::bleInstance_->bleScanSettings_, filters); 27219e95205Sopenharmony_ci EXPECT_TRUE(host_->IsBtDiscovering(1)); 27319e95205Sopenharmony_ci bleCentralManager.StopScan(); 27419e95205Sopenharmony_ci EXPECT_TRUE(DisableBle()); 27519e95205Sopenharmony_ci 27619e95205Sopenharmony_ci GTEST_LOG_(INFO) << "BLE_ModuleTest_StartCentralManager_00100 end"; 27719e95205Sopenharmony_ci} 27819e95205Sopenharmony_ci 27919e95205Sopenharmony_ci/** 28019e95205Sopenharmony_ci * @tc.number: BLE_ModuleTest_StartCentralManager_00200 28119e95205Sopenharmony_ci * @tc.name: 28219e95205Sopenharmony_ci * @tc.desc: 28319e95205Sopenharmony_ci */ 28419e95205Sopenharmony_ci 28519e95205Sopenharmony_ciHWTEST_F(BleTest, BLE_ModuleTest_StartCentralManager_00200, TestSize.Level1) 28619e95205Sopenharmony_ci{ 28719e95205Sopenharmony_ci GTEST_LOG_(INFO) << "BLE_ModuleTest_StartCentralManager_00200 start"; 28819e95205Sopenharmony_ci BleTest::bleInstance_->InitScanSettings(); 28919e95205Sopenharmony_ci EXPECT_EQ(defaultInt, BleTest::bleInstance_->bleScanSettings_.GetReportDelayMillisValue()); 29019e95205Sopenharmony_ci EXPECT_EQ(SCAN_MODE::SCAN_MODE_LOW_POWER, BleTest::bleInstance_->bleScanSettings_.GetScanMode()); 29119e95205Sopenharmony_ci EXPECT_TRUE(BleTest::bleInstance_->bleScanSettings_.GetLegacy()); 29219e95205Sopenharmony_ci EXPECT_EQ(PHY_TYPE::PHY_LE_ALL_SUPPORTED, BleTest::bleInstance_->bleScanSettings_.GetPhy()); 29319e95205Sopenharmony_ci GTEST_LOG_(INFO) << "BLE_ModuleTest_StartCentralManager_00200 end"; 29419e95205Sopenharmony_ci} 29519e95205Sopenharmony_ci} // namespace Bluetooth 29619e95205Sopenharmony_ci} // namespace OHOS 297