• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "gtest/gtest.h"
17 #include "test/mock/interfaces/mock_uicontent.h"
18 #include "ui_content.h"
19 
20 #define private public
21 #include "interfaces/inner_api/form_render/include/form_renderer.h"
22 #include "interfaces/inner_api/form_render/include/form_renderer_delegate_impl.h"
23 #include "interfaces/inner_api/form_render/include/form_renderer_group.h"
24 #include "core/pipeline_ng/test/mock/mock_pipeline_base.h"
25 
26 using namespace testing;
27 using namespace testing::ext;
28 
29 namespace OHOS::Ace {
30 namespace {
31 constexpr char FORM_RENDERER_ALLOW_UPDATE[] = "allowUpdate";
32 constexpr char FORM_RENDERER_COMP_ID[] = "ohos.extra.param.key.form_comp_id";
33 constexpr char FORM_WIDTH_KEY[] = "ohos.extra.param.key.form_width";
34 constexpr char FORM_HEIGHT_KEY[] = "ohos.extra.param.key.form_height";
35 constexpr char FORM_RENDERER_PROCESS_ON_ADD_SURFACE[] = "ohos.extra.param.key.process_on_add_surface";
36 constexpr char FORM_RENDER_STATE[] = "ohos.extra.param.key.form_render_state";
37 const std::string FORM_COMPONENT_ID_1 = "111111";
38 const std::string FORM_COMPONENT_ID_2 = "222222";
39 const std::string FORM_COMPONENT_ID_3 = "333333";
40 const std::string CHECK_KEY = "CHECK_KEY";
41 constexpr double FORM_WIDTH = 100.0f;
42 constexpr double FORM_HEIGHT = 100.0f;
43 constexpr double FORM_WIDTH_2 = 200.0f;
44 constexpr double FORM_HEIGHT_2 = 200.0f;
45 } // namespace
46 class FormRenderTest : public testing::Test {
47 public:
SetUpTestCase()48     static void SetUpTestCase()
49     {
50         NG::MockPipelineBase::SetUp();
51     }
52 
TearDownTestCase()53     static void TearDownTestCase()
54     {
55         NG::MockPipelineBase::TearDown();
56     }
57 };
58 
59 /**
60  * @tc.name: FormRenderTest001
61  * @tc.desc: test AddForm -> UpdateForm -> ReloadForm -> DeleteForm(comp_id) -> DeleteForm
62  * @tc.type: FUNC
63  */
64 HWTEST_F(FormRenderTest, FormRenderTest001, TestSize.Level1)
65 {
66     /**
67      * @tc.steps: step1. create formRenderGroup and prepare want
68      * @tc.expected: step1. formRenderGroup is created successfully
69      */
70     auto formRendererGroup = FormRendererGroup::Create(nullptr, nullptr);
71     EXPECT_TRUE(formRendererGroup);
72     bool isEmpty = formRendererGroup->IsFormRequestsEmpty();
73     EXPECT_TRUE(isEmpty);
74     OHOS::AAFwk::Want want;
75     want.SetParam(FORM_WIDTH_KEY, FORM_WIDTH);
76     want.SetParam(FORM_HEIGHT_KEY, FORM_HEIGHT);
77     want.SetParam(FORM_RENDERER_COMP_ID, FORM_COMPONENT_ID_1);
78     want.SetParam(FORM_RENDERER_ALLOW_UPDATE, true);
79     want.SetParam(FORM_RENDER_STATE, true);
80     OHOS::AppExecFwk::FormJsInfo formJsInfo;
81 
82     /**
83      * @tc.steps: step2. call AddForm
84      * @tc.expected: step2. formRenderer is created successfully and added to the formRendererGroup
85      */
86     // formRenderer->uiContent_ is null, so formRenderer->AddForm will not be called
87     formRendererGroup->AddForm(want, formJsInfo);
88     EXPECT_TRUE(formRendererGroup->formRenderer_ != nullptr);
89     isEmpty = formRendererGroup->IsFormRequestsEmpty();
90     formRendererGroup->UpdateConfiguration(nullptr);
91     EXPECT_FALSE(isEmpty);
92 
93 
94     /**
95      * @tc.steps: step3. call formRenderer's AddForm
96      * @tc.expected: step3. uiContent's relevant methods are called & formRenderer's property are set
97      */
98     auto formRenderer = formRendererGroup->formRenderer_;
99     EXPECT_TRUE(formRenderer);
100     formRenderer->uiContent_ = UIContent::Create(nullptr, nullptr);
101     EXPECT_TRUE(formRenderer->uiContent_);
102     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormWidth(FORM_WIDTH)).WillOnce(Return());
103     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormHeight(FORM_HEIGHT)).WillOnce(Return());
104     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), UpdateFormSharedImage(_)).WillOnce(Return());
105     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), UpdateFormData(_)).WillOnce(Return());
106     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), Initialize(An<OHOS::Rosen::Window*>(), _, _))
107         .WillOnce(Return());
108     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetActionEventHandler(_)).WillOnce(Return());
109     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetErrorEventHandler(_)).WillOnce(Return());
110     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), GetFormRootNode()).Times(Exactly(2));
111     // call AddForm manually
112     formRenderer->AddForm(want, formJsInfo);
113     EXPECT_EQ(formRenderer->allowUpdate_, true);
114     EXPECT_EQ(formRenderer->width_, FORM_WIDTH);
115     EXPECT_EQ(formRenderer->height_, FORM_HEIGHT);
116 
117     /**
118      * @tc.steps: step4. add another formRenderer
119      * @tc.expected: step4. the formRenderer is created successfully and added to the formRendererGroup
120      */
121     OHOS::AAFwk::Want want2;
122     want2.SetParam(FORM_WIDTH_KEY, FORM_WIDTH);
123     want2.SetParam(FORM_HEIGHT_KEY, FORM_HEIGHT);
124     want2.SetParam(FORM_RENDERER_COMP_ID, FORM_COMPONENT_ID_2);
125     want2.SetParam(FORM_RENDERER_ALLOW_UPDATE, true);
126     want2.SetParam(FORM_RENDER_STATE, true);
127     formRendererGroup->AddForm(want2, formJsInfo);
128     auto formRenderer2 = formRendererGroup->formRenderer_;
129     formRenderer2->OnActionEvent("");
130     formRenderer2->OnError("", "");
131     formRenderer2->OnSurfaceChange(0.0f, 0.0f);
132 
133     /**
134      * @tc.steps: step5. call formRenderer's UpdateForm
135      * @tc.expected: step5. uiContent's relevant methods are called
136      */
137     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), UpdateFormSharedImage(_)).WillOnce(Return());
138     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), UpdateFormData(_)).WillOnce(Return());
139     formRendererGroup->UpdateForm(formJsInfo);
140 
141     /**
142      * @tc.steps: step6. call formRenderer's ReloadForm
143      * @tc.expected: step6. uiContent's relevant methods are called
144      */
145     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), ReloadForm(_)).WillOnce(Return());
146     formRendererGroup->ReloadForm(formJsInfo);
147 
148     /**
149      * @tc.steps: step7. delete formRenderer whose compId not exists
150      * @tc.expected: step7. delete fail
151      */
152     formRendererGroup->DeleteForm(FORM_COMPONENT_ID_3);
153 
154     /**
155      * @tc.steps: step8. delete formRenderer whose compId exists
156      * @tc.expected: step8. delete successfully
157      */
158     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), Destroy()).WillOnce(Return());
159     // delete formRenderer that compId exists
160     formRendererGroup->DeleteForm(FORM_COMPONENT_ID_1);
161 
162     /**
163      * @tc.steps: step9. delete all formRenderers
164      * @tc.expected: step9. delete successfully
165      */
166     formRendererGroup->DeleteForm();
167 }
168 
169 /**
170  * @tc.name: FormRenderTest002
171  * @tc.desc: delegate & dispatcher is not null
172  * @tc.type: FUNC
173  */
174 HWTEST_F(FormRenderTest, FormRenderTest002, TestSize.Level1)
175 {
176     /**
177      * @tc.steps: step1. create formRenderGroup and add new formRenderer with delegate & dispatcher
178      * @tc.expected: step1. formRenderGroup is created successfully and the formRenderer is added to the
179      * formRendererGroup
180      */
181     auto formRendererGroup = FormRendererGroup::Create(nullptr, nullptr);
182     EXPECT_TRUE(formRendererGroup);
183     OHOS::AAFwk::Want want;
184     want.SetParam(FORM_RENDERER_COMP_ID, FORM_COMPONENT_ID_1);
185     want.SetParam(FORM_RENDERER_ALLOW_UPDATE, false);
186     want.SetParam(FORM_RENDER_STATE, true);
187     sptr<FormRendererDelegateImpl> renderDelegate = new FormRendererDelegateImpl();
188     want.SetParam(FORM_RENDERER_PROCESS_ON_ADD_SURFACE, renderDelegate->AsObject());
189     OHOS::AppExecFwk::FormJsInfo formJsInfo;
190     formRendererGroup->AddForm(want, formJsInfo);
191     auto formRenderer = formRendererGroup->formRenderer_;;
192     EXPECT_TRUE(formRenderer);
193     formRenderer->uiContent_ = UIContent::Create(nullptr, nullptr);
194     EXPECT_TRUE(formRenderer->uiContent_);
195 
196     /**
197      * @tc.steps: step2. register callback for rendererDelegate
198      */
199     std::string onSurfaceCreateKey;
200     auto onSurfaceCreate = [&onSurfaceCreateKey](const std::shared_ptr<Rosen::RSSurfaceNode>& /* surfaceNode */,
201                                const OHOS::AppExecFwk::FormJsInfo& /* info */,
__anondd23711b0202(const std::shared_ptr<Rosen::RSSurfaceNode>& , const OHOS::AppExecFwk::FormJsInfo& , const AAFwk::Want& ) 202                                const AAFwk::Want& /* want */) { onSurfaceCreateKey = CHECK_KEY; };
203     renderDelegate->SetSurfaceCreateEventHandler(std::move(onSurfaceCreate));
204 
205     std::string onActionEventKey;
__anondd23711b0302(const std::string& ) 206     auto onAction = [&onActionEventKey](const std::string& /* action */) { onActionEventKey = CHECK_KEY; };
207     renderDelegate->SetActionEventHandler(std::move(onAction));
208 
209     std::string onErrorEventKey;
210     auto onError = [&onErrorEventKey](
__anondd23711b0402( const std::string& , const std::string& ) 211                        const std::string& /* code */, const std::string& /* msg */) { onErrorEventKey = CHECK_KEY; };
212     renderDelegate->SetErrorEventHandler(std::move(onError));
213 
214     std::string onSurfaceChangeEventKey;
215     auto onSurfaceChange = [&onSurfaceChangeEventKey](
__anondd23711b0502( float , float ) 216                                float /* width */, float /* height */) { onSurfaceChangeEventKey = CHECK_KEY; };
217     renderDelegate->SetSurfaceChangeEventHandler(std::move(onSurfaceChange));
218 
219     /**
220      * @tc.steps: step3. call formRenderer's AddForm
221      * @tc.expected: step3. onSurfaceCreate has been called
222      */
223     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormWidth(_)).WillOnce(Return());
224     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormHeight(_)).WillOnce(Return());
225     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), UpdateFormSharedImage(_)).WillOnce(Return());
226     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), UpdateFormData(_)).WillOnce(Return());
227     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), Initialize(An<OHOS::Rosen::Window*>(), _, _))
228         .WillOnce(Return());
229     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetActionEventHandler(_)).WillOnce(Return());
230     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetErrorEventHandler(_)).WillOnce(Return());
231     std::string surfaceNodeName = "ArkTSCardNode";
232     struct Rosen::RSSurfaceNodeConfig surfaceNodeConfig = { .SurfaceNodeName = surfaceNodeName };
233     std::shared_ptr<Rosen::RSSurfaceNode> rsNode = OHOS::Rosen::RSSurfaceNode::Create(surfaceNodeConfig, true);
234     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), GetFormRootNode())
235         .WillOnce(Return(rsNode))
236         .WillOnce(Return(rsNode))
237         .WillOnce(Return(rsNode));
238     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), Foreground()).WillOnce(Return());
239     formRenderer->AddForm(want, formJsInfo);
240     EXPECT_EQ(onSurfaceCreateKey, CHECK_KEY);
241 
242     /**
243      * @tc.steps: step4. call formRenderer's OnActionEvent & OnErrorEvent
244      * @tc.expected: step4. onAction & onError have been called
245      */
246     formRenderer->OnActionEvent("");
247     EXPECT_EQ(onActionEventKey, CHECK_KEY);
248     formRenderer->OnError("", "");
249     EXPECT_EQ(onErrorEventKey, CHECK_KEY);
250 
251     /**
252      * @tc.steps: step5. Test surface change
253      * @tc.expected: step5. onSurfaceChange has been called
254      */
255     auto formRendererDispatcher = formRenderer->formRendererDispatcherImpl_;
256     EXPECT_TRUE(formRendererDispatcher);
257     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormWidth(FORM_WIDTH_2)).WillOnce(Return());
258     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormHeight(FORM_HEIGHT_2)).WillOnce(Return());
259     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), OnFormSurfaceChange(FORM_WIDTH_2, FORM_HEIGHT_2))
260         .WillOnce(Return());
261     formRendererDispatcher->DispatchSurfaceChangeEvent(FORM_WIDTH_2, FORM_HEIGHT_2);
262     EXPECT_EQ(onSurfaceChangeEventKey, CHECK_KEY);
263     // formRenderer is null
264     formRendererDispatcher->formRenderer_.reset();
265     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormWidth(FORM_WIDTH_2)).WillOnce(Return());
266     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), SetFormHeight(FORM_HEIGHT_2)).WillOnce(Return());
267     EXPECT_CALL(*((MockUIContent*)(formRenderer->uiContent_.get())), OnFormSurfaceChange(FORM_WIDTH_2, FORM_HEIGHT_2))
268         .WillOnce(Return());
269     onSurfaceChangeEventKey = "";
270     formRendererDispatcher->DispatchSurfaceChangeEvent(FORM_WIDTH_2, FORM_HEIGHT_2);
271     EXPECT_NE(onSurfaceChangeEventKey, CHECK_KEY);
272 }
273 } // namespace OHOS::Ace
274