1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "gmock/gmock.h"
17 #include "gtest/gtest.h"
18 #include "conn_log.h"
19 #include "bluetooth_mock.h"
20 #include "c_header/ohos_bt_def.h"
21 #include "c_header/ohos_bt_gatt_server.h"
22 #include "softbus_adapter_ble_gatt_server.h"
23 #include "softbus_error_code.h"
24 
25 #include "assert_helper.h"
26 
27 using namespace testing::ext;
28 using ::testing::Return;
29 
30 #define MOCK_GATT_SERVER_HANDLE     0
31 #define MOCK_GATT_SERVICE_HANDLE    1
32 #define MOCK_GATT_CHARA_HANDLE      2
33 #define MOCK_GATT_DESCRIPTOR_HANDLE 3
34 
35 namespace OHOS {
36 
37 class BtUuidRecordCtx : public StRecordCtx {
38 public:
39     explicit BtUuidRecordCtx(const char *identifier);
40     ~BtUuidRecordCtx();
41     bool Update(int32_t id, int32_t st, SoftBusBtUuid *param);
42     testing::AssertionResult Expect(int32_t id, int32_t st, SoftBusBtUuid *param);
43 private:
44     SoftBusBtUuid uuid;
45     void Reset();
46 };
47 
48 class BtGattRecordCtx : public BtUuidRecordCtx {
49 public:
50     explicit BtGattRecordCtx(const char *identifier);
51     bool Update(int32_t id, int32_t st, int32_t handle, SoftBusBtUuid *param);
52     testing::AssertionResult Expect(int32_t id, int32_t st, int32_t handle, SoftBusBtUuid *param);
53 private:
54     int32_t handle;
55 };
56 
57 class AdapterBleGattServerTest : public testing::Test {
58 public:
59     static BtGattServerCallbacks *gattServerCallback;
60     static BtUuidRecordCtx serviceAddCtx;
61     static BtGattRecordCtx characteristicAddCtx;
62     static BtGattRecordCtx descriptorAddCtx;
63     static StRecordCtx serviceStartCtx;
64     static StRecordCtx serviceStopCtx;
65     static StRecordCtx serviceDeleteCtx;
66     static BtAddrRecordCtx connectServerCtx;
67     static BtAddrRecordCtx disconnectServerCtx;
68     static SoftBusGattReadRequest requestReadCtx;
69     static SoftBusGattWriteRequest requestWriteCtx;
70     static StRecordCtx responseConfirmationCtx;
71     static StRecordCtx notifySentCtx;
72     static StRecordCtx mtuChangeCtx;
73 };
74 
75 static SoftBusGattsCallback *GetStubGattsCallback();
76 static testing::AssertionResult ExpectGattReadRequest(SoftBusGattReadRequest actual, SoftBusGattReadRequest want);
77 static testing::AssertionResult ExpectGattWriteRequest(SoftBusGattWriteRequest actual, SoftBusGattWriteRequest want);
78 
ActionBleGattsRegisterCallbacks(BtGattServerCallbacks *func)79 int32_t ActionBleGattsRegisterCallbacks(BtGattServerCallbacks *func)
80 {
81     AdapterBleGattServerTest::gattServerCallback = func;
82     return OHOS_BT_STATUS_SUCCESS;
83 }
84 
85 // 回绕到注册通知中
ActionBleGattsRegister(BtUuid appUuid)86 int32_t ActionBleGattsRegister(BtUuid appUuid)
87 {
88     AdapterBleGattServerTest::gattServerCallback->registerServerCb(0, MOCK_GATT_SERVER_HANDLE, &appUuid);
89     return OHOS_BT_STATUS_SUCCESS;
90 }
91 
MockAll(MockBluetooth &mocker)92 static void MockAll(MockBluetooth &mocker)
93 {
94     EXPECT_CALL(mocker, BleGattsRegisterCallbacks).WillRepeatedly(ActionBleGattsRegisterCallbacks);
95     EXPECT_CALL(mocker, BleGattsRegister).WillRepeatedly(ActionBleGattsRegister);
96     EXPECT_CALL(mocker, BleGattsAddService).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
97     EXPECT_CALL(mocker, BleGattsUnRegister).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
98     EXPECT_CALL(mocker, BleGattsAddCharacteristic).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
99     EXPECT_CALL(mocker, BleGattsAddDescriptor).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
100     EXPECT_CALL(mocker, BleGattsStartService).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
101     EXPECT_CALL(mocker, BleGattsStopService).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
102     EXPECT_CALL(mocker, BleGattsDeleteService).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
103     EXPECT_CALL(mocker, BleGattsDisconnect).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
104     EXPECT_CALL(mocker, BleGattsSendResponse).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
105     EXPECT_CALL(mocker, BleGattsSendIndication).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
106 }
107 
108 /**
109  * @tc.name: AdapterBleGattServerTest_SoftBusRegisterGattsCallbacks
110  * @tc.desc: test register gatt server callbacks
111  * @tc.type: FUNC
112  * @tc.require: NONE
113  */
HWTEST_F(AdapterBleGattServerTest, SoftBusRegisterGattsCallbacks, TestSize.Level3)114 HWTEST_F(AdapterBleGattServerTest, SoftBusRegisterGattsCallbacks, TestSize.Level3)
115 {
116     InitSoftbusAdapterServer();
117     MockBluetooth mocker;
118     MockAll(mocker);
119     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
120     SoftBusBtUuid service = {
121         .uuidLen = strlen(serviceUuid),
122         .uuid = (char *)serviceUuid,
123     };
124 
125     ASSERT_EQ(SoftBusRegisterGattsCallbacks(nullptr, service),
126         SOFTBUS_BLECONNECTION_REG_GATTS_CALLBACK_FAIL)
127         << "nullptr gatts callback scenor";
128     // 清空状态,允许重入
129     SoftBusUnRegisterGattsCallbacks(service);
130     EXPECT_CALL(mocker, BleGattsRegisterCallbacks).WillRepeatedly(Return(OHOS_BT_STATUS_FAIL));
131     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service),
132         SOFTBUS_BLECONNECTION_REG_GATTS_CALLBACK_FAIL)
133         << "BleGattsRegisterCallbacks fail scenor";
134 
135     EXPECT_CALL(mocker, BleGattsRegisterCallbacks).WillRepeatedly(ActionBleGattsRegisterCallbacks);
136     EXPECT_CALL(mocker, BleGattsRegister).WillRepeatedly(Return(OHOS_BT_STATUS_FAIL));
137     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service),
138         SOFTBUS_BLECONNECTION_REG_GATTS_CALLBACK_FAIL)
139         << "BleGattsRegister fail scenor";
140 
141     EXPECT_CALL(mocker, BleGattsRegister).WillRepeatedly(ActionBleGattsRegister);
142     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
143     // 清空状态
144     SoftBusUnRegisterGattsCallbacks(service);
145 }
146 
147 /**
148  * @tc.name: AdapterBleGattServerTest_SoftBusUnRegisterGattsCallbacks
149  * @tc.desc: test unregister gatt server callbacks
150  * @tc.type: FUNC
151  * @tc.require: NONE
152  */
HWTEST_F(AdapterBleGattServerTest, SoftBusUnRegisterGattsCallbacks, TestSize.Level3)153 HWTEST_F(AdapterBleGattServerTest, SoftBusUnRegisterGattsCallbacks, TestSize.Level3)
154 {
155     InitSoftbusAdapterServer();
156     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
157     SoftBusBtUuid service = {
158         .uuidLen = strlen(serviceUuid),
159         .uuid = (char *)serviceUuid,
160     };
161     MockBluetooth mocker;
162     MockAll(mocker);
163     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
164     SoftBusUnRegisterGattsCallbacks(service);
165 }
166 
167 /**
168  * @tc.name: AdapterBleGattServerTest_SoftBusGattsAddService
169  * @tc.desc: test add gatt service
170  * @tc.type: FUNC
171  * @tc.require: NONE
172  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsAddService, TestSize.Level3)173 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsAddService, TestSize.Level3)
174 {
175     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
176     SoftBusBtUuid service1 = {
177         .uuidLen = strlen(serviceUuid),
178         .uuid = (char *)serviceUuid,
179     };
180     MockBluetooth mocker;
181     MockAll(mocker);
182     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service1), SOFTBUS_OK);
183 
184     // 注册service
185     SoftBusBtUuid service = {
186         .uuidLen = 0,
187         .uuid = nullptr,
188     };
189     ASSERT_EQ(SoftBusGattsAddService(service, true, 1), SOFTBUS_INVALID_PARAM);
190 
191     EXPECT_CALL(mocker, BleGattsAddService).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
192     service.uuid = (char *)serviceUuid;
193     service.uuidLen = strlen(serviceUuid);
194     ASSERT_EQ(SoftBusGattsAddService(service, true, 1), SOFTBUS_CONN_BLE_UNDERLAY_SERVER_ADD_SERVICE_ERR);
195 
196     EXPECT_CALL(mocker, BleGattsAddService).WillRepeatedly(Return(OHOS_BT_STATUS_SUCCESS));
197     ASSERT_EQ(SoftBusGattsAddService(service, true, 1), SOFTBUS_OK);
198 }
199 
200 /**
201  * @tc.name: AdapterBleGattServerTest_SoftBusGattsAddCharacteristic
202  * @tc.desc: test add gatt characteristic
203  * @tc.type: FUNC
204  * @tc.require: NONE
205  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsAddCharacteristic, TestSize.Level3)206 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsAddCharacteristic, TestSize.Level3)
207 {
208     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
209     SoftBusBtUuid service = {
210         .uuidLen = strlen(serviceUuid),
211         .uuid = (char *)serviceUuid,
212     };
213     MockBluetooth mocker;
214     MockAll(mocker);
215     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
216 
217     SoftBusBtUuid characteristic = {
218         .uuidLen = 0,
219         .uuid = nullptr,
220     };
221     int32_t properties = SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_READ | SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP |
222         SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE | SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_NOTIFY |
223         SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_INDICATE;
224     int32_t permissions = SOFTBUS_GATT_PERMISSION_READ | SOFTBUS_GATT_PERMISSION_WRITE;
225     ASSERT_EQ(
226         SoftBusGattsAddCharacteristic(MOCK_GATT_SERVICE_HANDLE, characteristic, properties, permissions),
227         SOFTBUS_INVALID_PARAM);
228 
229     const char *netCharacteristic = "00002B00-0000-1000-8000-00805F9B34FB";
230     characteristic.uuid = (char *)netCharacteristic;
231     characteristic.uuidLen = strlen(netCharacteristic);
232     EXPECT_CALL(mocker, BleGattsAddCharacteristic).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
233     ASSERT_EQ(
234         SoftBusGattsAddCharacteristic(MOCK_GATT_SERVICE_HANDLE, characteristic, properties, permissions),
235         SOFTBUS_CONN_BLE_UNDERLAY_CHARACTERISTIC_ADD_ERR);
236 
237     EXPECT_CALL(mocker, BleGattsAddCharacteristic).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
238     ASSERT_EQ(
239         SoftBusGattsAddCharacteristic(MOCK_GATT_SERVICE_HANDLE, characteristic, properties, permissions), SOFTBUS_OK);
240 }
241 
242 /**
243  * @tc.name: AdapterBleGattServerTest_SoftBusGattsAddDescriptor
244  * @tc.desc: test add gatt descriptor
245  * @tc.type: FUNC
246  * @tc.require: NONE
247  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsAddDescriptor, TestSize.Level3)248 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsAddDescriptor, TestSize.Level3)
249 {
250     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
251     SoftBusBtUuid service = {
252         .uuidLen = strlen(serviceUuid),
253         .uuid = (char *)serviceUuid,
254     };
255     MockBluetooth mocker;
256     MockAll(mocker);
257     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
258 
259     SoftBusBtUuid desciptor = {
260         .uuidLen = 0,
261         .uuid = nullptr,
262     };
263     int32_t permissions = SOFTBUS_GATT_PERMISSION_READ | SOFTBUS_GATT_PERMISSION_WRITE;
264     ASSERT_EQ(SoftBusGattsAddDescriptor(MOCK_GATT_SERVICE_HANDLE, desciptor, permissions), SOFTBUS_INVALID_PARAM);
265 
266     const char *connDesciptor = "00002902-0000-1000-8000-00805F9B34FB";
267     desciptor.uuid = (char *)connDesciptor;
268     desciptor.uuidLen = strlen(connDesciptor);
269 
270     EXPECT_CALL(mocker, BleGattsAddDescriptor).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
271     ASSERT_EQ(SoftBusGattsAddDescriptor(MOCK_GATT_SERVICE_HANDLE, desciptor, permissions),
272         SOFTBUS_CONN_BLE_UNDERLAY_DESCRIPTOR_ADD_ERR);
273     EXPECT_CALL(mocker, BleGattsAddDescriptor).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
274     ASSERT_EQ(SoftBusGattsAddDescriptor(MOCK_GATT_SERVICE_HANDLE, desciptor, permissions), SOFTBUS_OK);
275 }
276 
277 /**
278  * @tc.name: AdapterBleGattServerTest_SoftBusGattsStartService
279  * @tc.desc: test start gatt service
280  * @tc.type: FUNC
281  * @tc.require: NONE
282  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsStartService, TestSize.Level3)283 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsStartService, TestSize.Level3)
284 {
285     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
286     SoftBusBtUuid service = {
287         .uuidLen = strlen(serviceUuid),
288         .uuid = (char *)serviceUuid,
289     };
290     MockBluetooth mocker;
291     MockAll(mocker);
292     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
293 
294     EXPECT_CALL(mocker, BleGattsStartService).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
295     ASSERT_EQ(SoftBusGattsStartService(MOCK_GATT_SERVICE_HANDLE), SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_START_ERR);
296 
297     EXPECT_CALL(mocker, BleGattsStartService).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
298     ASSERT_EQ(SoftBusGattsStartService(MOCK_GATT_SERVICE_HANDLE), SOFTBUS_OK);
299 }
300 
301 /**
302  * @tc.name: AdapterBleGattServerTest_SoftBusGattsStopService
303  * @tc.desc: test stop gatt service
304  * @tc.type: FUNC
305  * @tc.require: NONE
306  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsStopService, TestSize.Level3)307 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsStopService, TestSize.Level3)
308 {
309     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
310     SoftBusBtUuid service = {
311         .uuidLen = strlen(serviceUuid),
312         .uuid = (char *)serviceUuid,
313     };
314     MockBluetooth mocker;
315     MockAll(mocker);
316     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
317 
318     EXPECT_CALL(mocker, BleGattsStopService).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
319     ASSERT_EQ(SoftBusGattsStopService(MOCK_GATT_SERVICE_HANDLE), SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_STOP_ERR);
320 
321     EXPECT_CALL(mocker, BleGattsStopService).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
322     ASSERT_EQ(SoftBusGattsStopService(MOCK_GATT_SERVICE_HANDLE), SOFTBUS_OK);
323 }
324 
325 /**
326  * @tc.name: AdapterBleGattServerTest_SoftBusGattsDeleteService
327  * @tc.desc: test delete gatt service
328  * @tc.type: FUNC
329  * @tc.require: NONE
330  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsDeleteService, TestSize.Level3)331 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsDeleteService, TestSize.Level3)
332 {
333     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
334     SoftBusBtUuid service = {
335         .uuidLen = strlen(serviceUuid),
336         .uuid = (char *)serviceUuid,
337     };
338     MockBluetooth mocker;
339     MockAll(mocker);
340     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
341 
342     EXPECT_CALL(mocker, BleGattsDeleteService).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
343     ASSERT_EQ(SoftBusGattsDeleteService(MOCK_GATT_SERVICE_HANDLE), SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_DELETE_ERR);
344 
345     EXPECT_CALL(mocker, BleGattsDeleteService).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
346     ASSERT_EQ(SoftBusGattsDeleteService(MOCK_GATT_SERVICE_HANDLE), SOFTBUS_OK);
347 }
348 
349 /**
350  * @tc.name: AdapterBleGattServerTest_SoftBusGattsDisconnect
351  * @tc.desc: test disconnect gatt connection
352  * @tc.type: FUNC
353  * @tc.require: NONE
354  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsDisconnect, TestSize.Level3)355 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsDisconnect, TestSize.Level3)
356 {
357     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
358     SoftBusBtUuid service = {
359         .uuidLen = strlen(serviceUuid),
360         .uuid = (char *)serviceUuid,
361     };
362     MockBluetooth mocker;
363     MockAll(mocker);
364     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
365 
366     int32_t connId = 1;
367     SoftBusBtAddr addr = {
368         .addr = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
369     };
370     EXPECT_CALL(mocker, BleGattsDisconnect).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
371     ASSERT_EQ(SoftBusGattsDisconnect(addr, connId), SOFTBUS_CONN_BLE_UNDERLAY_SERVER_DISCONNECT_ERR);
372 
373     EXPECT_CALL(mocker, BleGattsDisconnect).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
374     ASSERT_EQ(SoftBusGattsDisconnect(addr, connId), SOFTBUS_OK);
375 }
376 
377 /**
378  * @tc.name: AdapterBleGattServerTest_SoftBusGattsSendResponse
379  * @tc.desc: test send gatt response
380  * @tc.type: FUNC
381  * @tc.require: NONE
382  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsSendResponse, TestSize.Level3)383 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsSendResponse, TestSize.Level3)
384 {
385     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
386     SoftBusBtUuid service = {
387         .uuidLen = strlen(serviceUuid),
388         .uuid = (char *)serviceUuid,
389     };
390     MockBluetooth mocker;
391     MockAll(mocker);
392     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
393 
394     SoftBusGattsResponse resp = {0};
395     EXPECT_CALL(mocker, BleGattsSendResponse).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
396     ASSERT_EQ(SoftBusGattsSendResponse(&resp), SOFTBUS_CONN_BLE_UNDERLAY_SERVER_SEND_RESPONSE_ERR);
397 
398     EXPECT_CALL(mocker, BleGattsSendResponse).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
399     ASSERT_EQ(SoftBusGattsSendResponse(&resp), SOFTBUS_OK);
400 }
401 
402 /**
403  * @tc.name: AdapterBleGattServerTest_SoftBusGattsSendNotify
404  * @tc.desc: test send gatt notify
405  * @tc.type: FUNC
406  * @tc.require: NONE
407  */
HWTEST_F(AdapterBleGattServerTest, SoftBusGattsSendNotify, TestSize.Level3)408 HWTEST_F(AdapterBleGattServerTest, SoftBusGattsSendNotify, TestSize.Level3)
409 {
410     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
411     SoftBusBtUuid service = {
412         .uuidLen = strlen(serviceUuid),
413         .uuid = (char *)serviceUuid,
414     };
415     MockBluetooth mocker;
416     MockAll(mocker);
417     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
418 
419     SoftBusGattsNotify notify = {0};
420     EXPECT_CALL(mocker, BleGattsSendIndication).Times(1).WillOnce(Return(OHOS_BT_STATUS_FAIL));
421     ASSERT_EQ(SoftBusGattsSendNotify(&notify), SOFTBUS_CONN_BLE_UNDERLAY_SERVER_SEND_INDICATION_ERR);
422 
423     EXPECT_CALL(mocker, BleGattsSendIndication).Times(1).WillOnce(Return(OHOS_BT_STATUS_SUCCESS));
424     ASSERT_EQ(SoftBusGattsSendNotify(&notify), SOFTBUS_OK);
425 }
426 
427 /**
428  * @tc.name: AdapterBleGattServerTest_GattServerLifeCycle
429  * @tc.desc: test gatt server complete life cyclel, from a real usage perspective, important
430  * @tc.type: FUNC
431  * @tc.require: NONE
432  */
HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle1, TestSize.Level3)433 HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle1, TestSize.Level3)
434 {
435     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
436     SoftBusBtUuid service = {
437         .uuidLen = strlen(serviceUuid),
438         .uuid = (char *)serviceUuid,
439     };
440     MockBluetooth mocker;
441     MockAll(mocker);
442     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
443 
444     ASSERT_EQ(SoftBusGattsAddService(service, true, 8), SOFTBUS_OK);
445     BtUuid btService = {
446         .uuidLen = strlen(serviceUuid),
447         .uuid = (char *)serviceUuid,
448     };
449     gattServerCallback->serviceAddCb(
450         OHOS_BT_STATUS_SUCCESS, MOCK_GATT_SERVER_HANDLE, &btService, MOCK_GATT_SERVICE_HANDLE);
451     ASSERT_TRUE(serviceAddCtx.Expect(MOCK_GATT_SERVICE_HANDLE, SOFTBUS_OK, &service));
452 
453     // 注册charateristic
454     const char *netCharacteristic = "00002B00-0000-1000-8000-00805F9B34FB";
455     SoftBusBtUuid characteristic = {
456         .uuidLen = strlen(netCharacteristic),
457         .uuid = (char *)netCharacteristic,
458     };
459     int32_t properties = SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_READ | SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP |
460         SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE | SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_NOTIFY |
461         SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_INDICATE;
462     int32_t charaPermissions = SOFTBUS_GATT_PERMISSION_READ | SOFTBUS_GATT_PERMISSION_WRITE;
463     ASSERT_EQ(SoftBusGattsAddCharacteristic(MOCK_GATT_SERVICE_HANDLE, characteristic, properties, charaPermissions),
464         SOFTBUS_OK);
465     BtUuid btCharacteristic = {
466         .uuidLen = strlen(netCharacteristic),
467         .uuid = (char *)netCharacteristic,
468     };
469     gattServerCallback->characteristicAddCb(OHOS_BT_STATUS_SUCCESS, MOCK_GATT_SERVER_HANDLE, &btCharacteristic,
470         MOCK_GATT_SERVICE_HANDLE, MOCK_GATT_CHARA_HANDLE);
471     ASSERT_TRUE(
472         characteristicAddCtx.Expect(MOCK_GATT_SERVICE_HANDLE, SOFTBUS_OK, MOCK_GATT_CHARA_HANDLE, &characteristic));
473 }
474 
475 /**
476  * @tc.name: AdapterBleGattServerTest_GattServerLifeCycle
477  * @tc.desc: test gatt server complete life cyclel, from a real usage perspective, important
478  * @tc.type: FUNC
479  * @tc.require: NONE
480  */
HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle2, TestSize.Level3)481 HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle2, TestSize.Level3)
482 {
483     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
484     SoftBusBtUuid service = {
485         .uuidLen = strlen(serviceUuid),
486         .uuid = (char *)serviceUuid,
487     };
488     MockBluetooth mocker;
489     MockAll(mocker);
490     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
491 
492     // 注册desciptor
493     const char *connDesciptor = "00002902-0000-1000-8000-00805F9B34FB";
494     int32_t descriptorPermissions = SOFTBUS_GATT_PERMISSION_READ | SOFTBUS_GATT_PERMISSION_WRITE;
495     SoftBusBtUuid descriptor = {
496         .uuidLen = strlen(connDesciptor),
497         .uuid = (char *)connDesciptor,
498     };
499     ASSERT_EQ(SoftBusGattsAddDescriptor(MOCK_GATT_SERVICE_HANDLE, descriptor, descriptorPermissions), SOFTBUS_OK);
500     BtUuid btDescriptor = {
501         .uuidLen = strlen(connDesciptor),
502         .uuid = (char *)connDesciptor,
503     };
504     gattServerCallback->descriptorAddCb(OHOS_BT_STATUS_SUCCESS, MOCK_GATT_SERVER_HANDLE, &btDescriptor,
505         MOCK_GATT_SERVICE_HANDLE, MOCK_GATT_DESCRIPTOR_HANDLE);
506     ASSERT_TRUE(
507         descriptorAddCtx.Expect(MOCK_GATT_SERVICE_HANDLE, SOFTBUS_OK, MOCK_GATT_DESCRIPTOR_HANDLE, &descriptor));
508     // 启动Listen
509     ASSERT_EQ(SoftBusGattsStartService(MOCK_GATT_SERVICE_HANDLE), SOFTBUS_OK);
510     gattServerCallback->serviceStartCb(OHOS_BT_STATUS_SUCCESS, MOCK_GATT_SERVER_HANDLE, MOCK_GATT_SERVICE_HANDLE);
511     ASSERT_TRUE(serviceStartCtx.Expect(MOCK_GATT_SERVICE_HANDLE, SOFTBUS_OK));
512 }
513 
514 /**
515  * @tc.name: AdapterBleGattServerTest_GattServerLifeCycle
516  * @tc.desc: test gatt server complete life cyclel, from a real usage perspective, important
517  * @tc.type: FUNC
518  * @tc.require: NONE
519  */
HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle3, TestSize.Level3)520 HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle3, TestSize.Level3)
521 {
522     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
523     SoftBusBtUuid service = {
524         .uuidLen = strlen(serviceUuid),
525         .uuid = (char *)serviceUuid,
526     };
527     MockBluetooth mocker;
528     MockAll(mocker);
529     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
530     // server建链
531     BdAddr bdAddr = {
532         .addr = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
533     };
534     gattServerCallback->connectServerCb(1, MOCK_GATT_SERVER_HANDLE, &bdAddr);
535     SoftBusBtAddr addr = {
536         .addr = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
537     };
538     GetStubGattsCallback()->connectServerCallback(1, &addr);
539     ASSERT_TRUE(connectServerCtx.Expect(1, &addr));
540     // 读写数据,及响应回复
541     const char *valueExample = "hello gatt server, this is client";
542     BtReqWriteCbPara btWriteParam = {
543         .connId = 1,
544         .transId = 0,
545         .bdAddr = &bdAddr,
546         .attrHandle = MOCK_GATT_CHARA_HANDLE,
547         .offset = 0,
548         .length = strlen(valueExample),
549         .needRsp = true,
550         .isPrep = false,
551         .value = (unsigned char *)valueExample,
552     };
553     gattServerCallback->requestWriteCb(btWriteParam);
554     SoftBusGattWriteRequest writeParam = {
555         .connId = 1,
556         .transId = 0,
557         .btAddr = &addr,
558         .attrHandle = MOCK_GATT_CHARA_HANDLE,
559         .offset = 0,
560         .length = strlen(valueExample),
561         .needRsp = true,
562         .isPrep = false,
563         .value = (unsigned char *)valueExample,
564     };
565     GetStubGattsCallback()->requestWriteCallback(writeParam);
566     ASSERT_TRUE(ExpectGattWriteRequest(requestWriteCtx, writeParam));
567     SoftBusGattsResponse resp = {0};
568     ASSERT_EQ(SoftBusGattsSendResponse(&resp), SOFTBUS_OK);
569 }
570 
571 /**
572  * @tc.name: AdapterBleGattServerTest_GattServerLifeCycle
573  * @tc.desc: test gatt server complete life cyclel, from a real usage perspective, important
574  * @tc.type: FUNC
575  * @tc.require: NONE
576  */
HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle4, TestSize.Level3)577 HWTEST_F(AdapterBleGattServerTest, GattServerLifeCycle4, TestSize.Level3)
578 {
579     const char *serviceUuid = "11C8B310-80E4-4276-AFC0-F81590B2177F";
580     SoftBusBtUuid service = {
581         .uuidLen = strlen(serviceUuid),
582         .uuid = (char *)serviceUuid,
583     };
584     MockBluetooth mocker;
585     MockAll(mocker);
586     ASSERT_EQ(SoftBusRegisterGattsCallbacks(GetStubGattsCallback(), service), SOFTBUS_OK);
587     BdAddr bdAddr = {
588         .addr = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
589     };
590     SoftBusBtAddr addr = {
591         .addr = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
592     };
593     BtReqReadCbPara btReadParam = {
594         .connId = 1,
595         .transId = 0,
596         .bdAddr = &bdAddr,
597         .attrHandle = MOCK_GATT_CHARA_HANDLE,
598         .offset = 0,
599         .isLong = false,
600     };
601     gattServerCallback->requestReadCb(btReadParam);
602     SoftBusGattReadRequest readParam = {
603         .connId = 1,
604         .transId = 0,
605         .btAddr = &addr,
606         .attrHandle = MOCK_GATT_CHARA_HANDLE,
607         .offset = 0,
608         .isLong = false,
609     };
610     GetStubGattsCallback()->requestReadCallback(readParam);
611     ASSERT_TRUE(ExpectGattReadRequest(requestReadCtx, readParam));
612     SoftBusGattsNotify notify = {0};
613     ASSERT_EQ(SoftBusGattsSendNotify(&notify), SOFTBUS_OK);
614     // server断链
615     ASSERT_EQ(SoftBusGattsDisconnect(addr, 1), SOFTBUS_OK);
616     gattServerCallback->disconnectServerCb(1, MOCK_GATT_SERVER_HANDLE, &bdAddr);
617 
618     // 停止GATT service
619     ASSERT_EQ(SoftBusGattsStopService(MOCK_GATT_SERVER_HANDLE), SOFTBUS_OK);
620     gattServerCallback->serviceStopCb(OHOS_BT_STATUS_SUCCESS, MOCK_GATT_SERVER_HANDLE, MOCK_GATT_SERVICE_HANDLE);
621     ASSERT_TRUE(serviceStopCtx.Expect(MOCK_GATT_SERVICE_HANDLE, SOFTBUS_OK));
622 
623     // 删除GATT service
624     ASSERT_EQ(SoftBusGattsDeleteService(MOCK_GATT_SERVER_HANDLE), SOFTBUS_OK);
625     gattServerCallback->serviceDeleteCb(OHOS_BT_STATUS_SUCCESS, MOCK_GATT_SERVER_HANDLE, MOCK_GATT_SERVICE_HANDLE);
626     ASSERT_TRUE(serviceDeleteCtx.Expect(MOCK_GATT_SERVICE_HANDLE, SOFTBUS_OK));
627 }
628 
BtUuidRecordCtx(const char *identifier)629 BtUuidRecordCtx::BtUuidRecordCtx(const char *identifier) : StRecordCtx(identifier)
630 {
631     Reset();
632 }
~BtUuidRecordCtx()633 BtUuidRecordCtx::~BtUuidRecordCtx()
634 {
635     Reset();
636 }
637 
Reset()638 void BtUuidRecordCtx::Reset()
639 {
640     SoftBusFree(uuid.uuid);
641     uuid.uuid = nullptr;
642     uuid.uuidLen = 0;
643 }
644 
Update(int32_t id, int32_t st, SoftBusBtUuid *param)645 bool BtUuidRecordCtx::Update(int32_t id, int32_t st, SoftBusBtUuid *param)
646 {
647     if (!StRecordCtx::Update(id, st)) {
648         return false;
649     }
650     uuid.uuid = (char *)SoftBusCalloc(param->uuidLen);
651     if (uuid.uuid == nullptr) {
652         return false;
653     }
654     if (memcpy_s(uuid.uuid, param->uuidLen, param->uuid, param->uuidLen) != EOK) {
655         return false;
656     }
657     uuid.uuidLen = param->uuidLen;
658     return true;
659 }
660 
Expect(int32_t id, int32_t st, SoftBusBtUuid *param)661 testing::AssertionResult BtUuidRecordCtx::Expect(int32_t id, int32_t st, SoftBusBtUuid *param)
662 {
663     auto result = StRecordCtx::Expect(id, st);
664     if (!result) {
665         goto ClEANUP;
666     }
667     if (uuid.uuidLen != param->uuidLen || memcmp(uuid.uuid, param->uuid, uuid.uuidLen) != 0) {
668         result = testing::AssertionFailure() << identifier << " is call by unexpectedly uuid";
669         goto ClEANUP;
670     }
671     result = testing::AssertionSuccess();
672 ClEANUP:
673     Reset();
674     return result;
675 }
676 
BtGattRecordCtx(const char *identifier)677 BtGattRecordCtx::BtGattRecordCtx(const char *identifier) : BtUuidRecordCtx(identifier)
678 {
679     handle = -1;
680 }
681 
Update(int32_t id, int32_t st, int32_t handleParam, SoftBusBtUuid *param)682 bool BtGattRecordCtx::Update(int32_t id, int32_t st, int32_t handleParam, SoftBusBtUuid *param)
683 {
684     if (!BtUuidRecordCtx::Update(id, st, param)) {
685         return false;
686     }
687     this->handle = handleParam;
688     return true;
689 }
690 
Expect(int32_t id, int32_t st, int32_t handleParam, SoftBusBtUuid *param)691 testing::AssertionResult BtGattRecordCtx::Expect(int32_t id, int32_t st, int32_t handleParam, SoftBusBtUuid *param)
692 {
693     auto result = BtUuidRecordCtx::Expect(id, st, param);
694     if (!result) {
695         goto ClEANUP;
696     }
697     if (this->handle != handleParam) {
698         result = testing::AssertionFailure() << identifier << " is call by unexpectedly state,"
699                                              << "want: " << handleParam << ", actual: " << this->handle;
700         goto ClEANUP;
701     }
702     result = testing::AssertionSuccess();
703 ClEANUP:
704     this->handle = -1;
705     return result;
706 }
707 
708 BtGattServerCallbacks *AdapterBleGattServerTest::gattServerCallback = nullptr;
709 BtUuidRecordCtx AdapterBleGattServerTest::serviceAddCtx("ServiceAddCallback");
710 BtGattRecordCtx AdapterBleGattServerTest::characteristicAddCtx("CharacteristicAddCallback");
711 BtGattRecordCtx AdapterBleGattServerTest::descriptorAddCtx("DescriptorAddCallback");
712 StRecordCtx AdapterBleGattServerTest::serviceStartCtx("ServiceStartCallback");
713 StRecordCtx AdapterBleGattServerTest::serviceStopCtx("ServiceStopCallback");
714 StRecordCtx AdapterBleGattServerTest::serviceDeleteCtx("ServiceDeleteCallback");
715 BtAddrRecordCtx AdapterBleGattServerTest::connectServerCtx("ConnectServerCallback");
716 BtAddrRecordCtx AdapterBleGattServerTest::disconnectServerCtx("DisconnectServerCallback");
717 SoftBusGattReadRequest AdapterBleGattServerTest::requestReadCtx = {0};
718 SoftBusGattWriteRequest AdapterBleGattServerTest::requestWriteCtx = {0};
719 StRecordCtx AdapterBleGattServerTest::responseConfirmationCtx("ResponseConfirmationCallback");
720 StRecordCtx AdapterBleGattServerTest::notifySentCtx("NotifySentCallback");
721 StRecordCtx AdapterBleGattServerTest::mtuChangeCtx("MtuChangeCallback");
722 
StubServiceAddCallback(int32_t status, SoftBusBtUuid *uuid, int32_t srvcHandle)723 static void StubServiceAddCallback(int32_t status, SoftBusBtUuid *uuid, int32_t srvcHandle)
724 {
725     AdapterBleGattServerTest::serviceAddCtx.Update(srvcHandle, status, uuid);
726 }
727 
StubCharacteristicAddCallback(int32_t status, SoftBusBtUuid *uuid, int32_t srvcHandle, int32_t characteristicHandle)728 static void StubCharacteristicAddCallback(int32_t status, SoftBusBtUuid *uuid,
729                                           int32_t srvcHandle, int32_t characteristicHandle)
730 {
731     AdapterBleGattServerTest::characteristicAddCtx.Update(srvcHandle, status, characteristicHandle, uuid);
732 }
733 
StubDescriptorAddCallback(int32_t status, SoftBusBtUuid *uuid, int32_t srvcHandle, int32_t descriptorHandle)734 static void StubDescriptorAddCallback(int32_t status, SoftBusBtUuid *uuid, int32_t srvcHandle, int32_t descriptorHandle)
735 {
736     AdapterBleGattServerTest::descriptorAddCtx.Update(srvcHandle, status, descriptorHandle, uuid);
737 }
738 
StubServiceStartCallback(int32_t status, int32_t srvcHandle)739 static void StubServiceStartCallback(int32_t status, int32_t srvcHandle)
740 {
741     AdapterBleGattServerTest::serviceStartCtx.Update(srvcHandle, status);
742 }
743 
StubServiceStopCallback(int32_t status, int32_t srvcHandle)744 static void StubServiceStopCallback(int32_t status, int32_t srvcHandle)
745 {
746     AdapterBleGattServerTest::serviceStopCtx.Update(srvcHandle, status);
747 }
748 
StubServiceDeleteCallback(int32_t status, int32_t srvcHandle)749 static void StubServiceDeleteCallback(int32_t status, int32_t srvcHandle)
750 {
751     AdapterBleGattServerTest::serviceDeleteCtx.Update(srvcHandle, status);
752 }
753 
StubConnectServerCallback(int32_t connId, const SoftBusBtAddr *btAddr)754 static void StubConnectServerCallback(int32_t connId, const SoftBusBtAddr *btAddr)
755 {
756     AdapterBleGattServerTest::connectServerCtx.Update(connId, btAddr);
757 }
758 
StubDisconnectServerCallback(int32_t connId, const SoftBusBtAddr *btAddr)759 static void StubDisconnectServerCallback(int32_t connId, const SoftBusBtAddr *btAddr)
760 {
761     AdapterBleGattServerTest::disconnectServerCtx.Update(connId, btAddr);
762 }
763 
StubRequestReadCallback(SoftBusGattReadRequest readCbPara)764 static void StubRequestReadCallback(SoftBusGattReadRequest readCbPara)
765 {
766     AdapterBleGattServerTest::requestReadCtx = readCbPara;
767 }
768 
StubRequestWriteCallback(SoftBusGattWriteRequest writeCbPara)769 static void StubRequestWriteCallback(SoftBusGattWriteRequest writeCbPara)
770 {
771     AdapterBleGattServerTest::requestWriteCtx = writeCbPara;
772 }
773 
StubResponseConfirmationCallback(int32_t status, int32_t handle)774 static void StubResponseConfirmationCallback(int32_t status, int32_t handle)
775 {
776     AdapterBleGattServerTest::responseConfirmationCtx.Update(handle, status);
777 }
StubNotifySentCallback(int32_t connId, int32_t status)778 static void StubNotifySentCallback(int32_t connId, int32_t status)
779 {
780     AdapterBleGattServerTest::notifySentCtx.Update(connId, status);
781 }
StubMtuChangeCallback(int32_t connId, int32_t mtu)782 static void StubMtuChangeCallback(int32_t connId, int32_t mtu)
783 {
784     AdapterBleGattServerTest::mtuChangeCtx.Update(connId, mtu);
785 }
786 
GetStubGattsCallback()787 static SoftBusGattsCallback *GetStubGattsCallback()
788 {
789     static SoftBusGattsCallback callbacks = {
790         .serviceAddCallback = StubServiceAddCallback,
791         .characteristicAddCallback = StubCharacteristicAddCallback,
792         .descriptorAddCallback = StubDescriptorAddCallback,
793         .serviceStartCallback = StubServiceStartCallback,
794         .serviceStopCallback = StubServiceStopCallback,
795         .serviceDeleteCallback = StubServiceDeleteCallback,
796         .connectServerCallback = StubConnectServerCallback,
797         .disconnectServerCallback = StubDisconnectServerCallback,
798         .requestReadCallback = StubRequestReadCallback,
799         .requestWriteCallback = StubRequestWriteCallback,
800         .responseConfirmationCallback = StubResponseConfirmationCallback,
801         .notifySentCallback = StubNotifySentCallback,
802         .mtuChangeCallback = StubMtuChangeCallback,
803     };
804     return &callbacks;
805 }
806 
ExpectGattWriteRequest(SoftBusGattWriteRequest actual, SoftBusGattWriteRequest want)807 static testing::AssertionResult ExpectGattWriteRequest(SoftBusGattWriteRequest actual, SoftBusGattWriteRequest want)
808 {
809     if (want.connId != actual.connId ||
810         want.transId != actual.transId ||
811         memcmp(want.btAddr->addr, actual.btAddr->addr, BT_ADDR_LEN) != 0 ||
812         want.attrHandle != actual.attrHandle ||
813         want.offset != actual.offset ||
814         want.length != actual.length ||
815         !(want.needRsp ? actual.needRsp : !actual.needRsp) ||
816         !(want.isPrep ? actual.isPrep : !actual.isPrep) ||
817         memcmp(want.value, actual.value, want.length) != 0) {
818         return testing::AssertionFailure() << "SoftBusGattWriteRequest is unexpected";
819     }
820     return testing::AssertionSuccess();
821 }
822 
ExpectGattReadRequest(SoftBusGattReadRequest actual, SoftBusGattReadRequest want)823 static testing::AssertionResult ExpectGattReadRequest(SoftBusGattReadRequest actual, SoftBusGattReadRequest want)
824 {
825     if (want.connId != actual.connId ||
826         want.transId != actual.transId ||
827         memcmp(want.btAddr->addr, actual.btAddr->addr, BT_ADDR_LEN) != 0 ||
828         want.attrHandle != actual.attrHandle ||
829         want.offset != actual.offset ||
830         !(want.isLong ? actual.isLong : !actual.isLong)) {
831         return testing::AssertionFailure() << "SoftBusGattReadRequest is unexpected";
832     }
833     return testing::AssertionSuccess();
834 }
835 
836 } // namespace OHOS
837