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 }