• 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 "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