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