• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 #include <iostream>
16 #include <map>
17 
18 #include <gtest/gtest.h>
19 
20 #include "app_event_store.h"
21 #include "app_event_watcher.h"
22 #include "app_event_observer_mgr.h"
23 #include "hiappevent_base.h"
24 #include "hiappevent_config.h"
25 
26 using namespace testing::ext;
27 using namespace OHOS::HiviewDFX;
28 using namespace OHOS::HiviewDFX::HiAppEvent;
29 
30 namespace {
31 const std::string TEST_DIR = "/data/test/hiappevent/";
32 const std::string TEST_WATCHER = "test_watcher";
33 const std::string TEST_WATCHER_ROW = "watcher_row";
34 const std::string TEST_WATCHER_SIZE = "watcher_size";
35 const std::string TEST_WATCHER_TIMEOUT = "watcher_time";
36 const std::string TEST_DOMAIN = "test_domain";
37 const std::string TEST_NAME = "test_name";
38 constexpr unsigned int TEST_TYPE = 1;
39 const std::string TEST_EVENT = R"~({"domain_":"hiappevent", "name_":"testEvent"})~";
40 
CreateAppEventPack(const std::string & domain=TEST_DOMAIN)41 std::shared_ptr<AppEventPack> CreateAppEventPack(const std::string& domain = TEST_DOMAIN)
42 {
43     return std::make_shared<AppEventPack>(domain, TEST_NAME, TEST_TYPE);
44 }
45 
46 class HiAppEventWatcherTest : public testing::Test {
47 public:
48     void SetUp();
49     void TearDown();
50 };
51 
SetUp()52 void HiAppEventWatcherTest::SetUp()
53 {
54     HiAppEventConfig::GetInstance().SetStorageDir(TEST_DIR);
55     (void)AppEventStore::GetInstance().InitDbStore();
56 }
57 
TearDown()58 void HiAppEventWatcherTest::TearDown()
59 {
60     (void)AppEventStore::GetInstance().DestroyDbStore();
61 }
62 
63 class AppEventWatcherTest : public AppEventWatcher {
64 public:
AppEventWatcherTest(const std::string & name,const std::vector<AppEventFilter> & filters,TriggerCondition cond)65     AppEventWatcherTest(
66         const std::string& name,
67         const std::vector<AppEventFilter>& filters,
68         TriggerCondition cond)
69         : AppEventWatcher(name, filters, cond) {}
70 
OnTrigger(const TriggerCondition & triggerCond)71     void OnTrigger(const TriggerCondition& triggerCond) override
72     {
73         std::cout << GetName() << " onTrigger, row=" << triggerCond.row << ", size=" << triggerCond.size << std::endl;
74         triggerTimes++;
75     }
76 
GetTriggerTimes()77     int GetTriggerTimes()
78     {
79         return triggerTimes;
80     }
81 
OnEvents(const std::vector<std::shared_ptr<AppEventPack>> & events)82     void OnEvents(const std::vector<std::shared_ptr<AppEventPack>>& events) override
83     {
84         std::cout << GetName() << " OnEvents size=" << events.size() << std::endl;
85         for (const auto& event : events) {
86             std::cout << "domain=" << event->GetDomain() << ", eventName=" << event->GetName()
87                 << ", eventType=" << event->GetType() << std::endl;
88             std::cout << "params=" << event->GetParamStr() << std::endl;
89         }
90     }
91 
92 private:
93     int triggerTimes = 0;
94 };
95 
BuildSimpleFilters(std::vector<AppEventFilter> & filters)96 void BuildSimpleFilters(std::vector<AppEventFilter>& filters)
97 {
98     filters.emplace_back(AppEventFilter(TEST_DOMAIN, 0xff)); // 0xff means all types
99 }
100 
BuildSimpleOsFilters(std::vector<AppEventFilter> & filters)101 void BuildSimpleOsFilters(std::vector<AppEventFilter>& filters)
102 {
103     filters.emplace_back(AppEventFilter("OS", {"APP_CRASH"}));
104 }
105 
BuildCondition(int row,int size,int timeout)106 TriggerCondition BuildCondition(int row, int size, int timeout)
107 {
108     TriggerCondition cond = {
109         .row = row,
110         .size = size,
111         .timeout = timeout,
112     };
113     return cond;
114 }
115 
BuildSimpleWatcher()116 std::shared_ptr<AppEventWatcherTest> BuildSimpleWatcher()
117 {
118     std::vector<AppEventFilter> filters;
119     TriggerCondition cond = BuildCondition(0, 0, 0);
120     return std::make_shared<AppEventWatcherTest>(TEST_WATCHER, filters, cond);
121 }
122 
BuildWatcherWithRow()123 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithRow()
124 {
125     std::vector<AppEventFilter> filters;
126     BuildSimpleFilters(filters);
127     TriggerCondition cond = BuildCondition(1, 0, 0); // row is 1
128     return std::make_shared<AppEventWatcherTest>(TEST_WATCHER_ROW, filters, cond);
129 }
130 
BuildWatcherWithSize()131 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithSize()
132 {
133     std::vector<AppEventFilter> filters;
134     BuildSimpleFilters(filters);
135     TriggerCondition cond = BuildCondition(0, 10, 0); // size is 10 byte
136     return std::make_shared<AppEventWatcherTest>(TEST_WATCHER_SIZE, filters, cond);
137 }
138 
BuildWatcherWithTimeout()139 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithTimeout()
140 {
141     std::vector<AppEventFilter> filters;
142     BuildSimpleFilters(filters);
143     TriggerCondition cond = BuildCondition(0, 0, 1); // timeout is 1
144     return std::make_shared<AppEventWatcherTest>(TEST_WATCHER_TIMEOUT, filters, cond);
145 }
146 
BuildWatcherWithTimeout2()147 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithTimeout2()
148 {
149     std::vector<AppEventFilter> filters;
150     BuildSimpleFilters(filters);
151     TriggerCondition cond = BuildCondition(0, 0, 1); // timeout is 1
152     return std::make_shared<AppEventWatcherTest>("watcher_time2", filters, cond);
153 }
154 
BuildSimpleOsWatcher()155 std::shared_ptr<AppEventWatcherTest> BuildSimpleOsWatcher()
156 {
157     std::vector<AppEventFilter> filters;
158     BuildSimpleOsFilters(filters);
159     TriggerCondition cond = BuildCondition(0, 0, 0);
160     return std::make_shared<AppEventWatcherTest>(TEST_WATCHER, filters, cond);
161 }
162 }
163 
164 /**
165  * @tc.name: HiAppEventWatcherTest001
166  * @tc.desc: Test to add watcher with no condition.
167  * @tc.type: FUNC
168  * @tc.require: issueI5LB4N
169  */
170 HWTEST_F(HiAppEventWatcherTest, HiAppEventWatcherTest001, TestSize.Level3)
171 {
172     /**
173      * @tc.steps: step1. create AppEventWatcher object.
174      * @tc.steps: step2. add the watcher to AppEventObserverMgr.
175      */
176     std::cout << "HiAppEventWatcherTest001 start" << std::endl;
177 
178     auto watcher1 = BuildSimpleWatcher();
179     AppEventObserverMgr::GetInstance().AddWatcher(watcher1);
180     auto watcher2 = BuildWatcherWithRow();
181     AppEventObserverMgr::GetInstance().AddWatcher(watcher2);
182     auto watcher3 = BuildWatcherWithSize();
183     AppEventObserverMgr::GetInstance().AddWatcher(watcher3);
184     auto watcher4 = BuildWatcherWithTimeout();
185     AppEventObserverMgr::GetInstance().AddWatcher(watcher4);
186     auto watcher5 = BuildWatcherWithTimeout2();
187     AppEventObserverMgr::GetInstance().AddWatcher(watcher5);
188 
189     std::vector<std::shared_ptr<AppEventPack>> events;
190     events.emplace_back(CreateAppEventPack());
191     AppEventObserverMgr::GetInstance().HandleEvents(events);
192     ASSERT_EQ(watcher1->GetTriggerTimes(), 0);
193     ASSERT_EQ(watcher2->GetTriggerTimes(), 1);
194     ASSERT_EQ(watcher3->GetTriggerTimes(), 1);
195     ASSERT_EQ(watcher4->GetTriggerTimes(), 0);
196 
197     events.clear();
198     events.emplace_back(CreateAppEventPack("invalid_domain"));
199     AppEventObserverMgr::GetInstance().HandleEvents(events);
200     ASSERT_EQ(watcher1->GetTriggerTimes(), 0);
201     ASSERT_EQ(watcher2->GetTriggerTimes(), 1);
202     ASSERT_EQ(watcher3->GetTriggerTimes(), 1);
203     ASSERT_EQ(watcher4->GetTriggerTimes(), 0);
204 
205     AppEventObserverMgr::GetInstance().HandleTimeout();
206     ASSERT_EQ(watcher4->GetTriggerTimes(), 1);
207     ASSERT_EQ(watcher5->GetTriggerTimes(), 1);
208 
209     AppEventObserverMgr::GetInstance().RemoveObserver(watcher1->GetName());
210     AppEventObserverMgr::GetInstance().RemoveObserver(watcher2->GetName());
211     AppEventObserverMgr::GetInstance().RemoveObserver(watcher3->GetName());
212     AppEventObserverMgr::GetInstance().RemoveObserver(watcher4->GetName());
213     AppEventObserverMgr::GetInstance().RemoveObserver(watcher5->GetName());
214     std::cout << "HiAppEventWatcherTest001 end" << std::endl;
215 }
216 
217 /**
218  * @tc.name: HiAppEventWatcherTest002
219  * @tc.desc: Test failed to add watcher.
220  * @tc.type: FUNC
221  * @tc.require: issueI5LB4N
222  */
223 HWTEST_F(HiAppEventWatcherTest, HiAppEventWatcherTest002, TestSize.Level3)
224 {
225     /**
226      * @tc.steps: step1. create AppEventWatcher object.
227      * @tc.steps: step2. add the watcher to AppEventObserverMgr.
228      */
229     std::cout << "HiAppEventWatcherTest002 start" << std::endl;
230     (void)AppEventStore::GetInstance().DestroyDbStore();
231 
232     auto watcher = BuildSimpleWatcher();
233     AppEventObserverMgr::GetInstance().AddWatcher(watcher);
234     std::vector<std::shared_ptr<AppEventPack>> events;
235     events.emplace_back(CreateAppEventPack());
236     AppEventObserverMgr::GetInstance().HandleEvents(events);
237     ASSERT_EQ(watcher->GetTriggerTimes(), 0);
238 
239     AppEventObserverMgr::GetInstance().RemoveObserver(watcher->GetName());
240     std::cout << "HiAppEventWatcherTest002 end" << std::endl;
241 }
242 
243 /**
244  * @tc.name: HiAppEventWatcherTest003
245  * @tc.desc: Test to add watcher repeatedly.
246  * @tc.type: FUNC
247  * @tc.require: issueI5LB4N
248  */
249 HWTEST_F(HiAppEventWatcherTest, HiAppEventWatcherTest003, TestSize.Level3)
250 {
251     /**
252      * @tc.steps: step1. create AppEventWatcher object.
253      * @tc.steps: step2. add the watcher to AppEventObserverMgr.
254      */
255     std::cout << "HiAppEventWatcherTest003 start" << std::endl;
256 
257     auto watcher1 = BuildWatcherWithRow();
258     AppEventObserverMgr::GetInstance().AddWatcher(watcher1);
259     auto watcher2 = BuildWatcherWithRow();
260     AppEventObserverMgr::GetInstance().AddWatcher(watcher2);
261 
262     std::vector<std::shared_ptr<AppEventPack>> events;
263     events.emplace_back(CreateAppEventPack());
264     AppEventObserverMgr::GetInstance().HandleEvents(events);
265     ASSERT_EQ(watcher1->GetTriggerTimes(), 0);
266     ASSERT_EQ(watcher2->GetTriggerTimes(), 1);
267 
268     AppEventObserverMgr::GetInstance().RemoveObserver(watcher1->GetName());
269     AppEventObserverMgr::GetInstance().RemoveObserver(watcher2->GetName());
270     std::cout << "HiAppEventWatcherTest003 end" << std::endl;
271 }
272 
273 /**
274  * @tc.name: HiAppEventWatcherTest004
275  * @tc.desc: Test to add watcher onReceive.
276  * @tc.type: FUNC
277  * @tc.require: issueI5LB4N
278  */
279 HWTEST_F(HiAppEventWatcherTest, HiAppEventWatcherTest004, TestSize.Level3)
280 {
281     /**
282      * @tc.steps: step1. create AppEventWatcher object.
283      * @tc.steps: step2. add the watcher to AppEventObserverMgr.
284      */
285     std::cout << "HiAppEventWatcherTest004 start" << std::endl;
286 
287     auto watcher = BuildSimpleOsWatcher();
288     AppEventObserverMgr::GetInstance().AddWatcher(watcher);
289     std::vector<std::shared_ptr<AppEventPack>> events;
290     events.emplace_back(std::make_shared<AppEventPack>("OS", "APP_CRASH", TEST_TYPE));
291     AppEventObserverMgr::GetInstance().HandleEvents(events);
292     ASSERT_EQ(watcher->GetTriggerTimes(), 0);
293 
294     AppEventObserverMgr::GetInstance().RemoveObserver(watcher->GetName());
295     std::cout << "HiAppEventWatcherTest004 end" << std::endl;
296 }
297