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