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