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