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