1ba5c3796Sopenharmony_ci/*
2ba5c3796Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3ba5c3796Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ba5c3796Sopenharmony_ci * you may not use this file except in compliance with the License.
5ba5c3796Sopenharmony_ci * You may obtain a copy of the License at
6ba5c3796Sopenharmony_ci *
7ba5c3796Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ba5c3796Sopenharmony_ci *
9ba5c3796Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ba5c3796Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ba5c3796Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ba5c3796Sopenharmony_ci * See the License for the specific language governing permissions and
13ba5c3796Sopenharmony_ci * limitations under the License.
14ba5c3796Sopenharmony_ci */
15ba5c3796Sopenharmony_ci
16ba5c3796Sopenharmony_ci#include "gtest/gtest.h"
17ba5c3796Sopenharmony_ci
18ba5c3796Sopenharmony_ci#include "utils.h"
19ba5c3796Sopenharmony_ci
20ba5c3796Sopenharmony_ci#define private public
21ba5c3796Sopenharmony_ci#define protected public
22ba5c3796Sopenharmony_ci#include "kernel_interface.h"
23ba5c3796Sopenharmony_ci#include "memcg.h"
24ba5c3796Sopenharmony_ci#undef private
25ba5c3796Sopenharmony_ci#undef protected
26ba5c3796Sopenharmony_ci
27ba5c3796Sopenharmony_cinamespace OHOS {
28ba5c3796Sopenharmony_cinamespace Memory {
29ba5c3796Sopenharmony_ciusing namespace testing;
30ba5c3796Sopenharmony_ciusing namespace testing::ext;
31ba5c3796Sopenharmony_ci
32ba5c3796Sopenharmony_ciclass UserMemcgTest : public testing::Test {
33ba5c3796Sopenharmony_cipublic:
34ba5c3796Sopenharmony_ci    static void SetUpTestCase();
35ba5c3796Sopenharmony_ci    static void TearDownTestCase();
36ba5c3796Sopenharmony_ci    void SetUp();
37ba5c3796Sopenharmony_ci    void TearDown();
38ba5c3796Sopenharmony_ci    static constexpr unsigned int userId_ = 123456u; // ensure it is a new ID
39ba5c3796Sopenharmony_ci};
40ba5c3796Sopenharmony_ci
41ba5c3796Sopenharmony_civoid UserMemcgTest::SetUpTestCase()
42ba5c3796Sopenharmony_ci{
43ba5c3796Sopenharmony_ci}
44ba5c3796Sopenharmony_ci
45ba5c3796Sopenharmony_civoid UserMemcgTest::TearDownTestCase()
46ba5c3796Sopenharmony_ci{
47ba5c3796Sopenharmony_ci}
48ba5c3796Sopenharmony_ci
49ba5c3796Sopenharmony_civoid UserMemcgTest::SetUp()
50ba5c3796Sopenharmony_ci{
51ba5c3796Sopenharmony_ci}
52ba5c3796Sopenharmony_ci
53ba5c3796Sopenharmony_civoid UserMemcgTest::TearDown()
54ba5c3796Sopenharmony_ci{
55ba5c3796Sopenharmony_ci}
56ba5c3796Sopenharmony_ci
57ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, CreateMemcgTest, TestSize.Level1)
58ba5c3796Sopenharmony_ci{
59ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
60ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg != nullptr, true);
61ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->swapInfo_ != nullptr, true);
62ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->memInfo_ != nullptr, true);
63ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_ != nullptr, true);
64ba5c3796Sopenharmony_ci    delete memcg;
65ba5c3796Sopenharmony_ci    memcg = nullptr;
66ba5c3796Sopenharmony_ci}
67ba5c3796Sopenharmony_ci
68ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, UpdateMemInfoFromKernelTest, TestSize.Level1)
69ba5c3796Sopenharmony_ci{
70ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
71ba5c3796Sopenharmony_ci    memcg->CreateMemcgDir();
72ba5c3796Sopenharmony_ci    bool ret = memcg->UpdateMemInfoFromKernel();
73ba5c3796Sopenharmony_ci    EXPECT_EQ(ret, true);
74ba5c3796Sopenharmony_ci    memcg->RemoveMemcgDir();
75ba5c3796Sopenharmony_ci    delete memcg;
76ba5c3796Sopenharmony_ci    memcg = nullptr;
77ba5c3796Sopenharmony_ci}
78ba5c3796Sopenharmony_ci
79ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, SetScoreTest, TestSize.Level1)
80ba5c3796Sopenharmony_ci{
81ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
82ba5c3796Sopenharmony_ci    int score = 0;
83ba5c3796Sopenharmony_ci    memcg->SetScore(score);
84ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->score_, score);
85ba5c3796Sopenharmony_ci    score = -1;
86ba5c3796Sopenharmony_ci    memcg->SetScore(score);
87ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->score_, score);
88ba5c3796Sopenharmony_ci    score = 2000;
89ba5c3796Sopenharmony_ci    memcg->SetScore(score);
90ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->score_, score);
91ba5c3796Sopenharmony_ci    delete memcg;
92ba5c3796Sopenharmony_ci    memcg = nullptr;
93ba5c3796Sopenharmony_ci}
94ba5c3796Sopenharmony_ci
95ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, SetReclaimRatiosTest, TestSize.Level1)
96ba5c3796Sopenharmony_ci{
97ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
98ba5c3796Sopenharmony_ci    memcg->SetReclaimRatios(0, 0, 0);
99ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 0u);
100ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 0u);
101ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 0u);
102ba5c3796Sopenharmony_ci    memcg->SetReclaimRatios(100, 100, 100);
103ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 100u);
104ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 100u);
105ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 100u);
106ba5c3796Sopenharmony_ci    memcg->SetReclaimRatios(101, 101, 101);
107ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 100u);
108ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 100u);
109ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 101u);
110ba5c3796Sopenharmony_ci
111ba5c3796Sopenharmony_ci    ReclaimRatios ratios(50, 50, 50);
112ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->SetReclaimRatios(ratios), true);
113ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->mem2zramRatio_, 50u);
114ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->zram2ufsRatio_, 50u);
115ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->reclaimRatios_->refaultThreshold_, 50u);
116ba5c3796Sopenharmony_ci    delete memcg;
117ba5c3796Sopenharmony_ci    memcg = nullptr;
118ba5c3796Sopenharmony_ci}
119ba5c3796Sopenharmony_ci
120ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, SetScoreAndReclaimRatiosToKernelTest, TestSize.Level1)
121ba5c3796Sopenharmony_ci{
122ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
123ba5c3796Sopenharmony_ci    memcg->CreateMemcgDir();
124ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->SetScoreAndReclaimRatiosToKernel(), true);
125ba5c3796Sopenharmony_ci    memcg->RemoveMemcgDir();
126ba5c3796Sopenharmony_ci    delete memcg;
127ba5c3796Sopenharmony_ci    memcg = nullptr;
128ba5c3796Sopenharmony_ci}
129ba5c3796Sopenharmony_ci
130ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, SwapInTest, TestSize.Level1)
131ba5c3796Sopenharmony_ci{
132ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
133ba5c3796Sopenharmony_ci    memcg->CreateMemcgDir();
134ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->SwapIn(), true);
135ba5c3796Sopenharmony_ci    memcg->RemoveMemcgDir();
136ba5c3796Sopenharmony_ci    delete memcg;
137ba5c3796Sopenharmony_ci    memcg = nullptr;
138ba5c3796Sopenharmony_ci}
139ba5c3796Sopenharmony_ci
140ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, CreateMemcgDirTest, TestSize.Level1)
141ba5c3796Sopenharmony_ci{
142ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
143ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->CreateMemcgDir(), true);
144ba5c3796Sopenharmony_ci    EXPECT_EQ(KernelInterface::GetInstance().IsDirExists(memcg->GetMemcgPath_()), true);
145ba5c3796Sopenharmony_ci    memcg->RemoveMemcgDir();
146ba5c3796Sopenharmony_ci    delete memcg;
147ba5c3796Sopenharmony_ci    memcg = nullptr;
148ba5c3796Sopenharmony_ci}
149ba5c3796Sopenharmony_ci
150ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, RemoveMemcgDirTest, TestSize.Level1)
151ba5c3796Sopenharmony_ci{
152ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
153ba5c3796Sopenharmony_ci    memcg->CreateMemcgDir();
154ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->RemoveMemcgDir(), true);
155ba5c3796Sopenharmony_ci    EXPECT_EQ(KernelInterface::GetInstance().IsDirExists(memcg->GetMemcgPath_()), false);
156ba5c3796Sopenharmony_ci    delete memcg;
157ba5c3796Sopenharmony_ci    memcg = nullptr;
158ba5c3796Sopenharmony_ci}
159ba5c3796Sopenharmony_ci
160ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, AddProcTest, TestSize.Level1)
161ba5c3796Sopenharmony_ci{
162ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
163ba5c3796Sopenharmony_ci    memcg->CreateMemcgDir();
164ba5c3796Sopenharmony_ci    EXPECT_EQ(memcg->AddProc(12345678u), false);
165ba5c3796Sopenharmony_ci    memcg->RemoveMemcgDir();
166ba5c3796Sopenharmony_ci    delete memcg;
167ba5c3796Sopenharmony_ci    memcg = nullptr;
168ba5c3796Sopenharmony_ci}
169ba5c3796Sopenharmony_ci
170ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, GetMemcgPathTest, TestSize.Level1)
171ba5c3796Sopenharmony_ci{
172ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
173ba5c3796Sopenharmony_ci    std::string path = "/dev/memcg/" + std::to_string(userId_);
174ba5c3796Sopenharmony_ci    EXPECT_STREQ(memcg->GetMemcgPath_().c_str(), path.c_str());
175ba5c3796Sopenharmony_ci    delete memcg;
176ba5c3796Sopenharmony_ci    memcg = nullptr;
177ba5c3796Sopenharmony_ci}
178ba5c3796Sopenharmony_ci
179ba5c3796Sopenharmony_ciHWTEST_F(UserMemcgTest, ReadScoreAndReclaimRatiosFromKernelTest, TestSize.Level1)
180ba5c3796Sopenharmony_ci{
181ba5c3796Sopenharmony_ci    UserMemcg* memcg = new UserMemcg(userId_);
182ba5c3796Sopenharmony_ci    memcg->CreateMemcgDir();
183ba5c3796Sopenharmony_ci    int score = 0;
184ba5c3796Sopenharmony_ci    unsigned int mem2zramRatio = 0;
185ba5c3796Sopenharmony_ci    unsigned int zram2ufsRatio = 0;
186ba5c3796Sopenharmony_ci    unsigned int refaultThreshold = 0;
187ba5c3796Sopenharmony_ci    bool ret = memcg->ReadScoreAndReclaimRatiosFromKernel_(score, mem2zramRatio, zram2ufsRatio, refaultThreshold);
188ba5c3796Sopenharmony_ci    EXPECT_EQ(ret, true);
189ba5c3796Sopenharmony_ci    memcg->RemoveMemcgDir();
190ba5c3796Sopenharmony_ci    delete memcg;
191ba5c3796Sopenharmony_ci    memcg = nullptr;
192ba5c3796Sopenharmony_ci}
193ba5c3796Sopenharmony_ci}
194ba5c3796Sopenharmony_ci}
195