1 /*
2 * Copyright (c) 2022 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 <utility>
17 #include "gtest/gtest.h"
18 #include "ui_test_graphic_engine.h"
19 #include "view/component/img_view_adapter.h"
20 #include "view/component/text_label_adapter.h"
21 #include "view/page/page_manager.h"
22
23 using namespace Updater;
24 using namespace std;
25 using namespace testing::ext;
26
27 namespace {
ToString(const std::vector<std::string> & vec)28 std::string ToString(const std::vector<std::string> &vec)
29 {
30 if (vec.empty()) {
31 return "{}";
32 }
33 std::string res = "{";
34 for (auto &str : vec) {
35 res += str + ",";
36 }
37 res.pop_back();
38 res += "}";
39 return res;
40 }
41
42 class UpdaterUiPageManagerUnitTest : public testing::Test {
43 public:
SetUpTestCase(void)44 static void SetUpTestCase(void)
45 {
46 TestGraphicEngine::GetInstance();
47 }
TearDownTestCase(void)48 static void TearDownTestCase(void) {}
SetUp()49 void SetUp() override {}
TearDown()50 void TearDown() override {}
51 protected:
52 constexpr static const char *MAIN_PAGE_ID = "page1";
53 const static std::vector<Updater::UxPageInfo> pageInfos_;
54 };
55
GetInstance()56 inline PageManager &GetInstance()
57 {
58 return PageManager::GetInstance();
59 }
60
61 constexpr std::array VALID_COMINFOS {
62 std::pair {"page1", "label_id_0"}, std::pair {"page1", "image_view"},
63 std::pair {"page1:subpage1", "label_id_0"}, std::pair {"page1:subpage1", "image_view"},
64 std::pair {"page1:subpage2", "image_view"}, std::pair {"page1:subpage3", "label_id_0"},
65 std::pair {"page2", "label_id_0"}, std::pair {"page2", "image_view"},
66 std::pair {"page2:subpage1", "label_id_0"}, std::pair {"page2:subpage2", "image_view"},
67 std::pair {"page3", "label_id_0"}, std::pair {"page3", "image_view"}
68 };
69
70 const std::vector<UxPageInfo> UpdaterUiPageManagerUnitTest::pageInfos_ = {
71 {"page1",
72 "#000000ff",
73 {UxViewInfo {
74 UxViewCommonInfo {
75 300, 400, 600, 200, "label_id_0", "UILabel", true},
76 UxLabelInfo {
77 50, "this is page1", "center", "#ff0000ff", "#000000ff"}},
78 UxViewInfo {
79 UxViewCommonInfo {
80 300, 700, 400, 400, "image_view", "UIImageView", false},
81 UxImageInfo {
82 "/resources/img1", "empty", 100, 0 // just test page manger, image need not to exist
83 }}},
84 {UxSubPageInfo {"subpage1", "#000000ff", {"label_id_0", "image_view"}},
85 UxSubPageInfo {"subpage2", "#000000ff", {"image_view"}},
86 UxSubPageInfo {"subpage3", "#000000ff", {"label_id_0"}}}},
87 {"page2",
88 "#ffffffff",
89 {UxViewInfo {
90 UxViewCommonInfo {
91 300, 400, 600, 200, "label_id_0", "UILabel", true},
92 UxLabelInfo {
93 50, "this is page2", "center", "#00ff00ff", "#000000ff"}},
94 UxViewInfo {
95 UxViewCommonInfo {
96 300, 700, 400, 400, "image_view", "UIImageView", false},
97 UxImageInfo {
98 "/resources/img2", "empty", 100, 0 // just test page manger, image need not to exist
99 }}},
100 {UxSubPageInfo {"subpage1", "#000000ff", {"label_id_0"}},
101 UxSubPageInfo {"subpage2", "#000000ff", {"image_view"}}}},
102 {"page3",
103 "#000000ff",
104 {UxViewInfo {
105 UxViewCommonInfo {
106 300, 400, 600, 200, "label_id_0", "UILabel", true},
107 UxLabelInfo {
108 50, "this is page2", "center", "#0000ffff", "#000000ff"}},
109 UxViewInfo {
110 UxViewCommonInfo {
111 300, 700, 400, 400, "image_view", "UIImageView", false},
112 UxImageInfo {
113 "/resources/img2", "empty", 100, 0 // just test page manger, image need not to exist
114 }}}}};
115
CheckResult(const std::vector<std::string> & expected,std::vector<std::string> && checked)116 inline bool CheckResult(const std::vector<std::string> &expected, std::vector<std::string> &&checked)
117 {
118 std::sort(checked.begin(), checked.end());
119 EXPECT_TRUE(expected == checked) << ToString(expected) << "!=" << ToString(checked);
120 return expected == checked;
121 }
122
123 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_init_failed, TestSize.Level0)
124 {
125 {
126 // invalid page id
127 std::vector<UxPageInfo> pageInfo { { "", "#000000ff", {}, {} } };
128 EXPECT_FALSE(GetInstance().Init(pageInfo, ""));
129
130 // duplicate page id
131 pageInfo = {
132 { "page1", "#000000ff", {}, {} },
133 { "page1", "#000000ff", {}, {} }
134 };
135 EXPECT_FALSE(GetInstance().Init(pageInfo, "page1"));
136
137 // invalid page's view info
138 pageInfo = {
139 {"page1",
140 "#000000ff",
141 {UxViewInfo {
142 UxViewCommonInfo {
143 300, 400, 600, 200, "label_id_0", "UILabel", true},
144 UxLabelInfo {
145 50, "this is page1", "center", "#ff0ff", "#0"}}}, {}}
146 };
147 EXPECT_FALSE(GetInstance().Init(pageInfo, "page1"));
148 }
149 {
150 GetInstance().Reset();
151 // invalid subpage id
152 std::vector<UxPageInfo> pageInfo {
153 {"page1",
154 "#000000ff",
155 {UxViewInfo {
156 UxViewCommonInfo {
157 300, 400, 600, 200, "label_id_0", "UILabel", true},
158 UxLabelInfo {
159 50, "this is page1", "center", "#000000ff", "#000000ff"}}},
160 {{UxSubPageInfo {"", "#000000ff", {"label_id_0"}}}}}};
161 EXPECT_FALSE(GetInstance().Init(pageInfo, "page1"));
162
163 // duplicate subpage id
164 pageInfo[0].subpages = { UxSubPageInfo {"subpage1", "#000000ff", {"label_id_0"}},
165 UxSubPageInfo {"subpage1", "#000000ff", {"label_id_0"}}};
166 EXPECT_FALSE(GetInstance().Init(pageInfo, "page1"));
167
168 // invalid subpage's component id
169 pageInfo[0].subpages = {UxSubPageInfo {"subpage1", "#000000ff", {"invalid_id"}}};
170 EXPECT_FALSE(GetInstance().Init(pageInfo, "page1"));
171 }
172 {
173 GetInstance().Reset();
174 std::vector<UxPageInfo> pageInfo {
175 { "page1", "#000000ff", {}, {} },
176 { "page2", "#000000ff", {}, {} },
177 { "page3", "#000000ff", {}, {} }
178 };
179 EXPECT_FALSE(GetInstance().Init(pageInfo, "page")); // invalid main page id
180 }
181 }
182
183 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_is_valid_com, TestSize.Level0)
184 {
185 auto pageInfo = pageInfos_;
186 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
187 for (auto [pageId, comId] : VALID_COMINFOS) {
188 EXPECT_TRUE(GetInstance().IsValidCom(ComInfo {pageId, comId})) << pageId << "[" << comId << "] is invalid";
189 }
190 const std::array inValidCominfos {
191 ComInfo {"page1", "invalid"}, ComInfo {"invalid", "image_view"}, ComInfo {"page1:subpage2", "label_id_0"}
192 };
193 for (auto cominfo : inValidCominfos) {
194 EXPECT_FALSE(GetInstance().IsValidCom(cominfo)) << cominfo.pageId << "[" << cominfo.comId << "] is valid";
195 }
196 GetInstance().Reset();
197 }
198
199 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_operator_subscript_for_pages, TestSize.Level0)
200 {
201 auto pageInfo = pageInfos_;
202 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
203 auto *dummyPage = &GetInstance()[""];
204 for (auto pageId : { "page1", "page2", "page3", "page1:subpage1", "page1:subpage2", "page1:subpage3",
205 "page2:subpage1", "page2:subpage2"}) {
206 EXPECT_NE(&GetInstance()[pageId], dummyPage);
207 }
208 EXPECT_EQ(&GetInstance()["nonexist"], dummyPage);
209 GetInstance().Reset();
210 }
211
212 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_operator_subscript_for_coms, TestSize.Level0)
213 {
214 auto pageInfo = pageInfos_;
215 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
216
217 std::string errMsg {};
218 for (auto [pageId, comId] : { std::pair {"page1", "label_id_0"}, std::pair {"page1:subpage1", "label_id_0"},
219 std::pair {"page1:subpage3", "label_id_0"}, std::pair {"page2", "label_id_0"},
220 std::pair {"page2:subpage1", "label_id_0"}, std::pair {"page3", "label_id_0"}}) {
221 GetInstance()[ComInfo {pageId, comId}].As<TextLabelAdapter>(errMsg);
222 ASSERT_EQ(errMsg, "") << errMsg;
223 }
224 for (auto [pageId, comId] : { std::pair {"page1", "image_view"}, std::pair {"page1:subpage1", "image_view"},
225 std::pair {"page1:subpage2", "image_view"}, std::pair {"page2", "image_view"},
226 std::pair {"page2:subpage2", "image_view"}, std::pair {"page3", "image_view"}}) {
227 GetInstance()[ComInfo {pageId, comId}].As<ImgViewAdapter>(errMsg);
228 ASSERT_EQ(errMsg, "") << errMsg;
229 }
230 GetInstance()[ComInfo {"", ""}].As(errMsg);
231 EXPECT_EQ(errMsg, " view is null");
232 GetInstance().Reset();
233 }
234
235 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_after_init_success, TestSize.Level1)
236 {
237 auto pageInfo = pageInfos_;
238 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
239 EXPECT_TRUE(CheckResult(GetInstance().Report(), {}));
240 GetInstance().Reset();
241 }
242
243 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_show_main_page, TestSize.Level1)
244 {
245 auto pageInfo = pageInfos_;
246 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
247 GetInstance().ShowPage("page2");
248 GetInstance().ShowMainPage();
249 EXPECT_TRUE(CheckResult(GetInstance().Report(), { MAIN_PAGE_ID }));
250 GetInstance().Reset();
251 }
252
253 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_show_page, TestSize.Level1)
254 {
255 auto pageInfo = pageInfos_;
256 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
257 GetInstance().ShowPage("page2");
258 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2" }));
259 GetInstance().Reset();
260 }
261
262 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_show_non_exist_page, TestSize.Level1)
263 {
264 auto pageInfo = pageInfos_;
265 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
266 GetInstance().ShowMainPage();
267 GetInstance().ShowPage("nonexist");
268 EXPECT_TRUE(CheckResult(GetInstance().Report(), { MAIN_PAGE_ID }));
269 GetInstance().Reset();
270 }
271
272 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_switch_between_page, TestSize.Level1)
273 {
274 auto pageInfo = pageInfos_;
275 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
276 GetInstance().ShowPage("page2");
277 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2" }));
278 GetInstance().ShowPage("page3");
279 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page3" }));
280 GetInstance().Reset();
281 }
282
283 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_show_sub_page, TestSize.Level1)
284 {
285 auto pageInfo = pageInfos_;
286 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
287 GetInstance().ShowPage("page2:subpage1");
288 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2:subpage1", "page2" }));
289 GetInstance().Reset();
290 }
291
292 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_show_non_exist_sub_page, TestSize.Level1)
293 {
294 auto pageInfo = pageInfos_;
295 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
296 GetInstance().ShowPage("page2");
297 GetInstance().ShowPage("page2:subpage3");
298 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2" }));
299 GetInstance().Reset();
300 }
301
302 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_switch_between_sub_pages, TestSize.Level1)
303 {
304 auto pageInfo = pageInfos_;
305 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
306 GetInstance().ShowPage("page2");
307 GetInstance().ShowPage("page1:subpage1");
308 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page1:subpage1", "page1" }));
309
310 GetInstance().ShowPage("page2:subpage2");
311 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2:subpage2", "page2" }));
312 GetInstance().Reset();
313 }
314
315 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_switch_between_sub_page_and_page, TestSize.Level1)
316 {
317 auto pageInfo = pageInfos_;
318 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
319 GetInstance().ShowPage("page1:subpage1");
320 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page1:subpage1", "page1" }));
321
322 GetInstance().ShowPage("page2");
323 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2" }));
324
325 GetInstance().ShowPage("page1:subpage2");
326 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page1:subpage2", "page1" }));
327 GetInstance().Reset();
328 }
329
330 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_go_back, TestSize.Level1)
331 {
332 auto pageInfo = pageInfos_;
333 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
334 GetInstance().ShowMainPage();
335 GetInstance().ShowPage("page2");
336 GetInstance().ShowPage("page3");
337 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page3" }));
338
339 GetInstance().GoBack();
340 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2" }));
341
342 GetInstance().GoBack();
343 EXPECT_TRUE(CheckResult(GetInstance().Report(), { MAIN_PAGE_ID }));
344 GetInstance().Reset();
345 }
346
347 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_show_same_page_and_goback, TestSize.Level1)
348 {
349 auto pageInfo = pageInfos_;
350 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
351 GetInstance().ShowMainPage();
352 GetInstance().ShowPage("page1");
353 GetInstance().ShowPage("page2");
354 GetInstance().ShowPage("page2");
355 GetInstance().ShowPage("page3");
356 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page3" }));
357
358 // don't show and enqueue page showing currently
359 GetInstance().GoBack();
360 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2" }));
361
362 GetInstance().GoBack();
363 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page1" }));
364 GetInstance().Reset();
365 }
366
367 HWTEST_F(UpdaterUiPageManagerUnitTest, test_page_manager_show_more_page_than_queue_limit, TestSize.Level1)
368 {
369 auto pageInfo = pageInfos_;
370 ASSERT_EQ(GetInstance().Init(pageInfo, MAIN_PAGE_ID), true);
371 GetInstance().ShowMainPage();
372 GetInstance().ShowPage("page3");
373 GetInstance().ShowPage("page1");
374 GetInstance().ShowPage("page2");
375 GetInstance().ShowPage("page3");
376 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page3" }));
377
378 // Don't show and enqueue page showing currently
379 GetInstance().GoBack();
380 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page2" }));
381
382 GetInstance().GoBack();
383 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page1" }));
384
385 GetInstance().GoBack();
386 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page3" }));
387
388 // max queue size is 3, when bigger than 3, queue tail will be pop, so can't show page3 here
389 GetInstance().GoBack();
390 EXPECT_TRUE(CheckResult(GetInstance().Report(), { "page3" }));
391 GetInstance().Reset();
392 }
393 }
394