1 /*
2 * Copyright (c) 2023 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 <cstddef>
17 #include <memory>
18 #include <optional>
19
20 #include "gmock/gmock-actions.h"
21 #include "gmock/gmock-matchers.h"
22 #include "gtest/gtest.h"
23
24 #include "core/common/container.h"
25
26 #define private public
27 #define protected public
28
29 #include "bundlemgr/bundle_mgr_interface.h"
30 #include "mock/mock_bundle_mgr_interface.h"
31 #include "test/mock/core/common/mock_theme_manager.h"
32 #include "test/mock/core/pipeline/mock_pipeline_context.h"
33
34 #include "base/geometry/dimension.h"
35 #include "base/json/json_util.h"
36 #include "base/memory/ace_type.h"
37 #include "base/memory/referenced.h"
38 #include "core/components/plugin/plugin_component_manager.h"
39 #include "core/components/plugin/plugin_sub_container.h"
40 #include "core/components/plugin/resource/plugin_manager_delegate.h"
41 #include "core/components_ng/base/view_stack_processor.h"
42 #include "core/components_ng/pattern/custom/custom_node.h"
43 #include "core/components_ng/pattern/pattern.h"
44 #include "core/components_ng/pattern/plugin/plugin_event_hub.h"
45 #include "core/components_ng/pattern/plugin/plugin_layout_property.h"
46 #include "core/components_ng/pattern/plugin/plugin_model.h"
47 #include "core/components_ng/pattern/plugin/plugin_model_ng.h"
48 #include "core/components_ng/pattern/plugin/plugin_node.h"
49 #include "core/components_ng/pattern/plugin/plugin_pattern.h"
50
51 using namespace testing;
52 using namespace testing::ext;
53
54 namespace OHOS::Ace::NG {
55 struct CreateProperty {
56 std::optional<double> maxValue = std::nullopt;
57 std::optional<double> value = std::nullopt;
58 };
59
60 struct TestProperty {};
61
62 namespace {
63 constexpr Dimension WIDTH = 200.0_vp;
64 constexpr Dimension HEIGHT = 200.0_vp;
65 PluginModelNG pluginModel;
66 RequestPluginInfo pluginInfo;
67 DirtySwapConfig config;
68 string testText = "testText";
69 } // namespace
70
71 class PluginPatternTestNg : public testing::Test {
72 public:
73 void CheckValue(const RefPtr<FrameNode>& frameNode, const TestProperty& testProperty);
74 static void SetUpTestCase();
75 static void TearDownTestCase();
SetUp()76 void SetUp() override {}
TearDown()77 void TearDown() override {}
78
79 protected:
80 RefPtr<FrameNode> CreatePluginParagraph();
81 };
82
SetUpTestCase()83 void PluginPatternTestNg::SetUpTestCase()
84 {
85 MockPipelineContext::SetUp();
86 pluginInfo.pluginName = "plugin1";
87 pluginInfo.bundleName = "com.example.plugin";
88 }
89
TearDownTestCase()90 void PluginPatternTestNg::TearDownTestCase()
91 {
92 MockPipelineContext::TearDown();
93 }
94
CreatePluginParagraph()95 RefPtr<FrameNode> PluginPatternTestNg::CreatePluginParagraph()
96 {
97 pluginModel.Create(pluginInfo);
98 pluginModel.SetPluginSize(WIDTH, HEIGHT);
99 pluginModel.SetWidth(WIDTH);
100 pluginModel.SetHeight(HEIGHT);
101 pluginModel.SetData("{data}");
102 auto frameNode = AceType::DynamicCast<FrameNode>(ViewStackProcessor::GetInstance()->Finish());
103 return frameNode;
104 }
105
106 /**
107 * @tc.name: ReplaceAll
108 * @tc.desc: Test SplitString in Plugin Pattern.
109 * @tc.type: FUNC
110 */
111 HWTEST_F(PluginPatternTestNg, ReplaceAll, TestSize.Level1)
112 {
113 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
114 auto pattern = frameNode->GetPattern<PluginPattern>();
115 ASSERT_NE(pattern, nullptr);
116 std::vector<std::string> strList;
117 std::string oldPattern = "com";
118 std::string newPattern = "sys";
119 std::string string = "com.example.providerTest/assets/com.exampe.service";
120 pattern->ReplaceAll(string, oldPattern, newPattern);
121 EXPECT_EQ(string, "sys.example.providerTest/assets/sys.exampe.service");
122 }
123
124 /**
125 * @tc.name: PluginPattern002
126 * @tc.desc: Test SplitString in Plugin Pattern.
127 * @tc.type: FUNC
128 */
129 HWTEST_F(PluginPatternTestNg, SplitString, TestSize.Level1)
130 {
131 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
132 auto pattern = frameNode->GetPattern<PluginPattern>();
133 ASSERT_NE(pattern, nullptr);
134 std::vector<std::string> strList;
135 pattern->SplitString("/com.example.providerTest/assets", '/', strList);
136 std::vector<std::string> strList2 = { "com.example.providerTest", "assets" };
137 }
138
139 /**
140 * @tc.name: PluginEventHubTestNg
141 * @tc.desc: Test PluginEventHub.
142 * @tc.type: FUNC
143 */
144 HWTEST_F(PluginPatternTestNg, PluginEventHubTestNg, TestSize.Level1)
145 {
146 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
147 auto pattern = frameNode->GetPattern<PluginPattern>();
148 ASSERT_NE(pattern, nullptr);
149 auto eventHub = AceType::DynamicCast<PluginEventHub>(pattern->CreateEventHub());
150 EXPECT_NE(eventHub, nullptr);
__anone686d1f00202(const std::string& param) 151 auto onFuntion = [](const std::string& param) { EXPECT_EQ(param, "TestText"); };
152
153 eventHub->FireOnComplete("");
154 eventHub->FireOnError("");
155 pluginModel.SetOnComplete(onFuntion);
156 pluginModel.SetOnError(onFuntion);
157 eventHub->FireOnComplete("TestText");
158 eventHub->FireOnError("TestText");
159 pattern->FireOnCompleteEvent();
160 pattern->FireOnErrorEvent("", "TestText");
161 pattern->FireOnCompleteEvent();
162 auto allowUpdate = pattern->ISAllowUpdate();
163 EXPECT_TRUE(allowUpdate);
164 }
165
166 /**
167 * @tc.name: PluginPatternTestNg
168 * @tc.desc: Test OnDirtyLayoutWrapperSwap in Plugin Pattern.
169 * @tc.type: FUNC
170 */
171 HWTEST_F(PluginPatternTestNg, OnDirtyLayoutWrapperSwap2, TestSize.Level1)
172 {
173 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
174 auto pattern = frameNode->GetPattern<PluginPattern>();
175 ASSERT_NE(pattern, nullptr);
176 RefPtr<GeometryNode> geometryNode = AceType::MakeRefPtr<GeometryNode>();
177 geometryNode->SetContentSize(SizeF(100.0f, 100.0f));
178 geometryNode->SetContentOffset(OffsetF(0, 0));
179 RefPtr<LayoutAlgorithm> layoutAlgorithm = AceType::MakeRefPtr<LayoutAlgorithm>();
180 auto layoutWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(frameNode, geometryNode, nullptr);
181 EXPECT_NE(layoutWrapper, nullptr);
182 auto host = pattern->GetHost();
183 EXPECT_NE(host, nullptr);
184
185 /**
186 * case 1: info.bundleName == pluginInfo_.bundleName && pluginInfo_.allowUpdate != info.allowUpdate &&
187 * pluginInfo_.width != info.width && pluginSubContainer_ == nullptr ;
188 */
189 pattern->pluginInfo_.pluginName = "plugin1";
190 pattern->pluginInfo_.bundleName = "com.example.plugin";
191
192 pattern->pluginInfo_.width = WIDTH;
193 pattern->pluginInfo_.height = HEIGHT;
194 pattern->pluginInfo_.allowUpdate = false;
195
196 config.skipMeasure = false;
197 config.skipLayout = false;
198
199 auto layoutAlgorithmWrapper = AceType::MakeRefPtr<LayoutAlgorithmWrapper>(layoutAlgorithm, false);
200 layoutWrapper->SetLayoutAlgorithm(layoutAlgorithmWrapper);
201 auto isSwap = pattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config);
202 EXPECT_EQ(isSwap, false);
203
204 /**
205 * case 2: info.bundleName == pluginInfo_.bundleName && pluginInfo_.allowUpdate != info.allowUpdate &&
206 * pluginInfo_.width != info.width && pluginSubContainer_ != nullptr ;
207 */
208 config.skipMeasure = true;
209 config.skipLayout = false;
210
211 pattern->pluginInfo_.width = WIDTH;
212 pattern->pluginInfo_.height = HEIGHT;
213 pattern->pluginInfo_.allowUpdate = false;
214
215 pattern->CreatePluginSubContainer();
216 EXPECT_NE(pattern->pluginSubContainer_, nullptr);
217 isSwap = pattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config);
218 EXPECT_EQ(isSwap, false);
219
220 /**
221 * case 3: info.bundleName == pluginInfo_.bundleName && pluginInfo_.allowUpdate == info.allowUpdate &&
222 * pluginInfo_.width == info.width;
223 */
224 config.skipMeasure = true;
225 config.skipLayout = false;
226
227 EXPECT_NE(pattern->pluginSubContainer_, nullptr);
228 isSwap = pattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config);
229 EXPECT_EQ(isSwap, false);
230
231 /**
232 * case 4: info.pluginName != pluginInfo_.pluginName && pluginManagerBridge_ == nullptr ;
233 */
234 config.skipMeasure = false;
235 config.skipLayout = true;
236 pattern->pluginInfo_.pluginName = "plugin";
237 pattern->pluginManagerBridge_ = nullptr;
238 EXPECT_EQ(pattern->pluginManagerBridge_, nullptr);
239 isSwap = pattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config);
240 EXPECT_EQ(isSwap, false);
241
242 /**
243 * case 5: info.pluginName != pluginInfo_.pluginName && pluginManagerBridge_ != nullptr ;
244 */
245 pattern->pluginInfo_.pluginName = "plugin";
246 pattern->InitPluginManagerDelegate();
247 EXPECT_NE(pattern->pluginManagerBridge_, nullptr);
248 isSwap = pattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config);
249 EXPECT_EQ(isSwap, false);
250
251 /**
252 * case 6: config.skipMeasure = true; && onfig.skipLayout = true;
253 */
254 config.skipMeasure = true;
255 config.skipLayout = true;
256 isSwap = pattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config);
257 EXPECT_EQ(isSwap, false);
258
259 auto data = pattern->GetData();
260 EXPECT_EQ(data, "{data}");
261
262 auto pluginInfoOfPattern = pattern->GetPluginRequestInfo();
263 EXPECT_EQ(pluginInfoOfPattern, pluginInfo);
264 }
265
266 /**
267 * @tc.name: PluginPatternTestNg
268 * @tc.desc: Test CreatePluginSubContainer in Plugin Pattern.
269 * @tc.type: FUNC
270 */
271 HWTEST_F(PluginPatternTestNg, CreatePluginSubContainerTestNg, TestSize.Level1)
272 {
273 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
274 auto pattern = frameNode->GetPattern<PluginPattern>();
275 ASSERT_NE(pattern, nullptr);
276 Container::UpdateCurrent(MIN_PLUGIN_SUBCONTAINER_ID);
277 pattern->CreatePluginSubContainer();
278 auto pluginSubContainer = pattern->GetPluginSubContainer();
279 EXPECT_NE(pluginSubContainer, nullptr);
280 }
281
282 /**
283 * @tc.name: GetPackagePathTestNg1
284 * @tc.desc: Test GetPackagePath throw GetPackagePathByAbsolutePath in Plugin Pattern.
285 * @tc.type: FUNC
286 */
287 HWTEST_F(PluginPatternTestNg, GetPackagePathTestNg1, TestSize.Level1)
288 {
289 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
290 auto pattern = frameNode->GetPattern<PluginPattern>();
291 ASSERT_NE(pattern, nullptr);
292
293 /**
294 * corresponding ets code:
295 * PluginComponent({template: { source: "/data/bundle/index.js", bundleName: "com.example.plugin" },data:
296 * {}})
297 */
298 pluginInfo.pluginName = "/data/bundle/index.js";
299 auto packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
300 EXPECT_EQ(packagePathStr, "/data/bundle/");
301 EXPECT_EQ(pluginInfo.abilityName, "/");
302 EXPECT_EQ(pluginInfo.source, "index.js");
303
304 /**
305 * corresponding ets code:
306 * PluginComponent({template: { source: "/data/bundle/assets/js/index.js", bundleName: "com.example.plugin"
307 * },data: {}})
308 */
309 pluginInfo.pluginName = "/data/bundle/assets/js/index.js";
310 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
311 EXPECT_EQ(packagePathStr, "/data/bundle/");
312 EXPECT_EQ(pluginInfo.abilityName, "/");
313 EXPECT_EQ(pluginInfo.source, "index.js");
314
315 /**
316 * corresponding ets code:
317 * PluginComponent({template: { source: "/data/bundle/assets/js/plugin/index.js",
318 * bundleName: "com.example.plugin" },data: {}})
319 */
320 pluginInfo.pluginName = "/data/bundle/assets/js/plugin/index.js";
321 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
322 EXPECT_EQ(packagePathStr, "/data/bundle/");
323 EXPECT_EQ(pluginInfo.abilityName, "plugin");
324 EXPECT_EQ(pluginInfo.source, "/index.js");
325 }
326
327 /**
328 * @tc.name: GetPackagePathTestNg2
329 * @tc.desc: Test GetPackagePath throw GetPackagePathByWant when hapPath is not empty in Plugin Pattern.
330 * @tc.type: FUNC
331 */
332 HWTEST_F(PluginPatternTestNg, GetPackagePathTestNg2, TestSize.Level1)
333 {
334 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
335 auto pattern = frameNode->GetPattern<PluginPattern>();
336 ASSERT_NE(pattern, nullptr);
337
338 /**
339 * corresponding ets code:
340 * PluginComponent({template: { source: "", bundleName:""},data: {}})
341 */
342 pluginInfo.pluginName = "";
343 pluginInfo.bundleName = "";
344 auto packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
345 EXPECT_EQ(packagePathStr, "");
346
347 /**
348 * corresponding ets code:
349 * PluginComponent({template: { source: "plugin/index.js", bundleName:"com.example.plugin"},data: {}})
350 */
351 pluginInfo.pluginName = "plugin/index.js";
352 pluginInfo.bundleName = "com.example.plugin";
353 AppExecFwk::BundleInfo bundleInfo;
354 AppExecFwk::HapModuleInfo hapModuleInfo;
355 hapModuleInfo.hapPath = "/data/storage/com.example.plugin/";
356 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
357 EXPECT_EQ(packagePathStr, "");
358
359 AppExecFwk::MOCKIBundleMgr::CreateInstance();
360
361 auto bms = (PluginComponentManager::GetInstance()->GetBundleManager());
362 auto* bundleMgr = static_cast<AppExecFwk::MOCKIBundleMgr*>(bms.GetRefPtr());
363
364 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _)).WillOnce(Return(false));
365 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
366
367 bundleInfo.hapModuleInfos.emplace_back(hapModuleInfo);
368 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
369 .WillOnce(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
370 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
371 EXPECT_EQ(pluginInfo.source, "plugin/index.js");
372 EXPECT_EQ(packagePathStr, "/data/storage/com.example.plugin/");
373
374 /**
375 * corresponding ets code:
376 * PluginComponent({template: { source: "pages/index.js&plugin", bundleName:"com.example.plugin"},data: {}})
377 */
378 pluginInfo.pluginName = "pages&plugin";
379 pluginInfo.bundleName = "com.example.plugin";
380 hapModuleInfo.moduleName = "plugin";
381 hapModuleInfo.resourcePath = "resourcePath";
382 bundleInfo.hapModuleInfos.emplace_back(hapModuleInfo);
383 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
384 .WillOnce(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
385 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
386 EXPECT_EQ(pluginInfo.abilityName, "pages");
387 EXPECT_EQ(pluginInfo.moduleName, "plugin");
388 EXPECT_EQ(pluginInfo.moduleResPath, "resourcePath");
389 EXPECT_EQ(packagePathStr, "/data/storage/com.example.plugin/");
390
391 /**
392 * corresponding ets code:
393 * PluginComponent({template: { source: "pages/index.js&plugin", bundleName:"com.example.plugin"},data: {}})
394 */
395 pluginInfo.pluginName = "pages/plugin.js&plugin1";
396 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
397 .WillOnce(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
398 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
399 EXPECT_EQ(pluginInfo.source, "pages/plugin.js");
400 EXPECT_EQ(pluginInfo.moduleName, "plugin1");
401 EXPECT_EQ(packagePathStr, "");
402
403 AppExecFwk::MOCKIBundleMgr::ReleaseInstance();
404 }
405
406 /**
407 * @tc.name: GetPackagePathTestNg3
408 * @tc.desc: Test GetPackagePath throw GetPackagePathByWant when hapPath is empty in Plugin Pattern.
409 * @tc.type: FUNC
410 */
411 HWTEST_F(PluginPatternTestNg, GetPackagePathTestNg3, TestSize.Level1)
412 {
413 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
414 auto pattern = frameNode->GetPattern<PluginPattern>();
415 ASSERT_NE(pattern, nullptr);
416
417 /**
418 * corresponding ets code:
419 * PluginComponent({template: { source: "", bundleName:""},data: {}})
420 */
421 pluginInfo.pluginName = "";
422 pluginInfo.bundleName = "";
423 auto packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
424 EXPECT_EQ(packagePathStr, "");
425
426 /**
427 * corresponding ets code:
428 * PluginComponent({template: { source: "plugin/index.js", bundleName:"com.example.plugin"},data: {}})
429 */
430 pluginInfo.pluginName = "plugin/index.js";
431 pluginInfo.bundleName = "com.example.plugin";
432 AppExecFwk::BundleInfo bundleInfo;
433
434 AppExecFwk::MOCKIBundleMgr::CreateInstance();
435
436 auto bms = (PluginComponentManager::GetInstance()->GetBundleManager());
437 auto* bundleMgr = static_cast<AppExecFwk::MOCKIBundleMgr*>(bms.GetRefPtr());
438
439 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
440 .WillOnce(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
441 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
442 EXPECT_EQ(packagePathStr, "");
443
444 bundleInfo.moduleResPaths.emplace_back("moduleResPaths");
445 bundleInfo.moduleDirs.emplace_back("/data/storage/com.example.plugin");
446 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
447 .WillOnce(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
448 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
449 EXPECT_EQ(pluginInfo.source, "plugin/index.js");
450 EXPECT_EQ(packagePathStr, "/data/storage/com.example.plugin/");
451
452 /**
453 * corresponding ets code:
454 * PluginComponent({template: { source: "plugin/index.js", bundleName:"com.example.plugin/plugin"},data:
455 * {}})
456 */
457 pluginInfo.pluginName = "plugin/index.js";
458 pluginInfo.bundleName = "com.example.plugin/plugin";
459
460 AppExecFwk::AbilityInfo abilityInfo;
461 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
462 .WillOnce(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
463 EXPECT_CALL(*bundleMgr, QueryAbilityInfo(_, AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, _, _))
464 .WillOnce(DoAll(SetArgReferee<3>(abilityInfo), Return(false)));
465 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
466 EXPECT_EQ(packagePathStr, "");
467
468 abilityInfo.applicationInfo.codePath = "/data/storage/com.example.plugin";
469 abilityInfo.package = "data/plugin";
470 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
471 .WillOnce(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
472 EXPECT_CALL(*bundleMgr, QueryAbilityInfo(_, AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, _, _))
473 .WillOnce(DoAll(SetArgReferee<3>(abilityInfo), Return(true)));
474 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
475 EXPECT_EQ(packagePathStr, "/data/storage/com.example.plugin/data/plugin/");
476
477 AppExecFwk::MOCKIBundleMgr::ReleaseInstance();
478 }
479
480 /**@tc.name : GetPackagePathTestNg4
481 * @tc.desc : Test GetPackagePath.
482 * @tc.type : FUNC
483 */
484 HWTEST_F(PluginPatternTestNg, GetPackagePathTestNg4, TestSize.Level1)
485 {
486 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
487 auto pattern = frameNode->GetPattern<PluginPattern>();
488 ASSERT_NE(pattern, nullptr);
489
490 /**
491 * corresponding ets code:
492 * PluginComponent({template: { source: "", bundleName:""},data: {}})
493 */
494 pluginInfo.pluginName = "";
495 pluginInfo.bundleName = "";
496 AppExecFwk::BundleInfo bundleInfo;
497 AppExecFwk::MOCKIBundleMgr::CreateInstance();
498
499 auto packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
500 EXPECT_EQ(packagePathStr, "");
501
502 AppExecFwk::MOCKIBundleMgr::ReleaseInstance();
503 }
504
505 /**@tc.name : GetPackagePathTestNg5
506 * @tc.desc : Test GetPackagePath.
507 * @tc.type : FUNC
508 */
509 HWTEST_F(PluginPatternTestNg, GetPackagePathTestNg5, TestSize.Level1)
510 {
511 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
512 auto pattern = frameNode->GetPattern<PluginPattern>();
513 ASSERT_NE(pattern, nullptr);
514 AppExecFwk::BundleInfo bundleInfo;
515 AppExecFwk::MOCKIBundleMgr::CreateInstance();
516 auto bms = (PluginComponentManager::GetInstance()->GetBundleManager());
517 auto* bundleMgr = static_cast<AppExecFwk::MOCKIBundleMgr*>(bms.GetRefPtr());
518
519 /**
520 * corresponding ets code:
521 * PluginComponent({template: { source: "plugin/index.ets", bundleName:"com.example.plugin/plugin"},data:
522 * {}})
523 */
524 pluginInfo.pluginName = "plugin/index.ets";
525 pluginInfo.bundleName = "com.example.plugin";
526
527 bundleInfo.moduleResPaths.emplace_back("moduleResPaths");
528 bundleInfo.moduleDirs.emplace_back("/data/storage/com.example.plugin");
529 EXPECT_CALL(*bundleMgr, GetBundleInfo(_, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, _, _))
530 .WillRepeatedly(DoAll(SetArgReferee<2>(bundleInfo), Return(true)));
531 auto packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
532 EXPECT_EQ(pluginInfo.source, "plugin/index.js");
533 EXPECT_EQ(packagePathStr, "/data/storage/com.example.plugin/");
534
535 /**
536 * corresponding ets code:
537 * PluginComponent({template: { source: "plugin.ets/index.js", bundleName:"com.example.plugin/plugin"},data:
538 * {}})
539 */
540 pluginInfo.pluginName = "plugin.ets/index.js";
541 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
542 EXPECT_EQ(pluginInfo.source, "plugin.ets/index.js");
543
544 /**
545 * corresponding ets code:
546 * PluginComponent({template: { source: "plugin.ets/index.js&plugin",
547 * bundleName:"com.example.plugin/plugin"},data:{}})
548 */
549 pluginInfo.pluginName = "plugin.ets/index.ets&plugin";
550 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
551 EXPECT_EQ(pluginInfo.source, "plugin.ets/index.js");
552
553 /**
554 * corresponding ets code:
555 * PluginComponent({template: { source: "plugin/index.ets&plugin", bundleName:"com.example.plugin/plugin"},data:
556 * {}})
557 */
558 pluginInfo.pluginName = "plugin/index.ets&plugin";
559 packagePathStr = pattern->GetPackagePath(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
560 EXPECT_EQ(pluginInfo.source, "plugin/index.js");
561
562 AppExecFwk::MOCKIBundleMgr::ReleaseInstance();
563 }
564
565 /**@tc.name : GetAbilityNameByWant
566 * @tc.desc : Test GetPackagePath.
567 * @tc.type : FUNC
568 */
569 HWTEST_F(PluginPatternTestNg, GetAbilityNameByWant, TestSize.Level1)
570 {
571 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
572 auto pattern = frameNode->GetPattern<PluginPattern>();
573 ASSERT_NE(pattern, nullptr);
574
575 /**
576 * corresponding ets code:
577 * PluginComponent({template: { source: "plugin", bundleName:""},data: {}})
578 */
579 pluginInfo.pluginName = "plugin";
580 pluginInfo.bundleName = "";
581 AppExecFwk::BundleInfo bundleInfo;
582 AppExecFwk::MOCKIBundleMgr::CreateInstance();
583 pattern->GetAbilityNameByWant(AceType::WeakClaim(AceType::RawPtr(pattern)), pluginInfo);
584 EXPECT_EQ(pluginInfo.abilityName, "plugin");
585
586 AppExecFwk::MOCKIBundleMgr::ReleaseInstance();
587 }
588
589 /**
590 * @tc.name: PluginPatternTestNg
591 * @tc.desc: Test FireEvent in Plugin Pattern.
592 * @tc.type: FUNC
593 */
594 HWTEST_F(PluginPatternTestNg, FireEvent, TestSize.Level1)
595 {
596 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
597 auto pattern = frameNode->GetPattern<PluginPattern>();
598 ASSERT_NE(pattern, nullptr);
599 pattern->InitPluginManagerDelegate();
600 pattern->pluginManagerBridge_->OnPluginUpdate("");
601 pattern->pluginManagerBridge_->OnPluginError("");
602 }
603
604 /**
605 * @tc.name: GetDrawDelegate
606 * @tc.desc: Test OnActionEvent in Plugin Pattern.
607 * @tc.type: FUNC
608 */
609 HWTEST_F(PluginPatternTestNg, GetDrawDelegate, TestSize.Level1)
610 {
611 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
612 auto pattern = frameNode->GetPattern<PluginPattern>();
613 ASSERT_NE(pattern, nullptr);
614 std::shared_ptr<RSNode> rsNode = nullptr;
615 auto drawRSFrame = pattern->GetDrawDelegate();
616 drawRSFrame->DrawRSFrame(rsNode, Rect(100.0, 100.0, 100.0, 100.0));
617 }
618
619 /**s
620 * @tc.name: PluginLayoutPropertyTestNg
621 * @tc.desc: Test funcions in PluginLayoutProperty.
622 * @tc.type: FUNC
623 */
624 HWTEST_F(PluginPatternTestNg, PluginLayoutTestNg, TestSize.Level1)
625 {
626 RefPtr<FrameNode> frameNode = CreatePluginParagraph();
627 auto pattern = frameNode->GetPattern<PluginPattern>();
628 ASSERT_NE(pattern, nullptr);
629 auto layout = pattern->GetLayoutProperty<PluginLayoutProperty>();
630 EXPECT_NE(layout, nullptr);
631 layout->Clone();
632 layout.Reset();
633 }
634 } // namespace OHOS::Ace::NG
635