1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#include "gtest/gtest.h" 17e509ee18Sopenharmony_ci#include "inspector/connect_inspector.h" 18e509ee18Sopenharmony_ci#include "inspector/connect_server.h" 19e509ee18Sopenharmony_ci#include "websocket/client/websocket_client.h" 20e509ee18Sopenharmony_ci#include "websocket/server/websocket_server.h" 21e509ee18Sopenharmony_ci 22e509ee18Sopenharmony_ciusing namespace OHOS::ArkCompiler::Toolchain; 23e509ee18Sopenharmony_ci 24e509ee18Sopenharmony_cinamespace panda::test { 25e509ee18Sopenharmony_ciclass ConnectServerTest : public testing::Test { 26e509ee18Sopenharmony_cipublic: 27e509ee18Sopenharmony_ci static void SetUpTestCase() 28e509ee18Sopenharmony_ci { 29e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "ConnectServerTest::SetUpTestCase"; 30e509ee18Sopenharmony_ci } 31e509ee18Sopenharmony_ci 32e509ee18Sopenharmony_ci static void TearDownTestCase() 33e509ee18Sopenharmony_ci { 34e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "ConnectServerTest::TearDownTestCase"; 35e509ee18Sopenharmony_ci } 36e509ee18Sopenharmony_ci 37e509ee18Sopenharmony_ci void SetUp() override {} 38e509ee18Sopenharmony_ci 39e509ee18Sopenharmony_ci void TearDown() override {} 40e509ee18Sopenharmony_ci void ReturnValueVerification(); 41e509ee18Sopenharmony_ci#if defined(OHOS_PLATFORM) 42e509ee18Sopenharmony_ci static constexpr char CONNECTED_MESSAGE_TEST[] = "connected"; 43e509ee18Sopenharmony_ci static constexpr char OPEN_MESSAGE_TEST[] = "layoutOpen"; 44e509ee18Sopenharmony_ci static constexpr char CLOSE_MESSAGE_TEST[] = "layoutClose"; 45e509ee18Sopenharmony_ci static constexpr char REQUEST_MESSAGE_TEST[] = "tree"; 46e509ee18Sopenharmony_ci static constexpr char STOPDEBUGGER_MESSAGE_TEST[] = "stopDebugger"; 47e509ee18Sopenharmony_ci static constexpr char OPEN_ARKUI_STATE_PROFILER_TEST[] = "ArkUIStateProfilerOpen"; 48e509ee18Sopenharmony_ci static constexpr char CLOSE_ARKUI_STATE_PROFILER_TEST[] = "ArkUIStateProfilerClose"; 49e509ee18Sopenharmony_ci static constexpr char START_RECORD_MESSAGE_TEST[] = "rsNodeStartRecord"; 50e509ee18Sopenharmony_ci static constexpr char STOP_RECORD_MESSAGE_TEST[] = "rsNodeStopRecord"; 51e509ee18Sopenharmony_ci 52e509ee18Sopenharmony_ci static constexpr char HELLO_INSPECTOR_CLIENT[] = "hello inspector client"; 53e509ee18Sopenharmony_ci static constexpr char INSPECTOR_SERVER_OK[] = "inspector server ok"; 54e509ee18Sopenharmony_ci static constexpr char INSPECTOR_RUN[] = "inspector run"; 55e509ee18Sopenharmony_ci static constexpr char INSPECTOR_QUIT[] = "inspector quit"; 56e509ee18Sopenharmony_ci static constexpr int32_t WAIT_TIME = 2; 57e509ee18Sopenharmony_ci#endif 58e509ee18Sopenharmony_ci}; 59e509ee18Sopenharmony_ci 60e509ee18Sopenharmony_cibool g_profilerFlag = false; 61e509ee18Sopenharmony_cibool g_connectFlag = false; 62e509ee18Sopenharmony_cibool g_switchStatus = false; 63e509ee18Sopenharmony_ciint32_t g_createInfoId = 0; 64e509ee18Sopenharmony_ciint32_t g_instanceId = 1; 65e509ee18Sopenharmony_ci 66e509ee18Sopenharmony_civoid CallbackInit() 67e509ee18Sopenharmony_ci{ 68e509ee18Sopenharmony_ci auto profilerCb = [](bool flag) -> void { 69e509ee18Sopenharmony_ci g_profilerFlag = flag; 70e509ee18Sopenharmony_ci }; 71e509ee18Sopenharmony_ci SetProfilerCallback(profilerCb); 72e509ee18Sopenharmony_ci 73e509ee18Sopenharmony_ci auto connectCb = [](bool flag) -> void { 74e509ee18Sopenharmony_ci g_connectFlag = flag; 75e509ee18Sopenharmony_ci }; 76e509ee18Sopenharmony_ci SetConnectCallback(connectCb); 77e509ee18Sopenharmony_ci 78e509ee18Sopenharmony_ci auto debugModeCb = []() -> void { 79e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "Execute DebugModeCallBack."; 80e509ee18Sopenharmony_ci }; 81e509ee18Sopenharmony_ci SetDebugModeCallBack(debugModeCb); 82e509ee18Sopenharmony_ci 83e509ee18Sopenharmony_ci auto switchStatusCb = [](bool flag) -> void { 84e509ee18Sopenharmony_ci g_switchStatus = flag; 85e509ee18Sopenharmony_ci }; 86e509ee18Sopenharmony_ci auto createInfoCb = [](int32_t id) -> void { 87e509ee18Sopenharmony_ci g_createInfoId = id; 88e509ee18Sopenharmony_ci }; 89e509ee18Sopenharmony_ci SetSwitchCallBack(switchStatusCb, createInfoCb, g_instanceId); 90e509ee18Sopenharmony_ci 91e509ee18Sopenharmony_ci auto startRecordFunc = []() -> void {}; 92e509ee18Sopenharmony_ci auto stopRecordFunc = []() -> void {}; 93e509ee18Sopenharmony_ci SetRecordCallback(startRecordFunc, stopRecordFunc); 94e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "ConnectServerTest::CallbackInit finished"; 95e509ee18Sopenharmony_ci} 96e509ee18Sopenharmony_ci 97e509ee18Sopenharmony_civoid ConnectServerTest::ReturnValueVerification() 98e509ee18Sopenharmony_ci{ 99e509ee18Sopenharmony_ci#if defined(OHOS_PLATFORM) 100e509ee18Sopenharmony_ci // Waiting for executing the message instruction sent by the client 101e509ee18Sopenharmony_ci sleep(WAIT_TIME); 102e509ee18Sopenharmony_ci ASSERT_TRUE(g_profilerFlag); 103e509ee18Sopenharmony_ci ASSERT_EQ(g_createInfoId, g_instanceId); 104e509ee18Sopenharmony_ci ASSERT_TRUE(g_switchStatus); 105e509ee18Sopenharmony_ci ASSERT_TRUE(g_connectFlag); 106e509ee18Sopenharmony_ci ASSERT_FALSE(WaitForConnection()); 107e509ee18Sopenharmony_ci 108e509ee18Sopenharmony_ci SendMessage(INSPECTOR_SERVER_OK); 109e509ee18Sopenharmony_ci SendLayoutMessage(INSPECTOR_RUN); 110e509ee18Sopenharmony_ci 111e509ee18Sopenharmony_ci // Waiting for executing the message instruction sent by the client 112e509ee18Sopenharmony_ci sleep(WAIT_TIME); 113e509ee18Sopenharmony_ci ASSERT_FALSE(g_profilerFlag); 114e509ee18Sopenharmony_ci ASSERT_FALSE(g_switchStatus); 115e509ee18Sopenharmony_ci ASSERT_FALSE(g_connectFlag); 116e509ee18Sopenharmony_ci 117e509ee18Sopenharmony_ci SendProfilerMessage(INSPECTOR_QUIT); 118e509ee18Sopenharmony_ci 119e509ee18Sopenharmony_ci StopServer("InspectorConnectTest"); 120e509ee18Sopenharmony_ci#endif 121e509ee18Sopenharmony_ci} 122e509ee18Sopenharmony_ci 123e509ee18Sopenharmony_ciHWTEST_F(ConnectServerTest, InspectorBasicTest, testing::ext::TestSize.Level0) 124e509ee18Sopenharmony_ci{ 125e509ee18Sopenharmony_ci ASSERT_TRUE(WaitForConnection()); 126e509ee18Sopenharmony_ci} 127e509ee18Sopenharmony_ci 128e509ee18Sopenharmony_ciHWTEST_F(ConnectServerTest, InspectorConnectTest, testing::ext::TestSize.Level0) 129e509ee18Sopenharmony_ci{ 130e509ee18Sopenharmony_ci CallbackInit(); 131e509ee18Sopenharmony_ci#if defined(OHOS_PLATFORM) 132e509ee18Sopenharmony_ci int appPid = getprocpid(); 133e509ee18Sopenharmony_ci int oldProcessfd = -2; 134e509ee18Sopenharmony_ci ASSERT_TRUE(StartServerForSocketPair(oldProcessfd)); 135e509ee18Sopenharmony_ci // test ConnectServer is not nullptr 136e509ee18Sopenharmony_ci ASSERT_TRUE(StartServerForSocketPair(oldProcessfd)); 137e509ee18Sopenharmony_ci StoreMessage(g_instanceId, HELLO_INSPECTOR_CLIENT); 138e509ee18Sopenharmony_ci pid_t pid = fork(); 139e509ee18Sopenharmony_ci if (pid == 0) { 140e509ee18Sopenharmony_ci WebSocketClient clientSocket; 141e509ee18Sopenharmony_ci ASSERT_TRUE(clientSocket.InitToolchainWebSocketForSockName(std::to_string(appPid))); 142e509ee18Sopenharmony_ci ASSERT_TRUE(clientSocket.ClientSendWSUpgradeReq()); 143e509ee18Sopenharmony_ci ASSERT_TRUE(clientSocket.ClientRecvWSUpgradeRsp()); 144e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(OPEN_ARKUI_STATE_PROFILER_TEST)); 145e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(REQUEST_MESSAGE_TEST)); 146e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(OPEN_MESSAGE_TEST)); 147e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(CONNECTED_MESSAGE_TEST)); 148e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(START_RECORD_MESSAGE_TEST)); 149e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(STOP_RECORD_MESSAGE_TEST)); 150e509ee18Sopenharmony_ci 151e509ee18Sopenharmony_ci EXPECT_STREQ(clientSocket.Decode().c_str(), HELLO_INSPECTOR_CLIENT); 152e509ee18Sopenharmony_ci 153e509ee18Sopenharmony_ci std::string recv = clientSocket.Decode(); 154e509ee18Sopenharmony_ci EXPECT_STREQ(recv.c_str(), INSPECTOR_SERVER_OK); 155e509ee18Sopenharmony_ci if (strcmp(recv.c_str(), INSPECTOR_SERVER_OK) == 0) { 156e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(CLOSE_MESSAGE_TEST)); 157e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(STOPDEBUGGER_MESSAGE_TEST)); 158e509ee18Sopenharmony_ci EXPECT_TRUE(clientSocket.SendReply(CLOSE_ARKUI_STATE_PROFILER_TEST)); 159e509ee18Sopenharmony_ci } 160e509ee18Sopenharmony_ci 161e509ee18Sopenharmony_ci EXPECT_STREQ(clientSocket.Decode().c_str(), INSPECTOR_RUN); 162e509ee18Sopenharmony_ci EXPECT_STREQ(clientSocket.Decode().c_str(), INSPECTOR_QUIT); 163e509ee18Sopenharmony_ci clientSocket.Close(); 164e509ee18Sopenharmony_ci exit(0); 165e509ee18Sopenharmony_ci } else if (pid > 0) { 166e509ee18Sopenharmony_ci ReturnValueVerification(); 167e509ee18Sopenharmony_ci } 168e509ee18Sopenharmony_ci else { 169e509ee18Sopenharmony_ci std::cerr << "InspectorConnectTest::fork failed" << std::endl; 170e509ee18Sopenharmony_ci } 171e509ee18Sopenharmony_ci RemoveMessage(g_instanceId); 172e509ee18Sopenharmony_ci#endif 173e509ee18Sopenharmony_ci} 174e509ee18Sopenharmony_ci 175e509ee18Sopenharmony_ci} // namespace panda::test