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