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