• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device 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 "inspector/connect_inspector.h"
18 #include "inspector/connect_server.h"
19 #include "websocket/client/websocket_client.h"
20 #include "websocket/server/websocket_server.h"
21 
22 using namespace OHOS::ArkCompiler::Toolchain;
23 
24 namespace panda::test {
25 class ConnectServerTest : public testing::Test {
26 public:
SetUpTestCase()27     static void SetUpTestCase()
28     {
29         GTEST_LOG_(INFO) << "ConnectServerTest::SetUpTestCase";
30     }
31 
TearDownTestCase()32     static void TearDownTestCase()
33     {
34         GTEST_LOG_(INFO) << "ConnectServerTest::TearDownTestCase";
35     }
36 
SetUp()37     void SetUp() override {}
38 
TearDown()39     void TearDown() override {}
40 #if defined(OHOS_PLATFORM)
41     static constexpr char CONNECTED_MESSAGE_TEST[] = "connected";
42     static constexpr char OPEN_MESSAGE_TEST[] = "layoutOpen";
43     static constexpr char CLOSE_MESSAGE_TEST[] = "layoutClose";
44     static constexpr char REQUEST_MESSAGE_TEST[] = "tree";
45     static constexpr char STOPDEBUGGER_MESSAGE_TEST[] = "stopDebugger";
46     static constexpr char OPEN_ARKUI_STATE_PROFILER_TEST[] = "ArkUIStateProfilerOpen";
47     static constexpr char CLOSE_ARKUI_STATE_PROFILER_TEST[] = "ArkUIStateProfilerClose";
48     static constexpr char START_RECORD_MESSAGE_TEST[] = "rsNodeStartRecord";
49     static constexpr char STOP_RECORD_MESSAGE_TEST[] = "rsNodeStopRecord";
50 
51     static constexpr char HELLO_INSPECTOR_CLIENT[] = "hello inspector client";
52     static constexpr char INSPECTOR_SERVER_OK[]    = "inspector server ok";
53     static constexpr char INSPECTOR_RUN[]          = "inspector run";
54     static constexpr char INSPECTOR_QUIT[]         = "inspector quit";
55 #endif
56 };
57 
58 bool g_profilerFlag = false;
59 bool g_connectFlag = false;
60 bool g_switchStatus = false;
61 int32_t g_createInfoId = 0;
62 int32_t g_instanceId = 1;
63 
CallbackInit()64 void CallbackInit()
65 {
66     auto profilerCb = [](bool flag) -> void {
67     g_profilerFlag = flag;
68     };
69     SetProfilerCallback(profilerCb);
70 
71     auto connectCb = [](bool flag) -> void {
72         g_connectFlag = flag;
73     };
74     SetConnectCallback(connectCb);
75 
76     auto debugModeCb = []() -> void {
77         GTEST_LOG_(INFO) << "Execute DebugModeCallBack.";
78     };
79     SetDebugModeCallBack(debugModeCb);
80 
81     auto switchStatusCb = [](bool flag) -> void {
82         g_switchStatus = flag;
83     };
84     auto createInfoCb = [](int32_t id) -> void {
85         g_createInfoId = id;
86     };
87     SetSwitchCallBack(switchStatusCb, createInfoCb, g_instanceId);
88 
89     auto startRecordFunc = []() -> void {};
90     auto stopRecordFunc = []() -> void {};
91     SetRecordCallback(startRecordFunc, stopRecordFunc);
92     GTEST_LOG_(INFO) << "ConnectServerTest::CallbackInit finished";
93 }
94 
95 HWTEST_F(ConnectServerTest, InspectorBasicTest, testing::ext::TestSize.Level0)
96 {
97     ASSERT_TRUE(WaitForConnection());
98 }
99 
100 HWTEST_F(ConnectServerTest, InspectorConnectTest, testing::ext::TestSize.Level0)
101 {
102     CallbackInit();
103 #if defined(OHOS_PLATFORM)
104     int appPid = getprocpid();
105     int oldProcessfd = -2;
106     StartServerForSocketPair(oldProcessfd);
107     StoreMessage(g_instanceId, HELLO_INSPECTOR_CLIENT);
108     pid_t pid = fork();
109     if (pid == 0) {
110         WebSocketClient clientSocket;
111         ASSERT_TRUE(clientSocket.InitToolchainWebSocketForSockName(std::to_string(appPid)));
112         ASSERT_TRUE(clientSocket.ClientSendWSUpgradeReq());
113         ASSERT_TRUE(clientSocket.ClientRecvWSUpgradeRsp());
114         EXPECT_TRUE(clientSocket.SendReply(OPEN_ARKUI_STATE_PROFILER_TEST));
115         EXPECT_TRUE(clientSocket.SendReply(REQUEST_MESSAGE_TEST));
116         EXPECT_TRUE(clientSocket.SendReply(OPEN_MESSAGE_TEST));
117         EXPECT_TRUE(clientSocket.SendReply(CONNECTED_MESSAGE_TEST));
118         EXPECT_TRUE(clientSocket.SendReply(START_RECORD_MESSAGE_TEST));
119         EXPECT_TRUE(clientSocket.SendReply(STOP_RECORD_MESSAGE_TEST));
120 
121         EXPECT_STREQ(clientSocket.Decode().c_str(), HELLO_INSPECTOR_CLIENT);
122 
123         std::string recv = clientSocket.Decode();
124         EXPECT_STREQ(recv.c_str(), INSPECTOR_SERVER_OK);
125         if (strcmp(recv.c_str(), INSPECTOR_SERVER_OK) == 0) {
126             EXPECT_TRUE(clientSocket.SendReply(CLOSE_MESSAGE_TEST));
127             EXPECT_TRUE(clientSocket.SendReply(STOPDEBUGGER_MESSAGE_TEST));
128             EXPECT_TRUE(clientSocket.SendReply(CLOSE_ARKUI_STATE_PROFILER_TEST));
129         }
130 
131         EXPECT_STREQ(clientSocket.Decode().c_str(), INSPECTOR_RUN);
132         EXPECT_STREQ(clientSocket.Decode().c_str(), INSPECTOR_QUIT);
133         clientSocket.Close();
134         exit(0);
135     } else if (pid > 0) {
136         // Waiting for executing the message instruction sent by the client
137         sleep(2);
138         ASSERT_TRUE(g_profilerFlag);
139         ASSERT_EQ(g_createInfoId, g_instanceId);
140         ASSERT_TRUE(g_switchStatus);
141         ASSERT_TRUE(g_connectFlag);
142         ASSERT_FALSE(WaitForConnection());
143 
144         SendMessage(INSPECTOR_SERVER_OK);
145         SendLayoutMessage(INSPECTOR_RUN);
146 
147         // Waiting for executing the message instruction sent by the client
148         sleep(2);
149         ASSERT_FALSE(g_profilerFlag);
150         ASSERT_FALSE(g_switchStatus);
151         ASSERT_FALSE(g_connectFlag);
152 
153         SendProfilerMessage(INSPECTOR_QUIT);
154 
155         StopServer("InspectorConnectTest");
156     } else {
157         std::cerr << "InspectorConnectTest::fork failed" << std::endl;
158     }
159     RemoveMessage(g_instanceId);
160 #endif
161 }
162 
163 } // namespace panda::test