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