• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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