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