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 }