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