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