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 "gtest/gtest.h"
17
18 #define private public
19 #define protected public
20 #include "base/memory/ace_type.h"
21 #include "frameworks/bridge/common/utils/source_map.h"
22
23 #undef private
24 #undef protected
25
26 using namespace testing;
27 using namespace testing::ext;
28
29 namespace OHOS::Ace::Framework {
30 class SourceMapTest : public testing::Test {
31 public:
SetUpTestSuite()32 static void SetUpTestSuite() {}
TearDownTestSuite()33 static void TearDownTestSuite() {}
34 };
35
36 /**
37 * @tc.name: SourceMapTest001
38 * @tc.desc: Find()
39 * @tc.type: FUNC
40 */
HWTEST_F(SourceMapTest, SourceMapTest001, TestSize.Level1)41 HWTEST_F(SourceMapTest, SourceMapTest001, TestSize.Level1)
42 {
43 /**
44 * @tc.steps: step1. Create a revSourceMap.
45 */
46 RevSourceMap revSourceMap;
47 int32_t row = 0;
48 int32_t col = 0;
49 bool isColPrecise = false;
50 revSourceMap.files_.emplace_back("files");
51
52 /**
53 * @tc.steps: step2. Testing values.
54 * @tc.expected: return mappingInfo.
55 */
56 auto mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 47line if 1、1、1
57 EXPECT_EQ(mappingInfo.col, 0);
58 row = 5;
59 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 47line if 0、1、1
60 EXPECT_EQ(mappingInfo.col, 0);
61 col = 1;
62 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 47line if 0、0、1
63 EXPECT_EQ(mappingInfo.col, 0);
64 SourceMapInfo sourceMapInfo;
65 revSourceMap.afterPos_.emplace_back(sourceMapInfo);
66 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 47line if 0、0、0 57line if 1
67 EXPECT_EQ(mappingInfo.col, 1);
68 revSourceMap.afterPos_.emplace_back(SourceMapInfo { 0, 0, 5, 0, 0, 0 });
69 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 47line if 0、0、0 57line if 0 62line 0、0、0
70 EXPECT_EQ(mappingInfo.col, 0);
71 revSourceMap.afterPos_.clear();
72 revSourceMap.afterPos_.emplace_back(SourceMapInfo { 0, 0, 5, 1, 0, 0 }); // 62line 0、1、1
73 mappingInfo = revSourceMap.Find(row, col, isColPrecise);
74 EXPECT_EQ(mappingInfo.col, 0);
75 revSourceMap.afterPos_.clear();
76 revSourceMap.afterPos_.emplace_back(SourceMapInfo { 0, 0, 4, 1, 0, 0 }); // 62line 1、1、0
77 mappingInfo = revSourceMap.Find(row, col, isColPrecise);
78 EXPECT_EQ(mappingInfo.col, 0);
79 }
80
81 /**
82 * @tc.name: SourceMapTest002
83 * @tc.desc: Find()
84 * @tc.type: FUNC
85 */
HWTEST_F(SourceMapTest, SourceMapTest002, TestSize.Level1)86 HWTEST_F(SourceMapTest, SourceMapTest002, TestSize.Level1)
87 {
88 /**
89 * @tc.steps: step1. Create a revSourceMap.
90 */
91 RevSourceMap revSourceMap;
92 int32_t row = 0;
93 int32_t col = 0;
94 bool isColPrecise = true;
95 revSourceMap.files_.emplace_back("files");
96
97 /**
98 * @tc.steps: step2. Testing values.
99 * @tc.expected: return mappingInfo.
100 */
101 row = 5;
102 col = 5;
103 revSourceMap.afterPos_.emplace_back(SourceMapInfo { 0, 0, 5, 1, 0, 0 });
104 revSourceMap.afterPos_.emplace_back(SourceMapInfo { 0, 0, 3, 1, 0, 0 });
105 revSourceMap.afterPos_.emplace_back(SourceMapInfo { 0, 0, 4, 1, 0, 0 });
106 auto mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 79line 0、0、 1、0
107 EXPECT_EQ(mappingInfo.col, 0);
108 isColPrecise = false;
109 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 79line 1、0、 1、0
110 EXPECT_EQ(mappingInfo.col, 0);
111 col = 1;
112 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 79line 1、1、 1、 1 83line 0、1
113 EXPECT_EQ(mappingInfo.col, 0);
114 revSourceMap.afterPos_[2].sourcesVal = -1;
115 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 83line 1、0
116 EXPECT_EQ(mappingInfo.col, 0);
117 revSourceMap.afterPos_[2].sourcesVal = 0;
118 revSourceMap.sources_.emplace_back("0");
119 revSourceMap.sources_.emplace_back("1");
120 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 89line 0
121 EXPECT_EQ(mappingInfo.col, 1);
122 revSourceMap.sources_[0] = ("webpack:///111");
123 mappingInfo = revSourceMap.Find(row, col, isColPrecise); // 89line 1
124 EXPECT_EQ(mappingInfo.col, 1);
125 }
126
127 /**
128 * @tc.name: SourceMapTest003
129 * @tc.desc: GetOriginalNames()
130 * @tc.type: FUNC
131 */
HWTEST_F(SourceMapTest, SourceMapTest003, TestSize.Level1)132 HWTEST_F(SourceMapTest, SourceMapTest003, TestSize.Level1)
133 {
134 /**
135 * @tc.steps: step1. Create a revSourceMap.
136 */
137 RevSourceMap revSourceMap;
138 std::string sourceCode;
139 uint32_t errorPos = 0;
140 /**
141 * @tc.steps: step2. Testing values.
142 * @tc.expected: return sourceCode.
143 */
144 EXPECT_EQ(revSourceMap.GetOriginalNames(sourceCode, errorPos), sourceCode);
145 sourceCode = "test";
146 EXPECT_EQ(revSourceMap.GetOriginalNames(sourceCode, errorPos), sourceCode);
147 sourceCode = "SourceCode:\n test";
148 EXPECT_EQ(revSourceMap.GetOriginalNames(sourceCode, errorPos), sourceCode);
149 revSourceMap.nameMap_.emplace_back("0");
150 EXPECT_EQ(revSourceMap.GetOriginalNames(sourceCode, errorPos), sourceCode);
151 revSourceMap.nameMap_.emplace_back("test");
152 revSourceMap.nameMap_.emplace_back("SourceCode");
153 revSourceMap.nameMap_.emplace_back("Code");
154 EXPECT_EQ(revSourceMap.GetOriginalNames(sourceCode, errorPos), "Code:\n test");
155 errorPos = 10;
156 EXPECT_EQ(revSourceMap.GetOriginalNames(sourceCode, errorPos), "Code:\n test");
157 sourceCode = "SourceCode:\n";
158 EXPECT_EQ(revSourceMap.GetOriginalNames(sourceCode, errorPos), "Code:\n");
159 }
160
161 /**
162 * @tc.name: SourceMapTest004
163 * @tc.desc: ExtractKeyInfo() and Init()
164 * @tc.type: FUNC
165 */
HWTEST_F(SourceMapTest, SourceMapTest004, TestSize.Level1)166 HWTEST_F(SourceMapTest, SourceMapTest004, TestSize.Level1)
167 {
168 /**
169 * @tc.steps: step1. Create a revSourceMap.
170 */
171 RevSourceMap revSourceMap;
172 std::string sourceMap;
173 revSourceMap.Init(sourceMap);
174 EXPECT_TRUE(revSourceMap.mappings_.empty());
175 /**
176 * @tc.steps: step2. Testing values.
177 * @tc.expected: return revSourceMap.mappings_.size() = 0.
178 */
179 sourceMap = "\"test\"\"sources\"\"./pag\\es\""
180 "\"names\"\"dfxtest\""
181 "\"mappings\"\"test123AB+B,B;test2BBBB,test3B\""
182 "\"file\"\"dfxtest.js\""
183 "\"nameMap\"\"testMap\""
184 "\"sourceContent\"\"conent\""
185 "\"sourceRoot\"\"root\"";
186 revSourceMap.Init(sourceMap);
187 EXPECT_EQ(revSourceMap.mappings_.size(), 0);
188 }
189
190 /**
191 * @tc.name: SourceMapTest005
192 * @tc.desc: ExtractKeyInfo() and Init()
193 * @tc.type: FUNC
194 */
HWTEST_F(SourceMapTest, SourceMapTest005, TestSize.Level1)195 HWTEST_F(SourceMapTest, SourceMapTest005, TestSize.Level1)
196 {
197 /**
198 * @tc.steps: step1. Create a revSourceMap.
199 */
200 RevSourceMap revSourceMap;
201 std::string sourceMap;
202 revSourceMap.Init(sourceMap);
203 EXPECT_TRUE(revSourceMap.mappings_.empty());
204 /**
205 * @tc.steps: step2. Testing values.
206 * @tc.expected: return revSourceMap.mappings_.size() = 1.
207 */
208 sourceMap = "\"test\"\"sources\"\"./pag\\es\""
209 "\"names\"\"dfxtest\""
210 "\"mappings\"\"test123AB+\""
211 "\"file\"\"dfxtest.js\""
212 "\"nameMap\"\"testMap\""
213 "\"sourceContent\"\"conent\""
214 "\"sourceRoot\"\"root\"";
215 revSourceMap.Init(sourceMap);
216 EXPECT_EQ(revSourceMap.mappings_.size(), 1);
217 }
218
219 /**
220 * @tc.name: SourceMapTest006
221 * @tc.desc: ExtractKeyInfo() and MergeInit()
222 * @tc.type: FUNC
223 */
HWTEST_F(SourceMapTest, SourceMapTest006, TestSize.Level1)224 HWTEST_F(SourceMapTest, SourceMapTest006, TestSize.Level1)
225 {
226 /**
227 * @tc.steps: step1. Create a revSourceMap.
228 */
229 RevSourceMap revSourceMap;
230 std::string sourceMap;
231 RefPtr<RevSourceMap> curMapData = AceType::MakeRefPtr<RevSourceMap>();
232 revSourceMap.MergeInit(sourceMap, curMapData);
233 EXPECT_TRUE(curMapData->mappings_.empty());
234 /**
235 * @tc.steps: step2. Testing values.
236 * @tc.expected: return curMapData.mappings_.size() = 1.
237 */
238 sourceMap = "\"test\"\"sources\"\"./pag\\es\""
239 "\"names\"\"dfxtest\""
240 "\"mappings\"\"test123AB+B,B;test2BBBB,test3B\""
241 "\"file\"\"dfxtest.js\""
242 "\"nameMap\"\"testMap\""
243 "\"sourceContent\"\"conent\""
244 "\"sourceRoot\"\"root\"";
245 revSourceMap.MergeInit(sourceMap, curMapData);
246 EXPECT_EQ(curMapData->mappings_.size(), 0);
247 }
248
249 /**
250 * @tc.name: SourceMapTest007
251 * @tc.desc: ExtractKeyInfo() and MergeInit()
252 * @tc.type: FUNC
253 */
HWTEST_F(SourceMapTest, SourceMapTest007, TestSize.Level1)254 HWTEST_F(SourceMapTest, SourceMapTest007, TestSize.Level1)
255 {
256 /**
257 * @tc.steps: step1. Create a revSourceMap.
258 */
259 RevSourceMap revSourceMap;
260 std::string sourceMap;
261 RefPtr<RevSourceMap> curMapData = AceType::MakeRefPtr<RevSourceMap>();
262 /**
263 * @tc.steps: step2. Testing values.
264 * @tc.expected: return curMapData.mappings_.size() = 1.
265 */
266 sourceMap = "\"test\"\"sources\"\"./pag\\es\""
267 "\"names\"\"dfxtest\""
268 "\"mappings\"\"test123AB+\""
269 "\"file\"\"dfxtest.js\""
270 "\"nameMap\"\"testMap\""
271 "\"sourceContent\"\"conent\""
272 "\"sourceRoot\"\"root\"";
273 revSourceMap.MergeInit(sourceMap, curMapData);
274 EXPECT_EQ(curMapData->mappings_.size(), 1);
275 }
276
277 /**
278 * @tc.name: SourceMapTest008
279 * @tc.desc: StageModeSourceMapSplit()
280 * @tc.type: FUNC
281 */
HWTEST_F(SourceMapTest, SourceMapTest008, TestSize.Level1)282 HWTEST_F(SourceMapTest, SourceMapTest008, TestSize.Level1)
283 {
284 /**
285 * @tc.steps: step1. Create a revSourceMap.
286 */
287 RevSourceMap revSourceMap;
288 std::string sourceMap;
289 std::unordered_map<std::string, RefPtr<RevSourceMap>> sourceMaps;
290 /**
291 * @tc.steps: step2. Testing values.
292 * @tc.expected: return curMapData.mappings_.size() = 1.
293 */
294 sourceMap = "\"test\": {\"sources\": [test],[test1]}\"./pag\\es\""
295 "\"names\"\"dfxtest\""
296 "\"mappings\"\"test123AB+\""
297 "\"file\"\"dfxtest.js\""
298 "\"nameMap\"\"testMap\""
299 "\"sourceContent\"\"conent\""
300 "\"sourceRoot\"\"root\"";
301 revSourceMap.StageModeSourceMapSplit(sourceMap, sourceMaps);
302 EXPECT_EQ(sourceMaps.size(), 1);
303 }
304
305 /**
306 * @tc.name: SourceMapTest009
307 * @tc.desc: GetOriginalNames()
308 * @tc.type: FUNC
309 */
HWTEST_F(SourceMapTest, SourceMapTest009, TestSize.Level1)310 HWTEST_F(SourceMapTest, SourceMapTest009, TestSize.Level1)
311 {
312 /**
313 * @tc.steps: step1. construct posDiff > 0,lineBreakPos + 1 < jsCode.length() - 1 is true
314 */
315 RevSourceMap revSourceMap;
316 revSourceMap.nameMap_.push_back("param1");
317 revSourceMap.nameMap_.push_back("param111");
318 revSourceMap.nameMap_.push_back("param2");
319 revSourceMap.nameMap_.push_back("param222");
320 std::string sourceCode = "SourceCode:\nvar param1 = 1;\nvar param2 = 2;\n";
321 uint32_t errorPos = 20;
322 std::string result = revSourceMap.GetOriginalNames(sourceCode, errorPos);
323 EXPECT_EQ(result, "SourceCode:\nvar param111 = 1;\n var param222 = 2;\n");
324
325 /**
326 * @tc.steps: step2. construct posDiff < 0,flagPos < jsCode.length() false
327 */
328 sourceCode = "SourceCode:\nvar param111 = 1;\nvar param222 = 2;\n";
329 revSourceMap.nameMap_.clear();
330 revSourceMap.nameMap_.push_back("param111");
331 revSourceMap.nameMap_.push_back("param1");
332 revSourceMap.nameMap_.push_back("param222");
333 revSourceMap.nameMap_.push_back("param2");
334 std::string result2 = revSourceMap.GetOriginalNames(sourceCode, errorPos);
335 EXPECT_EQ(result2, "SourceCode:\nvar param1 = 1;\nvar param2 = 2;\n");
336 // flagPos < jsCode.length() true, false
337 sourceCode = "SourceCode:\nvar param111 = 1;var param222 = 2;\n";
338 std::string result3 = revSourceMap.GetOriginalNames(sourceCode, errorPos);
339 EXPECT_EQ(result3, "SourceCode:\nvar param1 = 1;var param2 = 2;\n");
340 // flagPos < jsCode.length() true, true,true
341 sourceCode = "SourceCode:\nvar param111 = 1;var^param222 = 2;\n";
342 uint32_t errorPos2 = 19;
343 std::string result4 = revSourceMap.GetOriginalNames(sourceCode, errorPos2);
344 EXPECT_EQ(result4, "SourceCode:\nvar param1 = 1;r^param2 = 2;\n");
345 }
346
347 /**
348 * @tc.name: SourceMapTest010
349 * @tc.desc: VlqRevCode()
350 * @tc.type: FUNC
351 */
HWTEST_F(SourceMapTest, SourceMapTest010, TestSize.Level1)352 HWTEST_F(SourceMapTest, SourceMapTest010, TestSize.Level1)
353 {
354 /**
355 * @tc.steps: step1. VlqRevCode vStr.size() == 0
356 */
357 RevSourceMap revSourceMap;
358 std::string vStr = "";
359 std::vector<int32_t> ans;
360 bool ret = revSourceMap.VlqRevCode(vStr, ans);
361 EXPECT_FALSE(ret);
362
363 /**
364 * @tc.steps: step2. VlqRevCode vStr.size() != 0,include invalid char
365 */
366 std::string vStr2 = "abc/&";
367 bool ret2 = revSourceMap.VlqRevCode(vStr2, ans);
368 EXPECT_FALSE(ret2);
369
370 /**
371 * @tc.steps: step3. HandleMappings mapping = ""
372 */
373 std::string mapping;
374 std::vector<std::string> ret3 = revSourceMap.HandleMappings(mapping);
375 EXPECT_EQ(ret3.size(), 0);
376
377 /**
378 * @tc.steps: step4. HandleMappings mapping contain ';'
379 */
380 std::string mapping2 = ";";
381 std::vector<std::string> ret4 = revSourceMap.HandleMappings(mapping2);
382 EXPECT_EQ(ret4.size(), 1);
383 }
384 } // namespace OHOS::Ace::Framework
385