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