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