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 "agent/debugger_impl.h" 17e509ee18Sopenharmony_ci#include "backend/js_pt_hooks.h" 18e509ee18Sopenharmony_ci#include "tooling/base/pt_types.h" 19e509ee18Sopenharmony_ci#include "tooling/base/pt_events.h" 20e509ee18Sopenharmony_ci#include "dispatcher.h" 21e509ee18Sopenharmony_ci 22e509ee18Sopenharmony_ci#include "ecmascript/debugger/js_debugger.h" 23e509ee18Sopenharmony_ci#include "ecmascript/js_array.h" 24e509ee18Sopenharmony_ci#include "ecmascript/js_tagged_value-inl.h" 25e509ee18Sopenharmony_ci#include "ecmascript/object_factory.h" 26e509ee18Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 27e509ee18Sopenharmony_ci 28e509ee18Sopenharmony_ciusing namespace panda::ecmascript; 29e509ee18Sopenharmony_ciusing namespace panda::ecmascript::tooling; 30e509ee18Sopenharmony_ci 31e509ee18Sopenharmony_cinamespace panda::test { 32e509ee18Sopenharmony_ciclass JSPtHooksTest : public testing::Test { 33e509ee18Sopenharmony_cipublic: 34e509ee18Sopenharmony_ci using EntityId = panda_file::File::EntityId; 35e509ee18Sopenharmony_ci static void SetUpTestCase() 36e509ee18Sopenharmony_ci { 37e509ee18Sopenharmony_ci GTEST_LOG_(INFO) << "SetUpTestCase"; 38e509ee18Sopenharmony_ci } 39e509ee18Sopenharmony_ci 40e509ee18Sopenharmony_ci static void TearDownTestCase() 41e509ee18Sopenharmony_ci { 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 } 49e509ee18Sopenharmony_ci 50e509ee18Sopenharmony_ci void TearDown() override 51e509ee18Sopenharmony_ci { 52e509ee18Sopenharmony_ci TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope); 53e509ee18Sopenharmony_ci } 54e509ee18Sopenharmony_ci 55e509ee18Sopenharmony_ciprotected: 56e509ee18Sopenharmony_ci EcmaVM *ecmaVm {nullptr}; 57e509ee18Sopenharmony_ci EcmaHandleScope *scope {nullptr}; 58e509ee18Sopenharmony_ci JSThread *thread {nullptr}; 59e509ee18Sopenharmony_ci}; 60e509ee18Sopenharmony_ci 61e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, BreakpointTest) 62e509ee18Sopenharmony_ci{ 63e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 64e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 65e509ee18Sopenharmony_ci EntityId methodId(0); 66e509ee18Sopenharmony_ci uint32_t bytecodeOffset = 0; 67e509ee18Sopenharmony_ci JSPtLocation ptLocation1(nullptr, methodId, bytecodeOffset); 68e509ee18Sopenharmony_ci jspthooks->Breakpoint(ptLocation1); 69e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 70e509ee18Sopenharmony_ci} 71e509ee18Sopenharmony_ci 72e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, LoadModuleTest) 73e509ee18Sopenharmony_ci{ 74e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 75e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 76e509ee18Sopenharmony_ci jspthooks->LoadModule("pandafile/test.abc", "func_main_0"); 77e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 78e509ee18Sopenharmony_ci} 79e509ee18Sopenharmony_ci 80e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, ExceptionTest) 81e509ee18Sopenharmony_ci{ 82e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 83e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 84e509ee18Sopenharmony_ci EntityId methodId(0); 85e509ee18Sopenharmony_ci uint32_t bytecodeOffset = 0; 86e509ee18Sopenharmony_ci JSPtLocation ptLocation2(nullptr, methodId, bytecodeOffset); 87e509ee18Sopenharmony_ci jspthooks->Exception(ptLocation2); 88e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 89e509ee18Sopenharmony_ci} 90e509ee18Sopenharmony_ci 91e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, SingleStepTest) 92e509ee18Sopenharmony_ci{ 93e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 94e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 95e509ee18Sopenharmony_ci EntityId methodId(0); 96e509ee18Sopenharmony_ci uint32_t bytecodeOffset = 0; 97e509ee18Sopenharmony_ci JSPtLocation ptLocation4(nullptr, methodId, bytecodeOffset); 98e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 99e509ee18Sopenharmony_ci} 100e509ee18Sopenharmony_ci 101e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, VmStartTest) 102e509ee18Sopenharmony_ci{ 103e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 104e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 105e509ee18Sopenharmony_ci jspthooks->VmStart(); 106e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 107e509ee18Sopenharmony_ci} 108e509ee18Sopenharmony_ci 109e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, VmDeathTest) 110e509ee18Sopenharmony_ci{ 111e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 112e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 113e509ee18Sopenharmony_ci jspthooks->VmDeath(); 114e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 115e509ee18Sopenharmony_ci} 116e509ee18Sopenharmony_ci 117e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, NativeCallingTest) 118e509ee18Sopenharmony_ci{ 119e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 120e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 121e509ee18Sopenharmony_ci jspthooks->NativeCalling(nullptr); 122e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 123e509ee18Sopenharmony_ci} 124e509ee18Sopenharmony_ci 125e509ee18Sopenharmony_ciHWTEST_F_L0(JSPtHooksTest, NativeReturnTest) 126e509ee18Sopenharmony_ci{ 127e509ee18Sopenharmony_ci auto debugger = std::make_unique<DebuggerImpl>(ecmaVm, nullptr, nullptr); 128e509ee18Sopenharmony_ci std::unique_ptr<JSPtHooks> jspthooks = std::make_unique<JSPtHooks>(debugger.get()); 129e509ee18Sopenharmony_ci jspthooks->NativeReturn(nullptr); 130e509ee18Sopenharmony_ci ASSERT_NE(jspthooks, nullptr); 131e509ee18Sopenharmony_ci} 132e509ee18Sopenharmony_ci}