11e934351Sopenharmony_ci/* 21e934351Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 31e934351Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41e934351Sopenharmony_ci * you may not use this file except in compliance with the License. 51e934351Sopenharmony_ci * You may obtain a copy of the License at 61e934351Sopenharmony_ci * 71e934351Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81e934351Sopenharmony_ci * 91e934351Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101e934351Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111e934351Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e934351Sopenharmony_ci * See the License for the specific language governing permissions and 131e934351Sopenharmony_ci * limitations under the License. 141e934351Sopenharmony_ci */ 151e934351Sopenharmony_ci 161e934351Sopenharmony_ci#include <csignal> 171e934351Sopenharmony_ci#include <cstring> 181e934351Sopenharmony_ci#include <functional> 191e934351Sopenharmony_ci#include <iostream> 201e934351Sopenharmony_ci 211e934351Sopenharmony_ci#include "netstack_log.h" 221e934351Sopenharmony_ci#include "gtest/gtest.h" 231e934351Sopenharmony_ci#ifdef GTEST_API_ 241e934351Sopenharmony_ci#define private public 251e934351Sopenharmony_ci#endif 261e934351Sopenharmony_ci#include "websocket_client_innerapi.h" 271e934351Sopenharmony_ci 281e934351Sopenharmony_ciclass WebSocketTest : public testing::Test { 291e934351Sopenharmony_cipublic: 301e934351Sopenharmony_ci static void SetUpTestCase() {} 311e934351Sopenharmony_ci 321e934351Sopenharmony_ci static void TearDownTestCase() {} 331e934351Sopenharmony_ci 341e934351Sopenharmony_ci virtual void SetUp() {} 351e934351Sopenharmony_ci 361e934351Sopenharmony_ci virtual void TearDown() {} 371e934351Sopenharmony_ci}; 381e934351Sopenharmony_ci 391e934351Sopenharmony_cinamespace { 401e934351Sopenharmony_ciusing namespace testing::ext; 411e934351Sopenharmony_ciusing namespace OHOS::NetStack::WebSocketClient; 421e934351Sopenharmony_cistatic constexpr const size_t TEST_MAX_DATA_LENGTH = 5 * 1024 * 1024; 431e934351Sopenharmony_cistatic constexpr const size_t TEST_LENGTH = 1; 441e934351Sopenharmony_ci 451e934351Sopenharmony_ciOpenOptions openOptions; 461e934351Sopenharmony_ci 471e934351Sopenharmony_ciCloseOption closeOptions; 481e934351Sopenharmony_ci 491e934351Sopenharmony_cistatic void OnMessage(WebSocketClient *client, const std::string &data, size_t length) {} 501e934351Sopenharmony_ci 511e934351Sopenharmony_cistatic void OnOpen(WebSocketClient *client, OpenResult openResult) {} 521e934351Sopenharmony_ci 531e934351Sopenharmony_cistatic void OnError(WebSocketClient *client, ErrorResult error) {} 541e934351Sopenharmony_ci 551e934351Sopenharmony_cistatic void OnClose(WebSocketClient *client, CloseResult closeResult) {} 561e934351Sopenharmony_ci 571e934351Sopenharmony_ciWebSocketClient *client = new WebSocketClient(); 581e934351Sopenharmony_ci 591e934351Sopenharmony_ciHWTEST_F(WebSocketTest, WebSocketRegistcallback001, TestSize.Level1) 601e934351Sopenharmony_ci{ 611e934351Sopenharmony_ci openOptions.headers["Content-Type"] = "application/json"; 621e934351Sopenharmony_ci openOptions.headers["Authorization"] = "Bearer your_token_here"; 631e934351Sopenharmony_ci closeOptions.code = LWS_CLOSE_STATUS_NORMAL; 641e934351Sopenharmony_ci closeOptions.reason = ""; 651e934351Sopenharmony_ci client->Registcallback(OnOpen, OnMessage, OnError, OnClose); 661e934351Sopenharmony_ci int32_t ret = client->Connect("www.baidu.com", openOptions); 671e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_CONNECTION_TO_SERVER_FAIL); 681e934351Sopenharmony_ci} 691e934351Sopenharmony_ci 701e934351Sopenharmony_ciHWTEST_F(WebSocketTest, WebSocketConnect002, TestSize.Level1) 711e934351Sopenharmony_ci{ 721e934351Sopenharmony_ci int32_t ret = 0; 731e934351Sopenharmony_ci openOptions.headers["Content-Type"] = "application/json"; 741e934351Sopenharmony_ci openOptions.headers["Authorization"] = "Bearer your_token_here"; 751e934351Sopenharmony_ci client->Registcallback(OnOpen, OnMessage, OnError, OnClose); 761e934351Sopenharmony_ci ret = client->Connect("www.baidu.com", openOptions); 771e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_CONNECTION_TO_SERVER_FAIL); 781e934351Sopenharmony_ci} 791e934351Sopenharmony_ci 801e934351Sopenharmony_ciHWTEST_F(WebSocketTest, WebSocketSend003, TestSize.Level1) 811e934351Sopenharmony_ci{ 821e934351Sopenharmony_ci int32_t ret; 831e934351Sopenharmony_ci const char *data = "Hello, world!"; 841e934351Sopenharmony_ci int32_t length = std::strlen(data); 851e934351Sopenharmony_ci client->Connect("www.baidu.com", openOptions); 861e934351Sopenharmony_ci ret = client->Send(const_cast<char *>(data), length); 871e934351Sopenharmony_ci EXPECT_EQ(ret, 0); 881e934351Sopenharmony_ci} 891e934351Sopenharmony_ci 901e934351Sopenharmony_ciHWTEST_F(WebSocketTest, WebSocketClose004, TestSize.Level1) 911e934351Sopenharmony_ci{ 921e934351Sopenharmony_ci const int32_t WEBSOCKET_NO_CONNECTION = 1017; 931e934351Sopenharmony_ci CloseOption CloseOptions; 941e934351Sopenharmony_ci CloseOptions.code = LWS_CLOSE_STATUS_NORMAL; 951e934351Sopenharmony_ci CloseOptions.reason = ""; 961e934351Sopenharmony_ci int32_t ret = client->Close(CloseOptions); 971e934351Sopenharmony_ci EXPECT_EQ(ret, WEBSOCKET_NO_CONNECTION); 981e934351Sopenharmony_ci} 991e934351Sopenharmony_ci 1001e934351Sopenharmony_ciHWTEST_F(WebSocketTest, WebSocketDestroy005, TestSize.Level1) 1011e934351Sopenharmony_ci{ 1021e934351Sopenharmony_ci int32_t ret; 1031e934351Sopenharmony_ci ret = client->Destroy(); 1041e934351Sopenharmony_ci delete client; 1051e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_ERROR_HAVE_NO_CONNECT_CONTEXT); 1061e934351Sopenharmony_ci} 1071e934351Sopenharmony_ci 1081e934351Sopenharmony_ciHWTEST_F(WebSocketTest, WebSocketBranchTest001, TestSize.Level1) 1091e934351Sopenharmony_ci{ 1101e934351Sopenharmony_ci const char *data = "test data"; 1111e934351Sopenharmony_ci char *testData = nullptr; 1121e934351Sopenharmony_ci size_t length = 0; 1131e934351Sopenharmony_ci int32_t ret = client->Send(testData, length); 1141e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_SEND_DATA_NULL); 1151e934351Sopenharmony_ci 1161e934351Sopenharmony_ci ret = client->Send(const_cast<char *>(data), TEST_MAX_DATA_LENGTH); 1171e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_DATA_LENGTH_EXCEEDS); 1181e934351Sopenharmony_ci 1191e934351Sopenharmony_ci CloseOption options; 1201e934351Sopenharmony_ci options.reason = ""; 1211e934351Sopenharmony_ci options.code = 0; 1221e934351Sopenharmony_ci WebSocketClient *client = new WebSocketClient(); 1231e934351Sopenharmony_ci EXPECT_TRUE(client->GetClientContext() != nullptr); 1241e934351Sopenharmony_ci client->GetClientContext()->openStatus = TEST_LENGTH; 1251e934351Sopenharmony_ci ret = client->Close(options); 1261e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_NONE_ERR); 1271e934351Sopenharmony_ci client->GetClientContext()->openStatus = 0; 1281e934351Sopenharmony_ci ret = client->Close(options); 1291e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_ERROR_HAVE_NO_CONNECT); 1301e934351Sopenharmony_ci} 1311e934351Sopenharmony_ci 1321e934351Sopenharmony_ciHWTEST_F(WebSocketTest, WebSocketBranchTest002, TestSize.Level1) 1331e934351Sopenharmony_ci{ 1341e934351Sopenharmony_ci client->clientContext = nullptr; 1351e934351Sopenharmony_ci const char *data = "test data"; 1361e934351Sopenharmony_ci size_t length = 0; 1371e934351Sopenharmony_ci int32_t ret = client->Send(const_cast<char *>(data), length); 1381e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_ERROR_NO_CLIENTCONTEX); 1391e934351Sopenharmony_ci 1401e934351Sopenharmony_ci CloseOption options; 1411e934351Sopenharmony_ci ret = client->Close(options); 1421e934351Sopenharmony_ci EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_ERROR_NO_CLIENTCONTEX); 1431e934351Sopenharmony_ci} 1441e934351Sopenharmony_ci} // namespace