1 /*
2 * Copyright (c) 2024 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 "socket_common.h"
17
18 static int32_t g_currentSocket4Data = -1;
19 static int32_t g_waitFlag = WAIT_DEF_VALUE;
20 static int32_t g_waitFlag4Shutdown = WAIT_DEF_VALUE;
21 static int32_t g_waitFlag4Byte = WAIT_DEF_VALUE;
22 static int32_t g_waitFlag4Message = WAIT_DEF_VALUE;
23 static int32_t g_waitFlagStream = WAIT_DEF_VALUE;
24 static int32_t g_waitFlag4File = WAIT_DEF_VALUE;
25 static int32_t g_nodeOnlineCount = 0;
26 static int32_t g_nodeOfflineCount = 0;
27 static ISocketListener* g_socketlistenerdata = NULL;
28 static char g_networkId[NETWORK_ID_BUF_LEN] = { 0 };
29 static INodeStateCb g_defNodeStateCallback;
30 static char g_fillContentChar = 'd';
31 static unsigned int g_expectDataSize = 0;
32 static char* g_expectDataContent = NULL;
33
34 /*reset count*/
ResetwaitCount4Online(void)35 void ResetwaitCount4Online(void)
36 {
37 g_nodeOnlineCount = 0;
38 }
39
40 /*common method*/
ResetwaitCount4Offline(void)41 void ResetwaitCount4Offline(void)
42 {
43 g_nodeOfflineCount = 0;
44 }
45
Sleepn(int n)46 void Sleepn(int n)
47 {
48 for(int i = 0; i < n; i++) {
49 sleep(1);
50 LOG("sleeped %d", i);
51 }
52 }
53
GetSoftbusPid(void)54 char* GetSoftbusPid(void)
55 {
56 FILE* file = NULL;
57 int buffSize = 20;
58 char* buffer = (char*)malloc(buffSize);
59 if (buffer == NULL) {
60 LOG("malloc fail");
61 return NULL;
62 }
63
64 file = popen(CMD_PIDOF_SOFTBUS, "r");
65 if (file == NULL) {
66 LOG("call popen fail");
67 free(buffer);
68 return NULL;
69 }
70 (void)fgets(buffer, buffSize, file);
71 LOG("##################Softbus PID:%s", buffer);
72 pclose(file);
73
74 return buffer;
75 }
76
OnDefNodeOnline(NodeBasicInfo* info)77 static void OnDefNodeOnline(NodeBasicInfo* info)
78 {
79 if (info == NULL) {
80 LOG("[cb]Online: info is null");
81 return;
82 }
83 (void)strncpy_s(g_networkId, NETWORK_ID_BUF_LEN, info->networkId, NETWORK_ID_BUF_LEN);
84 LOG("[cb]Online id:%s, name:%s, type id:%u", info->networkId, info->deviceName, info->deviceTypeId);
85 g_nodeOnlineCount++;
86 }
87
OnDefNodeOffline(NodeBasicInfo* info)88 static void OnDefNodeOffline(NodeBasicInfo* info)
89 {
90 if (info == NULL) {
91 LOG("[cb]Offline: info is null");
92 return;
93 }
94 LOG("[cb]Offline id:%s, name:%s, type id:%u", info->networkId, info->deviceName, info->deviceTypeId);
95 g_nodeOfflineCount++;
96 }
97
OnDefNodeBasicInfoChanged(NodeBasicInfoType type, NodeBasicInfo* info)98 static void OnDefNodeBasicInfoChanged(NodeBasicInfoType type, NodeBasicInfo* info)
99 {
100 if (info == NULL) {
101 LOG("[cb]InfoChanged: info is null, type[%d]", type);
102 return;
103 }
104 LOG("[cb]InfoChanged id: %s,name: %s", info->networkId, info->deviceName);
105 }
106
onDefNodeStatusChanged(NodeStatusType type, NodeStatus *status)107 static void onDefNodeStatusChanged(NodeStatusType type, NodeStatus *status)
108 {
109 if (status == NULL) {
110 LOG("[cb]StatusChanged: info is null, type[%d]", type);
111 return;
112 }
113 LOG("[cb]StatusChanged id: %s,status: %d", status->basicInfo.networkId, status->authStatus);
114 }
115
RegisterDeviceStateDefCallback(void)116 int RegisterDeviceStateDefCallback(void)
117 {
118 return RegNodeDeviceStateCb(DEF_PKG_NAME, &g_defNodeStateCallback);
119 }
120
UnRegisterDeviceStateDefCallback(void)121 int UnRegisterDeviceStateDefCallback(void)
122 {
123 return UnregNodeDeviceStateCb(&g_defNodeStateCallback);
124 }
125
WaitNodeCount(int timeout, WaitNodeStateType state, int expectCount)126 int WaitNodeCount(int timeout, WaitNodeStateType state, int expectCount)
127 {
128 LOG("Wait4Node,timeout:%d, type:%d, exp count:%d", timeout, state, expectCount);
129 int hitFlag = -1;
130 while (timeout > 0) {
131 sleep(ONE_SECOND);
132 switch (state) {
133 case STATE_ONLINE:
134 if (g_nodeOnlineCount == expectCount) {
135 LOG("Wait4Node[online] succ,timeout:%d", timeout);
136 hitFlag = 1;
137 }
138 break;
139 case STATE_OFFLINE:
140 if (g_nodeOfflineCount == expectCount) {
141 LOG("Wait4Node[offline] succ,timeout:%d", timeout);
142 hitFlag = 1;
143 }
144 break;
145 default:
146 LOG("Wait4Node state error");
147 hitFlag = 1;
148 break;
149 }
150 if (hitFlag != -1) {
151 break;
152 }
153 timeout--;
154 }
155 switch (state) {
156 case STATE_ONLINE:
157 if (g_nodeOnlineCount != expectCount) {
158 LOG("Wait4Node[online] fail[exp:%d, real:%d]", expectCount, g_nodeOnlineCount);
159 return SOFTBUS_ERR;
160 }
161 break;
162 case STATE_OFFLINE:
163 if (g_nodeOfflineCount != expectCount) {
164 LOG("Wait4Node[offline] fail[exp:%d, real:%d]", expectCount, g_nodeOfflineCount);
165 return SOFTBUS_ERR;
166 }
167 break;
168 default:
169 return SOFTBUS_ERR;
170 }
171 return SOFTBUS_OK;
172 }
173
174 //socket callback
OnBindData(int32_t socket, PeerSocketInfo info)175 static void OnBindData(int32_t socket, PeerSocketInfo info)
176 {
177 int successcount = 0;
178 LOG("[cb][Ctrl]OnBind success {socket:%d, name:%s, deviceId:%s, pkgName:%s, dataType:%d}", socket,
179 info.name, info.networkId, info.pkgName, info.dataType);
180 if (strcmp(info.networkId, g_networkId) != 0)
181 {
182 LOG("PeerSocket Info peer deviceId and check remote networkId are diff");
183 successcount++;
184 }
185 if (strcmp(info.name, SOCKET_NAME_BYTE) != 0)
186 {
187 LOG("PeerSocket Info peer name and local name are diff");
188 successcount++;
189 }
190 if (strcmp(info.pkgName, DEF_PKG_NAME) != 0)
191 {
192 LOG("PeerSocket Info peer pkgName and local pkgName are diff");
193 successcount++;
194 }
195 if(successcount == 3)
196 {
197 g_waitFlag = WAIT_SUCCESS_VALUE;
198 }else{
199 g_waitFlag = WAIT_FAIL_VALUE;
200 }
201 }
202
OnShutdownData(int32_t socket, ShutdownReason reason)203 static void OnShutdownData(int32_t socket, ShutdownReason reason)
204 {
205 LOG("[cb][Ctrl]OnShutdownData success {socket:%d, reason:%u}", socket, reason);
206 if (reason == SHUTDOWN_REASON_PEER || reason == SHUTDOWN_REASON_LOCAL)
207 {
208 g_waitFlag4Shutdown = WAIT_SUCCESS_VALUE;
209 }else{
210 g_waitFlag4Shutdown = WAIT_FAIL_VALUE;
211 }
212 }
213
CheckReceiveSocketData(int socket, const void *data, unsigned int dataLen)214 static int CheckReceiveSocketData(int socket, const void *data, unsigned int dataLen)
215 {
216 if (socket == g_currentSocket4Data && dataLen == g_expectDataSize)
217 {
218 LOG("[check]socket/size ok socket:%d, size:%d", socket, dataLen);
219 }else
220 {
221 LOG("[check]socket/size failed socket :%d, expectsocket:%d, size:%d, expectsize:%d",
222 socket, g_currentSocket4Data, dataLen, g_expectDataSize);
223 return SOFTBUS_ERR;
224 }
225 if (g_expectDataContent == NULL)
226 {
227 LOG("[check]socket Datacunt is null !!!");
228 return SOFTBUS_ERR;
229 }else
230 {
231 int cmpRst = strncmp(g_expectDataContent, (char*)data, dataLen);
232 if (cmpRst == 0) {
233 LOG("[check] cmp content ok");
234 return SOFTBUS_OK;
235 } else {
236 LOG("[check] cmp content fail[exp:%s,real:%s]", g_expectDataContent, (char*)data);
237 return SOFTBUS_ERR;
238 }
239 }
240 }
241
OnByteData(int32_t socket, const void *data, uint32_t dataLen)242 static void OnByteData(int32_t socket, const void *data, uint32_t dataLen)
243 {
244 LOG("[cb] OnByteData socket:%d", socket);
245 int ret = CheckReceiveSocketData(socket, data, dataLen);
246 if (ret == SOFTBUS_OK)
247 {
248 g_waitFlag4Byte = WAIT_SUCCESS_VALUE;
249 LOG("[cb] OnByteData data recv success");
250 }else
251 {
252 g_waitFlag4Byte = WAIT_FAIL_VALUE;
253 LOG("[cb] OnByteData data recv failed");
254 }
255 }
256
OnMessageData(int32_t socket, const void *data, uint32_t dataLen)257 static void OnMessageData(int32_t socket, const void *data, uint32_t dataLen)
258 {
259 LOG("[cb] OnMessageData socket:%d", socket);
260 int ret = CheckReceiveSocketData(socket, data, dataLen);
261 if (ret == SOFTBUS_OK)
262 {
263 g_waitFlag4Message = WAIT_SUCCESS_VALUE;
264 LOG("[cb] OnMessageData data recv success");
265 }else
266 {
267 g_waitFlag4Message = WAIT_FAIL_VALUE;
268 LOG("[cb] OnMessageData data recv failed");
269 }
270 }
271
OnStreamData(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)272 static void OnStreamData(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
273 {
274 if (socket < 0) {
275 LOG("[cb][data]OnStream invalid socket id[%d]", socket);
276 return;
277 }
278 if (data == NULL) {
279 LOG("[cb][data]OnStream socket id[%d], data is NULL", socket);
280 return;
281 }
282 if (ext == NULL) {
283 LOG("[cb][data]OnStream socket id[%d], ext is NULL", socket);
284 return;
285 }
286 if (param == NULL) {
287 LOG("[cb][data]OnStream socket id[%d], param is NULL", socket);
288 return;
289 }
290 LOG("[cb][data]OnStream Success socket:%d,", socket);
291 LOG("[cb][data]OnStream Success buf:%s,", (data->buf != NULL ? data->buf : "null"));
292 LOG("[cb][data]OnStream Success buflen:%d", data->bufLen);
293 LOG("[cb][data]OnStream Success buf:%s,", (ext->buf != NULL ? ext->buf : "null"));
294 g_waitFlagStream = WAIT_SUCCESS_VALUE;
295 }
296
ClientUpdataRecvFilePathnull297 static const char *ClientUpdataRecvFilePath() {
298 return "/data/";
299 }
300
OnFileData(int32_t socket, FileEvent *event)301 static void OnFileData(int32_t socket, FileEvent *event)
302 {
303 if (socket < 0) {
304 LOG("[cb][data]OnFile invalid socket id[%d]", socket);
305 return;
306 }
307 if (event == NULL) {
308 LOG("[cb][data]OnFile socket id[%d], event is nullptr", socket);
309 return;
310 }
311 if (event->type == FILE_EVENT_RECV_UPDATE_PATH) {
312 LOG("[cb][data]OnFile event type:%d,", event->type);
313 event->UpdateRecvPath = ClientUpdataRecvFilePath;
314 return;
315 }
316 LOG("[cb][data]OnFile, event type:%d, fileCnt:%u", event->type, event->fileCnt);
317 for (uint32_t i = 0; i < event->fileCnt; i++) {
318 LOG("[cb][data] %s", (event->files[i] == NULL ? "null" : event->files[i]));
319 }
320 if (event->type == FILE_EVENT_SEND_FINISH) {
321 LOG("[cb][data]OnFile recv finished");
322 g_waitFlag4File = WAIT_SUCCESS_VALUE;
323 return;
324 }
325 if (event->type == FILE_EVENT_SEND_PROCESS) {
326 LOG("[cb][data]OnFile recv process");
327 return;
328 }
329 if (event->type == FILE_EVENT_SEND_ERROR) {
330 LOG("[cb][data]OnFile recv error!!");
331 g_waitFlag4File = WAIT_FAIL_VALUE;
332 return;
333 }
334 }
335
OnQosData(int32_t socket, QoSEvent eventId, const QosTV *qos, uint32_t qosCunt)336 static void OnQosData(int32_t socket, QoSEvent eventId, const QosTV *qos, uint32_t qosCunt)
337 {
338 LOG("[cb][data] OnQos {socket:%d, event:%d}", socket, eventId);
339 }
340
Wait4Socket(int timeout, WaitSocketType type)341 int Wait4Socket(int timeout, WaitSocketType type)
342 {
343 int hitFlag = -1;
344 int t = timeout;
345 while (t > 0) {
346 sleep(1);
347 switch (type) {
348 case SOCKET_BYTES:
349 if (g_waitFlag4Byte != WAIT_DEF_VALUE) {
350 LOG("Wait4socket[Byte] succ, flag:%d", g_waitFlag4Byte);
351 hitFlag = 1;
352 }
353 break;
354 case SOCKET_MSG:
355 if (g_waitFlag4Message != WAIT_DEF_VALUE) {
356 LOG("Wait4socket[Message] succ,flag:%d", g_waitFlag4Message);
357 hitFlag = 1;
358 }
359 break;
360 case SOCKET_FILE:
361 if (g_waitFlag4File != WAIT_DEF_VALUE) {
362 LOG("Wait4socket[File] succ,flag:%d", g_waitFlag4File);
363 hitFlag = 1;
364 }
365 break;
366 case SOCKET_STREAM:
367 if (g_waitFlagStream != WAIT_DEF_VALUE) {
368 LOG("Wait4socket[Stream] succ,flag:%d", g_waitFlagStream);
369 hitFlag = 1;
370 }
371 break;
372 case SOCKET_SHUTDOWN:
373 if (g_waitFlag4Shutdown != WAIT_DEF_VALUE) {
374 LOG("Wait4socket[SHUTDOWN] succ,flag:%d", g_waitFlag4Shutdown);
375 hitFlag = 1;
376 }
377 break;
378 default:
379 LOG("Wait4socket type error");
380 hitFlag = 1;
381 break;
382 }
383 if (hitFlag != -1) {
384 break;
385 }
386 t--;
387 }
388 switch (type) {
389 case SOCKET_BYTES:
390 if (g_waitFlag4Byte != WAIT_SUCCESS_VALUE) {
391 LOG("Wait4socket[Byte] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4Byte);
392 return SOFTBUS_ERR;
393 }
394 break;
395 case SOCKET_MSG:
396 if (g_waitFlag4Message != WAIT_SUCCESS_VALUE) {
397 LOG("Wait4socket[Message] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4Message);
398 return SOFTBUS_ERR;
399 }
400 break;
401 case SOCKET_FILE:
402 if (g_waitFlag4File != WAIT_SUCCESS_VALUE) {
403 LOG("Wait4socket[File] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4File);
404 return SOFTBUS_ERR;
405 }
406 break;
407 case SOCKET_STREAM:
408 if (g_waitFlagStream != WAIT_SUCCESS_VALUE) {
409 LOG("Wait4socket[Stream] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlagStream);
410 return SOFTBUS_ERR;
411 }
412 break;
413 case SOCKET_SHUTDOWN:
414 if (g_waitFlag4Shutdown != WAIT_SUCCESS_VALUE) {
415 LOG("Wait4socket[SHUTDOWN] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4Shutdown);
416 return SOFTBUS_ERR;
417 }
418 break;
419 default:
420 return SOFTBUS_ERR;
421 }
422 return SOFTBUS_OK;
423 }
424
SendSocket4Data(DataType type, int size)425 int SendSocket4Data(DataType type, int size)
426 {
427 int ret;
428 LOG("###SendSocket4Data g_currentSocket4Data = %d ", g_currentSocket4Data );
429 if (size > 0) {
430 g_expectDataContent = (char*)calloc(1, size);
431 if (g_expectDataContent == NULL) {
432 LOG("[send data]calloc fail");
433 return SOFTBUS_ERR;
434 }
435 (void)memset_s(g_expectDataContent, size, g_fillContentChar, size);
436 } else {
437 LOG("[send data]invalid param[size>=1]");
438 return SOFTBUS_ERR;
439 }
440
441 g_expectDataSize = size;
442
443 if (type == DATA_TYPE_MSG) {
444 ret = SendMessage(g_currentSocket4Data, g_expectDataContent, size);
445 if (ret != SOFTBUS_OK) {
446 LOG("[send data]call SendX fail, ret:%d", ret);
447 free(g_expectDataContent);
448 return SOFTBUS_ERR;
449 }
450 } else if (type == DATA_TYPE_BYTE) {
451 ResetWaitFlag4Byte();
452 ret = SendBytes(g_currentSocket4Data, g_expectDataContent, size);
453 int timeout;
454 if (size < SIZE_1K * SIZE_1K) {
455 timeout = 30;
456 }else if (size >= SIZE_1K * SIZE_1K && size < 2 * SIZE_1K * SIZE_1K)
457 {
458 timeout = 60;
459 }else
460 {
461 timeout = 80;
462 }
463 ret = Wait4Socket(timeout, SOCKET_BYTES);
464 return ret;
465 } else {
466 LOG("[send data]invalid param[DataType]");
467 free(g_expectDataContent);
468 return SOFTBUS_ERR;
469 }
470
471 LOG("[send data]call SendX success");
472 free(g_expectDataContent);
473 g_expectDataContent = NULL;
474 return ret;
475 }
476
477 // set/get function
ResetWaitFlag(void)478 void ResetWaitFlag(void)
479 {
480 g_waitFlag = WAIT_DEF_VALUE;
481 }
482
ResetWaitFlag4Shutdown(void)483 void ResetWaitFlag4Shutdown(void)
484 {
485 g_waitFlag4Shutdown = WAIT_DEF_VALUE;
486 }
487
ResetWaitFlag4Byte(void)488 void ResetWaitFlag4Byte(void)
489 {
490 g_waitFlag4Byte = WAIT_DEF_VALUE;
491 }
492
ResetWaitFlag4Message(void)493 void ResetWaitFlag4Message(void)
494 {
495 g_waitFlag4Message = WAIT_DEF_VALUE;
496 }
497
ResetWaitFlag4Stream(void)498 void ResetWaitFlag4Stream(void)
499 {
500 g_waitFlagStream = WAIT_DEF_VALUE;
501 }
502
ResetWaitFlag4File(void)503 void ResetWaitFlag4File(void)
504 {
505 g_waitFlag4File = WAIT_DEF_VALUE;
506 }
507
GetNetworkId(void)508 char* GetNetworkId(void)
509 {
510 return g_networkId;
511 }
512
513 // To one device only
CheckRemoteDeviceIsNull(int isSetNetId)514 int CheckRemoteDeviceIsNull(int isSetNetId)
515 {
516 int nodeNum = 0;
517 NodeBasicInfo* nodeInfo = NULL;
518 int ret = GetAllNodeDeviceInfo(DEF_PKG_NAME, &nodeInfo, &nodeNum);
519 LOG("[check]get node number is:%d, ret:%d", nodeNum, ret);
520 if (nodeInfo != NULL && nodeNum > 0) {
521 LOG("[check]get netid is:%s", nodeInfo->networkId);
522 if (isSetNetId == BOOL_TRUE) {
523 (void)strncpy_s(g_networkId, NETWORK_ID_BUF_LEN, nodeInfo->networkId, NETWORK_ID_BUF_LEN);
524 }
525 FreeNodeInfo(nodeInfo);
526 return SOFTBUS_OK;
527 } else {
528 LOG("[check]get nodeInfo is null");
529 return SOFTBUS_ERR;
530 }
531 }
532
GetSocketListnerData(void)533 ISocketListener* GetSocketListnerData(void)
534 {
535 return g_socketlistenerdata;
536 }
537
SetCurrentSocket4Data(int socket)538 void SetCurrentSocket4Data(int socket)
539 {
540 g_currentSocket4Data = socket;
541 }
542
GetCurrentSocket4Data(void)543 int GetCurrentSocket4Data(void)
544 {
545 return g_currentSocket4Data;
546 }
547
TestSetUp(void)548 void TestSetUp(void)
549 {
550 g_defNodeStateCallback.events = EVENT_NODE_STATE_MASK;
551 g_defNodeStateCallback.onNodeOnline = OnDefNodeOnline;
552 g_defNodeStateCallback.onNodeOffline = OnDefNodeOffline;
553 g_defNodeStateCallback.onNodeBasicInfoChanged = OnDefNodeBasicInfoChanged;
554 g_defNodeStateCallback.onNodeStatusChanged = onDefNodeStatusChanged;
555 if (g_socketlistenerdata == NULL) {
556 g_socketlistenerdata = (ISocketListener*)calloc(1, sizeof(ISocketListener));
557 g_socketlistenerdata->OnBind = OnBindData;
558 g_socketlistenerdata->OnShutdown = OnShutdownData;
559 g_socketlistenerdata->OnBytes = OnByteData;
560 g_socketlistenerdata->OnMessage = OnMessageData;
561 g_socketlistenerdata->OnStream = OnStreamData;
562 g_socketlistenerdata->OnFile = OnFileData;
563 g_socketlistenerdata->OnQos = OnQosData;
564 };
565 }
566
TestTearDown(void)567 void TestTearDown(void)
568 {
569
570 if (g_socketlistenerdata != NULL) {
571 free(g_socketlistenerdata);
572 g_socketlistenerdata = NULL;
573 }
574 }
575
AddPermission(void)576 void AddPermission(void)
577 {
578 uint64_t tokenId;
579 const char *perms[2];
580 perms[0] = OHOS_PERMISSION_DISTRIBUTED_SOFTBUS_CENTER;
581 perms[1] = OHOS_PERMISSION_DISTRIBUTED_DATASYNC;
582 NativeTokenInfoParams infoTnstance = {
583 .dcapsNum = 0,
584 .permsNum = 2,
585 .aclsNum = 0,
586 .dcaps = NULL,
587 .perms = perms,
588 .acls = NULL,
589 .processName = "dsoftbus_test_service",
590 .aplStr = "system_core",
591 };
592 tokenId = GetAccessTokenId(&infoTnstance);
593 SetSelfTokenID(tokenId);
594 }