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