• 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 <gtest/gtest.h>
17 
18 #include "socket_common.h"
19 #include "socket.h"
20 #include "accesstoken_kit.h"
21 
22 using namespace std;
23 using namespace testing::ext;
24 
25 
26 static INodeStateCb* g_nodeStateCallback = NULL;
27 static ISocketListener* g_sessionlist4SokectData  = NULL;
28 
29 static void SetupCallback(void);
30 static void TeardownCallback(void);
31 
32 class SocketTestServer : public testing::Test {
33 public:
34     static void SetUpTestCase();
35     static void TearDownTestCase();
36     void SetUp();
37     void TearDown();
38 };
39 
SetUp()40 void SocketTestServer ::SetUp() {}
41 
TearDown()42 void SocketTestServer ::TearDown() {}
43 
SetUpTestCase()44 void SocketTestServer ::SetUpTestCase()
45 {
46     LOG("SetUpTestCase");
47     AddPermission();
48     sleep(ONE_SECOND);
49     system("pidof accesstoken_service | xargs kill -9");
50     sleep(ONE_SECOND);
51     TestSetUp();
52     SetupCallback();
53     int ret = RegNodeDeviceStateCb(DEF_PKG_NAME, g_nodeStateCallback);
54     EXPECT_EQ(SOFTBUS_OK, ret) << "call reg node state callback fail";
55 }
56 
TearDownTestCase()57 void SocketTestServer::TearDownTestCase()
58 {
59     LOG("TearDownTestCase");
60     int ret = UnregNodeDeviceStateCb(g_nodeStateCallback);
61     EXPECT_EQ(SOFTBUS_OK, ret) << "call unReg node state callback fail";
62     TeardownCallback();
63     TestTearDown();
64 }
65 
66 SocketInfo socketInfoByte = {
67     .name = (char *)SOCKET_NAME_BYTE,
68     .pkgName = (char *)DEF_PKG_NAME,
69     .dataType = DATA_TYPE_BYTES,
70 };
71 
72 SocketInfo socketInfoMessage = {
73     .name = (char *)SOCKET_NAME_MESSAGE,
74     .pkgName = (char *)DEF_PKG_NAME,
75     .dataType = DATA_TYPE_MESSAGE,
76 };
77 
78 SocketInfo socketInfoFile = {
79     .name = (char *)SOCKET_NAME_FILE,
80     .pkgName = (char *)DEF_PKG_NAME,
81     .dataType = DATA_TYPE_FILE,
82 };
83 
84 SocketInfo socketInfoStream = {
85     .name = (char *)SOCKET_NAME_STREAM,
86     .pkgName = (char *)DEF_PKG_NAME,
87     .dataType = DATA_TYPE_VIDEO_STREAM,
88 };
89 
90 /* socket callback for data */
OnBind(int32_t socket,PeerSocketInfo info)91 static void OnBind(int32_t socket, PeerSocketInfo info)
92 {
93     LOG("[cb][data]OnBind success  {socket:%d, name:%s, deviceId:%s, pkgName:%s, dataType:%d}", socket,
94         info.name, info.networkId, info.pkgName, info.dataType);
95 }
96 
OnShutdown(int32_t socket,ShutdownReason reason)97 static void OnShutdown(int32_t socket, ShutdownReason reason)
98 {
99     LOG("[cb][data] OnShutdown {socket:%d, reason:%d}", socket, reason);
100 }
101 
OnByte(int32_t socket,const void * data,unsigned int dataLen)102 static void OnByte(int32_t socket, const void* data, unsigned int dataLen)
103 {
104     if (socket < 0) {
105         LOG("[cb][data]byte received invalid socket id[%d]", socket);
106         return;
107     }
108     LOG("[cb][data]byte received   socket:%d, data-len:%d", socket, dataLen);
109     int ret = SendBytes(socket, data, dataLen);
110     LOG("[cb][data]byte received   send back:%d", ret);
111 }
112 
OnMessage(int32_t socket,const void * data,unsigned int dataLen)113 static void OnMessage(int32_t socket, const void* data, unsigned int dataLen)
114 {
115     if (socket < 0) {
116         LOG("[cb][data]mesg received   invalid socket id[%d]", socket);
117         return;
118     }
119     LOG("[cb][data]mesg received   socket:%d, data-len:%d", socket, dataLen);
120     int ret = SendMessage(socket, data, dataLen);
121     LOG("[cb][data]mesg received   send back:%d", ret);
122 }
123 
OnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)124 static void OnStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
125 {
126     if (socket < 0) {
127         LOG("[cb][data]OnStream invalid socket id[%d]", socket);
128         return;
129     }
130     if (data == nullptr) {
131         LOG("[cb][data]OnStream socket id[%d], data is nullptr", socket);
132         return;
133     }
134     if (ext == nullptr) {
135         LOG("[cb][data]OnStream socket id[%d], ext is nullptr", socket);
136         return;
137     }
138     if (param == nullptr) {
139         LOG("[cb][data]OnStream socket id[%d], param is nullptr", socket);
140         return;
141     }
142 
143     LOG("[cb][data]OnStream Success socket:%d,", socket);
144     LOG("[cb][data]OnStream Success buf:%s,", (data->buf != NULL ? data->buf : "null"));
145     LOG("[cb][data]OnStream Success buflen:%d", data->bufLen);
146     LOG("[cb][data]OnStream Success buf:%s,", (ext->buf != NULL ? ext->buf : "null"));
147 }
148 
UpdataRecvFilePath()149 static const char *UpdataRecvFilePath()
150 {
151     return "/data/";
152 }
153 
OnFile(int32_t socket,FileEvent * event)154 static void OnFile(int32_t socket, FileEvent *event)
155 {
156     if (socket < 0) {
157         LOG("[cb][data]OnFile invalid socket id[%d]", socket);
158         return;
159     }
160     if (event == nullptr) {
161         LOG("[cb][data]OnFile socket id[%d], event is nullptr", socket);
162         return;
163     }
164     if (event->type == FILE_EVENT_RECV_UPDATE_PATH) {
165         LOG("[cb][data]OnFile event type:%d,", event->type);
166         event->UpdateRecvPath = UpdataRecvFilePath;
167         return;
168     }
169     LOG("[cb][data]OnFile, event type:%d, fileCnt:%u",
170         event->type, event->fileCnt);
171     for (uint32_t i = 0; i < event->fileCnt; i++) {
172         LOG("[cb][data] %s", (event->files[i] == NULL ? "null" : event->files[i]));
173     }
174     if (event->type == FILE_EVENT_RECV_FINISH) {
175         LOG("[cb][data]OnFile recv finished");
176         return;
177     }
178     if (event->type == FILE_EVENT_RECV_PROCESS) {
179         LOG("[cb][data]OnFile recv process");
180         return;
181     }
182     if (event->type == FILE_EVENT_RECV_ERROR) {
183         LOG("[cb][data]OnFile recv error!!");
184         return;
185     }
186 }
187 
OnQos(int32_t socket,QoSEvent eventId,const QosTV * qos,uint32_t qosCunt)188 static void OnQos(int32_t socket, QoSEvent eventId, const QosTV *qos, uint32_t qosCunt)
189 {
190     LOG("[cb][data] OnQos {socket:%d, event:%d}", socket, eventId);
191 }
192 
193 /* net state callback */
OnNodeOnline(NodeBasicInfo * info)194 static void OnNodeOnline(NodeBasicInfo* info)
195 {
196     if (info == NULL) {
197         LOG("[cb]Online: info is null");
198     }
199 
200     LOG("[cb]Online id:%s, name:%s ,type id:%u", info->networkId, info->deviceName, info->deviceTypeId);
201 }
202 
OnNodeOffline(NodeBasicInfo * info)203 static void OnNodeOffline(NodeBasicInfo* info)
204 {
205     if (info == NULL) {
206         LOG("[cb]Offline: info is null");
207         return;
208     }
209 
210     LOG("[cb]Offline id:%s, name:%s ,type id:%u", info->networkId, info->deviceName, info->deviceTypeId);
211 }
212 
OnNodeBasicInfoChanged(NodeBasicInfoType type,NodeBasicInfo * info)213 static void OnNodeBasicInfoChanged(NodeBasicInfoType type, NodeBasicInfo* info)
214 {
215     if (info == NULL) {
216         LOG("[cb]InfoChanged: info is null, type[%d]", type);
217         return;
218     }
219     LOG("[cb]InfoChanged id: %s, name: %s", info->networkId, info->deviceName);
220 }
221 
onDefNodeStatusChanged(NodeStatusType type,NodeStatus * status)222 static void onDefNodeStatusChanged(NodeStatusType type, NodeStatus *status)
223 {
224     if (status == NULL) {
225         LOG("[cb]StatusChanged: info is null, type[%d]", type);
226         return;
227     }
228     LOG("[cb]StatusChanged id: %s,status: %d", status->basicInfo.networkId, status->authStatus);
229 }
230 
SetupCallback(void)231 static void SetupCallback(void)
232 {
233     if (g_nodeStateCallback == NULL) {
234         g_nodeStateCallback = (INodeStateCb*)calloc(1, sizeof(INodeStateCb));
235         g_nodeStateCallback->events = EVENT_NODE_STATE_MASK;
236         g_nodeStateCallback->onNodeOnline = OnNodeOnline;
237         g_nodeStateCallback->onNodeOffline = OnNodeOffline;
238         g_nodeStateCallback->onNodeBasicInfoChanged = OnNodeBasicInfoChanged;
239         g_nodeStateCallback->onNodeStatusChanged = onDefNodeStatusChanged;
240     }
241     if (g_sessionlist4SokectData == NULL) {
242         g_sessionlist4SokectData= (ISocketListener*)calloc(1, sizeof(ISocketListener));
243         g_sessionlist4SokectData->OnBind = OnBind;
244         g_sessionlist4SokectData->OnShutdown = OnShutdown;
245         g_sessionlist4SokectData->OnBytes = OnByte;
246         g_sessionlist4SokectData->OnMessage = OnMessage;
247         g_sessionlist4SokectData->OnStream = OnStream;
248         g_sessionlist4SokectData->OnFile = OnFile;
249         g_sessionlist4SokectData->OnQos = OnQos;
250     }
251 }
252 
TeardownCallback(void)253 static void TeardownCallback(void)
254 {
255     if (g_nodeStateCallback != NULL) {
256         free(g_nodeStateCallback);
257         g_nodeStateCallback = NULL;
258     }
259     if (g_sessionlist4SokectData != NULL) {
260         free(g_sessionlist4SokectData);
261         g_sessionlist4SokectData = NULL;
262     }
263 }
264 
265 /**
266  * @tc.number : SUB_Softbus_Trans_SelfNet_0100
267  * @tc.name     : 创建SS,等待opensession和消息传输
268  * @tc.desc       : 测试自组网下传输功能,模拟服务端
269  * @tc.type       : FUNC
270  * @tc.size        : MediumTest
271  */
272 HWTEST_F(SocketTestServer, test_create_ss, TestSize.Level3)
273 {
274     int runtime = 0;
275     /*socket server*/
276     QosTV info[] = {
277         {.qos = QOS_TYPE_MIN_BW, .value = 2000}
278     };
279 
280     int32_t socketByte = Socket(socketInfoByte);
281     LOG("Create socket [data] ret:%d", socketByte);
282     int32_t socketMessage = Socket(socketInfoMessage);
283     LOG("Create socket [data] ret:%d", socketMessage);
284     int32_t socketFile = Socket(socketInfoFile);
285     LOG("Create socket [data] ret:%d", socketFile);
286     int32_t socketStream = Socket(socketInfoStream);
287     LOG("Create socket [data] ret:%d", socketStream);
288     if (socketByte == SOFTBUS_OK && socketMessage
289         == SOFTBUS_OK && socketFile == SOFTBUS_OK && socketStream == SOFTBUS_OK) {
290         LOG("Create socket ok");
291     }
292 
293     /*create Listener*/
294     int32_t byteListenRet = Listen(socketByte, info, sizeof(info)/sizeof(info[0]), g_sessionlist4SokectData);
295     LOG("Create Listen [data] ret:%d", byteListenRet);
296     int32_t messageListenRet = Listen(socketMessage, info, sizeof(info)/sizeof(info[0]), g_sessionlist4SokectData);
297     LOG("Create Listen [data] ret:%d", messageListenRet);
298     int32_t fileListenRet = Listen(socketFile, info, sizeof(info)/sizeof(info[0]), g_sessionlist4SokectData);
299     LOG("Create Listen [data] ret:%d", fileListenRet);
300     int32_t streamListenRet = Listen(socketStream, info, sizeof(info)/sizeof(info[0]), g_sessionlist4SokectData);
301     LOG("Create Listen [data] ret:%d", socketStream);
302     if (byteListenRet == SOFTBUS_OK && messageListenRet
303         == SOFTBUS_OK && fileListenRet == SOFTBUS_OK && streamListenRet == SOFTBUS_OK) {
304         LOG("Create socket ok");
305     }
306 
307     while (true) {
308         sleep(ONE_SECOND);
309         runtime += 1;
310         if (runtime % 60 == 0) {
311             LOG("### test run:%d s", runtime);
312         }
313     }
314 }