10704ebd2Sopenharmony_ci/*
20704ebd2Sopenharmony_ci * Copyright (c) 2024  Huawei Device Co., Ltd.
30704ebd2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
40704ebd2Sopenharmony_ci * you may not use this file except in compliance with the License.
50704ebd2Sopenharmony_ci * You may obtain a copy of the License at
60704ebd2Sopenharmony_ci *
70704ebd2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
80704ebd2Sopenharmony_ci *
90704ebd2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
100704ebd2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
110704ebd2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120704ebd2Sopenharmony_ci * See the License for the specific language governing permissions and
130704ebd2Sopenharmony_ci * limitations under the License.
140704ebd2Sopenharmony_ci */
150704ebd2Sopenharmony_ci
160704ebd2Sopenharmony_ci#include "socket_common.h"
170704ebd2Sopenharmony_ci
180704ebd2Sopenharmony_cistatic int32_t g_currentSocket4Data = -1;
190704ebd2Sopenharmony_cistatic int32_t g_waitFlag = WAIT_DEF_VALUE;
200704ebd2Sopenharmony_cistatic int32_t g_waitFlag4Shutdown = WAIT_DEF_VALUE;
210704ebd2Sopenharmony_cistatic int32_t g_waitFlag4Byte = WAIT_DEF_VALUE;
220704ebd2Sopenharmony_cistatic int32_t g_waitFlag4Message = WAIT_DEF_VALUE;
230704ebd2Sopenharmony_cistatic int32_t g_waitFlagStream = WAIT_DEF_VALUE;
240704ebd2Sopenharmony_cistatic int32_t g_waitFlag4File = WAIT_DEF_VALUE;
250704ebd2Sopenharmony_cistatic int32_t g_nodeOnlineCount = 0;
260704ebd2Sopenharmony_cistatic int32_t g_nodeOfflineCount = 0;
270704ebd2Sopenharmony_cistatic ISocketListener* g_socketlistenerdata = NULL;
280704ebd2Sopenharmony_cistatic char g_networkId[NETWORK_ID_BUF_LEN] = { 0 };
290704ebd2Sopenharmony_cistatic INodeStateCb g_defNodeStateCallback;
300704ebd2Sopenharmony_cistatic char g_fillContentChar = 'd';
310704ebd2Sopenharmony_cistatic unsigned int g_expectDataSize = 0;
320704ebd2Sopenharmony_cistatic char* g_expectDataContent = NULL;
330704ebd2Sopenharmony_ci
340704ebd2Sopenharmony_ci/*reset count*/
350704ebd2Sopenharmony_civoid ResetwaitCount4Online(void)
360704ebd2Sopenharmony_ci{
370704ebd2Sopenharmony_ci    g_nodeOnlineCount = 0;
380704ebd2Sopenharmony_ci}
390704ebd2Sopenharmony_ci
400704ebd2Sopenharmony_ci/*common method*/
410704ebd2Sopenharmony_civoid ResetwaitCount4Offline(void)
420704ebd2Sopenharmony_ci{
430704ebd2Sopenharmony_ci    g_nodeOfflineCount = 0;
440704ebd2Sopenharmony_ci}
450704ebd2Sopenharmony_ci
460704ebd2Sopenharmony_civoid Sleepn(int n)
470704ebd2Sopenharmony_ci{
480704ebd2Sopenharmony_ci    for(int i = 0; i < n; i++) {
490704ebd2Sopenharmony_ci        sleep(1);
500704ebd2Sopenharmony_ci        LOG("sleeped %d", i);
510704ebd2Sopenharmony_ci    }
520704ebd2Sopenharmony_ci}
530704ebd2Sopenharmony_ci
540704ebd2Sopenharmony_cichar* GetSoftbusPid(void)
550704ebd2Sopenharmony_ci{
560704ebd2Sopenharmony_ci    FILE* file = NULL;
570704ebd2Sopenharmony_ci    int buffSize = 20;
580704ebd2Sopenharmony_ci    char* buffer = (char*)malloc(buffSize);
590704ebd2Sopenharmony_ci    if (buffer == NULL) {
600704ebd2Sopenharmony_ci        LOG("malloc fail");
610704ebd2Sopenharmony_ci        return NULL;
620704ebd2Sopenharmony_ci    }
630704ebd2Sopenharmony_ci
640704ebd2Sopenharmony_ci    file = popen(CMD_PIDOF_SOFTBUS, "r");
650704ebd2Sopenharmony_ci    if (file == NULL) {
660704ebd2Sopenharmony_ci        LOG("call popen fail");
670704ebd2Sopenharmony_ci        free(buffer);
680704ebd2Sopenharmony_ci        return NULL;
690704ebd2Sopenharmony_ci    }
700704ebd2Sopenharmony_ci    (void)fgets(buffer, buffSize, file);
710704ebd2Sopenharmony_ci    LOG("##################Softbus PID:%s", buffer);
720704ebd2Sopenharmony_ci    pclose(file);
730704ebd2Sopenharmony_ci
740704ebd2Sopenharmony_ci    return buffer;
750704ebd2Sopenharmony_ci}
760704ebd2Sopenharmony_ci
770704ebd2Sopenharmony_cistatic void OnDefNodeOnline(NodeBasicInfo* info)
780704ebd2Sopenharmony_ci{
790704ebd2Sopenharmony_ci    if (info == NULL) {
800704ebd2Sopenharmony_ci        LOG("[cb]Online: info is null");
810704ebd2Sopenharmony_ci        return;
820704ebd2Sopenharmony_ci    }
830704ebd2Sopenharmony_ci    (void)strncpy_s(g_networkId, NETWORK_ID_BUF_LEN, info->networkId, NETWORK_ID_BUF_LEN);
840704ebd2Sopenharmony_ci    LOG("[cb]Online id:%s, name:%s, type id:%u", info->networkId, info->deviceName, info->deviceTypeId);
850704ebd2Sopenharmony_ci    g_nodeOnlineCount++;
860704ebd2Sopenharmony_ci}
870704ebd2Sopenharmony_ci
880704ebd2Sopenharmony_cistatic void OnDefNodeOffline(NodeBasicInfo* info)
890704ebd2Sopenharmony_ci{
900704ebd2Sopenharmony_ci    if (info == NULL) {
910704ebd2Sopenharmony_ci        LOG("[cb]Offline: info is null");
920704ebd2Sopenharmony_ci        return;
930704ebd2Sopenharmony_ci    }
940704ebd2Sopenharmony_ci    LOG("[cb]Offline id:%s, name:%s, type id:%u", info->networkId, info->deviceName, info->deviceTypeId);
950704ebd2Sopenharmony_ci    g_nodeOfflineCount++;
960704ebd2Sopenharmony_ci}
970704ebd2Sopenharmony_ci
980704ebd2Sopenharmony_cistatic void OnDefNodeBasicInfoChanged(NodeBasicInfoType type, NodeBasicInfo* info)
990704ebd2Sopenharmony_ci{
1000704ebd2Sopenharmony_ci    if (info == NULL) {
1010704ebd2Sopenharmony_ci        LOG("[cb]InfoChanged: info is null, type[%d]", type);
1020704ebd2Sopenharmony_ci        return;
1030704ebd2Sopenharmony_ci    }
1040704ebd2Sopenharmony_ci    LOG("[cb]InfoChanged id: %s,name: %s", info->networkId, info->deviceName);
1050704ebd2Sopenharmony_ci}
1060704ebd2Sopenharmony_ci
1070704ebd2Sopenharmony_cistatic void onDefNodeStatusChanged(NodeStatusType type, NodeStatus *status)
1080704ebd2Sopenharmony_ci{
1090704ebd2Sopenharmony_ci    if (status == NULL) {
1100704ebd2Sopenharmony_ci        LOG("[cb]StatusChanged: info is null, type[%d]", type);
1110704ebd2Sopenharmony_ci        return;
1120704ebd2Sopenharmony_ci    }
1130704ebd2Sopenharmony_ci    LOG("[cb]StatusChanged id: %s,status: %d", status->basicInfo.networkId, status->authStatus);
1140704ebd2Sopenharmony_ci}
1150704ebd2Sopenharmony_ci
1160704ebd2Sopenharmony_ciint RegisterDeviceStateDefCallback(void)
1170704ebd2Sopenharmony_ci{
1180704ebd2Sopenharmony_ci    return RegNodeDeviceStateCb(DEF_PKG_NAME, &g_defNodeStateCallback);
1190704ebd2Sopenharmony_ci}
1200704ebd2Sopenharmony_ci
1210704ebd2Sopenharmony_ciint UnRegisterDeviceStateDefCallback(void)
1220704ebd2Sopenharmony_ci{
1230704ebd2Sopenharmony_ci    return UnregNodeDeviceStateCb(&g_defNodeStateCallback);
1240704ebd2Sopenharmony_ci}
1250704ebd2Sopenharmony_ci
1260704ebd2Sopenharmony_ciint WaitNodeCount(int timeout, WaitNodeStateType state, int expectCount)
1270704ebd2Sopenharmony_ci{
1280704ebd2Sopenharmony_ci    LOG("Wait4Node,timeout:%d, type:%d, exp count:%d", timeout, state, expectCount);
1290704ebd2Sopenharmony_ci    int hitFlag = -1;
1300704ebd2Sopenharmony_ci    while (timeout > 0) {
1310704ebd2Sopenharmony_ci        sleep(ONE_SECOND);
1320704ebd2Sopenharmony_ci        switch (state) {
1330704ebd2Sopenharmony_ci            case STATE_ONLINE:
1340704ebd2Sopenharmony_ci                if (g_nodeOnlineCount == expectCount) {
1350704ebd2Sopenharmony_ci                    LOG("Wait4Node[online] succ,timeout:%d", timeout);
1360704ebd2Sopenharmony_ci                    hitFlag = 1;
1370704ebd2Sopenharmony_ci                }
1380704ebd2Sopenharmony_ci                break;
1390704ebd2Sopenharmony_ci            case STATE_OFFLINE:
1400704ebd2Sopenharmony_ci                if (g_nodeOfflineCount == expectCount) {
1410704ebd2Sopenharmony_ci                    LOG("Wait4Node[offline] succ,timeout:%d", timeout);
1420704ebd2Sopenharmony_ci                    hitFlag = 1;
1430704ebd2Sopenharmony_ci                }
1440704ebd2Sopenharmony_ci                break;
1450704ebd2Sopenharmony_ci            default:
1460704ebd2Sopenharmony_ci                LOG("Wait4Node state error");
1470704ebd2Sopenharmony_ci                hitFlag = 1;
1480704ebd2Sopenharmony_ci                break;
1490704ebd2Sopenharmony_ci        }
1500704ebd2Sopenharmony_ci        if (hitFlag != -1) {
1510704ebd2Sopenharmony_ci            break;
1520704ebd2Sopenharmony_ci        }
1530704ebd2Sopenharmony_ci        timeout--;
1540704ebd2Sopenharmony_ci    }
1550704ebd2Sopenharmony_ci    switch (state) {
1560704ebd2Sopenharmony_ci        case STATE_ONLINE:
1570704ebd2Sopenharmony_ci            if (g_nodeOnlineCount != expectCount) {
1580704ebd2Sopenharmony_ci                LOG("Wait4Node[online] fail[exp:%d, real:%d]", expectCount, g_nodeOnlineCount);
1590704ebd2Sopenharmony_ci                return SOFTBUS_ERR;
1600704ebd2Sopenharmony_ci            }
1610704ebd2Sopenharmony_ci            break;
1620704ebd2Sopenharmony_ci        case STATE_OFFLINE:
1630704ebd2Sopenharmony_ci            if (g_nodeOfflineCount != expectCount) {
1640704ebd2Sopenharmony_ci                LOG("Wait4Node[offline] fail[exp:%d, real:%d]", expectCount, g_nodeOfflineCount);
1650704ebd2Sopenharmony_ci                return SOFTBUS_ERR;
1660704ebd2Sopenharmony_ci            }
1670704ebd2Sopenharmony_ci            break;
1680704ebd2Sopenharmony_ci        default:
1690704ebd2Sopenharmony_ci            return SOFTBUS_ERR;
1700704ebd2Sopenharmony_ci    }
1710704ebd2Sopenharmony_ci    return SOFTBUS_OK;
1720704ebd2Sopenharmony_ci}
1730704ebd2Sopenharmony_ci
1740704ebd2Sopenharmony_ci//socket callback
1750704ebd2Sopenharmony_cistatic void OnBindData(int32_t socket, PeerSocketInfo info)
1760704ebd2Sopenharmony_ci{
1770704ebd2Sopenharmony_ci    int successcount = 0;
1780704ebd2Sopenharmony_ci    LOG("[cb][Ctrl]OnBind success  {socket:%d, name:%s, deviceId:%s, pkgName:%s, dataType:%d}", socket,
1790704ebd2Sopenharmony_ci       info.name, info.networkId, info.pkgName, info.dataType);
1800704ebd2Sopenharmony_ci    if (strcmp(info.networkId, g_networkId) != 0)
1810704ebd2Sopenharmony_ci    {
1820704ebd2Sopenharmony_ci        LOG("PeerSocket Info peer deviceId and check remote networkId are diff");
1830704ebd2Sopenharmony_ci        successcount++;
1840704ebd2Sopenharmony_ci    }
1850704ebd2Sopenharmony_ci    if (strcmp(info.name, SOCKET_NAME_BYTE) != 0)
1860704ebd2Sopenharmony_ci    {
1870704ebd2Sopenharmony_ci        LOG("PeerSocket Info peer name and local name are diff");
1880704ebd2Sopenharmony_ci        successcount++;
1890704ebd2Sopenharmony_ci    }
1900704ebd2Sopenharmony_ci    if (strcmp(info.pkgName, DEF_PKG_NAME) != 0)
1910704ebd2Sopenharmony_ci    {
1920704ebd2Sopenharmony_ci        LOG("PeerSocket Info peer pkgName and local pkgName are diff");
1930704ebd2Sopenharmony_ci        successcount++;
1940704ebd2Sopenharmony_ci    }
1950704ebd2Sopenharmony_ci    if(successcount == 3)
1960704ebd2Sopenharmony_ci    {
1970704ebd2Sopenharmony_ci       g_waitFlag = WAIT_SUCCESS_VALUE;
1980704ebd2Sopenharmony_ci    }else{
1990704ebd2Sopenharmony_ci       g_waitFlag = WAIT_FAIL_VALUE;
2000704ebd2Sopenharmony_ci    }
2010704ebd2Sopenharmony_ci}
2020704ebd2Sopenharmony_ci
2030704ebd2Sopenharmony_cistatic void OnShutdownData(int32_t socket, ShutdownReason reason)
2040704ebd2Sopenharmony_ci{
2050704ebd2Sopenharmony_ci    LOG("[cb][Ctrl]OnShutdownData success  {socket:%d, reason:%u}", socket, reason);
2060704ebd2Sopenharmony_ci    if (reason == SHUTDOWN_REASON_PEER || reason == SHUTDOWN_REASON_LOCAL)
2070704ebd2Sopenharmony_ci    {
2080704ebd2Sopenharmony_ci        g_waitFlag4Shutdown = WAIT_SUCCESS_VALUE;
2090704ebd2Sopenharmony_ci    }else{
2100704ebd2Sopenharmony_ci        g_waitFlag4Shutdown = WAIT_FAIL_VALUE;
2110704ebd2Sopenharmony_ci    }
2120704ebd2Sopenharmony_ci}
2130704ebd2Sopenharmony_ci
2140704ebd2Sopenharmony_cistatic int CheckReceiveSocketData(int socket, const void *data, unsigned int dataLen)
2150704ebd2Sopenharmony_ci{
2160704ebd2Sopenharmony_ci    if (socket == g_currentSocket4Data && dataLen == g_expectDataSize)
2170704ebd2Sopenharmony_ci    {
2180704ebd2Sopenharmony_ci        LOG("[check]socket/size ok socket:%d, size:%d", socket, dataLen);
2190704ebd2Sopenharmony_ci    }else
2200704ebd2Sopenharmony_ci    {
2210704ebd2Sopenharmony_ci        LOG("[check]socket/size failed socket :%d, expectsocket:%d, size:%d, expectsize:%d",
2220704ebd2Sopenharmony_ci         socket, g_currentSocket4Data, dataLen, g_expectDataSize);
2230704ebd2Sopenharmony_ci         return SOFTBUS_ERR;
2240704ebd2Sopenharmony_ci    }
2250704ebd2Sopenharmony_ci    if (g_expectDataContent == NULL)
2260704ebd2Sopenharmony_ci    {
2270704ebd2Sopenharmony_ci        LOG("[check]socket  Datacunt is null !!!");
2280704ebd2Sopenharmony_ci        return SOFTBUS_ERR;
2290704ebd2Sopenharmony_ci    }else
2300704ebd2Sopenharmony_ci    {
2310704ebd2Sopenharmony_ci        int cmpRst = strncmp(g_expectDataContent, (char*)data, dataLen);
2320704ebd2Sopenharmony_ci        if (cmpRst == 0) {
2330704ebd2Sopenharmony_ci           LOG("[check] cmp content ok");
2340704ebd2Sopenharmony_ci           return SOFTBUS_OK;
2350704ebd2Sopenharmony_ci        } else {
2360704ebd2Sopenharmony_ci           LOG("[check] cmp content fail[exp:%s,real:%s]", g_expectDataContent, (char*)data);
2370704ebd2Sopenharmony_ci           return SOFTBUS_ERR;
2380704ebd2Sopenharmony_ci        }
2390704ebd2Sopenharmony_ci    }
2400704ebd2Sopenharmony_ci}
2410704ebd2Sopenharmony_ci
2420704ebd2Sopenharmony_cistatic void OnByteData(int32_t socket, const void *data, uint32_t dataLen)
2430704ebd2Sopenharmony_ci{
2440704ebd2Sopenharmony_ci    LOG("[cb] OnByteData socket:%d", socket);
2450704ebd2Sopenharmony_ci    int ret = CheckReceiveSocketData(socket, data, dataLen);
2460704ebd2Sopenharmony_ci    if (ret == SOFTBUS_OK)
2470704ebd2Sopenharmony_ci    {
2480704ebd2Sopenharmony_ci        g_waitFlag4Byte = WAIT_SUCCESS_VALUE;
2490704ebd2Sopenharmony_ci        LOG("[cb] OnByteData data recv success");
2500704ebd2Sopenharmony_ci    }else
2510704ebd2Sopenharmony_ci    {
2520704ebd2Sopenharmony_ci        g_waitFlag4Byte = WAIT_FAIL_VALUE;
2530704ebd2Sopenharmony_ci        LOG("[cb] OnByteData data recv failed");
2540704ebd2Sopenharmony_ci    }
2550704ebd2Sopenharmony_ci}
2560704ebd2Sopenharmony_ci
2570704ebd2Sopenharmony_cistatic void OnMessageData(int32_t socket, const void *data, uint32_t dataLen)
2580704ebd2Sopenharmony_ci{
2590704ebd2Sopenharmony_ci    LOG("[cb] OnMessageData socket:%d", socket);
2600704ebd2Sopenharmony_ci    int ret = CheckReceiveSocketData(socket, data, dataLen);
2610704ebd2Sopenharmony_ci    if (ret == SOFTBUS_OK)
2620704ebd2Sopenharmony_ci    {
2630704ebd2Sopenharmony_ci        g_waitFlag4Message = WAIT_SUCCESS_VALUE;
2640704ebd2Sopenharmony_ci        LOG("[cb] OnMessageData data recv success");
2650704ebd2Sopenharmony_ci    }else
2660704ebd2Sopenharmony_ci    {
2670704ebd2Sopenharmony_ci        g_waitFlag4Message = WAIT_FAIL_VALUE;
2680704ebd2Sopenharmony_ci        LOG("[cb] OnMessageData data recv failed");
2690704ebd2Sopenharmony_ci    }
2700704ebd2Sopenharmony_ci}
2710704ebd2Sopenharmony_ci
2720704ebd2Sopenharmony_cistatic void OnStreamData(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
2730704ebd2Sopenharmony_ci{
2740704ebd2Sopenharmony_ci    if (socket < 0) {
2750704ebd2Sopenharmony_ci        LOG("[cb][data]OnStream invalid socket id[%d]", socket);
2760704ebd2Sopenharmony_ci        return;
2770704ebd2Sopenharmony_ci    }
2780704ebd2Sopenharmony_ci    if (data == NULL) {
2790704ebd2Sopenharmony_ci        LOG("[cb][data]OnStream socket id[%d], data is NULL", socket);
2800704ebd2Sopenharmony_ci        return;
2810704ebd2Sopenharmony_ci    }
2820704ebd2Sopenharmony_ci    if (ext == NULL) {
2830704ebd2Sopenharmony_ci        LOG("[cb][data]OnStream socket id[%d], ext is NULL", socket);
2840704ebd2Sopenharmony_ci        return;
2850704ebd2Sopenharmony_ci    }
2860704ebd2Sopenharmony_ci    if (param == NULL) {
2870704ebd2Sopenharmony_ci        LOG("[cb][data]OnStream socket id[%d], param is NULL", socket);
2880704ebd2Sopenharmony_ci        return;
2890704ebd2Sopenharmony_ci    }
2900704ebd2Sopenharmony_ci    LOG("[cb][data]OnStream Success socket:%d,", socket);
2910704ebd2Sopenharmony_ci    LOG("[cb][data]OnStream Success buf:%s,", (data->buf != NULL ? data->buf : "null"));
2920704ebd2Sopenharmony_ci    LOG("[cb][data]OnStream Success buflen:%d", data->bufLen);
2930704ebd2Sopenharmony_ci    LOG("[cb][data]OnStream Success buf:%s,", (ext->buf != NULL ? ext->buf : "null"));
2940704ebd2Sopenharmony_ci    g_waitFlagStream = WAIT_SUCCESS_VALUE;
2950704ebd2Sopenharmony_ci}
2960704ebd2Sopenharmony_ci
2970704ebd2Sopenharmony_cistatic const char *ClientUpdataRecvFilePath() {
2980704ebd2Sopenharmony_ci    return "/data/";
2990704ebd2Sopenharmony_ci}
3000704ebd2Sopenharmony_ci
3010704ebd2Sopenharmony_cistatic void OnFileData(int32_t socket, FileEvent *event)
3020704ebd2Sopenharmony_ci{
3030704ebd2Sopenharmony_ci    if (socket < 0) {
3040704ebd2Sopenharmony_ci        LOG("[cb][data]OnFile invalid socket id[%d]", socket);
3050704ebd2Sopenharmony_ci        return;
3060704ebd2Sopenharmony_ci    }
3070704ebd2Sopenharmony_ci    if (event == NULL) {
3080704ebd2Sopenharmony_ci        LOG("[cb][data]OnFile socket id[%d], event is nullptr", socket);
3090704ebd2Sopenharmony_ci        return;
3100704ebd2Sopenharmony_ci    }
3110704ebd2Sopenharmony_ci    if (event->type == FILE_EVENT_RECV_UPDATE_PATH) {
3120704ebd2Sopenharmony_ci        LOG("[cb][data]OnFile event type:%d,", event->type);
3130704ebd2Sopenharmony_ci        event->UpdateRecvPath = ClientUpdataRecvFilePath;
3140704ebd2Sopenharmony_ci        return;
3150704ebd2Sopenharmony_ci    }
3160704ebd2Sopenharmony_ci    LOG("[cb][data]OnFile, event type:%d, fileCnt:%u", event->type, event->fileCnt);
3170704ebd2Sopenharmony_ci    for (uint32_t i = 0; i < event->fileCnt; i++) {
3180704ebd2Sopenharmony_ci        LOG("[cb][data] %s", (event->files[i] == NULL ? "null" : event->files[i]));
3190704ebd2Sopenharmony_ci    }
3200704ebd2Sopenharmony_ci    if (event->type == FILE_EVENT_SEND_FINISH) {
3210704ebd2Sopenharmony_ci        LOG("[cb][data]OnFile recv finished");
3220704ebd2Sopenharmony_ci        g_waitFlag4File = WAIT_SUCCESS_VALUE;
3230704ebd2Sopenharmony_ci        return;
3240704ebd2Sopenharmony_ci    }
3250704ebd2Sopenharmony_ci    if (event->type == FILE_EVENT_SEND_PROCESS) {
3260704ebd2Sopenharmony_ci        LOG("[cb][data]OnFile recv process");
3270704ebd2Sopenharmony_ci        return;
3280704ebd2Sopenharmony_ci    }
3290704ebd2Sopenharmony_ci    if (event->type == FILE_EVENT_SEND_ERROR) {
3300704ebd2Sopenharmony_ci        LOG("[cb][data]OnFile recv error!!");
3310704ebd2Sopenharmony_ci        g_waitFlag4File = WAIT_FAIL_VALUE;
3320704ebd2Sopenharmony_ci        return;
3330704ebd2Sopenharmony_ci    }
3340704ebd2Sopenharmony_ci}
3350704ebd2Sopenharmony_ci
3360704ebd2Sopenharmony_cistatic void OnQosData(int32_t socket, QoSEvent eventId, const QosTV *qos, uint32_t qosCunt)
3370704ebd2Sopenharmony_ci{
3380704ebd2Sopenharmony_ci    LOG("[cb][data] OnQos {socket:%d, event:%d}", socket, eventId);
3390704ebd2Sopenharmony_ci}
3400704ebd2Sopenharmony_ci
3410704ebd2Sopenharmony_ciint Wait4Socket(int timeout, WaitSocketType type)
3420704ebd2Sopenharmony_ci{
3430704ebd2Sopenharmony_ci    int hitFlag = -1;
3440704ebd2Sopenharmony_ci    int t = timeout;
3450704ebd2Sopenharmony_ci    while (t > 0) {
3460704ebd2Sopenharmony_ci        sleep(1);
3470704ebd2Sopenharmony_ci        switch (type) {
3480704ebd2Sopenharmony_ci            case SOCKET_BYTES:
3490704ebd2Sopenharmony_ci                if (g_waitFlag4Byte != WAIT_DEF_VALUE) {
3500704ebd2Sopenharmony_ci                    LOG("Wait4socket[Byte] succ, flag:%d", g_waitFlag4Byte);
3510704ebd2Sopenharmony_ci                    hitFlag = 1;
3520704ebd2Sopenharmony_ci                }
3530704ebd2Sopenharmony_ci                break;
3540704ebd2Sopenharmony_ci            case SOCKET_MSG:
3550704ebd2Sopenharmony_ci                if (g_waitFlag4Message != WAIT_DEF_VALUE) {
3560704ebd2Sopenharmony_ci                    LOG("Wait4socket[Message] succ,flag:%d", g_waitFlag4Message);
3570704ebd2Sopenharmony_ci                    hitFlag = 1;
3580704ebd2Sopenharmony_ci                }
3590704ebd2Sopenharmony_ci                break;
3600704ebd2Sopenharmony_ci            case SOCKET_FILE:
3610704ebd2Sopenharmony_ci                if (g_waitFlag4File != WAIT_DEF_VALUE) {
3620704ebd2Sopenharmony_ci                    LOG("Wait4socket[File] succ,flag:%d", g_waitFlag4File);
3630704ebd2Sopenharmony_ci                    hitFlag = 1;
3640704ebd2Sopenharmony_ci                }
3650704ebd2Sopenharmony_ci                break;
3660704ebd2Sopenharmony_ci            case SOCKET_STREAM:
3670704ebd2Sopenharmony_ci                if (g_waitFlagStream != WAIT_DEF_VALUE) {
3680704ebd2Sopenharmony_ci                    LOG("Wait4socket[Stream] succ,flag:%d", g_waitFlagStream);
3690704ebd2Sopenharmony_ci                    hitFlag = 1;
3700704ebd2Sopenharmony_ci                }
3710704ebd2Sopenharmony_ci                break;
3720704ebd2Sopenharmony_ci            case SOCKET_SHUTDOWN:
3730704ebd2Sopenharmony_ci                if (g_waitFlag4Shutdown != WAIT_DEF_VALUE) {
3740704ebd2Sopenharmony_ci                    LOG("Wait4socket[SHUTDOWN] succ,flag:%d", g_waitFlag4Shutdown);
3750704ebd2Sopenharmony_ci                    hitFlag = 1;
3760704ebd2Sopenharmony_ci                }
3770704ebd2Sopenharmony_ci                break;
3780704ebd2Sopenharmony_ci            default:
3790704ebd2Sopenharmony_ci                LOG("Wait4socket type error");
3800704ebd2Sopenharmony_ci                hitFlag = 1;
3810704ebd2Sopenharmony_ci                break;
3820704ebd2Sopenharmony_ci        }
3830704ebd2Sopenharmony_ci        if (hitFlag != -1) {
3840704ebd2Sopenharmony_ci            break;
3850704ebd2Sopenharmony_ci        }
3860704ebd2Sopenharmony_ci        t--;
3870704ebd2Sopenharmony_ci    }
3880704ebd2Sopenharmony_ci    switch (type) {
3890704ebd2Sopenharmony_ci        case SOCKET_BYTES:
3900704ebd2Sopenharmony_ci            if (g_waitFlag4Byte != WAIT_SUCCESS_VALUE) {
3910704ebd2Sopenharmony_ci                LOG("Wait4socket[Byte] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4Byte);
3920704ebd2Sopenharmony_ci                return SOFTBUS_ERR;
3930704ebd2Sopenharmony_ci            }
3940704ebd2Sopenharmony_ci            break;
3950704ebd2Sopenharmony_ci        case SOCKET_MSG:
3960704ebd2Sopenharmony_ci            if (g_waitFlag4Message != WAIT_SUCCESS_VALUE) {
3970704ebd2Sopenharmony_ci                LOG("Wait4socket[Message] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4Message);
3980704ebd2Sopenharmony_ci                return SOFTBUS_ERR;
3990704ebd2Sopenharmony_ci            }
4000704ebd2Sopenharmony_ci            break;
4010704ebd2Sopenharmony_ci        case SOCKET_FILE:
4020704ebd2Sopenharmony_ci            if (g_waitFlag4File != WAIT_SUCCESS_VALUE) {
4030704ebd2Sopenharmony_ci                LOG("Wait4socket[File] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4File);
4040704ebd2Sopenharmony_ci                return SOFTBUS_ERR;
4050704ebd2Sopenharmony_ci            }
4060704ebd2Sopenharmony_ci            break;
4070704ebd2Sopenharmony_ci         case SOCKET_STREAM:
4080704ebd2Sopenharmony_ci            if (g_waitFlagStream != WAIT_SUCCESS_VALUE) {
4090704ebd2Sopenharmony_ci                LOG("Wait4socket[Stream] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlagStream);
4100704ebd2Sopenharmony_ci                return SOFTBUS_ERR;
4110704ebd2Sopenharmony_ci            }
4120704ebd2Sopenharmony_ci            break;
4130704ebd2Sopenharmony_ci         case SOCKET_SHUTDOWN:
4140704ebd2Sopenharmony_ci            if (g_waitFlag4Shutdown != WAIT_SUCCESS_VALUE) {
4150704ebd2Sopenharmony_ci                LOG("Wait4socket[SHUTDOWN] fail[exp:%d, real:%d]", WAIT_SUCCESS_VALUE, g_waitFlag4Shutdown);
4160704ebd2Sopenharmony_ci                return SOFTBUS_ERR;
4170704ebd2Sopenharmony_ci            }
4180704ebd2Sopenharmony_ci            break;
4190704ebd2Sopenharmony_ci        default:
4200704ebd2Sopenharmony_ci            return SOFTBUS_ERR;
4210704ebd2Sopenharmony_ci    }
4220704ebd2Sopenharmony_ci    return SOFTBUS_OK;
4230704ebd2Sopenharmony_ci}
4240704ebd2Sopenharmony_ci
4250704ebd2Sopenharmony_ciint SendSocket4Data(DataType type, int size)
4260704ebd2Sopenharmony_ci{
4270704ebd2Sopenharmony_ci    int ret;
4280704ebd2Sopenharmony_ci    LOG("###SendSocket4Data  g_currentSocket4Data = %d ", g_currentSocket4Data );
4290704ebd2Sopenharmony_ci    if (size > 0) {
4300704ebd2Sopenharmony_ci        g_expectDataContent = (char*)calloc(1, size);
4310704ebd2Sopenharmony_ci        if (g_expectDataContent == NULL) {
4320704ebd2Sopenharmony_ci            LOG("[send data]calloc fail");
4330704ebd2Sopenharmony_ci            return SOFTBUS_ERR;
4340704ebd2Sopenharmony_ci        }
4350704ebd2Sopenharmony_ci        (void)memset_s(g_expectDataContent, size, g_fillContentChar, size);
4360704ebd2Sopenharmony_ci    } else {
4370704ebd2Sopenharmony_ci        LOG("[send data]invalid param[size>=1]");
4380704ebd2Sopenharmony_ci        return SOFTBUS_ERR;
4390704ebd2Sopenharmony_ci    }
4400704ebd2Sopenharmony_ci
4410704ebd2Sopenharmony_ci    g_expectDataSize = size;
4420704ebd2Sopenharmony_ci
4430704ebd2Sopenharmony_ci    if (type == DATA_TYPE_MSG) {
4440704ebd2Sopenharmony_ci        ret = SendMessage(g_currentSocket4Data, g_expectDataContent, size);
4450704ebd2Sopenharmony_ci        if (ret != SOFTBUS_OK) {
4460704ebd2Sopenharmony_ci            LOG("[send data]call SendX fail, ret:%d", ret);
4470704ebd2Sopenharmony_ci            free(g_expectDataContent);
4480704ebd2Sopenharmony_ci            return SOFTBUS_ERR;
4490704ebd2Sopenharmony_ci        }
4500704ebd2Sopenharmony_ci    } else if (type == DATA_TYPE_BYTE) {
4510704ebd2Sopenharmony_ci        ResetWaitFlag4Byte();
4520704ebd2Sopenharmony_ci        ret = SendBytes(g_currentSocket4Data, g_expectDataContent, size);
4530704ebd2Sopenharmony_ci        int timeout;
4540704ebd2Sopenharmony_ci        if (size < SIZE_1K * SIZE_1K) {
4550704ebd2Sopenharmony_ci            timeout = 30;
4560704ebd2Sopenharmony_ci        }else if (size >= SIZE_1K * SIZE_1K && size < 2 * SIZE_1K * SIZE_1K)
4570704ebd2Sopenharmony_ci        {
4580704ebd2Sopenharmony_ci            timeout = 60;
4590704ebd2Sopenharmony_ci        }else
4600704ebd2Sopenharmony_ci        {
4610704ebd2Sopenharmony_ci            timeout = 80;
4620704ebd2Sopenharmony_ci        }
4630704ebd2Sopenharmony_ci        ret = Wait4Socket(timeout, SOCKET_BYTES);
4640704ebd2Sopenharmony_ci        return ret;
4650704ebd2Sopenharmony_ci    } else {
4660704ebd2Sopenharmony_ci        LOG("[send data]invalid param[DataType]");
4670704ebd2Sopenharmony_ci        free(g_expectDataContent);
4680704ebd2Sopenharmony_ci        return SOFTBUS_ERR;
4690704ebd2Sopenharmony_ci    }
4700704ebd2Sopenharmony_ci
4710704ebd2Sopenharmony_ci    LOG("[send data]call SendX success");
4720704ebd2Sopenharmony_ci    free(g_expectDataContent);
4730704ebd2Sopenharmony_ci    g_expectDataContent = NULL;
4740704ebd2Sopenharmony_ci    return ret;
4750704ebd2Sopenharmony_ci}
4760704ebd2Sopenharmony_ci
4770704ebd2Sopenharmony_ci// set/get function
4780704ebd2Sopenharmony_civoid ResetWaitFlag(void)
4790704ebd2Sopenharmony_ci{
4800704ebd2Sopenharmony_ci    g_waitFlag = WAIT_DEF_VALUE;
4810704ebd2Sopenharmony_ci}
4820704ebd2Sopenharmony_ci
4830704ebd2Sopenharmony_civoid ResetWaitFlag4Shutdown(void)
4840704ebd2Sopenharmony_ci{
4850704ebd2Sopenharmony_ci    g_waitFlag4Shutdown = WAIT_DEF_VALUE;
4860704ebd2Sopenharmony_ci}
4870704ebd2Sopenharmony_ci
4880704ebd2Sopenharmony_civoid ResetWaitFlag4Byte(void)
4890704ebd2Sopenharmony_ci{
4900704ebd2Sopenharmony_ci    g_waitFlag4Byte = WAIT_DEF_VALUE;
4910704ebd2Sopenharmony_ci}
4920704ebd2Sopenharmony_ci
4930704ebd2Sopenharmony_civoid ResetWaitFlag4Message(void)
4940704ebd2Sopenharmony_ci{
4950704ebd2Sopenharmony_ci    g_waitFlag4Message = WAIT_DEF_VALUE;
4960704ebd2Sopenharmony_ci}
4970704ebd2Sopenharmony_ci
4980704ebd2Sopenharmony_civoid ResetWaitFlag4Stream(void)
4990704ebd2Sopenharmony_ci{
5000704ebd2Sopenharmony_ci    g_waitFlagStream = WAIT_DEF_VALUE;
5010704ebd2Sopenharmony_ci}
5020704ebd2Sopenharmony_ci
5030704ebd2Sopenharmony_civoid ResetWaitFlag4File(void)
5040704ebd2Sopenharmony_ci{
5050704ebd2Sopenharmony_ci    g_waitFlag4File = WAIT_DEF_VALUE;
5060704ebd2Sopenharmony_ci}
5070704ebd2Sopenharmony_ci
5080704ebd2Sopenharmony_cichar* GetNetworkId(void)
5090704ebd2Sopenharmony_ci{
5100704ebd2Sopenharmony_ci    return g_networkId;
5110704ebd2Sopenharmony_ci}
5120704ebd2Sopenharmony_ci
5130704ebd2Sopenharmony_ci// To one device only
5140704ebd2Sopenharmony_ciint CheckRemoteDeviceIsNull(int isSetNetId)
5150704ebd2Sopenharmony_ci{
5160704ebd2Sopenharmony_ci    int nodeNum = 0;
5170704ebd2Sopenharmony_ci    NodeBasicInfo* nodeInfo = NULL;
5180704ebd2Sopenharmony_ci    int ret = GetAllNodeDeviceInfo(DEF_PKG_NAME, &nodeInfo, &nodeNum);
5190704ebd2Sopenharmony_ci    LOG("[check]get node number is:%d, ret:%d", nodeNum, ret);
5200704ebd2Sopenharmony_ci    if (nodeInfo != NULL && nodeNum > 0) {
5210704ebd2Sopenharmony_ci        LOG("[check]get netid is:%s", nodeInfo->networkId);
5220704ebd2Sopenharmony_ci        if (isSetNetId == BOOL_TRUE) {
5230704ebd2Sopenharmony_ci            (void)strncpy_s(g_networkId, NETWORK_ID_BUF_LEN, nodeInfo->networkId, NETWORK_ID_BUF_LEN);
5240704ebd2Sopenharmony_ci        }
5250704ebd2Sopenharmony_ci        FreeNodeInfo(nodeInfo);
5260704ebd2Sopenharmony_ci        return SOFTBUS_OK;
5270704ebd2Sopenharmony_ci    } else {
5280704ebd2Sopenharmony_ci        LOG("[check]get nodeInfo is null");
5290704ebd2Sopenharmony_ci        return SOFTBUS_ERR;
5300704ebd2Sopenharmony_ci    }
5310704ebd2Sopenharmony_ci}
5320704ebd2Sopenharmony_ci
5330704ebd2Sopenharmony_ciISocketListener* GetSocketListnerData(void)
5340704ebd2Sopenharmony_ci{
5350704ebd2Sopenharmony_ci    return g_socketlistenerdata;
5360704ebd2Sopenharmony_ci}
5370704ebd2Sopenharmony_ci
5380704ebd2Sopenharmony_civoid SetCurrentSocket4Data(int socket)
5390704ebd2Sopenharmony_ci{
5400704ebd2Sopenharmony_ci    g_currentSocket4Data = socket;
5410704ebd2Sopenharmony_ci}
5420704ebd2Sopenharmony_ci
5430704ebd2Sopenharmony_ciint GetCurrentSocket4Data(void)
5440704ebd2Sopenharmony_ci{
5450704ebd2Sopenharmony_ci    return g_currentSocket4Data;
5460704ebd2Sopenharmony_ci}
5470704ebd2Sopenharmony_ci
5480704ebd2Sopenharmony_civoid TestSetUp(void)
5490704ebd2Sopenharmony_ci{
5500704ebd2Sopenharmony_ci    g_defNodeStateCallback.events = EVENT_NODE_STATE_MASK;
5510704ebd2Sopenharmony_ci    g_defNodeStateCallback.onNodeOnline = OnDefNodeOnline;
5520704ebd2Sopenharmony_ci    g_defNodeStateCallback.onNodeOffline = OnDefNodeOffline;
5530704ebd2Sopenharmony_ci    g_defNodeStateCallback.onNodeBasicInfoChanged = OnDefNodeBasicInfoChanged;
5540704ebd2Sopenharmony_ci    g_defNodeStateCallback.onNodeStatusChanged = onDefNodeStatusChanged;
5550704ebd2Sopenharmony_ci    if (g_socketlistenerdata == NULL) {
5560704ebd2Sopenharmony_ci        g_socketlistenerdata = (ISocketListener*)calloc(1, sizeof(ISocketListener));
5570704ebd2Sopenharmony_ci        g_socketlistenerdata->OnBind = OnBindData;
5580704ebd2Sopenharmony_ci        g_socketlistenerdata->OnShutdown = OnShutdownData;
5590704ebd2Sopenharmony_ci        g_socketlistenerdata->OnBytes = OnByteData;
5600704ebd2Sopenharmony_ci        g_socketlistenerdata->OnMessage = OnMessageData;
5610704ebd2Sopenharmony_ci        g_socketlistenerdata->OnStream = OnStreamData;
5620704ebd2Sopenharmony_ci        g_socketlistenerdata->OnFile = OnFileData;
5630704ebd2Sopenharmony_ci        g_socketlistenerdata->OnQos = OnQosData;
5640704ebd2Sopenharmony_ci    };
5650704ebd2Sopenharmony_ci}
5660704ebd2Sopenharmony_ci
5670704ebd2Sopenharmony_civoid TestTearDown(void)
5680704ebd2Sopenharmony_ci{
5690704ebd2Sopenharmony_ci
5700704ebd2Sopenharmony_ci    if (g_socketlistenerdata != NULL) {
5710704ebd2Sopenharmony_ci        free(g_socketlistenerdata);
5720704ebd2Sopenharmony_ci        g_socketlistenerdata = NULL;
5730704ebd2Sopenharmony_ci    }
5740704ebd2Sopenharmony_ci}
5750704ebd2Sopenharmony_ci
5760704ebd2Sopenharmony_civoid AddPermission(void)
5770704ebd2Sopenharmony_ci{
5780704ebd2Sopenharmony_ci    uint64_t tokenId;
5790704ebd2Sopenharmony_ci    const char *perms[2];
5800704ebd2Sopenharmony_ci    perms[0] = OHOS_PERMISSION_DISTRIBUTED_SOFTBUS_CENTER;
5810704ebd2Sopenharmony_ci    perms[1] = OHOS_PERMISSION_DISTRIBUTED_DATASYNC;
5820704ebd2Sopenharmony_ci    NativeTokenInfoParams infoTnstance = {
5830704ebd2Sopenharmony_ci        .dcapsNum = 0,
5840704ebd2Sopenharmony_ci        .permsNum = 2,
5850704ebd2Sopenharmony_ci        .aclsNum = 0,
5860704ebd2Sopenharmony_ci        .dcaps = NULL,
5870704ebd2Sopenharmony_ci        .perms = perms,
5880704ebd2Sopenharmony_ci        .acls = NULL,
5890704ebd2Sopenharmony_ci        .processName = "dsoftbus_test_service",
5900704ebd2Sopenharmony_ci        .aplStr = "system_core",
5910704ebd2Sopenharmony_ci    };
5920704ebd2Sopenharmony_ci    tokenId = GetAccessTokenId(&infoTnstance);
5930704ebd2Sopenharmony_ci    SetSelfTokenID(tokenId);
5940704ebd2Sopenharmony_ci}