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