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