1 /*
2 * Copyright (c) 2021-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 <stdio.h>
17 #include <stdlib.h>
18 #include <unistd.h>
19
20 #include "securec.h"
21 #include "session.h"
22 #include "softbus_bus_center.h"
23 #include "softbus_errcode.h"
24
25 #define LOG2_DBG(fmt, ...) printf("DEBUG:%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
26 #define LOG2_INFO(fmt, ...) printf("INFO:%s:%d " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
27 #define LOG2_WARN(fmt, ...) printf("WARN:%s:%d " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
28 #define LOG2_ERR(fmt, ...) printf("ERROR:%s:%d " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
29 #define NETWORK_ID_LEN 65
30 #define ARG_NUM 2
31 #define FILE_NUM 4
32
33 typedef enum {
34 TRANS_STATE_NONE = 0, // 0
35 TRANS_STATE_INIT, // 1
36 TRANS_STATE_CREATE_SESSION_SERVER, // 2
37 TRANS_SET_FILE_SEND_LISTENER, // 3
38 TRANS_STATE_OPEN, // 4
39 TRANS_STATE_SEND_BYTE, // 5
40 TRANS_STATE_SEND_MESSAGE, // 6
41 TRANS_STATE_SEND_FILE, // 7
42 TRANS_STATE_CLOSE, // 8
43 TRANS_STATE_REMOVE_SESSION_SERVER, // 9
44 TRANS_STATE_CREATE_PHONE = 10, // 10
45 TRANS_STATE_GET_SESSION_NAME, // 11
46 TRANS_STATE_GET_DEVICE_ID, // 12
47 TRANS_CLEAR_LOG,
48 TRANS_TEST_FIN,
49
50 LNN_STATE_JOINLNN = 20, // 20
51 LNN_STATE_LEAVELNN, // 21
52 } StatusNum;
53
54 static const char *g_testModuleName = "com.huawei.plrdtest.dsoftbus";
55 static const char *g_testSessionName = "com.huawei.plrdtest.dsoftbus.JtOpenFileSession";
56 static const char *g_testSessionNameE2 = "com.huawei.plrdtest.dsoftbus.JtOnOpenFileSession";
57 static const char *g_testGroupId = "g_testGroupId";
58 static ISessionListener g_sessionlistener;
59 static SessionAttribute g_sessionAttr;
60 static int32_t g_sessionId = -1;
61 static char g_networkId[NETWORK_ID_LEN] = {0};
62 static int32_t g_stateDebug = LNN_STATE_JOINLNN;
63
TestChangeDebugState(int32_t state)64 static void TestChangeDebugState(int32_t state)
65 {
66 g_stateDebug = state;
67 LOG2_INFO("change to debug state: %d", state);
68 }
69
OnLeaveLNNDone(const char * networkId,int32_t retCode)70 static void OnLeaveLNNDone(const char *networkId, int32_t retCode)
71 {
72 if (networkId == NULL) {
73 LOG2_ERR("OnLeaveLNNDone error! retCode = %d", retCode);
74 return;
75 }
76
77 LOG2_INFO("OnLeaveLNNDone enter networdid = %s, retCode = %d", networkId, retCode);
78 }
79
OnNodeOnline(NodeBasicInfo * info)80 static void OnNodeOnline(NodeBasicInfo *info)
81 {
82 if (info == NULL) {
83 return;
84 }
85 if (strcpy_s(g_networkId, NETWORK_ID_LEN, info->networkId) != EOK) {
86 return;
87 }
88 TestChangeDebugState(TRANS_STATE_CREATE_SESSION_SERVER);
89 LOG2_INFO("node online, network id: %s", info->networkId);
90 }
91
OnNodeOffline(NodeBasicInfo * info)92 static void OnNodeOffline(NodeBasicInfo *info)
93 {
94 if (info == NULL) {
95 return;
96 }
97 LOG2_INFO("node offline, network id: %s", info->networkId);
98 }
99
100 static INodeStateCb g_nodeStateCallback = {
101 .events = EVENT_NODE_STATE_ONLINE | EVENT_NODE_STATE_OFFLINE,
102 .onNodeOnline = OnNodeOnline,
103 .onNodeOffline = OnNodeOffline,
104 };
105
OnSessionOpened(int32_t sessionId,int32_t result)106 static int32_t OnSessionOpened(int32_t sessionId, int32_t result)
107 {
108 LOG2_INFO("############# session opened,sesison id[%d] result[%d]", sessionId, result);
109 if (result == SOFTBUS_OK) {
110 TestChangeDebugState(TRANS_STATE_SEND_FILE);
111 } else {
112 TestChangeDebugState(-1);
113 }
114 return result;
115 }
116
OnSessionClosed(int32_t sessionId)117 static void OnSessionClosed(int32_t sessionId)
118 {
119 LOG2_INFO("session closed, session id = %d", sessionId);
120 TestChangeDebugState(TRANS_STATE_REMOVE_SESSION_SERVER);
121 }
122
OnBytesReceived(int32_t sessionId,const void * data,uint32_t len)123 static void OnBytesReceived(int32_t sessionId, const void *data, uint32_t len)
124 {
125 (void)data;
126 LOG2_INFO("session bytes received, sessionid[%d], dataLen[%u]", sessionId, len);
127 }
128
OnMessageReceived(int32_t sessionId,const void * data,uint32_t len)129 static void OnMessageReceived(int32_t sessionId, const void *data, uint32_t len)
130 {
131 (void)data;
132 LOG2_INFO("session msg received, sessionid[%d], dataLen[%u]", sessionId, len);
133 }
134
TestSessionListenerInit(void)135 static void TestSessionListenerInit(void)
136 {
137 g_sessionlistener.OnSessionOpened = OnSessionOpened;
138 g_sessionlistener.OnSessionClosed = OnSessionClosed;
139 g_sessionlistener.OnBytesReceived = OnBytesReceived;
140 g_sessionlistener.OnMessageReceived = OnMessageReceived;
141
142 g_sessionAttr.dataType = TYPE_FILE;
143 }
144
OnSendFileProcess(int32_t sessionId,uint64_t bytesUpload,uint64_t bytesTotal)145 static int32_t OnSendFileProcess(int32_t sessionId, uint64_t bytesUpload, uint64_t bytesTotal)
146 {
147 LOG2_INFO("OnSendFileProcess sessionId = %d, bytesUpload = %" PRIu64 ", total = %" PRIu64 "\n",
148 sessionId, bytesUpload, bytesTotal);
149 return SOFTBUS_OK;
150 }
151
OnSendFileFinished(int32_t sessionId,const char * firstFile)152 static int32_t OnSendFileFinished(int32_t sessionId, const char *firstFile)
153 {
154 LOG2_INFO("OnSendFileFinished sessionId = %d, first file = %s\n", sessionId, firstFile);
155 TestChangeDebugState(TRANS_STATE_CLOSE);
156 return SOFTBUS_OK;
157 }
158
OnFileTransError(int32_t sessionId)159 static void OnFileTransError(int32_t sessionId)
160 {
161 LOG2_INFO("OnFileTransError sessionId = %d\n", sessionId);
162 }
163
164 static IFileSendListener g_fileSendListener = {
165 .OnSendFileProcess = OnSendFileProcess,
166 .OnSendFileFinished = OnSendFileFinished,
167 .OnFileTransError = OnFileTransError,
168 };
169
TestSetFileSendListener(void)170 static void TestSetFileSendListener(void)
171 {
172 LOG2_INFO("*******************SET FILE SEND LISTENER*************");
173 int32_t ret = SetFileSendListener(g_testModuleName, g_testSessionName, &g_fileSendListener);
174 if (ret != SOFTBUS_OK) {
175 LOG2_INFO("SetFileSendListener ret = %d\n", ret);
176 } else {
177 LOG2_INFO("TestSetFileSendListener ok\n");
178 }
179 }
180
TestSendFile(int32_t sessionId)181 static int32_t TestSendFile(int32_t sessionId)
182 {
183 const char *sfileList[] = {
184 "/data/big.tar",
185 "/data/richu.jpg",
186 "/data/richu-002.jpg",
187 "/data/richu-003.jpg",
188 };
189 int32_t ret = SendFile(sessionId, sfileList, NULL, FILE_NUM);
190 if (ret != SOFTBUS_OK) {
191 LOG2_INFO("SendFile ret = %d\n", ret);
192 } else {
193 LOG2_INFO("SendFile ok\n");
194 }
195 return ret;
196 }
197
TestActiveSendFile(int32_t state)198 static void TestActiveSendFile(int32_t state)
199 {
200 switch (state) {
201 case TRANS_STATE_CREATE_SESSION_SERVER:
202 int32_t ret = CreateSessionServer(g_testModuleName, g_testSessionName, &g_sessionlistener);
203 LOG2_INFO("CreateSessionServer ret: %d", ret);
204 if (ret != SOFTBUS_SERVER_NAME_REPEATED && ret != SOFTBUS_OK) {
205 LOG2_ERR("CreateSessionServer ret: %d", ret);
206 return;
207 }
208 TestSetFileSendListener();
209 TestChangeDebugState(TRANS_STATE_OPEN);
210 break;
211 case TRANS_STATE_OPEN:
212 g_sessionId = OpenSession(g_testSessionName, g_testSessionName, g_networkId, g_testGroupId, &g_sessionAttr);
213 if (g_sessionId < 0) {
214 LOG2_ERR("OpenSession ret[%d]", g_sessionId);
215 return;
216 }
217 break;
218 case TRANS_STATE_SEND_FILE:
219 TestSendFile(g_sessionId);
220 TestChangeDebugState(TRANS_TEST_FIN);
221 break;
222 case TRANS_STATE_CLOSE:
223 CloseSession(g_sessionId);
224 g_sessionId = -1;
225 TestChangeDebugState(TRANS_STATE_REMOVE_SESSION_SERVER);
226 break;
227 case TRANS_STATE_REMOVE_SESSION_SERVER:
228 int32_t ret = RemoveSessionServer(g_testModuleName, g_testSessionName);
229 if (ret != SOFTBUS_OK) {
230 LOG2_ERR("RemoveSessionServer failed, ret = %d", ret);
231 return;
232 }
233 LOG2_INFO("RemoveSessionServer success, ret = %d", ret);
234 TestChangeDebugState(LNN_STATE_LEAVELNN);
235 break;
236 case LNN_STATE_LEAVELNN:
237 LeaveLNN(g_networkId, OnLeaveLNNDone);
238 TestChangeDebugState(-1);
239 break;
240 default:
241 LOG2_INFO("default: Invalid state");
242 break;
243 }
244 }
245
OnSessionOpenRecvFile(int32_t sessionId,int32_t result)246 static int32_t OnSessionOpenRecvFile(int32_t sessionId, int32_t result)
247 {
248 LOG2_INFO("############# recv session opened,sesison id[%d] result[%d]", sessionId, result);
249 return SOFTBUS_OK;
250 }
251
OnReceiveFileStarted(int32_t sessionId,const char * files,int32_t fileCnt)252 static int32_t OnReceiveFileStarted(int32_t sessionId, const char *files, int32_t fileCnt)
253 {
254 LOG2_INFO("File receive start sessionId = %d, first file = %s, fileCnt = %d\n", sessionId, files, fileCnt);
255 return SOFTBUS_OK;
256 }
257
OnReceiveFileFinished(int32_t sessionId,const char * files,int32_t fileCnt)258 static void OnReceiveFileFinished(int32_t sessionId, const char *files, int32_t fileCnt)
259 {
260 LOG2_INFO("File receive finished sessionId = %d, first file = %s, fileCnt = %d\n", sessionId, files, fileCnt);
261 }
262
263 static IFileReceiveListener g_fileRecvListener = {
264 .OnReceiveFileStarted = OnReceiveFileStarted,
265 .OnReceiveFileFinished = OnReceiveFileFinished,
266 .OnFileTransError = OnFileTransError,
267 };
268
TestSetFileRecvListener(void)269 static void TestSetFileRecvListener(void)
270 {
271 int32_t ret = SetFileReceiveListener(g_testModuleName, g_testSessionNameE2, &g_fileRecvListener, "/data/");
272 if (ret != SOFTBUS_OK) {
273 LOG2_INFO("SetFileReceiveListener ret = %d\n", ret);
274 } else {
275 LOG2_INFO("SetFileReceiveListener ok\n");
276 }
277 }
278
TestReceiveFile(int32_t state)279 static void TestReceiveFile(int32_t state)
280 {
281 switch (state) {
282 case TRANS_STATE_CREATE_SESSION_SERVER: {
283 g_sessionlistener.OnSessionOpened = OnSessionOpenRecvFile;
284 int32_t ret = CreateSessionServer(g_testModuleName, g_testSessionNameE2, &g_sessionlistener);
285 LOG2_INFO("CreateSessionServer ret: %d", ret);
286 if (ret != SOFTBUS_SERVER_NAME_REPEATED && ret != SOFTBUS_OK) {
287 LOG2_ERR("CreateSessionServer ret: %d", ret);
288 return;
289 }
290 TestSetFileRecvListener();
291 TestChangeDebugState(TRANS_TEST_FIN);
292 break;
293 }
294 default: {
295 }
296 }
297 }
298
main(int32_t argc,char * argv[])299 int32_t main(int32_t argc, char *argv[])
300 {
301 if (argc == 1) {
302 return -1;
303 }
304 int32_t testWay = 0;
305 if (argc >= ARG_NUM) {
306 testWay = atoi(argv[1]);
307 }
308 TestSessionListenerInit();
309
310 if (RegNodeDeviceStateCb(g_testModuleName, &g_nodeStateCallback) != SOFTBUS_OK) {
311 LOG2_ERR("RegNodeDeviceStateCb error!");
312 return SOFTBUS_DISCOVER_COAP_GET_DEVICE_INFO_FAIL;
313 }
314
315 LOG2_INFO("\n$$$$$$$$$ Start transmission.........");
316 while (1) {
317 sleep(1);
318 if (g_stateDebug == TRANS_TEST_FIN) {
319 continue;
320 }
321 if (testWay == 0) {
322 TestActiveSendFile(g_stateDebug);
323 } else if (testWay == 1) {
324 TestReceiveFile(g_stateDebug);
325 }
326 if (g_stateDebug == -1) {
327 break;
328 }
329 }
330 LOG2_INFO("\n############### TEST PASS ###############\n");
331 return 0;
332 }
333