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
27namespace OHOS {
28namespace Memory {
29using namespace testing;
30using namespace testing::ext;
31
32class UserMemcgTest : public testing::Test {
33public:
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
41void UserMemcgTest::SetUpTestCase()
42{
43}
44
45void UserMemcgTest::TearDownTestCase()
46{
47}
48
49void UserMemcgTest::SetUp()
50{
51}
52
53void UserMemcgTest::TearDown()
54{
55}
56
57HWTEST_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
68HWTEST_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
79HWTEST_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
95HWTEST_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
120HWTEST_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
130HWTEST_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
140HWTEST_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
150HWTEST_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
160HWTEST_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
170HWTEST_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
179HWTEST_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