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 #include <iostream>
16 #include <map>
17
18 #include <gtest/gtest.h>
19
20 #include "app_event_cache.h"
21 #include "app_event_watcher_mgr.h"
22
23 using namespace testing::ext;
24 using namespace OHOS::HiviewDFX;
25
26 namespace {
27 const std::string TEST_DIR = "/data/test/hiappevent/";
28 const std::string TEST_WATCHER = "test_watcher";
29 const std::string TEST_WATCHER_ROW = "watcher_row";
30 const std::string TEST_WATCHER_SIZE = "watcher_size";
31 const std::string TEST_WATCHER_TIMEOUT = "watcher_time";
32 const std::string TEST_DOMAIN = "test_domain";
33 const std::string TEST_NAME = "test_name";
34 constexpr unsigned int TEST_TYPE = 1;
35 const std::string TEST_EVENT = R"~({"domain_":"hiappevent", "name_":"testEvent"})~";
36
37 class HiAppEventWatcherTest : public testing::Test {
38 public:
39 void SetUp();
40 void TearDown();
41 };
42
SetUp()43 void HiAppEventWatcherTest::SetUp()
44 {
45 AppEventCache::GetInstance()->Open(TEST_DIR);
46 }
47
TearDown()48 void HiAppEventWatcherTest::TearDown()
49 {
50 AppEventCache::GetInstance()->Close();
51 }
52
53 class AppEventWatcherTest : public AppEventWatcher {
54 public:
AppEventWatcherTest(const std::string & name,const std::map<std::string,unsigned int> & filters,TriggerCondition cond)55 AppEventWatcherTest(const std::string& name, const std::map<std::string, unsigned int>& filters,
56 TriggerCondition cond) : AppEventWatcher(name, filters, cond) {}
57
OnTrigger(int row,int size)58 void OnTrigger(int row, int size) override
59 {
60 std::cout << GetName() << " onTrigger, row=" << row << ", size=" << size << std::endl;
61 triggerTimes++;
62 }
63
GetTriggerTimes()64 int GetTriggerTimes()
65 {
66 return triggerTimes;
67 }
68
69 private:
70 int triggerTimes = 0;
71 };
72
BuildSimpleFilters(std::map<std::string,unsigned int> & filters)73 void BuildSimpleFilters(std::map<std::string, unsigned int>& filters)
74 {
75 filters.insert(std::make_pair(TEST_DOMAIN, 0xff)); // 0xff means all types
76 }
77
BuildCondition(int row,int size,int timeOut)78 TriggerCondition BuildCondition(int row, int size, int timeOut)
79 {
80 TriggerCondition cond = {
81 .row = row,
82 .size = size,
83 .timeOut = timeOut,
84 };
85 return cond;
86 }
87
BuildSimpleWatcher()88 std::shared_ptr<AppEventWatcherTest> BuildSimpleWatcher()
89 {
90 std::map<std::string, unsigned int> filters;
91 TriggerCondition cond = BuildCondition(0, 0, 0);
92 return std::make_shared<AppEventWatcherTest>(TEST_WATCHER, filters, cond);
93 }
94
BuildWatcherWithRow()95 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithRow()
96 {
97 std::map<std::string, unsigned int> filters;
98 BuildSimpleFilters(filters);
99 TriggerCondition cond = BuildCondition(1, 0, 0); // row is 1
100 return std::make_shared<AppEventWatcherTest>(TEST_WATCHER_ROW, filters, cond);
101 }
102
BuildWatcherWithSize()103 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithSize()
104 {
105 std::map<std::string, unsigned int> filters;
106 BuildSimpleFilters(filters);
107 TriggerCondition cond = BuildCondition(0, 10, 0); // size is 10 byte
108 return std::make_shared<AppEventWatcherTest>(TEST_WATCHER_SIZE, filters, cond);
109 }
110
BuildWatcherWithTimeout()111 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithTimeout()
112 {
113 std::map<std::string, unsigned int> filters;
114 BuildSimpleFilters(filters);
115 TriggerCondition cond = BuildCondition(0, 0, 1); // timeout is 1
116 return std::make_shared<AppEventWatcherTest>(TEST_WATCHER_TIMEOUT, filters, cond);
117 }
118
BuildWatcherWithTimeout2()119 std::shared_ptr<AppEventWatcherTest> BuildWatcherWithTimeout2()
120 {
121 std::map<std::string, unsigned int> filters;
122 BuildSimpleFilters(filters);
123 TriggerCondition cond = BuildCondition(0, 0, 1); // timeout is 1
124 return std::make_shared<AppEventWatcherTest>("watcher_time2", filters, cond);
125 }
126 }
127
128 /**
129 * @tc.name: HiAppEventWatcherTest001
130 * @tc.desc: Test to add watcher with no condition.
131 * @tc.type: FUNC
132 * @tc.require: issueI5LB4N
133 */
134 HWTEST_F(HiAppEventWatcherTest, HiAppEventWatcherTest001, TestSize.Level3)
135 {
136 /**
137 * @tc.steps: step1. create AppEventWatcher object.
138 * @tc.steps: step2. add the watcher to AppEventWatcherMgr.
139 */
140 std::cout << "HiAppEventWatcherTest001 start" << std::endl;
141 auto watcherMgr = AppEventWatcherMgr::GetInstance();
142 ASSERT_NE(watcherMgr, nullptr);
143
144 auto watcher1 = BuildSimpleWatcher();
145 watcherMgr->AddWatcher(watcher1);
146 auto watcher2 = BuildWatcherWithRow();
147 watcherMgr->AddWatcher(watcher2);
148 auto watcher3 = BuildWatcherWithSize();
149 watcherMgr->AddWatcher(watcher3);
150 auto watcher4 = BuildWatcherWithTimeout();
151 watcherMgr->AddWatcher(watcher4);
152 auto watcher5 = BuildWatcherWithTimeout2();
153 watcherMgr->AddWatcher(watcher5);
154
155 watcherMgr->HandleEvent(TEST_DOMAIN, TEST_TYPE, TEST_EVENT);
156 ASSERT_EQ(watcher1->GetTriggerTimes(), 0);
157 ASSERT_EQ(watcher2->GetTriggerTimes(), 1);
158 ASSERT_EQ(watcher3->GetTriggerTimes(), 1);
159 ASSERT_EQ(watcher4->GetTriggerTimes(), 0);
160
161 watcherMgr->HandleEvent("invalid_domain", TEST_TYPE, TEST_EVENT);
162 ASSERT_EQ(watcher1->GetTriggerTimes(), 0);
163 ASSERT_EQ(watcher2->GetTriggerTimes(), 1);
164 ASSERT_EQ(watcher3->GetTriggerTimes(), 1);
165 ASSERT_EQ(watcher4->GetTriggerTimes(), 0);
166
167 watcherMgr->HandleTimeOut();
168 ASSERT_EQ(watcher4->GetTriggerTimes(), 1);
169 ASSERT_EQ(watcher5->GetTriggerTimes(), 1);
170
171 watcherMgr->RemoveWatcher(watcher1->GetName());
172 watcherMgr->RemoveWatcher(watcher2->GetName());
173 watcherMgr->RemoveWatcher(watcher3->GetName());
174 watcherMgr->RemoveWatcher(watcher4->GetName());
175 watcherMgr->RemoveWatcher(watcher5->GetName());
176 std::cout << "HiAppEventWatcherTest001 end" << std::endl;
177 }
178
179 /**
180 * @tc.name: HiAppEventWatcherTest002
181 * @tc.desc: Test failed to add watcher.
182 * @tc.type: FUNC
183 * @tc.require: issueI5LB4N
184 */
185 HWTEST_F(HiAppEventWatcherTest, HiAppEventWatcherTest002, TestSize.Level3)
186 {
187 /**
188 * @tc.steps: step1. create AppEventWatcher object.
189 * @tc.steps: step2. add the watcher to AppEventWatcherMgr.
190 */
191 std::cout << "HiAppEventWatcherTest002 start" << std::endl;
192 AppEventCache::GetInstance()->Close();
193
194 auto watcher = BuildSimpleWatcher();
195 auto watcherMgr = AppEventWatcherMgr::GetInstance();
196 ASSERT_NE(watcherMgr, nullptr);
197 watcherMgr->AddWatcher(watcher);
198 watcherMgr->HandleEvent(TEST_DOMAIN, TEST_TYPE, TEST_EVENT);
199 ASSERT_EQ(watcher->GetTriggerTimes(), 0);
200
201 watcherMgr->RemoveWatcher(watcher->GetName());
202 std::cout << "HiAppEventWatcherTest002 end" << std::endl;
203 }
204
205 /**
206 * @tc.name: HiAppEventWatcherTest003
207 * @tc.desc: Test to add watcher repeatedly.
208 * @tc.type: FUNC
209 * @tc.require: issueI5LB4N
210 */
211 HWTEST_F(HiAppEventWatcherTest, HiAppEventWatcherTest003, TestSize.Level3)
212 {
213 /**
214 * @tc.steps: step1. create AppEventWatcher object.
215 * @tc.steps: step2. add the watcher to AppEventWatcherMgr.
216 */
217 std::cout << "HiAppEventWatcherTest003 start" << std::endl;
218
219 auto watcher1 = BuildWatcherWithRow();
220 auto watcherMgr = AppEventWatcherMgr::GetInstance();
221 ASSERT_NE(watcherMgr, nullptr);
222 watcherMgr->AddWatcher(watcher1);
223 auto watcher2 = BuildWatcherWithRow();
224 watcherMgr->AddWatcher(watcher2);
225
226 watcherMgr->HandleEvent(TEST_DOMAIN, TEST_TYPE, TEST_EVENT);
227 ASSERT_EQ(watcher1->GetTriggerTimes(), 0);
228 ASSERT_EQ(watcher2->GetTriggerTimes(), 1);
229
230 watcherMgr->RemoveWatcher(watcher1->GetName());
231 watcherMgr->RemoveWatcher(watcher2->GetName());
232 std::cout << "HiAppEventWatcherTest003 end" << std::endl;
233 }
234