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#ifndef ECMASCRIPT_TOOLING_TEST_UTILS_TESTCASES_JS_THROW_EXCEPTION_TEST_H 17e509ee18Sopenharmony_ci#define ECMASCRIPT_TOOLING_TEST_UTILS_TESTCASES_JS_THROW_EXCEPTION_TEST_H 18e509ee18Sopenharmony_ci 19e509ee18Sopenharmony_ci#include "test/utils/test_util.h" 20e509ee18Sopenharmony_ci 21e509ee18Sopenharmony_cinamespace panda::ecmascript::tooling::test { 22e509ee18Sopenharmony_ciclass JsThrowExceptionTest : public TestEvents { 23e509ee18Sopenharmony_cipublic: 24e509ee18Sopenharmony_ci JsThrowExceptionTest() 25e509ee18Sopenharmony_ci { 26e509ee18Sopenharmony_ci breakpoint = [this](const JSPtLocation &location) { 27e509ee18Sopenharmony_ci ASSERT_TRUE(location.GetMethodId().IsValid()); 28e509ee18Sopenharmony_ci ASSERT_LOCATION_EQ(location, location_); 29e509ee18Sopenharmony_ci ++breakpointCounter_; 30e509ee18Sopenharmony_ci std::vector<std::unique_ptr<CallFrame>> callFrames; 31e509ee18Sopenharmony_ci ASSERT_TRUE(debugger_->GenerateCallFrames(&callFrames, true)); 32e509ee18Sopenharmony_ci ASSERT_TRUE(callFrames.size() > 0); 33e509ee18Sopenharmony_ci auto jsLocation = callFrames[0]->GetLocation(); 34e509ee18Sopenharmony_ci ASSERT_TRUE(jsLocation != nullptr); 35e509ee18Sopenharmony_ci ASSERT_EQ(jsLocation->GetLine(), 31); // 31: breakpoint line 36e509ee18Sopenharmony_ci ASSERT_EQ(jsLocation->GetColumn(), 4); // 4: breakpoint column 37e509ee18Sopenharmony_ci TestUtil::SuspendUntilContinue(DebugEvent::BREAKPOINT, location); 38e509ee18Sopenharmony_ci return true; 39e509ee18Sopenharmony_ci }; 40e509ee18Sopenharmony_ci 41e509ee18Sopenharmony_ci exception = [this](const JSPtLocation &location) { 42e509ee18Sopenharmony_ci auto sourceLocation = TestUtil::GetSourceLocation(location, pandaFile_.c_str()); 43e509ee18Sopenharmony_ci ASSERT_EQ(sourceLocation.line, 19); // 19: exception line 44e509ee18Sopenharmony_ci ASSERT_EQ(sourceLocation.column, 8); // 8: exception column 45e509ee18Sopenharmony_ci ++exceptionCounter_; 46e509ee18Sopenharmony_ci std::vector<std::unique_ptr<CallFrame>> callFrames; 47e509ee18Sopenharmony_ci ASSERT_TRUE(debugger_->GenerateCallFrames(&callFrames, true)); 48e509ee18Sopenharmony_ci ASSERT_TRUE(callFrames.size() > 0); 49e509ee18Sopenharmony_ci auto jsLocation = callFrames[0]->GetLocation(); 50e509ee18Sopenharmony_ci ASSERT_TRUE(jsLocation != nullptr); 51e509ee18Sopenharmony_ci ASSERT_EQ(jsLocation->GetLine(), 19); // 19: exception line 52e509ee18Sopenharmony_ci ASSERT_EQ(jsLocation->GetColumn(), 8); // 8: exception column 53e509ee18Sopenharmony_ci ++exceptionCounter_; 54e509ee18Sopenharmony_ci TestUtil::SuspendUntilContinue(DebugEvent::EXCEPTION, location); 55e509ee18Sopenharmony_ci return true; 56e509ee18Sopenharmony_ci }; 57e509ee18Sopenharmony_ci 58e509ee18Sopenharmony_ci loadModule = [this](std::string_view moduleName) { 59e509ee18Sopenharmony_ci runtime_->Enable(); 60e509ee18Sopenharmony_ci // 31: breakpointer line 61e509ee18Sopenharmony_ci location_ = TestUtil::GetLocation(sourceFile_.c_str(), 31, 0, pandaFile_.c_str()); 62e509ee18Sopenharmony_ci std::cout<<"vmStart1"<<std::endl; 63e509ee18Sopenharmony_ci ASSERT_TRUE(location_.GetMethodId().IsValid()); 64e509ee18Sopenharmony_ci std::cout<<"vmStart2"<<std::endl; 65e509ee18Sopenharmony_ci TestUtil::SuspendUntilContinue(DebugEvent::LOAD_MODULE); 66e509ee18Sopenharmony_ci ASSERT_EQ(moduleName, pandaFile_); 67e509ee18Sopenharmony_ci ASSERT_TRUE(debugger_->NotifyScriptParsed(0, pandaFile_)); 68e509ee18Sopenharmony_ci auto condFuncRef = FunctionRef::Undefined(vm_); 69e509ee18Sopenharmony_ci auto ret = debugInterface_->SetBreakpoint(location_, condFuncRef); 70e509ee18Sopenharmony_ci ASSERT_TRUE(ret); 71e509ee18Sopenharmony_ci return true; 72e509ee18Sopenharmony_ci }; 73e509ee18Sopenharmony_ci 74e509ee18Sopenharmony_ci scenario = [this]() { 75e509ee18Sopenharmony_ci TestUtil::WaitForLoadModule(); 76e509ee18Sopenharmony_ci TestUtil::Continue(); 77e509ee18Sopenharmony_ci TestUtil::WaitForBreakpoint(location_); 78e509ee18Sopenharmony_ci TestUtil::Continue(); 79e509ee18Sopenharmony_ci TestUtil::WaitForException(); 80e509ee18Sopenharmony_ci TestUtil::Continue(); 81e509ee18Sopenharmony_ci auto ret = debugInterface_->RemoveBreakpoint(location_); 82e509ee18Sopenharmony_ci ASSERT_TRUE(ret); 83e509ee18Sopenharmony_ci ASSERT_EXITED(); 84e509ee18Sopenharmony_ci return true; 85e509ee18Sopenharmony_ci }; 86e509ee18Sopenharmony_ci 87e509ee18Sopenharmony_ci vmDeath = [this]() { 88e509ee18Sopenharmony_ci ASSERT_EQ(breakpointCounter_, 1U); // 1: break point counter 89e509ee18Sopenharmony_ci ASSERT_EQ(exceptionCounter_, 2U); // 2: exception counter 90e509ee18Sopenharmony_ci return true; 91e509ee18Sopenharmony_ci }; 92e509ee18Sopenharmony_ci } 93e509ee18Sopenharmony_ci 94e509ee18Sopenharmony_ci std::pair<std::string, std::string> GetEntryPoint() override 95e509ee18Sopenharmony_ci { 96e509ee18Sopenharmony_ci return {pandaFile_, entryPoint_}; 97e509ee18Sopenharmony_ci } 98e509ee18Sopenharmony_ci ~JsThrowExceptionTest() = default; 99e509ee18Sopenharmony_ci 100e509ee18Sopenharmony_ciprivate: 101e509ee18Sopenharmony_ci const std::string testFile = "throw_exception"; 102e509ee18Sopenharmony_ci std::string pandaFile_ = DEBUGGER_ABC_DIR + testFile + ".abc"; 103e509ee18Sopenharmony_ci std::string sourceFile_ = DEBUGGER_JS_DIR + testFile + ".js"; 104e509ee18Sopenharmony_ci std::string entryPoint_ = "_GLOBAL::func_main_0"; 105e509ee18Sopenharmony_ci JSPtLocation location_ {nullptr, JSPtLocation::EntityId(0), 0}; 106e509ee18Sopenharmony_ci size_t breakpointCounter_ = 0; 107e509ee18Sopenharmony_ci size_t exceptionCounter_ = 0; 108e509ee18Sopenharmony_ci}; 109e509ee18Sopenharmony_ci 110e509ee18Sopenharmony_cistd::unique_ptr<TestEvents> GetJsThrowExceptionTest() 111e509ee18Sopenharmony_ci{ 112e509ee18Sopenharmony_ci return std::make_unique<JsThrowExceptionTest>(); 113e509ee18Sopenharmony_ci} 114e509ee18Sopenharmony_ci} // namespace panda::ecmascript::tooling::test 115e509ee18Sopenharmony_ci 116e509ee18Sopenharmony_ci#endif // ECMASCRIPT_TOOLING_TEST_UTILS_TESTCASES_JS_THROW_EXCEPTION_TEST_H 117