• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef ECMASCRIPT_TOOLING_TEST_UTILS_TESTCASES_JS_STEP_OVER_TEST_H
17 #define ECMASCRIPT_TOOLING_TEST_UTILS_TESTCASES_JS_STEP_OVER_TEST_H
18 
19 #include "test/utils/test_util.h"
20 
21 namespace panda::ecmascript::tooling::test {
22 class JsStepOverTest : public TestEvents {
23 public:
JsStepOverTest()24     JsStepOverTest()
25     {
26         vmDeath = [this]() {
27             ASSERT_EQ(breakpointCounter_, pointerLocations_.size());  // size: break point counter
28             ASSERT_EQ(stepCompleteCounter_, stepLocations_.size());  // size: step complete counter
29             return true;
30         };
31 
32         loadModule = [this](std::string_view moduleName) {
33             runtime_->Enable();
34             // 24、27: line number for breakpoint array
35             size_t breakpoint[8][2] = {{24, 0}, {27, 0}, {36, 0}, {50, 0}, {60, 0}, {90, 0}, {96, 0}, {54, 0}};
36             // 25、28: line number for stepinto array
37             size_t stepOver[7][2] = {{25, 5}, {28, 0}, {37, 0}, {51, 0}, {61, 0}, {91, 5}, {97, 15}};
38             SetJSPtLocation(breakpoint[0], POINTER_SIZE, pointerLocations_);
39             SetJSPtLocation(stepOver[0], STEP_SIZE, stepLocations_);
40             TestUtil::SuspendUntilContinue(DebugEvent::LOAD_MODULE);
41             ASSERT_EQ(moduleName, pandaFile_);
42             debugger_->NotifyScriptParsed(0, moduleName.data());
43             auto condFuncRef = FunctionRef::Undefined(vm_);
44             for (auto &iter : pointerLocations_) {
45                 auto ret = debugInterface_->SetBreakpoint(iter, condFuncRef);
46                 ASSERT_TRUE(ret);
47             }
48             return true;
49         };
50 
51         breakpoint = [this](const JSPtLocation &location) {
52             ASSERT_TRUE(location.GetMethodId().IsValid());
53             ASSERT_LOCATION_EQ(location, pointerLocations_.at(breakpointCounter_));
54             ++breakpointCounter_;
55             TestUtil::SuspendUntilContinue(DebugEvent::BREAKPOINT, location);
56             debugger_->SetDebuggerState(DebuggerState::PAUSED);
57             debugger_->StepOver(StepOverParams());
58             return true;
59         };
60 
61         singleStep = [this](const JSPtLocation &location) {
62             if (debugger_->NotifySingleStep(location)) {
63                 ASSERT_TRUE(location.GetMethodId().IsValid());
64                 ASSERT_LOCATION_EQ(location, stepLocations_.at(stepCompleteCounter_));
65                 stepCompleteCounter_++;
66                 TestUtil::SuspendUntilContinue(DebugEvent::STEP_COMPLETE, location);
67                 return true;
68             }
69             return false;
70         };
71 
72         scenario = [this]() {
73             TestUtil::WaitForLoadModule();
74             TestUtil::Continue();
75             size_t index = 0;
76             while (index < pointerLocations_.size()) {
77                 TestUtil::WaitForBreakpoint(pointerLocations_.at(index));
78                 TestUtil::Continue();
79                 if (index < STEP_SIZE) {
80                     TestUtil::WaitForStepComplete(stepLocations_.at(index));
81                     TestUtil::Continue();
82                 }
83                 ++index;
84             }
85             ASSERT_EXITED();
86             return true;
87         };
88     }
89 
GetEntryPoint()90     std::pair<std::string, std::string> GetEntryPoint() override
91     {
92         return {pandaFile_, entryPoint_};
93     }
94 
95 private:
96     static constexpr size_t LINE_COLUMN = 2;
97     static constexpr size_t POINTER_SIZE = 8;
98     static constexpr size_t STEP_SIZE = 7;
99 
100     std::string pandaFile_ = DEBUGGER_ABC_DIR "step.abc";
101     std::string sourceFile_ = DEBUGGER_JS_DIR "step.js";
102     std::string entryPoint_ = "_GLOBAL::func_main_0";
103     JSPtLocation location1_ {nullptr, JSPtLocation::EntityId(0), 0};
104     JSPtLocation location2_ {nullptr, JSPtLocation::EntityId(0), 0};
105     size_t breakpointCounter_ = 0;
106     size_t stepCompleteCounter_ = 0;
107     std::vector<JSPtLocation> pointerLocations_;
108     std::vector<JSPtLocation> stepLocations_;
109 
SetJSPtLocation(size_t * arr,size_t number,std::vector<JSPtLocation> & locations)110     void SetJSPtLocation(size_t *arr, size_t number, std::vector<JSPtLocation> &locations)
111     {
112         for (size_t i = 0; i < number; i++) {
113             JSPtLocation location_ = TestUtil::GetLocation(sourceFile_.c_str(), arr[i * LINE_COLUMN],
114                                                            arr[i * LINE_COLUMN + 1], pandaFile_.c_str());
115             locations.push_back(location_);
116         }
117     };
118 };
119 
GetJsStepOverTest()120 std::unique_ptr<TestEvents> GetJsStepOverTest()
121 {
122     return std::make_unique<JsStepOverTest>();
123 }
124 }  // namespace panda::ecmascript::tooling::test
125 
126 #endif  // ECMASCRIPT_TOOLING_TEST_UTILS_TESTCASES_JS_STEP_OVER_TEST_H
127