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