• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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 <gtest/gtest.h>
17 #include <iostream>
18 #include <sstream>
19 #include <unistd.h>
20 #include "common/sharing_log.h"
21 #include "network/interfaces/iclient_callback.h"
22 #include "network/interfaces/inetwork_session_callback.h"
23 #include "network/interfaces/iserver_callback.h"
24 #include "network/network_factory.h"
25 #include "network/server/udp_server.h"
26 #include "network/client/udp_client.h"
27 
28 using namespace std;
29 using namespace OHOS::Sharing;
30 using namespace testing::ext;
31 
32 namespace OHOS {
33 namespace Sharing {
34 class NetworkUdpUnitTest : public testing::Test {
35 public:
SetUpTestCase()36     static void SetUpTestCase() {}
TearDownTestCase()37     static void TearDownTestCase() {}
SetUp()38     void SetUp() {}
TearDown()39     void TearDown() {}
40 };
41 
42 class UdpTestAgent final : public IServerCallback,
43                            public IClientCallback,
44                            public INetworkSessionCallback,
45                            public std::enable_shared_from_this<UdpTestAgent> {
46 public:
UdpTestAgent()47     UdpTestAgent() {}
48 
~UdpTestAgent()49     ~UdpTestAgent()
50     {
51         if (serverPtr_) {
52             serverPtr_->Stop();
53         }
54     }
55 
StartUdpServer(uint16_t port,const std::string & localIp)56     bool StartUdpServer(uint16_t port, const std::string &localIp)
57     {
58         bool ret = NetworkFactory::CreateUdpServer(port, localIp, shared_from_this(), serverPtr_);
59         if (!ret) {
60             SHARING_LOGE("===[UdpTestAgent] StartUdpServer failed");
61         } else {
62             SHARING_LOGD("===[UdpTestAgent] server agent started");
63         }
64         return ret;
65     }
66 
StartUdpClient(const std::string & peerIp,uint16_t peerPort,const std::string & localIp,uint16_t localPort)67     bool StartUdpClient(const std::string &peerIp, uint16_t peerPort, const std::string &localIp, uint16_t localPort)
68     {
69         bool ret =
70             NetworkFactory::CreateUdpClient(peerIp, peerPort, localIp, localPort, shared_from_this(), clientPtr_);
71         if (!ret) {
72             SHARING_LOGE("===[UdpTestAgent] StartUdpClient failed");
73         } else {
74             SHARING_LOGD("===[UdpTestAgent] client agent started");
75         }
76         return ret;
77     }
78 
OnAccept(std::weak_ptr<INetworkSession> session)79     void OnAccept(std::weak_ptr<INetworkSession> session) override
80     {
81         SHARING_LOGD("===[UdpTestAgent] OnServerAccept");
82     }
83 
OnServerReadData(int32_t fd,DataBuffer::Ptr buf,INetworkSession::Ptr session)84     void OnServerReadData(int32_t fd, DataBuffer::Ptr buf, INetworkSession::Ptr session) override
85     {
86         SHARING_LOGD("===[UdpTestAgent] OnServerReadData");
87         static int index = 0;
88         if (session) {
89             sessionPtrVec_.push_back(session);
90         }
91         DataBuffer::Ptr bufSend = std::make_shared<DataBuffer>();
92         string msg = "udp server message.index=" + std::to_string(index++);
93         bufSend->PushData(msg.c_str(), msg.size());
94         size_t nSize = sessionPtrVec_.size();
95         for (size_t i = 0; i < nSize; i++) {
96             sleep(2);
97         }
98     }
99 
OnServerWriteable(int32_t fd)100     void OnServerWriteable(int32_t fd) override
101     {
102         SHARING_LOGD("onServerWriteable");
103     }
104 
OnServerClose(int32_t fd)105     void OnServerClose(int32_t fd) override
106     {
107         SHARING_LOGD("===[UdpTestAgent] OnServerClose");
108         serverPtr_ = nullptr;
109     }
110 
OnServerException(int32_t fd)111     void OnServerException(int32_t fd) override
112     {
113         SHARING_LOGD("===[UdpTestAgent] OnServerException");
114         serverPtr_ = nullptr;
115     }
116 
OnSessionReadData(int32_t fd,DataBuffer::Ptr buf)117     void OnSessionReadData(int32_t fd, DataBuffer::Ptr buf) override
118     {
119         SHARING_LOGD("===[UdpTestAgent] OnSessionReadData");
120         static int index = 0;
121         DataBuffer::Ptr bufSend = std::make_shared<DataBuffer>();
122         string msg = "udp session send message=" + std::to_string(index++);
123         bufSend->PushData(msg.c_str(), msg.size());
124         size_t nSize = sessionPtrVec_.size();
125         for (size_t i = 0; i < nSize; i++) {
126             if (sessionPtrVec_[i]->GetSocketInfo()->GetPeerFd() == fd) {
127                 break;
128             }
129         }
130         sleep(3);
131     }
132 
OnSessionWriteable(int32_t fd)133     void OnSessionWriteable(int32_t fd) override
134     {
135         SHARING_LOGD("===[UdpTestAgent] OnSessionWriteable");
136     }
137 
OnSessionClose(int32_t fd)138     void OnSessionClose(int32_t fd) override
139     {
140         SHARING_LOGD("===[UdpTestAgent] OnSessionClose");
141     }
142 
OnSessionException(int32_t fd)143     void OnSessionException(int32_t fd) override
144     {
145         SHARING_LOGD("===[UdpTestAgent] OnSessionException");
146     }
147 
OnClientConnect(bool isSuccess)148     void OnClientConnect(bool isSuccess) override
149     {
150         if (isSuccess) {
151             SHARING_LOGD("===[UdpTestAgent] OnClientConnect success");
152             static int index = 0;
153             string msg = "udp client OnClientConnect message.index=" + std::to_string(index++);
154             DataBuffer::Ptr bufSend = std::make_shared<DataBuffer>();
155             bufSend->PushData(msg.c_str(), msg.size());
156             if (clientPtr_ != nullptr) {
157                 SHARING_LOGD("===[UdpTestAgent] OnClientConnect send");
158             } else {
159                 SHARING_LOGD("===[UdpTestAgent] OnClientConnect nullptr");
160             }
161         } else {
162             if (clientPtr_ != nullptr) {
163                 SHARING_LOGE("===[UdpTestAgent] OnClientConnect failed");
164                 clientPtr_->Disconnect();
165             }
166         }
167     }
168 
OnClientReadData(int32_t fd,DataBuffer::Ptr buf)169     void OnClientReadData(int32_t fd, DataBuffer::Ptr buf) override
170     {
171         SHARING_LOGD("===[UdpTestAgent] OnClientReadData");
172         static int index = 0;
173         string msg = "udp client message.index=" + std::to_string(index++);
174         DataBuffer::Ptr bufSend = std::make_shared<DataBuffer>();
175         bufSend->PushData(msg.c_str(), msg.size());
176         sleep(3);
177     }
178 
OnClientWriteable(int32_t fd)179     void OnClientWriteable(int32_t fd) override
180     {
181         SHARING_LOGD("===[UdpTestAgent] OnClientWriteable");
182     }
183 
OnClientClose(int32_t fd)184     void OnClientClose(int32_t fd) override
185     {
186         SHARING_LOGD("===[UdpTestAgent] OnClientClose");
187         clientPtr_ = nullptr;
188     }
189 
OnClientException(int32_t fd)190     void OnClientException(int32_t fd) override
191     {
192         SHARING_LOGD("===[UdpTestAgent] OnClientException");
193         clientPtr_ = nullptr;
194     }
195 
196 private:
197     NetworkFactory::ServerPtr serverPtr_{nullptr};
198     NetworkFactory::ClientPtr clientPtr_{nullptr};
199     std::vector<INetworkSession::Ptr> sessionPtrVec_;
200 };
201 
202 namespace {
203 
204 //测试服务器start
205 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_001, TestSize.Level0)
206 {
207     auto udpServer = std::make_shared<UdpServer>();
208     ASSERT_TRUE(udpServer != nullptr);
209     auto ret = udpServer->Start(8888, "127.0.0.1");
210     ASSERT_TRUE(ret);
211 }
212 
213 // 测试服务器在端口已被占用时的start
214 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_002, TestSize.Level0)
215 {
216     auto udpServer = std::make_shared<UdpServer>();
217     ASSERT_TRUE(udpServer != nullptr);
218     auto ret = udpServer->Start(8888, "127.0.0.1", false);
219     auto udpServer1 = std::make_shared<UdpServer>();
220     ASSERT_TRUE(udpServer1 != nullptr);
221     ret = udpServer1->Start(8888, "127.0.0.1", false);
222     ASSERT_FALSE(ret);
223 }
224 
225 // 测试server和client对连
226 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_003, TestSize.Level0)
227 {
228     auto udpServer = std::make_shared<UdpServer>();
229     ASSERT_TRUE(udpServer != nullptr);
230     auto udpClient = std::make_shared<UdpClient>();
231     ASSERT_TRUE(udpClient != nullptr);
232     auto ret = udpServer->Start(8888, "127.0.0.1");
233     ASSERT_TRUE(ret);
234     ret = udpClient->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
235     ASSERT_TRUE(ret);
236 }
237 
238 // 测试client的disconnect
239 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_004, TestSize.Level0)
240 {
241     auto udpServer = std::make_shared<UdpServer>();
242     ASSERT_TRUE(udpServer != nullptr);
243     auto ret = udpServer->Start(8888, "127.0.0.1");
244     ASSERT_TRUE(ret);
245     auto clientPtr = std::make_shared<UdpClient>();
246     ASSERT_TRUE(clientPtr != nullptr);
247     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
248     ASSERT_TRUE(ret);
249     clientPtr->Disconnect();
250 }
251 
252 // 测试server的disconnect
253 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_005, TestSize.Level0)
254 {
255     auto udpServer = std::make_shared<UdpServer>();
256     ASSERT_TRUE(udpServer != nullptr);
257     auto ret = udpServer->Start(8888, "127.0.0.1");
258     ASSERT_TRUE(ret);
259     auto clientPtr = std::make_shared<UdpClient>();
260     ASSERT_TRUE(clientPtr != nullptr);
261     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
262     ASSERT_TRUE(ret);
263     udpServer->CloseClientSocket(udpServer->GetSocketInfo()->GetLocalFd());
264 }
265 
266 // 测试端口没有被监听时的连接
267 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_006, TestSize.Level0)
268 {
269     auto udpClient = std::make_shared<UdpClient>();
270     ASSERT_TRUE(udpClient != nullptr);
271     auto ret = udpClient->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
272     ASSERT_FALSE(ret);
273 }
274 
275 
276 // 测试ip地址不合法时的连接
277 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_007, TestSize.Level0)
278 {
279     auto udpClient = std::make_shared<UdpClient>();
280     ASSERT_TRUE(udpClient != nullptr);
281     auto ret = udpClient->Connect("192.55.1", 28888, "192.55.1.2", 8889);
282     ASSERT_FALSE(ret);
283 }
284 
285 // 测试没有连接时的disconnect
286 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_008, TestSize.Level0)
287 {
288     auto udpClient = std::make_shared<UdpClient>();
289     ASSERT_TRUE(udpClient != nullptr);
290     udpClient->Disconnect();
291 }
292 
293 // 测试连接时的Send(const std::string &msg)
294 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_009, TestSize.Level0)
295 {
296     auto udpServer = std::make_shared<UdpServer>();
297     ASSERT_TRUE(udpServer != nullptr);
298     auto ret = udpServer->Start(8888, "127.0.0.1");
299     ASSERT_TRUE(ret);
300     auto clientPtr = std::make_shared<UdpClient>();
301     ASSERT_TRUE(clientPtr != nullptr);
302     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
303     ASSERT_TRUE(ret);
304     ret = clientPtr->Send(std::string("hello world"));
305     ASSERT_TRUE(ret);
306 }
307 
308 // 测试连接时的Send(const char *buf, int32_t nSize)
309 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_010, TestSize.Level0)
310 {
311     auto udpServer = std::make_shared<UdpServer>();
312     ASSERT_TRUE(udpServer != nullptr);
313     auto ret = udpServer->Start(8888, "127.0.0.1");
314     ASSERT_TRUE(ret);
315     auto clientPtr = std::make_shared<UdpClient>();
316     ASSERT_TRUE(clientPtr != nullptr);
317     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
318     ASSERT_TRUE(ret);
319     char testString[] = "hello world";
320     size_t testStringLen = strlen(testString);
321     ret = clientPtr->Send(testString, testStringLen);
322     ASSERT_TRUE(ret);
323 }
324 
325 // 测试连接时的Send(const DataBuffer::Ptr &buf, int32_t nSize)
326 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_011, TestSize.Level0)
327 {
328     auto udpServer = std::make_shared<UdpServer>();
329     ASSERT_TRUE(udpServer != nullptr);
330     auto ret = udpServer->Start(8888, "127.0.0.1");
331     ASSERT_TRUE(ret);
332     auto clientPtr = std::make_shared<UdpClient>();
333     ASSERT_TRUE(clientPtr != nullptr);
334     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
335     ASSERT_TRUE(ret);
336     auto buf = std::make_shared<DataBuffer>();
337     ASSERT_TRUE(buf != nullptr);
338     char testString[] = "hello world";
339     size_t testStringLen = strlen(testString);
340     buf->PushData(testString, testStringLen);
341     ret = clientPtr->Send(buf, testStringLen);
342     ASSERT_TRUE(ret);
343 }
344 
345 // 测试尚未连接时的Send(const std::string &msg)
346 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_012, TestSize.Level0)
347 {
348     auto clientPtr = std::make_shared<UdpClient>();
349     ASSERT_TRUE(clientPtr != nullptr);
350     auto ret = clientPtr->Send(std::string("hello world"));
351     ASSERT_FALSE(ret);
352 }
353 
354 // 测试尚未连接时的Send(const char *buf, int32_t nSize)
355 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_013, TestSize.Level0)
356 {
357     auto clientPtr = std::make_shared<UdpClient>();
358     ASSERT_TRUE(clientPtr != nullptr);
359     char testString[] = "hello world";
360     size_t testStringLen = strlen(testString);
361     auto ret = clientPtr->Send(testString, testStringLen);
362     ASSERT_FALSE(ret);
363 }
364 
365 // 测试尚未连接时的Send(const DataBuffer::Ptr &buf, int32_t nSize)
366 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_014, TestSize.Level0)
367 {
368     auto clientPtr = std::make_shared<UdpClient>();
369     ASSERT_TRUE(clientPtr != nullptr);
370     auto buf = std::make_shared<DataBuffer>();
371     ASSERT_TRUE(buf != nullptr);
372     char testString[] = "hello world";
373     size_t testStringLen = strlen(testString);
374     buf->PushData(testString, testStringLen);
375     auto ret = clientPtr->Send(buf, testStringLen);
376     ASSERT_FALSE(ret);
377 }
378 
379 // 测试连接后client是否可获取SocketInfo
380 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_015, TestSize.Level0)
381 {
382     auto udpServer = std::make_shared<UdpServer>();
383     ASSERT_TRUE(udpServer != nullptr);
384     auto ret = udpServer->Start(8888, "127.0.0.1");
385     ASSERT_TRUE(ret);
386     auto clientPtr = std::make_shared<UdpClient>();
387     ASSERT_TRUE(clientPtr != nullptr);
388     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
389     ASSERT_TRUE(ret);
390     auto socketInfo = clientPtr->GetSocketInfo();
391     ASSERT_TRUE(socketInfo != nullptr);
392 }
393 
394 // 测试连接后server是否可获取SocketInfo
395 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_016, TestSize.Level0)
396 {
397     auto udpServer = std::make_shared<UdpServer>();
398     ASSERT_TRUE(udpServer != nullptr);
399     auto ret = udpServer->Start(8888, "127.0.0.1");
400     ASSERT_TRUE(ret);
401     auto clientPtr = std::make_shared<UdpClient>();
402     ASSERT_TRUE(clientPtr != nullptr);
403     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
404     ASSERT_TRUE(ret);
405     auto socketInfo = udpServer->GetSocketInfo();
406     ASSERT_TRUE(socketInfo != nullptr);
407 }
408 
409 // 测试连接后client获取的SocketInfo是否正确
410 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_017, TestSize.Level0)
411 {
412     auto udpServer = std::make_shared<UdpServer>();
413     ASSERT_TRUE(udpServer != nullptr);
414     auto ret = udpServer->Start(8888, "127.0.0.1");
415     ASSERT_TRUE(ret);
416     auto clientPtr = std::make_shared<UdpClient>();
417     ASSERT_TRUE(clientPtr != nullptr);
418     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
419     ASSERT_TRUE(ret);
420     auto socketInfo = clientPtr->GetSocketInfo();
421     ASSERT_TRUE(socketInfo != nullptr);
422     EXPECT_EQ(socketInfo->GetLocalIp(), "127.0.0.1");
423     EXPECT_EQ(socketInfo->GetLocalPort(), 8889);
424     EXPECT_NE(socketInfo->GetLocalFd(), -1);
425     EXPECT_EQ(socketInfo->GetPeerIp(), "127.0.0.1");
426     EXPECT_EQ(socketInfo->GetPeerPort(), 8888);
427 }
428 
429 // 测试连接后Server获取的SocketInfo是否正确
430 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_018, TestSize.Level0)
431 {
432     auto udpServer = std::make_shared<UdpServer>();
433     ASSERT_TRUE(udpServer != nullptr);
434     auto ret = udpServer->Start(8888, "127.0.0.1");
435     ASSERT_TRUE(ret);
436     auto clientPtr = std::make_shared<UdpClient>();
437     ASSERT_TRUE(clientPtr != nullptr);
438     ret = clientPtr->Connect("127.0.0.1", 8888, "127.0.0.1", 8889);
439     ASSERT_TRUE(ret);
440     auto socketInfo = udpServer->GetSocketInfo();
441     ASSERT_TRUE(socketInfo != nullptr);
442     EXPECT_EQ(socketInfo->GetLocalIp(), "127.0.0.1");
443     EXPECT_EQ(socketInfo->GetLocalPort(), 8888);
444     EXPECT_NE(socketInfo->GetLocalFd(), -1);
445 }
446 
447 // 测试未连接时client是否能获取SocketInfo
448 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_019, TestSize.Level0)
449 {
450     auto clientPtr = std::make_shared<UdpClient>();
451     ASSERT_TRUE(clientPtr != nullptr);
452     auto socketInfo = clientPtr->GetSocketInfo();
453     ASSERT_TRUE(socketInfo == nullptr);
454 }
455 
456 // 测试未监听时server是否可获取SocketInfo
457 HWTEST_F(NetworkUdpUnitTest, NetworkUdpUnitTest_020, TestSize.Level0)
458 {
459     auto udpServer = std::make_shared<UdpServer>();
460     ASSERT_TRUE(udpServer != nullptr);
461     auto socketInfo = udpServer->GetSocketInfo();
462     ASSERT_TRUE(socketInfo == nullptr);
463 }
464 
465 
466 } // namespace
467 } // namespace Sharing
468 } // namespace OHOS