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