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