• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }