1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2021 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 "ecmascript/js_array.h" 17e509ee18Sopenharmony_ci#include "ecmascript/js_tagged_value-inl.h" 18e509ee18Sopenharmony_ci#include "ecmascript/object_factory.h" 19e509ee18Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 20e509ee18Sopenharmony_ci#include "tooling/base/pt_events.h" 21e509ee18Sopenharmony_ci#include "tooling/base/pt_types.h" 22e509ee18Sopenharmony_ci#include "dispatcher.h" 23e509ee18Sopenharmony_ci 24e509ee18Sopenharmony_ciusing namespace panda::ecmascript; 25e509ee18Sopenharmony_ciusing namespace panda::ecmascript::tooling; 26e509ee18Sopenharmony_ciusing ObjectType = RemoteObject::TypeName; 27e509ee18Sopenharmony_ciusing ObjectSubType = RemoteObject::SubTypeName; 28e509ee18Sopenharmony_ciusing ObjectClassName = RemoteObject::ClassName; 29e509ee18Sopenharmony_ci 30e509ee18Sopenharmony_cinamespace panda::test { 31e509ee18Sopenharmony_ciclass DebuggerEventsTest : public testing::Test { 32e509ee18Sopenharmony_cipublic: 33e509ee18Sopenharmony_ci static void SetUpTestCase() 34e509ee18Sopenharmony_ci { 35e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "SetUpTestCase"; 36e509ee18Sopenharmony_ci Logger::InitializeStdLogging(Logger::Level::FATAL, LoggerComponentMaskAll); 37e509ee18Sopenharmony_ci } 38e509ee18Sopenharmony_ci 39e509ee18Sopenharmony_ci static void TearDownTestCase() 40e509ee18Sopenharmony_ci { 41e509ee18Sopenharmony_ci Logger::InitializeStdLogging(Logger::Level::ERROR, LoggerComponentMaskAll); 42e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "TearDownCase"; 43e509ee18Sopenharmony_ci } 44e509ee18Sopenharmony_ci 45e509ee18Sopenharmony_ci void SetUp() override 46e509ee18Sopenharmony_ci { 47e509ee18Sopenharmony_ci TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope); 48e509ee18Sopenharmony_ci // Main logic is JSON parser, so not need trigger GC to decrease execute time 49e509ee18Sopenharmony_ci ecmaVm->SetEnableForceGC(false); 50e509ee18Sopenharmony_ci } 51e509ee18Sopenharmony_ci 52e509ee18Sopenharmony_ci void TearDown() override 53e509ee18Sopenharmony_ci { 54e509ee18Sopenharmony_ci TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope); 55e509ee18Sopenharmony_ci } 56e509ee18Sopenharmony_ci 57e509ee18Sopenharmony_ciprotected: 58e509ee18Sopenharmony_ci EcmaVM *ecmaVm {nullptr}; 59e509ee18Sopenharmony_ci EcmaHandleScope *scope {nullptr}; 60e509ee18Sopenharmony_ci JSThread *thread {nullptr}; 61e509ee18Sopenharmony_ci}; 62e509ee18Sopenharmony_ci 63e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, BreakpointResolvedToJsonTest) 64e509ee18Sopenharmony_ci{ 65e509ee18Sopenharmony_ci BreakpointResolved breakpointResolved; 66e509ee18Sopenharmony_ci 67e509ee18Sopenharmony_ci auto location = std::make_unique<Location>(); 68e509ee18Sopenharmony_ci location->SetScriptId(2).SetLine(99); 69e509ee18Sopenharmony_ci breakpointResolved.SetBreakpointId("00").SetLocation(std::move(location)); 70e509ee18Sopenharmony_ci 71e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json; 72e509ee18Sopenharmony_ci ASSERT_EQ(breakpointResolved.ToJson()->GetObject("params", &json), Result::SUCCESS); 73e509ee18Sopenharmony_ci std::string breakpointId; 74e509ee18Sopenharmony_ci ASSERT_EQ(json->GetString("breakpointId", &breakpointId), Result::SUCCESS); 75e509ee18Sopenharmony_ci EXPECT_EQ(breakpointId, "00"); 76e509ee18Sopenharmony_ci 77e509ee18Sopenharmony_ci std::unique_ptr<PtJson> locationJson; 78e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("location", &locationJson), Result::SUCCESS); 79e509ee18Sopenharmony_ci std::string scriptId; 80e509ee18Sopenharmony_ci ASSERT_EQ(locationJson->GetString("scriptId", &scriptId), Result::SUCCESS); 81e509ee18Sopenharmony_ci EXPECT_EQ(scriptId, "2"); 82e509ee18Sopenharmony_ci int32_t lineNumber; 83e509ee18Sopenharmony_ci ASSERT_EQ(locationJson->GetInt("lineNumber", &lineNumber), Result::SUCCESS); 84e509ee18Sopenharmony_ci EXPECT_EQ(lineNumber, 99); 85e509ee18Sopenharmony_ci} 86e509ee18Sopenharmony_ci 87e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, PausedToJsonTest) 88e509ee18Sopenharmony_ci{ 89e509ee18Sopenharmony_ci Paused paused; 90e509ee18Sopenharmony_ci auto callFrames_ = std::vector<std::unique_ptr<CallFrame>>(); 91e509ee18Sopenharmony_ci std::unique_ptr<CallFrame> callFrame = std::make_unique<CallFrame>(); 92e509ee18Sopenharmony_ci std::unique_ptr<Location> location = std::make_unique<Location>(); 93e509ee18Sopenharmony_ci location->SetScriptId(13).SetLine(16); 94e509ee18Sopenharmony_ci 95e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> res = std::make_unique<RemoteObject>(); 96e509ee18Sopenharmony_ci res->SetType("idle2"); 97e509ee18Sopenharmony_ci callFrame->SetCallFrameId(55); 98e509ee18Sopenharmony_ci callFrame->SetLocation(std::move(location)); 99e509ee18Sopenharmony_ci callFrame->SetThis(std::move(res)); 100e509ee18Sopenharmony_ci callFrames_.emplace_back(std::move(callFrame)); 101e509ee18Sopenharmony_ci 102e509ee18Sopenharmony_ci paused.SetCallFrames(std::move(callFrames_)) 103e509ee18Sopenharmony_ci .SetReason(PauseReason::EXCEPTION); 104e509ee18Sopenharmony_ci 105e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = paused.ToJson(); 106e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 107e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 108e509ee18Sopenharmony_ci 109e509ee18Sopenharmony_ci std::string reason; 110e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("reason", &reason), Result::SUCCESS); 111e509ee18Sopenharmony_ci EXPECT_EQ("exception", reason); 112e509ee18Sopenharmony_ci std::unique_ptr<PtJson> callFrames; 113e509ee18Sopenharmony_ci ASSERT_EQ(params->GetArray("callFrames", &callFrames), Result::SUCCESS); 114e509ee18Sopenharmony_ci ASSERT_NE(callFrames, nullptr); 115e509ee18Sopenharmony_ci EXPECT_EQ(callFrames->GetSize(), 1); 116e509ee18Sopenharmony_ci 117e509ee18Sopenharmony_ci Paused paused1; 118e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> obj = std::make_unique<RemoteObject>(); 119e509ee18Sopenharmony_ci paused1.SetData(std::move(obj)).SetReason(PauseReason::AMBIGUOUS).SetReason(PauseReason::ASSERT) 120e509ee18Sopenharmony_ci .SetReason(PauseReason::DEBUGCOMMAND).SetReason(PauseReason::DOM).SetReason(PauseReason::EVENTLISTENER) 121e509ee18Sopenharmony_ci .SetReason(PauseReason::OOM).SetReason(PauseReason::OTHER).SetReason(PauseReason::PROMISEREJECTION) 122e509ee18Sopenharmony_ci .SetReason(PauseReason::XHR).SetReason(PauseReason::BREAK_ON_START); 123e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json1 = paused1.ToJson(); 124e509ee18Sopenharmony_ci ASSERT_EQ(json1->GetObject("params", ¶ms), Result::SUCCESS); 125e509ee18Sopenharmony_ci} 126e509ee18Sopenharmony_ci 127e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, NativeCallingToJsonTest) 128e509ee18Sopenharmony_ci{ 129e509ee18Sopenharmony_ci NativeCalling nativeCalling; 130e509ee18Sopenharmony_ci nativeCalling.SetNativeAddress(nullptr); 131e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = nativeCalling.ToJson(); 132e509ee18Sopenharmony_ci 133e509ee18Sopenharmony_ci std::string method; 134e509ee18Sopenharmony_ci ASSERT_EQ(json->GetString("method", &method), Result::SUCCESS); 135e509ee18Sopenharmony_ci EXPECT_EQ(nativeCalling.GetName(), method); 136e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 137e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 138e509ee18Sopenharmony_ci 139e509ee18Sopenharmony_ci int64_t nativeAddress; 140e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt64("nativeAddress", &nativeAddress), Result::SUCCESS); 141e509ee18Sopenharmony_ci} 142e509ee18Sopenharmony_ci 143e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, ResumedToJsonTest) 144e509ee18Sopenharmony_ci{ 145e509ee18Sopenharmony_ci Resumed resumed; 146e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = resumed.ToJson(); 147e509ee18Sopenharmony_ci 148e509ee18Sopenharmony_ci std::string method; 149e509ee18Sopenharmony_ci ASSERT_EQ(json->GetString("method", &method), Result::SUCCESS); 150e509ee18Sopenharmony_ci EXPECT_EQ(resumed.GetName(), method); 151e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 152e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 153e509ee18Sopenharmony_ci} 154e509ee18Sopenharmony_ci 155e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, ScriptFailedToParseToJsonTest) 156e509ee18Sopenharmony_ci{ 157e509ee18Sopenharmony_ci ScriptFailedToParse parsed; 158e509ee18Sopenharmony_ci parsed.SetScriptId(100) 159e509ee18Sopenharmony_ci .SetUrl("use/test.js") 160e509ee18Sopenharmony_ci .SetStartLine(0) 161e509ee18Sopenharmony_ci .SetStartColumn(4) 162e509ee18Sopenharmony_ci .SetEndLine(10) 163e509ee18Sopenharmony_ci .SetEndColumn(10) 164e509ee18Sopenharmony_ci .SetExecutionContextId(2) 165e509ee18Sopenharmony_ci .SetHash("hash0001") 166e509ee18Sopenharmony_ci .SetSourceMapURL("usr/") 167e509ee18Sopenharmony_ci .SetHasSourceURL(true) 168e509ee18Sopenharmony_ci .SetIsModule(true) 169e509ee18Sopenharmony_ci .SetLength(34) 170e509ee18Sopenharmony_ci .SetCodeOffset(432) 171e509ee18Sopenharmony_ci .SetScriptLanguage("JavaScript") 172e509ee18Sopenharmony_ci .SetEmbedderName("hh"); 173e509ee18Sopenharmony_ci 174e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = parsed.ToJson(); 175e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 176e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 177e509ee18Sopenharmony_ci 178e509ee18Sopenharmony_ci std::string tmpStr; 179e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("scriptId", &tmpStr), Result::SUCCESS); 180e509ee18Sopenharmony_ci EXPECT_EQ("100", tmpStr); 181e509ee18Sopenharmony_ci 182e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("url", &tmpStr), Result::SUCCESS); 183e509ee18Sopenharmony_ci EXPECT_EQ("use/test.js", tmpStr); 184e509ee18Sopenharmony_ci 185e509ee18Sopenharmony_ci int tmpInt; 186e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("startLine", &tmpInt), Result::SUCCESS); 187e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 0); 188e509ee18Sopenharmony_ci 189e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("startColumn", &tmpInt), Result::SUCCESS); 190e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 4); 191e509ee18Sopenharmony_ci 192e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("endLine", &tmpInt), Result::SUCCESS); 193e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 10); 194e509ee18Sopenharmony_ci 195e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("endColumn", &tmpInt), Result::SUCCESS); 196e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 10); 197e509ee18Sopenharmony_ci 198e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("executionContextId", &tmpInt), Result::SUCCESS); 199e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 2); 200e509ee18Sopenharmony_ci 201e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("hash", &tmpStr), Result::SUCCESS); 202e509ee18Sopenharmony_ci EXPECT_EQ("hash0001", tmpStr); 203e509ee18Sopenharmony_ci 204e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("sourceMapURL", &tmpStr), Result::SUCCESS); 205e509ee18Sopenharmony_ci EXPECT_EQ("usr/", tmpStr); 206e509ee18Sopenharmony_ci 207e509ee18Sopenharmony_ci bool tmpBool; 208e509ee18Sopenharmony_ci ASSERT_EQ(params->GetBool("hasSourceURL", &tmpBool), Result::SUCCESS); 209e509ee18Sopenharmony_ci ASSERT_TRUE(tmpBool); 210e509ee18Sopenharmony_ci 211e509ee18Sopenharmony_ci ASSERT_EQ(params->GetBool("isModule", &tmpBool), Result::SUCCESS); 212e509ee18Sopenharmony_ci ASSERT_TRUE(tmpBool); 213e509ee18Sopenharmony_ci 214e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("length", &tmpInt), Result::SUCCESS); 215e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 34); 216e509ee18Sopenharmony_ci 217e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("codeOffset", &tmpInt), Result::SUCCESS); 218e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 432); 219e509ee18Sopenharmony_ci 220e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("scriptLanguage", &tmpStr), Result::SUCCESS); 221e509ee18Sopenharmony_ci EXPECT_EQ("JavaScript", tmpStr); 222e509ee18Sopenharmony_ci 223e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("embedderName", &tmpStr), Result::SUCCESS); 224e509ee18Sopenharmony_ci EXPECT_EQ("hh", tmpStr); 225e509ee18Sopenharmony_ci 226e509ee18Sopenharmony_ci ScriptFailedToParse parsed1; 227e509ee18Sopenharmony_ci json = parsed1.ToJson(); 228e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 229e509ee18Sopenharmony_ci} 230e509ee18Sopenharmony_ci 231e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, ScriptParsedToJsonTest) 232e509ee18Sopenharmony_ci{ 233e509ee18Sopenharmony_ci ScriptParsed parsed; 234e509ee18Sopenharmony_ci parsed.SetScriptId(10) 235e509ee18Sopenharmony_ci .SetUrl("use/test.js") 236e509ee18Sopenharmony_ci .SetStartLine(0) 237e509ee18Sopenharmony_ci .SetStartColumn(4) 238e509ee18Sopenharmony_ci .SetEndLine(10) 239e509ee18Sopenharmony_ci .SetEndColumn(10) 240e509ee18Sopenharmony_ci .SetExecutionContextId(2) 241e509ee18Sopenharmony_ci .SetHash("hash0001") 242e509ee18Sopenharmony_ci .SetIsLiveEdit(true) 243e509ee18Sopenharmony_ci .SetSourceMapURL("usr/") 244e509ee18Sopenharmony_ci .SetHasSourceURL(true) 245e509ee18Sopenharmony_ci .SetIsModule(true) 246e509ee18Sopenharmony_ci .SetLength(34) 247e509ee18Sopenharmony_ci .SetCodeOffset(432) 248e509ee18Sopenharmony_ci .SetScriptLanguage("JavaScript") 249e509ee18Sopenharmony_ci .SetEmbedderName("hh"); 250e509ee18Sopenharmony_ci 251e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = parsed.ToJson(); 252e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 253e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 254e509ee18Sopenharmony_ci 255e509ee18Sopenharmony_ci std::string tmpStr; 256e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("scriptId", &tmpStr), Result::SUCCESS); 257e509ee18Sopenharmony_ci EXPECT_EQ("10", tmpStr); 258e509ee18Sopenharmony_ci 259e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("url", &tmpStr), Result::SUCCESS); 260e509ee18Sopenharmony_ci EXPECT_EQ("use/test.js", tmpStr); 261e509ee18Sopenharmony_ci 262e509ee18Sopenharmony_ci int tmpInt; 263e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("startLine", &tmpInt), Result::SUCCESS); 264e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 0); 265e509ee18Sopenharmony_ci 266e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("startColumn", &tmpInt), Result::SUCCESS); 267e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 4); 268e509ee18Sopenharmony_ci 269e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("endLine", &tmpInt), Result::SUCCESS); 270e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 10); 271e509ee18Sopenharmony_ci 272e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("endColumn", &tmpInt), Result::SUCCESS); 273e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 10); 274e509ee18Sopenharmony_ci 275e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("executionContextId", &tmpInt), Result::SUCCESS); 276e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 2); 277e509ee18Sopenharmony_ci 278e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("hash", &tmpStr), Result::SUCCESS); 279e509ee18Sopenharmony_ci EXPECT_EQ("hash0001", tmpStr); 280e509ee18Sopenharmony_ci 281e509ee18Sopenharmony_ci bool tmpBool; 282e509ee18Sopenharmony_ci ASSERT_EQ(params->GetBool("isLiveEdit", &tmpBool), Result::SUCCESS); 283e509ee18Sopenharmony_ci ASSERT_TRUE(tmpBool); 284e509ee18Sopenharmony_ci 285e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("sourceMapURL", &tmpStr), Result::SUCCESS); 286e509ee18Sopenharmony_ci EXPECT_EQ("usr/", tmpStr); 287e509ee18Sopenharmony_ci 288e509ee18Sopenharmony_ci ASSERT_EQ(params->GetBool("hasSourceURL", &tmpBool), Result::SUCCESS); 289e509ee18Sopenharmony_ci ASSERT_TRUE(tmpBool); 290e509ee18Sopenharmony_ci 291e509ee18Sopenharmony_ci ASSERT_EQ(params->GetBool("isModule", &tmpBool), Result::SUCCESS); 292e509ee18Sopenharmony_ci ASSERT_TRUE(tmpBool); 293e509ee18Sopenharmony_ci 294e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("length", &tmpInt), Result::SUCCESS); 295e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 34); 296e509ee18Sopenharmony_ci 297e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("codeOffset", &tmpInt), Result::SUCCESS); 298e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 432); 299e509ee18Sopenharmony_ci 300e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("scriptLanguage", &tmpStr), Result::SUCCESS); 301e509ee18Sopenharmony_ci EXPECT_EQ("JavaScript", tmpStr); 302e509ee18Sopenharmony_ci 303e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("embedderName", &tmpStr), Result::SUCCESS); 304e509ee18Sopenharmony_ci EXPECT_EQ("hh", tmpStr); 305e509ee18Sopenharmony_ci} 306e509ee18Sopenharmony_ci 307e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, ConsoleProfileFinishedToJsonTest) 308e509ee18Sopenharmony_ci{ 309e509ee18Sopenharmony_ci ConsoleProfileFinished consoleProfileFinished; 310e509ee18Sopenharmony_ci 311e509ee18Sopenharmony_ci auto location = std::make_unique<Location>(); 312e509ee18Sopenharmony_ci location->SetScriptId(13).SetLine(20); 313e509ee18Sopenharmony_ci std::vector<std::unique_ptr<ProfileNode>> v; 314e509ee18Sopenharmony_ci auto profile = std::make_unique<Profile>(); 315e509ee18Sopenharmony_ci profile->SetNodes(std::move(v)) 316e509ee18Sopenharmony_ci .SetStartTime(0) 317e509ee18Sopenharmony_ci .SetEndTime(15) 318e509ee18Sopenharmony_ci .SetSamples(std::vector<int32_t>{}) 319e509ee18Sopenharmony_ci .SetTimeDeltas(std::vector<int32_t>{}); 320e509ee18Sopenharmony_ci consoleProfileFinished.SetId("11").SetLocation(std::move(location)).SetProfile(std::move(profile)).SetTitle("001"); 321e509ee18Sopenharmony_ci 322e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = consoleProfileFinished.ToJson(); 323e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 324e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 325e509ee18Sopenharmony_ci 326e509ee18Sopenharmony_ci std::string tmpStr; 327e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("id", &tmpStr), Result::SUCCESS); 328e509ee18Sopenharmony_ci EXPECT_EQ("11", tmpStr); 329e509ee18Sopenharmony_ci 330e509ee18Sopenharmony_ci std::unique_ptr<PtJson> tmpJson; 331e509ee18Sopenharmony_ci ASSERT_EQ(params->GetObject("location", &tmpJson), Result::SUCCESS); 332e509ee18Sopenharmony_ci ASSERT_EQ(params->GetObject("profile", &tmpJson), Result::SUCCESS); 333e509ee18Sopenharmony_ci 334e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("title", &tmpStr), Result::SUCCESS); 335e509ee18Sopenharmony_ci EXPECT_EQ("001", tmpStr); 336e509ee18Sopenharmony_ci 337e509ee18Sopenharmony_ci ConsoleProfileFinished consoleProfileFinished1; 338e509ee18Sopenharmony_ci auto location1 = std::make_unique<Location>(); 339e509ee18Sopenharmony_ci auto profile1 = std::make_unique<Profile>(); 340e509ee18Sopenharmony_ci consoleProfileFinished1.SetLocation(std::move(location1)).SetProfile(std::move(profile1)); 341e509ee18Sopenharmony_ci json = consoleProfileFinished1.ToJson(); 342e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 343e509ee18Sopenharmony_ci} 344e509ee18Sopenharmony_ci 345e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, ConsoleProfileStartedToJsonTest) 346e509ee18Sopenharmony_ci{ 347e509ee18Sopenharmony_ci ConsoleProfileStarted consoleProfileStarted; 348e509ee18Sopenharmony_ci 349e509ee18Sopenharmony_ci auto location = std::make_unique<Location>(); 350e509ee18Sopenharmony_ci location->SetScriptId(17).SetLine(30); 351e509ee18Sopenharmony_ci consoleProfileStarted.SetId("12").SetLocation(std::move(location)).SetTitle("002"); 352e509ee18Sopenharmony_ci 353e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = consoleProfileStarted.ToJson(); 354e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 355e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 356e509ee18Sopenharmony_ci 357e509ee18Sopenharmony_ci std::string tmpStr; 358e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("id", &tmpStr), Result::SUCCESS); 359e509ee18Sopenharmony_ci EXPECT_EQ("12", tmpStr); 360e509ee18Sopenharmony_ci 361e509ee18Sopenharmony_ci std::unique_ptr<PtJson> tmpJson = consoleProfileStarted.GetLocation()->ToJson(); 362e509ee18Sopenharmony_ci ASSERT_EQ(tmpJson->GetString("scriptId", &tmpStr), Result::SUCCESS); 363e509ee18Sopenharmony_ci EXPECT_EQ("17", tmpStr); 364e509ee18Sopenharmony_ci int tmpInt; 365e509ee18Sopenharmony_ci ASSERT_EQ(tmpJson->GetInt("lineNumber", &tmpInt), Result::SUCCESS); 366e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 30); 367e509ee18Sopenharmony_ci 368e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("title", &tmpStr), Result::SUCCESS); 369e509ee18Sopenharmony_ci EXPECT_EQ("002", tmpStr); 370e509ee18Sopenharmony_ci 371e509ee18Sopenharmony_ci ConsoleProfileStarted consoleProfileStarted1; 372e509ee18Sopenharmony_ci auto location1 = std::make_unique<Location>(); 373e509ee18Sopenharmony_ci consoleProfileStarted1.SetLocation(std::move(location1)); 374e509ee18Sopenharmony_ci json = consoleProfileStarted1.ToJson(); 375e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 376e509ee18Sopenharmony_ci} 377e509ee18Sopenharmony_ci 378e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, PreciseCoverageDeltaUpdateToJsonTest) 379e509ee18Sopenharmony_ci{ 380e509ee18Sopenharmony_ci PreciseCoverageDeltaUpdate preciseCoverageDeltaUpdate; 381e509ee18Sopenharmony_ci 382e509ee18Sopenharmony_ci std::vector<std::unique_ptr<ScriptCoverage>> v; 383e509ee18Sopenharmony_ci preciseCoverageDeltaUpdate.SetOccasion("percise") 384e509ee18Sopenharmony_ci .SetResult(std::move(v)) 385e509ee18Sopenharmony_ci .SetTimestamp(77); 386e509ee18Sopenharmony_ci 387e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = preciseCoverageDeltaUpdate.ToJson(); 388e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 389e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 390e509ee18Sopenharmony_ci 391e509ee18Sopenharmony_ci int64_t tmpInt; 392e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt64("timestamp", &tmpInt), Result::SUCCESS); 393e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 77); 394e509ee18Sopenharmony_ci 395e509ee18Sopenharmony_ci std::string tmpStr; 396e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("occasion", &tmpStr), Result::SUCCESS); 397e509ee18Sopenharmony_ci EXPECT_EQ("percise", tmpStr); 398e509ee18Sopenharmony_ci 399e509ee18Sopenharmony_ci std::unique_ptr<PtJson> tmpArray; 400e509ee18Sopenharmony_ci ASSERT_EQ(params->GetArray("result", &tmpArray), Result::SUCCESS); 401e509ee18Sopenharmony_ci 402e509ee18Sopenharmony_ci PreciseCoverageDeltaUpdate preciseCoverageDeltaUpdate1; 403e509ee18Sopenharmony_ci std::unique_ptr<ScriptCoverage> scriptCoverage; 404e509ee18Sopenharmony_ci std::string msg = std::string() + R"({"id":0,"method":"Debugger.Test","params":{ 405e509ee18Sopenharmony_ci "scriptId":"1001", 406e509ee18Sopenharmony_ci "url":"url17", 407e509ee18Sopenharmony_ci "functions":[{"functionName":"Create0", 408e509ee18Sopenharmony_ci "ranges":[{"startOffset":0, "endOffset":13, "count":13}], 409e509ee18Sopenharmony_ci "isBlockCoverage":true}]}})"; 410e509ee18Sopenharmony_ci scriptCoverage = ScriptCoverage::Create(DispatchRequest(msg).GetParams()); 411e509ee18Sopenharmony_ci v.push_back(std::move(scriptCoverage)); 412e509ee18Sopenharmony_ci preciseCoverageDeltaUpdate1.SetResult(std::move(v)); 413e509ee18Sopenharmony_ci json = preciseCoverageDeltaUpdate1.ToJson(); 414e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 415e509ee18Sopenharmony_ci ASSERT_EQ(params->GetArray("result", &tmpArray), Result::SUCCESS); 416e509ee18Sopenharmony_ci} 417e509ee18Sopenharmony_ci 418e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, HeapStatsUpdateToJsonTest) 419e509ee18Sopenharmony_ci{ 420e509ee18Sopenharmony_ci HeapStatsUpdate heapStatsUpdate; 421e509ee18Sopenharmony_ci heapStatsUpdate.SetStatsUpdate(std::vector<int32_t> {}); 422e509ee18Sopenharmony_ci 423e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = heapStatsUpdate.ToJson(); 424e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 425e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 426e509ee18Sopenharmony_ci 427e509ee18Sopenharmony_ci std::unique_ptr<PtJson> tmpArray; 428e509ee18Sopenharmony_ci ASSERT_EQ(params->GetArray("statsUpdate", &tmpArray), Result::SUCCESS); 429e509ee18Sopenharmony_ci 430e509ee18Sopenharmony_ci HeapStatsUpdate heapStatsUpdate1; 431e509ee18Sopenharmony_ci heapStatsUpdate1.SetStatsUpdate(std::vector<int32_t> {1, 12, 20}); 432e509ee18Sopenharmony_ci json = heapStatsUpdate1.ToJson(); 433e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 434e509ee18Sopenharmony_ci} 435e509ee18Sopenharmony_ci 436e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, LastSeenObjectIdToJsonTest) 437e509ee18Sopenharmony_ci{ 438e509ee18Sopenharmony_ci LastSeenObjectId lastSeenObjectId; 439e509ee18Sopenharmony_ci lastSeenObjectId.SetLastSeenObjectId(10).SetTimestamp(77); 440e509ee18Sopenharmony_ci 441e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = lastSeenObjectId.ToJson(); 442e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 443e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 444e509ee18Sopenharmony_ci 445e509ee18Sopenharmony_ci int64_t tmpInt64; 446e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt64("timestamp", &tmpInt64), Result::SUCCESS); 447e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt64, 77); 448e509ee18Sopenharmony_ci 449e509ee18Sopenharmony_ci int tmpInt; 450e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("lastSeenObjectId", &tmpInt), Result::SUCCESS); 451e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 10); 452e509ee18Sopenharmony_ci} 453e509ee18Sopenharmony_ci 454e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, ReportHeapSnapshotProgressToJsonTest) 455e509ee18Sopenharmony_ci{ 456e509ee18Sopenharmony_ci ReportHeapSnapshotProgress reportHeapSnapshotProgress; 457e509ee18Sopenharmony_ci reportHeapSnapshotProgress.SetDone(10).SetTotal(100); 458e509ee18Sopenharmony_ci 459e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = reportHeapSnapshotProgress.ToJson(); 460e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 461e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 462e509ee18Sopenharmony_ci 463e509ee18Sopenharmony_ci int tmpInt; 464e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("done", &tmpInt), Result::SUCCESS); 465e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 10); 466e509ee18Sopenharmony_ci 467e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("total", &tmpInt), Result::SUCCESS); 468e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 100); 469e509ee18Sopenharmony_ci} 470e509ee18Sopenharmony_ci 471e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, BufferUsageToJsonTest) 472e509ee18Sopenharmony_ci{ 473e509ee18Sopenharmony_ci BufferUsage bufferUsage; 474e509ee18Sopenharmony_ci bufferUsage.SetPercentFull(17).SetEventCount(15).SetValue(12); 475e509ee18Sopenharmony_ci 476e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = bufferUsage.ToJson(); 477e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 478e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 479e509ee18Sopenharmony_ci 480e509ee18Sopenharmony_ci int tmpInt; 481e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("percentFull", &tmpInt), Result::SUCCESS); 482e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 17); 483e509ee18Sopenharmony_ci 484e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("eventCount", &tmpInt), Result::SUCCESS); 485e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 15); 486e509ee18Sopenharmony_ci 487e509ee18Sopenharmony_ci ASSERT_EQ(params->GetInt("value", &tmpInt), Result::SUCCESS); 488e509ee18Sopenharmony_ci EXPECT_EQ(tmpInt, 12); 489e509ee18Sopenharmony_ci} 490e509ee18Sopenharmony_ci 491e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, DataCollectedToJsonTest) 492e509ee18Sopenharmony_ci{ 493e509ee18Sopenharmony_ci std::unique_ptr<std::vector<TraceEvent>> traceEvents = std::make_unique<std::vector<TraceEvent>>(); 494e509ee18Sopenharmony_ci int64_t ts = 604898475815; 495e509ee18Sopenharmony_ci TraceEvent event("timeline", "UpdateCounters", "I", getpid(), 1415); 496e509ee18Sopenharmony_ci event.SetTs(ts); 497e509ee18Sopenharmony_ci event.SetTts(ts); 498e509ee18Sopenharmony_ci event.SetS("t"); 499e509ee18Sopenharmony_ci std::string args = "{\"data\":{\"jsHeapSizeUsed\":" + std::to_string(1024) + "}}"; 500e509ee18Sopenharmony_ci event.SetArgs(args); 501e509ee18Sopenharmony_ci traceEvents->emplace_back(event); 502e509ee18Sopenharmony_ci 503e509ee18Sopenharmony_ci DataCollected dataCollected; 504e509ee18Sopenharmony_ci dataCollected.SetTraceEvents(std::move(traceEvents)); 505e509ee18Sopenharmony_ci 506e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = dataCollected.ToJson(); 507e509ee18Sopenharmony_ci std::string method; 508e509ee18Sopenharmony_ci ASSERT_EQ(json->GetString("method", &method), Result::SUCCESS); 509e509ee18Sopenharmony_ci EXPECT_EQ(dataCollected.GetName(), method); 510e509ee18Sopenharmony_ci 511e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 512e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 513e509ee18Sopenharmony_ci 514e509ee18Sopenharmony_ci std::unique_ptr<PtJson> tmpArray; 515e509ee18Sopenharmony_ci ASSERT_EQ(params->GetArray("value", &tmpArray), Result::SUCCESS); 516e509ee18Sopenharmony_ci} 517e509ee18Sopenharmony_ci 518e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, TracingCompleteToJsonTest) 519e509ee18Sopenharmony_ci{ 520e509ee18Sopenharmony_ci TracingComplete tracingComplete; 521e509ee18Sopenharmony_ci auto traceFormat = std::make_unique<StreamFormat>(); 522e509ee18Sopenharmony_ci auto streamCompression = std::make_unique<StreamCompression>(); 523e509ee18Sopenharmony_ci tracingComplete.SetDataLossOccurred(true) 524e509ee18Sopenharmony_ci .SetTraceFormat(std::move(traceFormat)) 525e509ee18Sopenharmony_ci .SetStreamCompression(std::move(streamCompression)); 526e509ee18Sopenharmony_ci 527e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = tracingComplete.ToJson(); 528e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 529e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 530e509ee18Sopenharmony_ci 531e509ee18Sopenharmony_ci bool tmpBool; 532e509ee18Sopenharmony_ci ASSERT_EQ(params->GetBool("dataLossOccurred", &tmpBool), Result::SUCCESS); 533e509ee18Sopenharmony_ci 534e509ee18Sopenharmony_ci std::string tmpStr; 535e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("traceFormat", &tmpStr), Result::SUCCESS); 536e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("streamCompression", &tmpStr), Result::SUCCESS); 537e509ee18Sopenharmony_ci} 538e509ee18Sopenharmony_ci 539e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, MixedStackToJsonTest) 540e509ee18Sopenharmony_ci{ 541e509ee18Sopenharmony_ci MixedStack mixedStack; 542e509ee18Sopenharmony_ci auto callFrames_ = std::vector<std::unique_ptr<CallFrame>>(); 543e509ee18Sopenharmony_ci std::unique_ptr<CallFrame> callFrame = std::make_unique<CallFrame>(); 544e509ee18Sopenharmony_ci std::unique_ptr<Location> location = std::make_unique<Location>(); 545e509ee18Sopenharmony_ci location->SetScriptId(13).SetLine(16); 546e509ee18Sopenharmony_ci 547e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> res = std::make_unique<RemoteObject>(); 548e509ee18Sopenharmony_ci res->SetType("idle2"); 549e509ee18Sopenharmony_ci 550e509ee18Sopenharmony_ci callFrame->SetCallFrameId(55); 551e509ee18Sopenharmony_ci callFrame->SetLocation(std::move(location)); 552e509ee18Sopenharmony_ci callFrame->SetThis(std::move(res)); 553e509ee18Sopenharmony_ci callFrames_.emplace_back(std::move(callFrame)); 554e509ee18Sopenharmony_ci mixedStack.SetCallFrames(std::move(callFrames_)); 555e509ee18Sopenharmony_ci 556e509ee18Sopenharmony_ci std::vector<void *> p; 557e509ee18Sopenharmony_ci int a = 5; 558e509ee18Sopenharmony_ci void * ptr = &a; 559e509ee18Sopenharmony_ci p.emplace_back(std::move(ptr)); 560e509ee18Sopenharmony_ci mixedStack.SetNativePointers(std::move(p)); 561e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = mixedStack.ToJson(); 562e509ee18Sopenharmony_ci 563e509ee18Sopenharmony_ci std::string method; 564e509ee18Sopenharmony_ci ASSERT_EQ(json->GetString("method", &method), Result::SUCCESS); 565e509ee18Sopenharmony_ci EXPECT_EQ(mixedStack.GetName(), method); 566e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 567e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 568e509ee18Sopenharmony_ci std::unique_ptr<PtJson> callFrames; 569e509ee18Sopenharmony_ci ASSERT_EQ(params->GetArray("callFrames", &callFrames), Result::SUCCESS); 570e509ee18Sopenharmony_ci ASSERT_NE(callFrames, nullptr); 571e509ee18Sopenharmony_ci EXPECT_EQ(callFrames->GetSize(), 1); 572e509ee18Sopenharmony_ci std::unique_ptr<PtJson> nativePointer; 573e509ee18Sopenharmony_ci ASSERT_EQ(params->GetArray("nativePointer", &nativePointer), Result::SUCCESS); 574e509ee18Sopenharmony_ci ASSERT_NE(nativePointer, nullptr); 575e509ee18Sopenharmony_ci EXPECT_EQ(nativePointer->GetSize(), 1); 576e509ee18Sopenharmony_ci} 577e509ee18Sopenharmony_ci 578e509ee18Sopenharmony_ciHWTEST_F_L0(DebuggerEventsTest, AddHeapSnapshotChunkToJsonTest) 579e509ee18Sopenharmony_ci{ 580e509ee18Sopenharmony_ci AddHeapSnapshotChunk addHeapSnapshotChunk; 581e509ee18Sopenharmony_ci addHeapSnapshotChunk.SetChunk("Chunk0001"); 582e509ee18Sopenharmony_ci 583e509ee18Sopenharmony_ci std::unique_ptr<PtJson> json = addHeapSnapshotChunk.ToJson(); 584e509ee18Sopenharmony_ci std::unique_ptr<PtJson> params; 585e509ee18Sopenharmony_ci ASSERT_EQ(json->GetObject("params", ¶ms), Result::SUCCESS); 586e509ee18Sopenharmony_ci std::string method; 587e509ee18Sopenharmony_ci ASSERT_EQ(json->GetString("method", &method), Result::SUCCESS); 588e509ee18Sopenharmony_ci EXPECT_EQ(addHeapSnapshotChunk.GetName(), method); 589e509ee18Sopenharmony_ci std::string tmpStr; 590e509ee18Sopenharmony_ci ASSERT_EQ(params->GetString("Chunk", &tmpStr), Result::SUCCESS); 591e509ee18Sopenharmony_ci EXPECT_EQ("Chunk0001", tmpStr); 592e509ee18Sopenharmony_ci} 593e509ee18Sopenharmony_ci} // namespace panda::test