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 "gtest/gtest.h"
17
18 #include "utils.h"
19
20 #define private public
21 #define protected public
22 #include "kernel_interface.h"
23 #include "memcg.h"
24 #undef private
25 #undef protected
26
27 namespace OHOS {
28 namespace Memory {
29 using namespace testing;
30 using namespace testing::ext;
31
32 class UserMemcgTest : public testing::Test {
33 public:
34 static void SetUpTestCase();
35 static void TearDownTestCase();
36 void SetUp();
37 void TearDown();
38 static constexpr unsigned int userId_ = 123456u; // ensure it is a new ID
39 };
40
SetUpTestCase()41 void UserMemcgTest::SetUpTestCase()
42 {
43 }
44
TearDownTestCase()45 void UserMemcgTest::TearDownTestCase()
46 {
47 }
48
SetUp()49 void UserMemcgTest::SetUp()
50 {
51 }
52
TearDown()53 void UserMemcgTest::TearDown()
54 {
55 }
56
57 HWTEST_F(UserMemcgTest, CreateMemcgTest, TestSize.Level1)
58 {
59 UserMemcg* memcg = new UserMemcg(userId_);
60 EXPECT_EQ(memcg != nullptr, true);
61 EXPECT_EQ(memcg->swapInfo_ != nullptr, true);
62 EXPECT_EQ(memcg->memInfo_ != nullptr, true);
63 EXPECT_EQ(memcg->reclaimRatios_ != nullptr, true);
64 delete memcg;
65 memcg = nullptr;
66 }
67
68 HWTEST_F(UserMemcgTest, UpdateMemInfoFromKernelTest, TestSize.Level1)
69 {
70 UserMemcg* memcg = new UserMemcg(userId_);
71 memcg->CreateMemcgDir();
72 bool ret = memcg->UpdateMemInfoFromKernel();
73 EXPECT_EQ(ret, true);
74 memcg->RemoveMemcgDir();
75 delete memcg;
76 memcg = nullptr;
77 }
78
79 HWTEST_F(UserMemcgTest, SetScoreTest, TestSize.Level1)
80 {
81 UserMemcg* memcg = new UserMemcg(userId_);
82 int score = 0;
83 memcg->SetScore(score);
84 EXPECT_EQ(memcg->score_, score);
85 score = -1;
86 memcg->SetScore(score);
87 EXPECT_EQ(memcg->score_, score);
88 score = 2000;
89 memcg->SetScore(score);
90 EXPECT_EQ(memcg->score_, score);
91 delete memcg;
92 memcg = nullptr;
93 }
94
95 HWTEST_F(UserMemcgTest, SetReclaimRatiosTest, TestSize.Level1)
96 {
97 UserMemcg* memcg = new UserMemcg(userId_);
98 memcg->SetReclaimRatios(0, 0, 0);
99 EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 0u);
100 EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 0u);
101 EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 0u);
102 memcg->SetReclaimRatios(100, 100, 100);
103 EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 100u);
104 EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 100u);
105 EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 100u);
106 memcg->SetReclaimRatios(101, 101, 101);
107 EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 100u);
108 EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 100u);
109 EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 101u);
110
111 ReclaimRatios ratios(50, 50, 50);
112 EXPECT_EQ(memcg->SetReclaimRatios(ratios), true);
113 EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 50u);
114 EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 50u);
115 EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 50u);
116 delete memcg;
117 memcg = nullptr;
118 }
119
120 HWTEST_F(UserMemcgTest, SetScoreAndReclaimRatiosToKernelTest, TestSize.Level1)
121 {
122 UserMemcg* memcg = new UserMemcg(userId_);
123 memcg->CreateMemcgDir();
124 EXPECT_EQ(memcg->SetScoreAndReclaimRatiosToKernel(), true);
125 memcg->RemoveMemcgDir();
126 delete memcg;
127 memcg = nullptr;
128 }
129
130 HWTEST_F(UserMemcgTest, SwapInTest, TestSize.Level1)
131 {
132 UserMemcg* memcg = new UserMemcg(userId_);
133 memcg->CreateMemcgDir();
134 EXPECT_EQ(memcg->SwapIn(), true);
135 memcg->RemoveMemcgDir();
136 delete memcg;
137 memcg = nullptr;
138 }
139
140 HWTEST_F(UserMemcgTest, CreateMemcgDirTest, TestSize.Level1)
141 {
142 UserMemcg* memcg = new UserMemcg(userId_);
143 EXPECT_EQ(memcg->CreateMemcgDir(), true);
144 EXPECT_EQ(KernelInterface::GetInstance().IsDirExists(memcg->GetMemcgPath_()), true);
145 memcg->RemoveMemcgDir();
146 delete memcg;
147 memcg = nullptr;
148 }
149
150 HWTEST_F(UserMemcgTest, RemoveMemcgDirTest, TestSize.Level1)
151 {
152 UserMemcg* memcg = new UserMemcg(userId_);
153 memcg->CreateMemcgDir();
154 EXPECT_EQ(memcg->RemoveMemcgDir(), true);
155 EXPECT_EQ(KernelInterface::GetInstance().IsDirExists(memcg->GetMemcgPath_()), false);
156 delete memcg;
157 memcg = nullptr;
158 }
159
160 HWTEST_F(UserMemcgTest, AddProcTest, TestSize.Level1)
161 {
162 UserMemcg* memcg = new UserMemcg(userId_);
163 memcg->CreateMemcgDir();
164 EXPECT_EQ(memcg->AddProc(12345678u), false);
165 memcg->RemoveMemcgDir();
166 delete memcg;
167 memcg = nullptr;
168 }
169
170 HWTEST_F(UserMemcgTest, GetMemcgPathTest, TestSize.Level1)
171 {
172 UserMemcg* memcg = new UserMemcg(userId_);
173 std::string path = "/dev/memcg/" + std::to_string(userId_);
174 EXPECT_STREQ(memcg->GetMemcgPath_().c_str(), path.c_str());
175 delete memcg;
176 memcg = nullptr;
177 }
178
179 HWTEST_F(UserMemcgTest, ReadScoreAndReclaimRatiosFromKernelTest, TestSize.Level1)
180 {
181 UserMemcg* memcg = new UserMemcg(userId_);
182 memcg->CreateMemcgDir();
183 int score = 0;
184 unsigned int mem2zramRatio = 0;
185 unsigned int zram2ufsRatio = 0;
186 unsigned int refaultThreshold = 0;
187 bool ret = memcg->ReadScoreAndReclaimRatiosFromKernel_(score, mem2zramRatio, zram2ufsRatio, refaultThreshold);
188 EXPECT_EQ(ret, true);
189 memcg->RemoveMemcgDir();
190 delete memcg;
191 memcg = nullptr;
192 }
193 }
194 }
195