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
18 #include "base/log/log.h"
19 #include "base/memory/ace_type.h"
20 #include "base/utils/utils.h"
21 #include "core/common/recorder/event_controller.h"
22 #include "core/common/recorder/event_recorder.h"
23 #include "core/common/recorder/event_config.h"
24 #include "core/common/recorder/exposure_processor.h"
25 #include "core/common/recorder/node_data_cache.h"
26 #include "interfaces/inner_api/ace/ui_event_observer.h"
27
28 using namespace testing;
29 using namespace testing::ext;
30
31 namespace OHOS::Ace {
32 class DemoUIEventObserver : public UIEventObserver {
33 public:
34 DemoUIEventObserver() = default;
35 ~DemoUIEventObserver() override = default;
36
GetEventType() const37 int32_t GetEventType() const
38 {
39 return eventType_;
40 }
41
NotifyUIEvent(int32_t eventType,const std::unordered_map<std::string,std::string> & eventParams)42 virtual void NotifyUIEvent(int32_t eventType, const std::unordered_map<std::string, std::string>& eventParams)
43 {
44 LOGI("NotifyUIEvent eventType %{public}d", eventType);
45 eventType_ = eventType;
46 }
47
48 private:
49 int32_t eventType_;
50 };
51
52 class EventRecorderTest : public testing::Test {
53 public:
SetUpTestCase()54 static void SetUpTestCase() {}
TearDownTestCase()55 static void TearDownTestCase() {}
SetUp()56 void SetUp() {}
TearDown()57 void TearDown() {}
58 };
59
GetConfig(std::string & config)60 void GetConfig(std::string& config)
61 {
62 config =
63 "{\"enable\":true,\"switch\":{\"page\":true,\"component\":true,\"exposure\":true},\"config\":[{\"pageUrl\":"
64 "\"pages/"
65 "Index\",\"shareNode\":[\"hahaha\",\"btn_TitleExpand\",\"btn_OpenSelf\",\"btn_Screenshot\",\"btn_inspect\","
66 "\"btn_xxx\",\"\"],\"exposureCfg\":[{\"id\":\"btn_Grid\",\"ratio\":0.75,\"duration\":5000},{\"id\":\"btn_"
67 "TitleExpand\",\"ratio\":0.9,\"duration\":1000}]},{\"pageUrl\":\"pages/"
68 "ScrollPage\",\"shareNode\":[\"scroll_item_1\"],\"exposureCfg\":[{\"id\":\"scroll_item_2\",\"ratio\":0.85,"
69 "\"duration\":5000},{\"id\":\"scroll_item_12\",\"ratio\":0.4,\"duration\":3000}]}]}";
70 }
71
72 /**
73 * @tc.name: EventRecorderTest001
74 * @tc.desc: Test register.
75 * @tc.type: FUNC
76 */
77 HWTEST_F(EventRecorderTest, EventRecorderTest001, TestSize.Level1)
78 {
79 /**
80 * @tc.steps: step1. call the Register first.
81 * @tc.expected: step1. register success.
82 */
83 std::string config;
84 GetConfig(config);
85 auto observer = std::make_shared<DemoUIEventObserver>();
86 Recorder::EventController::Get().Register(config, observer);
87
88 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
89
90 Recorder::ExposureCfg exposureCfg = { "", 0.0, 0 };
91 Recorder::NodeDataCache::Get().GetExposureCfg("btn_Grid", exposureCfg);
92 EXPECT_EQ(exposureCfg.id, "btn_Grid");
93 EXPECT_EQ(exposureCfg.duration, 5000);
94
95 exposureCfg = { "", 0.0, 0 };
96 Recorder::NodeDataCache::Get().GetExposureCfg("", exposureCfg);
97 EXPECT_EQ(exposureCfg.id, "");
98
99 exposureCfg = { "", 0.0, 0 };
100 Recorder::NodeDataCache::Get().GetExposureCfg("xyz", exposureCfg);
101 EXPECT_EQ(exposureCfg.id, "");
102
103 Recorder::NodeDataCache::Get().OnPageShow("pages/ScrollPage");
104 exposureCfg = { "", 0.0, 0 };
105 Recorder::NodeDataCache::Get().GetExposureCfg("btn_Grid", exposureCfg);
106 EXPECT_EQ(exposureCfg.id, "");
107
108 exposureCfg = { "", 0.0, 0 };
109 Recorder::NodeDataCache::Get().GetExposureCfg("scroll_item_2", exposureCfg);
110 EXPECT_EQ(exposureCfg.id, "scroll_item_2");
111 EXPECT_NEAR(exposureCfg.ratio, 0.85, 0.00001f);
112
113 /**
114 * @tc.steps: step2. call the Unregister first.
115 * @tc.expected: step2. unregister success.
116 */
117 Recorder::EventController::Get().Unregister(observer);
118 exposureCfg = { "", 0.0, 0 };
119 Recorder::NodeDataCache::Get().GetExposureCfg("scroll_item_2", exposureCfg);
120 EXPECT_EQ(exposureCfg.id, "");
121 }
122
123 /**
124 * @tc.name: EventRecorderTest002
125 * @tc.desc: Test node data cache.
126 * @tc.type: FUNC
127 */
128 HWTEST_F(EventRecorderTest, EventRecorderTest002, TestSize.Level1)
129 {
130 std::string config;
131 GetConfig(config);
132 auto observer = std::make_shared<DemoUIEventObserver>();
133 Recorder::EventController::Get().Register(config, observer);
134
135 /**
136 * @tc.steps: step1. test index page.
137 * @tc.expected: step1. get value success.
138 */
139 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
140
141 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "abc");
142 Recorder::NodeDataCache::Get().PutInt("btn_OpenSelf", 2);
143 Recorder::NodeDataCache::Get().PutBool("btn_Screenshot", true);
144 Recorder::NodeDataCache::Get().PutMultiple("btn_inspect", "inspect", 11);
145 Recorder::NodeDataCache::Get().PutMultiple("btn_xxx", "xxx", true);
146 std::vector<std::string> values = {"a", "b", "c"};
147 Recorder::NodeDataCache::Get().PutMultiple("hahaha", "xixi", values);
148 auto nodeValues = std::unordered_map<std::string, std::string>();
149 nodeValues.emplace("btn_TitleExpand", "");
150 nodeValues.emplace("btn_OpenSelf", "");
151 nodeValues.emplace("btn_Screenshot", "");
152 nodeValues.emplace("btn_inspect", "");
153 nodeValues.emplace("btn_xxx", "");
154 nodeValues.emplace("hahaha", "");
155 nodeValues.emplace("hello", "");
156 nodeValues.emplace("world", "xyz");
157 Recorder::NodeDataCache::Get().GetNodeData("pages/Index", nodeValues);
158
159 auto iter = nodeValues.find("btn_TitleExpand");
160 EXPECT_EQ(iter->second, "abc");
161
162 iter = nodeValues.find("btn_OpenSelf");
163 EXPECT_EQ(iter->second, "2");
164
165 iter = nodeValues.find("btn_Screenshot");
166 EXPECT_EQ(iter->second, "true");
167
168 iter = nodeValues.find("btn_inspect");
169 EXPECT_EQ(iter->second, "{\"text\":\"inspect\",\"index\":11}");
170
171 iter = nodeValues.find("btn_xxx");
172 EXPECT_EQ(iter->second, "{\"text\":\"xxx\",\"checked\":true}");
173
174 iter = nodeValues.find("hahaha");
175 EXPECT_EQ(iter->second, "{\"text\":\"xixi\",\"textArray\":[\"a\",\"b\",\"c\"]}");
176
177 iter = nodeValues.find("hello");
178 EXPECT_EQ(iter->second, "");
179
180 iter = nodeValues.find("world");
181 EXPECT_EQ(iter->second, "xyz");
182
183 Recorder::EventController::Get().Unregister(observer);
184 }
185
186 /**
187 * @tc.name: EventRecorderTest003
188 * @tc.desc: Test node data cache.
189 * @tc.type: FUNC
190 */
191 HWTEST_F(EventRecorderTest, EventRecorderTest003, TestSize.Level1)
192 {
193 std::string config;
194 GetConfig(config);
195 auto observer = std::make_shared<DemoUIEventObserver>();
196 Recorder::EventController::Get().Register(config, observer);
197
198 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
199
200 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "abc");
201 Recorder::NodeDataCache::Get().PutInt("btn_OpenSelf", 2);
202 Recorder::NodeDataCache::Get().PutBool("btn_Screenshot", true);
203 Recorder::NodeDataCache::Get().PutMultiple("btn_inspect", "inspect", 11);
204 Recorder::NodeDataCache::Get().PutMultiple("btn_xxx", "xxx", true);
205 std::vector<std::string> values = {"a", "b", "c"};
206 Recorder::NodeDataCache::Get().PutMultiple("hahaha", "xixi", values);
207
208 /**
209 * @tc.steps: step1. test scroll page.
210 * @tc.expected: step1. get value success.
211 */
212 Recorder::NodeDataCache::Get().OnPageShow("pages/ScrollPage");
213
214 std::vector<std::string> values2 = {"x", "y", "z"};
215 Recorder::NodeDataCache::Get().PutStringArray("scroll_item_1", values2);
216 auto nodeValues2 = std::unordered_map<std::string, std::string>();
217 nodeValues2.emplace("btn_TitleExpand", "");
218 nodeValues2.emplace("scroll_item_1", "");
219 Recorder::NodeDataCache::Get().GetNodeData("pages/ScrollPage", nodeValues2);
220
221 auto iter2 = nodeValues2.find("btn_TitleExpand");
222 EXPECT_NE(iter2->second, "abc");
223
224 iter2 = nodeValues2.find("scroll_item_1");
225 EXPECT_EQ(iter2->second, "[\"x\",\"y\",\"z\"]");
226
227 Recorder::EventController::Get().Unregister(observer);
228 }
229
230 /**
231 * @tc.name: EventRecorderTest004
232 * @tc.desc: Test node data cache.
233 * @tc.type: FUNC
234 */
235 HWTEST_F(EventRecorderTest, EventRecorderTest004, TestSize.Level1)
236 {
237 std::string config;
238 GetConfig(config);
239 auto observer = std::make_shared<DemoUIEventObserver>();
240 Recorder::EventController::Get().Register(config, observer);
241
242 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
243
244 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "abc");
245 Recorder::NodeDataCache::Get().PutInt("btn_OpenSelf", 2);
246 Recorder::NodeDataCache::Get().PutBool("btn_Screenshot", true);
247 Recorder::NodeDataCache::Get().PutMultiple("btn_inspect", "inspect", 11);
248 Recorder::NodeDataCache::Get().PutMultiple("btn_xxx", "xxx", true);
249 std::vector<std::string> values = {"a", "b", "c"};
250 Recorder::NodeDataCache::Get().PutMultiple("hahaha", "xixi", values);
251
252 Recorder::NodeDataCache::Get().OnPageShow("pages/ScrollPage");
253
254 std::vector<std::string> values2 = {"x", "y", "z"};
255 Recorder::NodeDataCache::Get().PutStringArray("scroll_item_1", values2);
256
257 /**
258 * @tc.steps: step1. test pop scroll page.
259 * @tc.expected: step1. get value success.
260 */
261 Recorder::NodeDataCache::Get().OnBeforePagePop();
262
263 auto nodeValues3 = std::unordered_map<std::string, std::string>();
264 nodeValues3.emplace("btn_TitleExpand", "");
265 nodeValues3.emplace("scroll_item_1", "");
266 Recorder::NodeDataCache::Get().GetNodeData("pages/ScrollPage", nodeValues3);
267
268 auto iter3 = nodeValues3.find("scroll_item_1");
269 EXPECT_EQ(iter3->second, "");
270
271 iter3 = nodeValues3.find("btn_TitleExpand");
272 EXPECT_EQ(iter3->second, "");
273
274 Recorder::EventController::Get().Unregister(observer);
275 }
276
277 /**
278 * @tc.name: EventRecorderTest005
279 * @tc.desc: Test node data cache.
280 * @tc.type: FUNC
281 */
282 HWTEST_F(EventRecorderTest, EventRecorderTest005, TestSize.Level1)
283 {
284 std::string config;
285 GetConfig(config);
286 auto observer = std::make_shared<DemoUIEventObserver>();
287 Recorder::EventController::Get().Register(config, observer);
288
289 /**
290 * @tc.steps: step1. test index page.
291 * @tc.expected: step1. get value success.
292 */
293 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
294
295 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "abc");
296 Recorder::NodeDataCache::Get().PutInt("btn_OpenSelf", 2);
297 Recorder::NodeDataCache::Get().PutBool("btn_Screenshot", true);
298 Recorder::NodeDataCache::Get().PutMultiple("btn_inspect", "inspect", 11);
299 Recorder::NodeDataCache::Get().PutMultiple("btn_xxx", "xxx", true);
300 std::vector<std::string> values = {"a", "b", "c"};
301 Recorder::NodeDataCache::Get().PutMultiple("hahaha", "xixi", values);
302
303 Recorder::NodeDataCache::Get().OnPageShow("pages/ScrollPage");
304
305 std::vector<std::string> values2 = {"x", "y", "z"};
306 Recorder::NodeDataCache::Get().PutStringArray("scroll_item_1", values2);
307
308 Recorder::NodeDataCache::Get().OnBeforePagePop();
309
310 /**
311 * @tc.steps: step1. test index page.
312 * @tc.expected: step1. get value success.
313 */
314 auto nodeValues4 = std::unordered_map<std::string, std::string>();
315 nodeValues4.emplace("btn_TitleExpand", "");
316 nodeValues4.emplace("btn_OpenSelf", "");
317 nodeValues4.emplace("btn_Screenshot", "");
318 Recorder::NodeDataCache::Get().GetNodeData("pages/Index", nodeValues4);
319
320 auto iter4 = nodeValues4.find("btn_TitleExpand");
321 EXPECT_EQ(iter4->second, "abc");
322
323 iter4 = nodeValues4.find("btn_OpenSelf");
324 EXPECT_EQ(iter4->second, "2");
325
326 iter4 = nodeValues4.find("btn_Screenshot");
327 EXPECT_EQ(iter4->second, "true");
328
329 Recorder::EventController::Get().Unregister(observer);
330 }
331
332 /**
333 * @tc.name: EventRecorderTest006
334 * @tc.desc: Test node data cache.
335 * @tc.type: FUNC
336 */
337 HWTEST_F(EventRecorderTest, EventRecorderTest006, TestSize.Level1)
338 {
339 std::string config;
340 GetConfig(config);
341 auto observer = std::make_shared<DemoUIEventObserver>();
342 Recorder::EventController::Get().Register(config, observer);
343
344 /**
345 * @tc.steps: step1. test index page.
346 * @tc.expected: step1. get value success.
347 */
348 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
349
350 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "abc");
351 Recorder::NodeDataCache::Get().PutInt("btn_OpenSelf", 2);
352 Recorder::NodeDataCache::Get().PutBool("btn_Screenshot", true);
353 Recorder::NodeDataCache::Get().PutMultiple("btn_inspect", "inspect", 11);
354 Recorder::NodeDataCache::Get().PutMultiple("btn_xxx", "xxx", true);
355 std::vector<std::string> values = {"a", "b", "c"};
356 Recorder::NodeDataCache::Get().PutMultiple("hahaha", "xixi", values);
357
358 Recorder::NodeDataCache::Get().OnPageShow("pages/ScrollPage");
359
360 std::vector<std::string> values2 = {"x", "y", "z"};
361 Recorder::NodeDataCache::Get().PutStringArray("scroll_item_1", values2);
362
363 Recorder::NodeDataCache::Get().OnBeforePagePop();
364 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
365
366 /**
367 * @tc.steps: step1. test update value.
368 * @tc.expected: step1. get value success.
369 */
370 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "hello");
371 auto nodeValues5 = std::unordered_map<std::string, std::string>();
372 nodeValues5.emplace("btn_TitleExpand", "");
373 Recorder::NodeDataCache::Get().GetNodeData("pages/Index", nodeValues5);
374
375 auto iter5 = nodeValues5.find("btn_TitleExpand");
376 EXPECT_EQ(iter5->second, "hello");
377
378 Recorder::EventController::Get().Unregister(observer);
379 }
380
381 /**
382 * @tc.name: EventRecorderTest007
383 * @tc.desc: Test node data cache.
384 * @tc.type: FUNC
385 */
386 HWTEST_F(EventRecorderTest, EventRecorderTest007, TestSize.Level1)
387 {
388 std::string config;
389 GetConfig(config);
390 auto observer = std::make_shared<DemoUIEventObserver>();
391 Recorder::EventController::Get().Register(config, observer);
392
393 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
394
395 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "abc");
396 Recorder::NodeDataCache::Get().PutInt("btn_OpenSelf", 2);
397 Recorder::NodeDataCache::Get().PutBool("btn_Screenshot", true);
398 Recorder::NodeDataCache::Get().PutMultiple("btn_inspect", "inspect", 11);
399 Recorder::NodeDataCache::Get().PutMultiple("btn_xxx", "xxx", true);
400 std::vector<std::string> values = {"a", "b", "c"};
401 Recorder::NodeDataCache::Get().PutMultiple("hahaha", "xixi", values);
402
403 Recorder::NodeDataCache::Get().OnPageShow("pages/ScrollPage");
404
405 std::vector<std::string> values2 = {"x", "y", "z"};
406 Recorder::NodeDataCache::Get().PutStringArray("scroll_item_1", values2);
407
408 Recorder::NodeDataCache::Get().OnBeforePagePop();
409
410 Recorder::NodeDataCache::Get().PutString("btn_TitleExpand", "hello");
411
412 /**
413 * @tc.steps: step1. test clear.
414 * @tc.expected: step1. get value success.
415 */
416 Recorder::NodeDataCache::Get().Clear("pages/Index");
417 auto nodeValues6 = std::unordered_map<std::string, std::string>();
418 nodeValues6.emplace("btn_TitleExpand", "");
419 auto iter6 = nodeValues6.find("btn_TitleExpand");
420 EXPECT_EQ(iter6->second, "");
421
422 Recorder::EventController::Get().Unregister(observer);
423 }
424
425 /**
426 * @tc.name: EventRecorderTest008
427 * @tc.desc: Test node exposure.
428 * @tc.type: FUNC
429 */
430 HWTEST_F(EventRecorderTest, EventRecorderTest008, TestSize.Level1)
431 {
432 std::string config;
433 GetConfig(config);
434 auto observer = std::make_shared<DemoUIEventObserver>();
435 Recorder::EventController::Get().Register(config, observer);
436 Recorder::NodeDataCache::Get().OnPageShow("pages/Index");
437 auto exposure = AceType::MakeRefPtr<Recorder::ExposureProcessor>("btn_TitleExpand");
438 EXPECT_TRUE(exposure->IsNeedRecord());
439 EXPECT_NEAR(exposure->GetRatio(), 0.9, 0.00001f);
440 exposure->OnVisibleChange(true);
441 sleep(2);
442 exposure->OnVisibleChange(false);
443
444 sleep(1);
445 EXPECT_EQ(observer->GetEventType(), static_cast<int32_t>(Recorder::EventType::EXPOSURE));
446 Recorder::EventController::Get().Unregister(observer);
447 }
448
449 /**
450 * @tc.name: EventRecorderTest009
451 * @tc.desc: Test node recorder.
452 * @tc.type: FUNC
453 */
454 HWTEST_F(EventRecorderTest, EventRecorderTest009, TestSize.Level1)
455 {
456 std::string config;
457 GetConfig(config);
458 auto observer = std::make_shared<DemoUIEventObserver>();
459 Recorder::EventController::Get().Register(config, observer);
460
461 Recorder::EventParamsBuilder builder1;
462 builder1.SetId("hello").SetPageUrl("pages/Index").SetText("world");
463 LOGI("OnClick");
464 Recorder::EventRecorder::Get().OnClick(std::move(builder1));
465 sleep(1);
466
467 Recorder::EventParamsBuilder builder2;
468 builder2.SetId("hello").SetPageUrl("pages/Index").SetText("world").SetChecked(true);
469 LOGI("OnChange");
470 Recorder::EventRecorder::Get().OnChange(std::move(builder2));
471 sleep(1);
472 EXPECT_EQ(observer->GetEventType(), static_cast<int32_t>(Recorder::EventType::CHANGE));
473
474 Recorder::EventParamsBuilder builder3;
475 builder3.SetId("hello")
476 .SetPageUrl("pages/Index")
477 .SetText("weather")
478 .SetEventType(Recorder::EventType::SEARCH_SUBMIT);
479 LOGI("OnEvent");
480 Recorder::EventRecorder::Get().OnEvent(std::move(builder3));
481 sleep(1);
482 EXPECT_EQ(observer->GetEventType(), static_cast<int32_t>(Recorder::EventType::SEARCH_SUBMIT));
483
484 Recorder::EventRecorder::Get().OnPageShow("pages/Index", "from moon");
485 sleep(1);
486 EXPECT_EQ(observer->GetEventType(), static_cast<int32_t>(Recorder::EventType::PAGE_SHOW));
487
488 Recorder::EventRecorder::Get().OnPageHide("pages/Index", 10000);
489 sleep(1);
490 EXPECT_EQ(observer->GetEventType(), static_cast<int32_t>(Recorder::EventType::PAGE_HIDE));
491
492 Recorder::EventParamsBuilder builder4;
493 builder4.SetText("tom");
494 Recorder::EventRecorder::Get().OnNavDstShow(std::move(builder4));
495 sleep(1);
496 EXPECT_EQ(observer->GetEventType(), static_cast<int32_t>(Recorder::EventType::PAGE_SHOW));
497
498 Recorder::EventParamsBuilder builder5;
499 builder5.SetText("tom");
500 Recorder::EventRecorder::Get().OnNavDstHide(std::move(builder5));
501 sleep(1);
502 EXPECT_EQ(observer->GetEventType(), static_cast<int32_t>(Recorder::EventType::PAGE_HIDE));
503
504 Recorder::EventController::Get().Unregister(observer);
505 }
506 } // namespace OHOS::Ace
507