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 }