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