• 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 
16 #include <ctime>
17 #include <gtest/gtest.h>
18 
19 #include "hichecker.h"
20 
21 using namespace testing::ext;
22 using namespace OHOS::HiviewDFX;
23 
24 namespace {
25     const int64_t SEC_TO_NS = 1000000000;
26     const int64_t MAX_CALL_DURATION_US = 1000; // 1ms
27     const int LOOP_COUNT = 1000;
28     const uint64_t RULE_ERROR0 = 0;
29     const uint64_t RULE_ERROR1 = -1;
30     const uint64_t RULE_ERROR2 = 999999999;
31 }
32 
33 class HiCheckerNativeTest : public testing::Test {
34 public:
SerUpTestCase()35     static void SerUpTestCase() {};
TearDownTestCase()36     static void TearDownTestCase() {};
37     void SetUp();
38     void TearDown();
39 };
40 
SetUp(void)41 void HiCheckerNativeTest::SetUp(void)
42 {
43     HiChecker::RemoveRule(Rule::ALL_RULES);
44 }
45 
TearDown(void)46 void HiCheckerNativeTest::TearDown(void)
47 {
48     HiChecker::RemoveRule(Rule::ALL_RULES);
49 }
50 
GetTimeNs()51 static int64_t GetTimeNs()
52 {
53     struct timespec ts;
54     clock_gettime(CLOCK_REALTIME, &ts);
55     return ts.tv_sec * SEC_TO_NS + ts.tv_nsec;
56 }
57 
58 /**
59   * @tc.name: AddRule001
60   * @tc.desc: add only one rule
61   * @tc.type: FUNC
62 */
63 HWTEST_F(HiCheckerNativeTest, AddRuleTest001, TestSize.Level1)
64 {
65     uint64_t rule = Rule::RULE_THREAD_CHECK_SLOW_PROCESS;
66     HiChecker::AddRule(Rule::RULE_THREAD_CHECK_SLOW_PROCESS);
67     ASSERT_EQ(HiChecker::GetRule(), rule);
68     rule |= Rule::RULE_CAUTION_PRINT_LOG;
69     HiChecker::AddRule(Rule::RULE_CAUTION_PRINT_LOG);
70     ASSERT_EQ(HiChecker::GetRule(), rule);
71 }
72 
73 /**
74   * @tc.name: AddRule002
75   * @tc.desc: add two or more rules
76   * @tc.type: FUNC
77 */
78 HWTEST_F(HiCheckerNativeTest, AddRuleTest002, TestSize.Level1)
79 {
80     uint64_t rule = Rule::RULE_THREAD_CHECK_SLOW_PROCESS |
81         Rule::RULE_CHECK_SLOW_EVENT | Rule::RULE_CHECK_ABILITY_CONNECTION_LEAK;
82     HiChecker::AddRule(Rule::RULE_THREAD_CHECK_SLOW_PROCESS |
83         Rule::RULE_CHECK_SLOW_EVENT | Rule::RULE_CHECK_ABILITY_CONNECTION_LEAK);
84     ASSERT_EQ(HiChecker::GetRule(), rule);
85     rule |= (Rule::RULE_CAUTION_PRINT_LOG | Rule::RULE_CAUTION_TRIGGER_CRASH);
86     HiChecker::AddRule(Rule::RULE_CAUTION_PRINT_LOG | Rule::RULE_CAUTION_TRIGGER_CRASH);
87     ASSERT_EQ(HiChecker::GetRule(), rule);
88 }
89 
90 /**
91   * @tc.name: AddRule003
92   * @tc.desc: add invaild rule
93   * @tc.type: FUNC
94 */
95 HWTEST_F(HiCheckerNativeTest, AddRuleTest003, TestSize.Level1)
96 {
97     HiChecker::AddRule(RULE_ERROR0);
98     ASSERT_EQ(HiChecker::GetRule(), 0);
99     HiChecker::AddRule(RULE_ERROR1);
100     ASSERT_EQ(HiChecker::GetRule(), 0);
101     HiChecker::AddRule(RULE_ERROR2);
102     ASSERT_EQ(HiChecker::GetRule(), 0);
103 }
104 
105 /**
106   * @tc.name: AddRulePerf
107   * @tc.desc: test performance for AddRule
108   * @tc.type: PERF
109 */
110 HWTEST_F(HiCheckerNativeTest, AddRulePerfTest001, TestSize.Level2)
111 {
112     int64_t total = 0;
113     for (int i = 0; i < LOOP_COUNT; i++) {
114         int64_t start = GetTimeNs();
115         HiChecker::AddRule(Rule::RULE_CHECK_SLOW_EVENT);
116         int64_t duration = GetTimeNs() - start;
117         total += duration;
118     }
119     int64_t duration = (total / LOOP_COUNT);
120     duration = duration / 1000;
121     ASSERT_TRUE(duration < MAX_CALL_DURATION_US);
122 }
123 
124 /**
125   * @tc.name: RemoveRule001
126   * @tc.desc: remove only one rule
127   * @tc.type: FUNC
128 */
129 HWTEST_F(HiCheckerNativeTest, RemoveRuleTest001, TestSize.Level1)
130 {
131     HiChecker::AddRule(Rule::ALL_RULES);
132     HiChecker::RemoveRule(Rule::RULE_CAUTION_TRIGGER_CRASH);
133     ASSERT_FALSE(HiChecker::Contains(Rule::RULE_CAUTION_TRIGGER_CRASH));
134     HiChecker::RemoveRule(Rule::RULE_CAUTION_PRINT_LOG);
135     ASSERT_FALSE(HiChecker::Contains(Rule::RULE_CAUTION_PRINT_LOG));
136     uint64_t rule = Rule::ALL_RULES ^ (Rule::RULE_CAUTION_PRINT_LOG | Rule::RULE_CAUTION_TRIGGER_CRASH);
137     ASSERT_EQ(HiChecker::GetRule(), rule);
138 }
139 
140 /**
141   * @tc.name: RemoveRule002
142   * @tc.desc: remove two or more rules
143   * @tc.type: FUNC
144 */
145 HWTEST_F(HiCheckerNativeTest, RemoveRuleTest002, TestSize.Level1)
146 {
147     HiChecker::AddRule(Rule::ALL_RULES);
148     HiChecker::RemoveRule(Rule::RULE_CAUTION_TRIGGER_CRASH | Rule::RULE_CAUTION_PRINT_LOG);
149     ASSERT_FALSE(HiChecker::Contains(Rule::RULE_CAUTION_TRIGGER_CRASH));
150     ASSERT_FALSE(HiChecker::Contains(Rule::RULE_CAUTION_PRINT_LOG));
151     uint64_t rule = Rule::ALL_RULES ^ (Rule::RULE_CAUTION_PRINT_LOG | Rule::RULE_CAUTION_TRIGGER_CRASH);
152     ASSERT_EQ(HiChecker::GetRule(), rule);
153 }
154 
155 /**
156   * @tc.name: RemoveRule003
157   * @tc.desc: remove invaild rule
158   * @tc.type: FUNC
159 */
160 HWTEST_F(HiCheckerNativeTest, RemoveRuleTest003, TestSize.Level1)
161 {
162     HiChecker::AddRule(Rule::ALL_RULES);
163     HiChecker::RemoveRule(RULE_ERROR0);
164     ASSERT_EQ(HiChecker::GetRule(), Rule::ALL_RULES);
165     HiChecker::RemoveRule(RULE_ERROR1);
166     ASSERT_EQ(HiChecker::GetRule(), Rule::ALL_RULES);
167     HiChecker::RemoveRule(RULE_ERROR2);
168     ASSERT_EQ(HiChecker::GetRule(), Rule::ALL_RULES);
169 }
170 
171 /**
172   * @tc.name: RemoveRulePerf
173   * @tc.desc: test performance for RemoveRule
174   * @tc.type: PERF
175 */
176 HWTEST_F(HiCheckerNativeTest, RemoveRulePerfTest001, TestSize.Level2)
177 {
178     int64_t total = 0;
179     for (int i = 0; i < LOOP_COUNT; i++) {
180         int64_t start = GetTimeNs();
181         HiChecker::RemoveRule(Rule::RULE_CHECK_SLOW_EVENT);
182         int64_t duration = GetTimeNs() - start;
183         total += duration;
184     }
185     int64_t duration = (total / LOOP_COUNT);
186     duration = duration / 1000;
187     ASSERT_TRUE(duration < MAX_CALL_DURATION_US);
188 }
189 
190 /**
191   * @tc.name: Contains001
192   * @tc.desc: test Contains
193   * @tc.type: FUNC
194 */
195 HWTEST_F(HiCheckerNativeTest, ContainsTest001, TestSize.Level1)
196 {
197     HiChecker::AddRule(Rule::RULE_CAUTION_PRINT_LOG);
198     ASSERT_TRUE(HiChecker::Contains(Rule::RULE_CAUTION_PRINT_LOG));
199     ASSERT_FALSE(HiChecker::Contains(Rule::RULE_CAUTION_TRIGGER_CRASH));
200     ASSERT_FALSE(HiChecker::Contains(Rule::RULE_CAUTION_PRINT_LOG | Rule::RULE_CAUTION_TRIGGER_CRASH));
201 }
202 
203 /**
204   * @tc.name: Contains002
205   * @tc.desc: test Contains with invaild rule
206   * @tc.type: FUNC
207 */
208 HWTEST_F(HiCheckerNativeTest, ContainsTest002, TestSize.Level1)
209 {
210     HiChecker::AddRule(Rule::ALL_RULES);
211     ASSERT_FALSE(HiChecker::Contains(RULE_ERROR0));
212     ASSERT_FALSE(HiChecker::Contains(RULE_ERROR1));
213     ASSERT_FALSE(HiChecker::Contains(RULE_ERROR2));
214 }