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