1e509ee18Sopenharmony_ci/*
2e509ee18Sopenharmony_ci * Copyright (c) 2022 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 "agent/profiler_impl.h"
17e509ee18Sopenharmony_ci#include "ecmascript/tests/test_helper.h"
18e509ee18Sopenharmony_ci#include "protocol_handler.h"
19e509ee18Sopenharmony_ci
20e509ee18Sopenharmony_ciusing namespace panda::ecmascript;
21e509ee18Sopenharmony_ciusing namespace panda::ecmascript::tooling;
22e509ee18Sopenharmony_ci
23e509ee18Sopenharmony_cinamespace panda::test {
24e509ee18Sopenharmony_ciclass ProfilerImplTest : public testing::Test {
25e509ee18Sopenharmony_cipublic:
26e509ee18Sopenharmony_ci    static void SetUpTestCase()
27e509ee18Sopenharmony_ci    {
28e509ee18Sopenharmony_ci        GTEST_LOG_(INFO) << "SetUpTestCase";
29e509ee18Sopenharmony_ci    }
30e509ee18Sopenharmony_ci
31e509ee18Sopenharmony_ci    static void TearDownTestCase()
32e509ee18Sopenharmony_ci    {
33e509ee18Sopenharmony_ci        GTEST_LOG_(INFO) << "TearDownCase";
34e509ee18Sopenharmony_ci    }
35e509ee18Sopenharmony_ci
36e509ee18Sopenharmony_ci    void SetUp() override
37e509ee18Sopenharmony_ci    {
38e509ee18Sopenharmony_ci        TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope);
39e509ee18Sopenharmony_ci    }
40e509ee18Sopenharmony_ci
41e509ee18Sopenharmony_ci    void TearDown() override
42e509ee18Sopenharmony_ci    {
43e509ee18Sopenharmony_ci        TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope);
44e509ee18Sopenharmony_ci    }
45e509ee18Sopenharmony_ci
46e509ee18Sopenharmony_ciprotected:
47e509ee18Sopenharmony_ci    EcmaVM *ecmaVm {nullptr};
48e509ee18Sopenharmony_ci    EcmaHandleScope *scope {nullptr};
49e509ee18Sopenharmony_ci    JSThread *thread {nullptr};
50e509ee18Sopenharmony_ci};
51e509ee18Sopenharmony_ci
52e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, Disable)
53e509ee18Sopenharmony_ci{
54e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
55e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
56e509ee18Sopenharmony_ci    DispatchResponse response = profiler->Disable();
57e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "");
58e509ee18Sopenharmony_ci    ASSERT_TRUE(response.IsOk());
59e509ee18Sopenharmony_ci}
60e509ee18Sopenharmony_ci
61e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, Enable)
62e509ee18Sopenharmony_ci{
63e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
64e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
65e509ee18Sopenharmony_ci    DispatchResponse response = profiler->Enable();
66e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "");
67e509ee18Sopenharmony_ci    ASSERT_TRUE(response.IsOk());
68e509ee18Sopenharmony_ci}
69e509ee18Sopenharmony_ci
70e509ee18Sopenharmony_ci
71e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, Start)
72e509ee18Sopenharmony_ci{
73e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
74e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
75e509ee18Sopenharmony_ci    DispatchResponse response = profiler->Start();
76e509ee18Sopenharmony_ci    std::unique_ptr<Profile> profile;
77e509ee18Sopenharmony_ci    DispatchResponse response1 = profiler->Stop(&profile);
78e509ee18Sopenharmony_ci    ASSERT_TRUE(response.IsOk());
79e509ee18Sopenharmony_ci    ASSERT_TRUE(response1.IsOk());
80e509ee18Sopenharmony_ci    ASSERT_TRUE(profile);
81e509ee18Sopenharmony_ci}
82e509ee18Sopenharmony_ci
83e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, Stop)
84e509ee18Sopenharmony_ci{
85e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
86e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
87e509ee18Sopenharmony_ci    std::unique_ptr<Profile> profile;
88e509ee18Sopenharmony_ci    DispatchResponse response = profiler->Stop(&profile);
89e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage().find("Stop is failure") != std::string::npos);
90e509ee18Sopenharmony_ci    ASSERT_TRUE(!response.IsOk());
91e509ee18Sopenharmony_ci}
92e509ee18Sopenharmony_ci
93e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, SetSamplingInterval)
94e509ee18Sopenharmony_ci{
95e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
96e509ee18Sopenharmony_ci    SetSamplingIntervalParams params;
97e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
98e509ee18Sopenharmony_ci    DispatchResponse response = profiler->SetSamplingInterval(params);
99e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "");
100e509ee18Sopenharmony_ci    ASSERT_TRUE(response.IsOk());
101e509ee18Sopenharmony_ci}
102e509ee18Sopenharmony_ci
103e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, EnableSerializationTimeoutCheck)
104e509ee18Sopenharmony_ci{
105e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
106e509ee18Sopenharmony_ci    SeriliazationTimeoutCheckEnableParams params;
107e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
108e509ee18Sopenharmony_ci    DispatchResponse response = profiler->EnableSerializationTimeoutCheck(params);
109e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "");
110e509ee18Sopenharmony_ci    ASSERT_TRUE(response.IsOk());
111e509ee18Sopenharmony_ci}
112e509ee18Sopenharmony_ci
113e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DisableSerializationTimeoutCheck)
114e509ee18Sopenharmony_ci{
115e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
116e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
117e509ee18Sopenharmony_ci    DispatchResponse response = profiler->DisableSerializationTimeoutCheck();
118e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "");
119e509ee18Sopenharmony_ci    ASSERT_TRUE(response.IsOk());
120e509ee18Sopenharmony_ci}
121e509ee18Sopenharmony_ci
122e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, GetBestEffortCoverage)
123e509ee18Sopenharmony_ci{
124e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
125e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
126e509ee18Sopenharmony_ci    DispatchResponse response = profiler->GetBestEffortCoverage();
127e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "GetBestEffortCoverage not support now");
128e509ee18Sopenharmony_ci}
129e509ee18Sopenharmony_ci
130e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, StopPreciseCoverage)
131e509ee18Sopenharmony_ci{
132e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
133e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
134e509ee18Sopenharmony_ci    DispatchResponse response = profiler->StopPreciseCoverage();
135e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "StopPreciseCoverage not support now");
136e509ee18Sopenharmony_ci}
137e509ee18Sopenharmony_ci
138e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, TakePreciseCoverage)
139e509ee18Sopenharmony_ci{
140e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
141e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
142e509ee18Sopenharmony_ci    DispatchResponse response = profiler->TakePreciseCoverage();
143e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "TakePreciseCoverage not support now");
144e509ee18Sopenharmony_ci}
145e509ee18Sopenharmony_ci
146e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, StartPreciseCoverage)
147e509ee18Sopenharmony_ci{
148e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
149e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
150e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Debugger.requestMemoryDump","params":{}})";
151e509ee18Sopenharmony_ci    DispatchRequest request = DispatchRequest(msg);
152e509ee18Sopenharmony_ci    std::unique_ptr<StartPreciseCoverageParams> params = StartPreciseCoverageParams::Create(request.GetParams());
153e509ee18Sopenharmony_ci    DispatchResponse response = profiler->StartPreciseCoverage(*params);
154e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "StartPreciseCoverage not support now");
155e509ee18Sopenharmony_ci}
156e509ee18Sopenharmony_ci
157e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, StartTypeProfile)
158e509ee18Sopenharmony_ci{
159e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
160e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
161e509ee18Sopenharmony_ci    DispatchResponse response = profiler->StartTypeProfile();
162e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "StartTypeProfile not support now");
163e509ee18Sopenharmony_ci}
164e509ee18Sopenharmony_ci
165e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, StopTypeProfile)
166e509ee18Sopenharmony_ci{
167e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
168e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
169e509ee18Sopenharmony_ci    DispatchResponse response = profiler->StopTypeProfile();
170e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "StopTypeProfile not support now");
171e509ee18Sopenharmony_ci}
172e509ee18Sopenharmony_ci
173e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, TakeTypeProfile)
174e509ee18Sopenharmony_ci{
175e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
176e509ee18Sopenharmony_ci    auto profiler = std::make_unique<ProfilerImpl>(ecmaVm, channel);
177e509ee18Sopenharmony_ci    DispatchResponse response = profiler->TakeTypeProfile();
178e509ee18Sopenharmony_ci    ASSERT_TRUE(response.GetMessage() == "TakeTypeProfile not support now");
179e509ee18Sopenharmony_ci}
180e509ee18Sopenharmony_ci
181e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplDispatch)
182e509ee18Sopenharmony_ci{
183e509ee18Sopenharmony_ci    std::string result = "";
184e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
185e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
186e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
187e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
188e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
189e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.Test","params":{}})";
190e509ee18Sopenharmony_ci    DispatchRequest request(msg);
191e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
192e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("Unknown method: Test") != std::string::npos);
193e509ee18Sopenharmony_ci    msg = std::string() + R"({"id":0,"method":"Profiler.disable","params":{}})";
194e509ee18Sopenharmony_ci    DispatchRequest request1 = DispatchRequest(msg);
195e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request1);
196e509ee18Sopenharmony_ci    if (channel) {
197e509ee18Sopenharmony_ci        delete channel;
198e509ee18Sopenharmony_ci        channel = nullptr;
199e509ee18Sopenharmony_ci    }
200e509ee18Sopenharmony_ci    ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}");
201e509ee18Sopenharmony_ci}
202e509ee18Sopenharmony_ci
203e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplEnable)
204e509ee18Sopenharmony_ci{
205e509ee18Sopenharmony_ci    std::string result = "";
206e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
207e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
208e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
209e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
210e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
211e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.enable","params":{}})";
212e509ee18Sopenharmony_ci    DispatchRequest request(msg);
213e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
214e509ee18Sopenharmony_ci    if (channel) {
215e509ee18Sopenharmony_ci        delete channel;
216e509ee18Sopenharmony_ci        channel = nullptr;
217e509ee18Sopenharmony_ci    }
218e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("protocols") != std::string::npos);
219e509ee18Sopenharmony_ci}
220e509ee18Sopenharmony_ci
221e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplDisable)
222e509ee18Sopenharmony_ci{
223e509ee18Sopenharmony_ci    std::string result = "";
224e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
225e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
226e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
227e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
228e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
229e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.disable","params":{}})";
230e509ee18Sopenharmony_ci    DispatchRequest request(msg);
231e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
232e509ee18Sopenharmony_ci    if (channel) {
233e509ee18Sopenharmony_ci        delete channel;
234e509ee18Sopenharmony_ci        channel = nullptr;
235e509ee18Sopenharmony_ci    }
236e509ee18Sopenharmony_ci    ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}");
237e509ee18Sopenharmony_ci}
238e509ee18Sopenharmony_ci
239e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplStart)
240e509ee18Sopenharmony_ci{
241e509ee18Sopenharmony_ci    std::string result = "";
242e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
243e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
244e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
245e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
246e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
247e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.start","params":{}})";
248e509ee18Sopenharmony_ci    DispatchRequest request(msg);
249e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
250e509ee18Sopenharmony_ci    ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}");
251e509ee18Sopenharmony_ci    msg = std::string() + R"({"id":0,"method":"Profiler.stop","params":{}})";
252e509ee18Sopenharmony_ci    DispatchRequest request1 = DispatchRequest(msg);
253e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request1);
254e509ee18Sopenharmony_ci    if (channel) {
255e509ee18Sopenharmony_ci        delete channel;
256e509ee18Sopenharmony_ci        channel = nullptr;
257e509ee18Sopenharmony_ci    }
258e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("\"id\":0") != std::string::npos);
259e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("\"profile\"") != std::string::npos);
260e509ee18Sopenharmony_ci}
261e509ee18Sopenharmony_ci
262e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplStop)
263e509ee18Sopenharmony_ci{
264e509ee18Sopenharmony_ci    std::string result = "";
265e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
266e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
267e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
268e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
269e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
270e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.stop","params":{}})";
271e509ee18Sopenharmony_ci    DispatchRequest request(msg);
272e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
273e509ee18Sopenharmony_ci    if (channel) {
274e509ee18Sopenharmony_ci        delete channel;
275e509ee18Sopenharmony_ci        channel = nullptr;
276e509ee18Sopenharmony_ci    }
277e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("Stop is failure") != std::string::npos);
278e509ee18Sopenharmony_ci}
279e509ee18Sopenharmony_ci
280e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplSetSamplingInterval)
281e509ee18Sopenharmony_ci{
282e509ee18Sopenharmony_ci    std::string result = "";
283e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
284e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
285e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
286e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
287e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
288e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.setSamplingInterval","params":{}})";
289e509ee18Sopenharmony_ci    DispatchRequest request(msg);
290e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
291e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("wrong params") != std::string::npos);
292e509ee18Sopenharmony_ci    msg = std::string() + R"({"id":0,"method":"Profiler.setSamplingInterval","params":{"interval":24}})";
293e509ee18Sopenharmony_ci    DispatchRequest request1(msg);
294e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request1);
295e509ee18Sopenharmony_ci    if (channel) {
296e509ee18Sopenharmony_ci        delete channel;
297e509ee18Sopenharmony_ci        channel = nullptr;
298e509ee18Sopenharmony_ci    }
299e509ee18Sopenharmony_ci    ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}");
300e509ee18Sopenharmony_ci}
301e509ee18Sopenharmony_ci
302e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplGetBestEffortCoverage)
303e509ee18Sopenharmony_ci{
304e509ee18Sopenharmony_ci    std::string result = "";
305e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
306e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
307e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
308e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
309e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
310e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.getBestEffortCoverage","params":{}})";
311e509ee18Sopenharmony_ci    DispatchRequest request(msg);
312e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
313e509ee18Sopenharmony_ci    if (channel) {
314e509ee18Sopenharmony_ci        delete channel;
315e509ee18Sopenharmony_ci        channel = nullptr;
316e509ee18Sopenharmony_ci    }
317e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("GetBestEffortCoverage not support now") != std::string::npos);
318e509ee18Sopenharmony_ci}
319e509ee18Sopenharmony_ci
320e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplStopPreciseCoverage)
321e509ee18Sopenharmony_ci{
322e509ee18Sopenharmony_ci    std::string result = "";
323e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
324e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
325e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
326e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
327e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
328e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.stopPreciseCoverage","params":{}})";
329e509ee18Sopenharmony_ci    DispatchRequest request(msg);
330e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
331e509ee18Sopenharmony_ci    if (channel) {
332e509ee18Sopenharmony_ci        delete channel;
333e509ee18Sopenharmony_ci        channel = nullptr;
334e509ee18Sopenharmony_ci    }
335e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("StopPreciseCoverage not support now") != std::string::npos);
336e509ee18Sopenharmony_ci}
337e509ee18Sopenharmony_ci
338e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplTakePreciseCoverage)
339e509ee18Sopenharmony_ci{
340e509ee18Sopenharmony_ci    std::string result = "";
341e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
342e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
343e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
344e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
345e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
346e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.takePreciseCoverage","params":{}})";
347e509ee18Sopenharmony_ci    DispatchRequest request(msg);
348e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
349e509ee18Sopenharmony_ci    if (channel) {
350e509ee18Sopenharmony_ci        delete channel;
351e509ee18Sopenharmony_ci        channel = nullptr;
352e509ee18Sopenharmony_ci    }
353e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("TakePreciseCoverage not support now") != std::string::npos);
354e509ee18Sopenharmony_ci}
355e509ee18Sopenharmony_ci
356e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplStartPreciseCoverage)
357e509ee18Sopenharmony_ci{
358e509ee18Sopenharmony_ci    std::string result = "";
359e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
360e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
361e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
362e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
363e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
364e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.startPreciseCoverage","params":{}})";
365e509ee18Sopenharmony_ci    DispatchRequest request(msg);
366e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
367e509ee18Sopenharmony_ci    if (channel) {
368e509ee18Sopenharmony_ci        delete channel;
369e509ee18Sopenharmony_ci        channel = nullptr;
370e509ee18Sopenharmony_ci    }
371e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("StartPreciseCoverage not support now") != std::string::npos);
372e509ee18Sopenharmony_ci}
373e509ee18Sopenharmony_ci
374e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplStartTypeProfile)
375e509ee18Sopenharmony_ci{
376e509ee18Sopenharmony_ci    std::string result = "";
377e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
378e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
379e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
380e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
381e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
382e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.startTypeProfile","params":{}})";
383e509ee18Sopenharmony_ci    DispatchRequest request(msg);
384e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
385e509ee18Sopenharmony_ci    if (channel) {
386e509ee18Sopenharmony_ci        delete channel;
387e509ee18Sopenharmony_ci        channel = nullptr;
388e509ee18Sopenharmony_ci    }
389e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("StartTypeProfile not support now") != std::string::npos);
390e509ee18Sopenharmony_ci}
391e509ee18Sopenharmony_ci
392e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplStopTypeProfile)
393e509ee18Sopenharmony_ci{
394e509ee18Sopenharmony_ci    std::string result = "";
395e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
396e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
397e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
398e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
399e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
400e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.stopTypeProfile","params":{}})";
401e509ee18Sopenharmony_ci    DispatchRequest request(msg);
402e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
403e509ee18Sopenharmony_ci    if (channel) {
404e509ee18Sopenharmony_ci        delete channel;
405e509ee18Sopenharmony_ci        channel = nullptr;
406e509ee18Sopenharmony_ci    }
407e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("StopTypeProfile not support now") != std::string::npos);
408e509ee18Sopenharmony_ci}
409e509ee18Sopenharmony_ci
410e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplTakeTypeProfile)
411e509ee18Sopenharmony_ci{
412e509ee18Sopenharmony_ci    std::string result = "";
413e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
414e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
415e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
416e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
417e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
418e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.takeTypeProfile","params":{}})";
419e509ee18Sopenharmony_ci    DispatchRequest request(msg);
420e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
421e509ee18Sopenharmony_ci    if (channel) {
422e509ee18Sopenharmony_ci        delete channel;
423e509ee18Sopenharmony_ci        channel = nullptr;
424e509ee18Sopenharmony_ci    }
425e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("TakeTypeProfile not support now") != std::string::npos);
426e509ee18Sopenharmony_ci}
427e509ee18Sopenharmony_ci
428e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplDisableSerializationTimeoutCheck)
429e509ee18Sopenharmony_ci{
430e509ee18Sopenharmony_ci    std::string result = "";
431e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
432e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
433e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
434e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
435e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
436e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.disableSerializationTimeoutCheck","params":{}})";
437e509ee18Sopenharmony_ci    DispatchRequest request(msg);
438e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
439e509ee18Sopenharmony_ci    if (channel) {
440e509ee18Sopenharmony_ci        delete channel;
441e509ee18Sopenharmony_ci        channel = nullptr;
442e509ee18Sopenharmony_ci    }
443e509ee18Sopenharmony_ci    ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}");
444e509ee18Sopenharmony_ci}
445e509ee18Sopenharmony_ci
446e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, DispatcherImplEnableSerializationTimeoutCheck)
447e509ee18Sopenharmony_ci{
448e509ee18Sopenharmony_ci    std::string result = "";
449e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
450e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
451e509ee18Sopenharmony_ci    ProtocolChannel *channel = new ProtocolHandler(callback, ecmaVm);
452e509ee18Sopenharmony_ci    auto tracing = std::make_unique<ProfilerImpl>(ecmaVm, channel);
453e509ee18Sopenharmony_ci    auto dispatcherImpl = std::make_unique<ProfilerImpl::DispatcherImpl>(channel, std::move(tracing));
454e509ee18Sopenharmony_ci    std::string msg = std::string() + R"({"id":0,"method":"Profiler.enableSerializationTimeoutCheck","params":{}})";
455e509ee18Sopenharmony_ci    DispatchRequest request(msg);
456e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request);
457e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("wrong params") != std::string::npos);
458e509ee18Sopenharmony_ci    msg = std::string() + R"({"id":0,"method":"Profiler.enableSerializationTimeoutCheck","params":{"threshold": 5}})";
459e509ee18Sopenharmony_ci    DispatchRequest request1(msg);
460e509ee18Sopenharmony_ci    dispatcherImpl->Dispatch(request1);
461e509ee18Sopenharmony_ci    if (channel) {
462e509ee18Sopenharmony_ci        delete channel;
463e509ee18Sopenharmony_ci        channel = nullptr;
464e509ee18Sopenharmony_ci    }
465e509ee18Sopenharmony_ci    ASSERT_TRUE(result == "{\"id\":0,\"result\":{}}");
466e509ee18Sopenharmony_ci}
467e509ee18Sopenharmony_ci
468e509ee18Sopenharmony_ciHWTEST_F_L0(ProfilerImplTest, FrontendPreciseCoverageDeltaUpdate)
469e509ee18Sopenharmony_ci{
470e509ee18Sopenharmony_ci    std::string result = "";
471e509ee18Sopenharmony_ci    std::function<void(const void*, const std::string &)> callback =
472e509ee18Sopenharmony_ci        [&result]([[maybe_unused]] const void *ptr, const std::string &temp) { result = temp; };
473e509ee18Sopenharmony_ci    ProtocolChannel *channel = nullptr;
474e509ee18Sopenharmony_ci    auto frontend = std::make_unique<ProfilerImpl::Frontend>(channel);
475e509ee18Sopenharmony_ci    frontend->PreciseCoverageDeltaUpdate();
476e509ee18Sopenharmony_ci    ASSERT_TRUE(result == "");
477e509ee18Sopenharmony_ci    if (!channel) {
478e509ee18Sopenharmony_ci        channel = new ProtocolHandler(callback, ecmaVm);
479e509ee18Sopenharmony_ci    }
480e509ee18Sopenharmony_ci    auto frontend1 = std::make_unique<ProfilerImpl::Frontend>(channel);
481e509ee18Sopenharmony_ci    frontend1->PreciseCoverageDeltaUpdate();
482e509ee18Sopenharmony_ci    if (channel) {
483e509ee18Sopenharmony_ci        delete channel;
484e509ee18Sopenharmony_ci        channel = nullptr;
485e509ee18Sopenharmony_ci    }
486e509ee18Sopenharmony_ci    ASSERT_TRUE(result.find("Profile.PreciseCoverageDeltaUpdate") != std::string::npos);
487e509ee18Sopenharmony_ci}
488e509ee18Sopenharmony_ci}  // namespace panda::test
489