• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "ecmascript/tests/test_helper.h"
17 #include "ecmascript/debugger/dropframe_manager.h"
18 #include "ecmascript/jspandafile/js_pandafile_manager.h"
19 #include "assembler/assembly-parser.h"
20 
21 using namespace panda::ecmascript;
22 using namespace panda::ecmascript::tooling;
23 using namespace panda::panda_file;
24 using namespace panda::pandasm;
25 
26 namespace panda::ecmascript::tooling {
27 class DropframeManagerFriendTest {
28 public:
29     std::vector<std::tuple<JSHandle<JSTaggedValue>, uint16_t,
GetLexModifyRecordOfTopFrameTest()30         JSHandle<JSTaggedValue>>> GetLexModifyRecordOfTopFrameTest ()
31     {
32         return manager.GetLexModifyRecordOfTopFrame();
33     }
34 
NewLexModifyRecordLevelTest()35     void NewLexModifyRecordLevelTest()
36     {
37         manager.NewLexModifyRecordLevel();
38     }
39 
GetLexModifyRecordLevelTest()40     uint32_t GetLexModifyRecordLevelTest()
41     {
42         return manager.GetLexModifyRecordLevel();
43     }
44 
RemoveLexModifyRecordOfTopFrameTest(JSThread * thread)45     void RemoveLexModifyRecordOfTopFrameTest(JSThread *thread)
46     {
47         manager.RemoveLexModifyRecordOfTopFrame(thread);
48     }
49 
PopMethodInfoTest()50     void PopMethodInfoTest()
51     {
52         manager.PopMethodInfo();
53     }
54 
PushMethodInfoTest(std::tuple<JSPandaFile *,panda_file::File::EntityId> methodInfo)55     void PushMethodInfoTest(std::tuple<JSPandaFile*, panda_file::File::EntityId> methodInfo)
56     {
57         manager.PushMethodInfo(methodInfo);
58     }
59 
CheckExitMethodInfoTest(std::tuple<JSPandaFile *,panda_file::File::EntityId> methodInfo)60     bool CheckExitMethodInfoTest(std::tuple<JSPandaFile*, panda_file::File::EntityId> methodInfo)
61     {
62         return manager.CheckExitMethodInfo(methodInfo);
63     }
64 
MergeLexModifyRecordOfTopFrameTest(JSThread * thread)65     void MergeLexModifyRecordOfTopFrameTest(JSThread *thread)
66     {
67         manager.MergeLexModifyRecordOfTopFrame(thread);
68     }
69 
70 private:
71     DropframeManager manager;
72 };
73 }
74 
75 namespace panda::test {
76 class DropframeManagerTest : public testing::Test {
77 public:
SetUpTestCase()78     static void SetUpTestCase()
79     {
80         GTEST_LOG_(INFO) << "SetUpTestCase";
81     }
82 
TearDownTestCase()83     static void TearDownTestCase()
84     {
85         GTEST_LOG_(INFO) << "TearDownCase";
86     }
87 
SetUp()88     void SetUp() override
89     {
90         TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope);
91     }
92 
TearDown()93     void TearDown() override
94     {
95         TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope);
96     }
97 
98     EcmaVM *ecmaVm {nullptr};
99     EcmaHandleScope *scope {nullptr};
100     JSThread *thread {nullptr};
101 };
102 
HWTEST_F_L0(DropframeManagerTest,GetLexModifyRecordOfTopFrameTest)103 HWTEST_F_L0(DropframeManagerTest, GetLexModifyRecordOfTopFrameTest)
104 {
105     DropframeManagerFriendTest manager;
106     manager.GetLexModifyRecordOfTopFrameTest();
107     uint32_t result = manager.GetLexModifyRecordLevelTest();
108     EXPECT_FALSE(result);
109 
110     manager.NewLexModifyRecordLevelTest();
111     manager.GetLexModifyRecordOfTopFrameTest();
112     result = manager.GetLexModifyRecordLevelTest();
113     EXPECT_TRUE(result);
114 }
115 
HWTEST_F_L0(DropframeManagerTest,RemoveLexModifyRecordOfTopFrameTest)116 HWTEST_F_L0(DropframeManagerTest, RemoveLexModifyRecordOfTopFrameTest)
117 {
118     DropframeManagerFriendTest manager;
119     JSThread *thread = ecmaVm->GetJSThread();
120     uint32_t result = manager.GetLexModifyRecordLevelTest();
121     manager.RemoveLexModifyRecordOfTopFrameTest(thread);
122     EXPECT_FALSE(result);
123 
124     manager.NewLexModifyRecordLevelTest();
125     result = manager.GetLexModifyRecordLevelTest();
126     EXPECT_TRUE(result);
127 
128     manager.RemoveLexModifyRecordOfTopFrameTest(thread);
129     result = manager.GetLexModifyRecordLevelTest();
130     EXPECT_FALSE(result);
131 }
132 
HWTEST_F_L0(DropframeManagerTest,PopMethodInfoTest)133 HWTEST_F_L0(DropframeManagerTest, PopMethodInfoTest)
134 {
135     DropframeManagerFriendTest manager;
136     Parser parser;
137     const char *filename = "__PandaFileTranslatorTest2.pa";
138     const char *data = R"(
139         .function any func_main_0(any a0, any a1, any a2) {
140             ldai 1
141             return
142         }
143     )";
144     auto res = parser.Parse(data);
145     JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
146     std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
147     std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), CString(filename));
148     const panda_file::File *testpf = pf.get()->GetPandaFile();
149     CString descriptor = "example_descriptor";
150     JSPandaFile* jspandaFilePtr = new JSPandaFile(testpf, descriptor);
151 
152     panda_file::File::EntityId entityId(42);
153     std::tuple<JSPandaFile*, panda_file::File::EntityId> methodInfo(jspandaFilePtr, entityId);
154 
155     manager.PopMethodInfoTest();
156     manager.PushMethodInfoTest(methodInfo);
157     bool result = manager.CheckExitMethodInfoTest(methodInfo);
158     EXPECT_EQ(result, true);
159 
160     manager.PopMethodInfoTest();
161     result = manager.CheckExitMethodInfoTest(methodInfo);
162     EXPECT_EQ(result, false);
163 }
164 
HWTEST_F_L0(DropframeManagerTest,MergeLexModifyRecordOfTopFrameEmptyTest)165 HWTEST_F_L0(DropframeManagerTest, MergeLexModifyRecordOfTopFrameEmptyTest)
166 {
167     DropframeManagerFriendTest manager;
168     JSThread *thread = ecmaVm->GetJSThread();
169     manager.MergeLexModifyRecordOfTopFrameTest(thread);
170     uint32_t result = manager.GetLexModifyRecordLevelTest();
171     EXPECT_FALSE(result);
172 }
173 }  // namespace panda::test
174