1 /*
2 * Copyright (c) 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
16 #include <gtest/gtest.h>
17 #include <thread>
18 #include <chrono>
19
20 #include "hilog_tag_wrapper.h"
21 #define private public
22 #include "rate_limiter.h"
23 #undef private
24
25 using namespace testing;
26 using namespace testing::ext;
27
28 namespace OHOS {
29 namespace AAFwk {
30 namespace {
31 constexpr int64_t EXTENSION_LIMIT_INTERVAL_MS = 1000; // 1s
32 constexpr int32_t EXTENSION_MAX_LIMIT = 20;
33 constexpr int64_t REPORT_LIMIT_INTERVAL_MS = 5000; // 5s
34 constexpr int32_t REPORT_MAX_LIMIT = 1;
35 }
36 class RateLimiterTest : public testing::Test {
37 public:
38 static void SetUpTestCase();
39 static void TearDownTestCase();
40 void SetUp() override;
41 void TearDown() override;
42 };
43
SetUpTestCase(void)44 void RateLimiterTest::SetUpTestCase(void)
45 {}
46
TearDownTestCase(void)47 void RateLimiterTest::TearDownTestCase(void)
48 {}
49
SetUp()50 void RateLimiterTest::SetUp()
51 {
52 RateLimiter::GetInstance().extensionCallMap_.clear();
53 }
54
TearDown()55 void RateLimiterTest::TearDown()
56 {}
57
58 /**
59 * @tc.number: CheckExtensionLimitTest_0100
60 * @tc.desc: Test CheckExtensionLimit
61 * @tc.type: FUNC
62 */
63 HWTEST_F(RateLimiterTest, CheckExtensionLimitTest_0100, TestSize.Level2)
64 {
65 TAG_LOGI(AAFwkTag::TEST, "CheckExtensionLimitTest_0100 start.");
66
67 auto &rateLimiter = RateLimiter::GetInstance();
68 auto uid = 20010001;
69 auto isLimit = rateLimiter.CheckExtensionLimit(uid);
70 EXPECT_FALSE(isLimit);
71
72 TAG_LOGI(AAFwkTag::TEST, "CheckExtensionLimitTest_0100 end.");
73 }
74
75 /**
76 * @tc.number: CheckExtensionLimitTest_0200
77 * @tc.desc: Test CheckExtensionLimit
78 * @tc.type: FUNC
79 */
80 HWTEST_F(RateLimiterTest, CheckExtensionLimitTest_0200, TestSize.Level2)
81 {
82 TAG_LOGI(AAFwkTag::TEST, "CheckExtensionLimitTest_0200 start.");
83
84 auto &rateLimiter = RateLimiter::GetInstance();
85 auto uid = 20010001;
86 for (int i = 0; i < EXTENSION_MAX_LIMIT; i++) {
87 rateLimiter.CheckExtensionLimit(uid);
88 }
89 auto isLimit = rateLimiter.CheckExtensionLimit(uid);
90 EXPECT_TRUE(isLimit);
91
92 TAG_LOGI(AAFwkTag::TEST, "CheckExtensionLimitTest_0200 end.");
93 }
94
95 /**
96 * @tc.number: CheckReportLimitTest_0100
97 * @tc.desc: Test CheckReportLimit
98 * @tc.type: FUNC
99 */
100 HWTEST_F(RateLimiterTest, CheckReportLimitTest_0100, TestSize.Level2)
101 {
102 TAG_LOGI(AAFwkTag::TEST, "CheckReportLimitTest_0100 start.");
103
104 auto &rateLimiter = RateLimiter::GetInstance();
105 auto uid = 20010001;
106 auto isLimit = rateLimiter.CheckReportLimit(uid);
107 EXPECT_FALSE(isLimit);
108
109 TAG_LOGI(AAFwkTag::TEST, "CheckReportLimitTest_0100 end.");
110 }
111
112 /**
113 * @tc.number: CheckReportLimitTest_0200
114 * @tc.desc: Test CheckReportLimit
115 * @tc.type: FUNC
116 */
117 HWTEST_F(RateLimiterTest, CheckReportLimitTest_0200, TestSize.Level2)
118 {
119 TAG_LOGI(AAFwkTag::TEST, "CheckReportLimitTest_0200 start.");
120
121 auto &rateLimiter = RateLimiter::GetInstance();
122 auto uid = 20010001;
123 for (int i = 0; i < REPORT_MAX_LIMIT; i++) {
124 rateLimiter.CheckReportLimit(uid);
125 }
126 auto isLimit = rateLimiter.CheckReportLimit(uid);
127 EXPECT_TRUE(isLimit);
128
129 TAG_LOGI(AAFwkTag::TEST, "CheckReportLimitTest_0200 end.");
130 }
131
132 /**
133 * @tc.number: CleanCallMapTest_0100
134 * @tc.desc: Test CleanCallMap
135 * @tc.type: FUNC
136 */
137 HWTEST_F(RateLimiterTest, CleanCallMapTest_0100, TestSize.Level2)
138 {
139 TAG_LOGI(AAFwkTag::TEST, "CleanCallMapTest_0100 start.");
140
141 auto &rateLimiter = RateLimiter::GetInstance();
142 auto uid1 = 20010001;
143 auto uid2 = 20010002;
144
145 rateLimiter.CheckExtensionLimit(uid1);
146 rateLimiter.CheckExtensionLimit(uid1);
147 rateLimiter.CheckExtensionLimit(uid1);
148 std::this_thread::sleep_for(std::chrono::milliseconds(EXTENSION_LIMIT_INTERVAL_MS + 100));
149 rateLimiter.CheckExtensionLimit(uid2);
150 rateLimiter.CheckExtensionLimit(uid2);
151
152 rateLimiter.lastCleanTimeMillis_ = 0;
153 rateLimiter.CleanCallMap();
154 auto mapSize = rateLimiter.extensionCallMap_.size();
155 TAG_LOGI(AAFwkTag::TEST, "extensionCallMap_ size:%{public}zu", mapSize);
156 EXPECT_EQ(mapSize, 1);
157
158 TAG_LOGI(AAFwkTag::TEST, "CleanCallMapTest_0100 end.");
159 }
160
161 /**
162 * @tc.number: CleanCallMapTest_0200
163 * @tc.desc: Test CleanCallMap
164 * @tc.type: FUNC
165 */
166 HWTEST_F(RateLimiterTest, CleanCallMapTest_0200, TestSize.Level2)
167 {
168 TAG_LOGI(AAFwkTag::TEST, "CleanCallMapTest_0200 start.");
169
170 auto &rateLimiter = RateLimiter::GetInstance();
171 auto uid1 = 20010001;
172 auto uid2 = 20010002;
173
174 rateLimiter.CheckReportLimit(uid1);
175 std::this_thread::sleep_for(std::chrono::milliseconds(REPORT_LIMIT_INTERVAL_MS + 100));
176 rateLimiter.CheckReportLimit(uid2);
177
178 rateLimiter.lastCleanTimeMillis_ = 0;
179 rateLimiter.CleanCallMap();
180 auto mapSize = rateLimiter.reportCallMap_.size();
181 TAG_LOGI(AAFwkTag::TEST, "reportCallMap_ size:%{public}zu", mapSize);
182 EXPECT_EQ(mapSize, 1);
183
184 TAG_LOGI(AAFwkTag::TEST, "CleanCallMapTest_0200 end.");
185 }
186 } // namespace AAFwk
187 } // namespace OHOS