2 * Copyright (C) 2017 Cisco Inc.
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2,
6 * as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 // @author Changxue Deng <chadeng@cisco.com>
23 #include <gtest/gtest.h>
25 #include "../free_list.h"
28 using namespace mabain;
32 class FreeListTest : public ::testing::Test
36 virtual ~FreeListTest() {}
37 virtual void SetUp() {}
38 virtual void TearDown() {}
43 TEST_F(FreeListTest, AddBufferByIndex_test)
46 FreeList flist("./freelist", 4, 1000);
48 rval = flist.AddBufferByIndex(0, 100);
50 EXPECT_EQ(flist.Count(), 1);
51 EXPECT_EQ(flist.GetBufferCountByIndex(0), 1u);
53 rval = flist.AddBufferByIndex(111, 128);
55 EXPECT_EQ(flist.Count(), 2);
56 EXPECT_EQ(flist.GetBufferCountByIndex(111), 1u);
59 TEST_F(FreeListTest, RemoveBufferByIndex_test)
61 FreeList flist("./freelist", 8, 2000);
63 flist.AddBufferByIndex(33, 72);
64 EXPECT_EQ(flist.RemoveBufferByIndex(33), 72u);
67 flist.AddBufferByIndex(44, 328);
68 flist.AddBufferByIndex(44, 1024);
69 flist.AddBufferByIndex(102, 8);
70 EXPECT_EQ(flist.RemoveBufferByIndex(44), 328u);
71 EXPECT_EQ(flist.RemoveBufferByIndex(102), 8u);
72 EXPECT_EQ(flist.RemoveBufferByIndex(44), 1024u);
75 TEST_F(FreeListTest, GetAlignmentSize_test)
77 FreeList flist("./freelist", 8, 1222);
79 EXPECT_EQ(flist.GetAlignmentSize(128), 128);
80 EXPECT_EQ(flist.GetAlignmentSize(129), 136);
81 EXPECT_EQ(flist.GetAlignmentSize(130), 136);
82 EXPECT_EQ(flist.GetAlignmentSize(131), 136);
83 EXPECT_EQ(flist.GetAlignmentSize(132), 136);
84 EXPECT_EQ(flist.GetAlignmentSize(133), 136);
85 EXPECT_EQ(flist.GetAlignmentSize(134), 136);
86 EXPECT_EQ(flist.GetAlignmentSize(135), 136);
87 EXPECT_EQ(flist.GetAlignmentSize(136), 136);
88 EXPECT_EQ(flist.GetAlignmentSize(137), 144);
91 TEST_F(FreeListTest, GetBufferIndex_test)
93 FreeList flist("./freelist", 4, 222);
95 EXPECT_EQ(flist.GetBufferIndex(1), 0);
96 EXPECT_EQ(flist.GetBufferIndex(2), 0);
97 EXPECT_EQ(flist.GetBufferIndex(3), 0);
98 EXPECT_EQ(flist.GetBufferIndex(4), 0);
99 EXPECT_EQ(flist.GetBufferIndex(5), 1);
102 TEST_F(FreeListTest, GetBufferCountByIndex_test)
104 FreeList flist("./freelist", 4, 333);
106 flist.AddBufferByIndex(7, 4);
107 flist.AddBufferByIndex(7, 24);
108 flist.AddBufferByIndex(7, 8);
110 EXPECT_EQ(flist.GetBufferCountByIndex(7), 3u);
113 TEST_F(FreeListTest, GetBufferSizeByIndex_test)
115 FreeList flist("./freelist", 4, 333);
117 flist.AddBufferByIndex(13, 64);
118 flist.AddBufferByIndex(3, 28);
119 flist.AddBufferByIndex(101, 256);
120 flist.AddBufferByIndex(101, 516);
122 EXPECT_EQ(flist.GetBufferCountByIndex(13), 1u);
123 EXPECT_EQ(flist.GetBufferCountByIndex(3), 1u);
124 EXPECT_EQ(flist.GetBufferCountByIndex(101), 2u);
127 TEST_F(FreeListTest, ReleaseBuffer_test)
130 FreeList flist("./freelist", 4, 444);
132 rval = flist.ReleaseBuffer(16, 8);
133 EXPECT_EQ(rval, MBError::SUCCESS);
134 rval = flist.ReleaseBuffer(124, 34);
135 EXPECT_EQ(rval, MBError::SUCCESS);
136 EXPECT_EQ(flist.GetBufferCountByIndex(flist.GetBufferIndex(8)), 1u);
137 EXPECT_EQ(flist.GetBufferCountByIndex(flist.GetBufferIndex(34)), 1u);
140 TEST_F(FreeListTest, AddBuffer_test)
143 FreeList flist("./freelist", 4, 555);
145 rval = flist.AddBuffer(40, 34);
146 EXPECT_EQ(rval, MBError::SUCCESS);
147 EXPECT_EQ(flist.GetBufferCountByIndex(flist.GetBufferIndex(34)), 1u);
148 rval =flist. AddBuffer(144, 34);
149 EXPECT_EQ(rval, MBError::SUCCESS);
150 EXPECT_EQ(flist.GetBufferCountByIndex(flist.GetBufferIndex(34)), 2u);
151 rval = flist.AddBuffer(196, 35);
152 EXPECT_EQ(rval, MBError::SUCCESS);
153 EXPECT_EQ(flist.GetBufferCountByIndex(flist.GetBufferIndex(34)), 3u);
155 rval = flist.AddBuffer(260, 135);
156 EXPECT_EQ(rval, MBError::SUCCESS);
157 EXPECT_EQ(flist.GetBufferCountByIndex(flist.GetBufferIndex(135)), 1u);
160 TEST_F(FreeListTest, RemoveBuffer_test)
163 FreeList flist("./freelist", 4, 555);
166 flist.AddBufferByIndex(98, 96);
167 flist.AddBufferByIndex(98, 196);
168 rval = flist.RemoveBuffer(offset, flist.GetBufferSizeByIndex(98));
169 EXPECT_EQ(rval, MBError::SUCCESS);
170 EXPECT_EQ(offset, 96u);
171 rval = flist.RemoveBuffer(offset, flist.GetBufferSizeByIndex(98));
172 EXPECT_EQ(rval, MBError::SUCCESS);
173 EXPECT_EQ(offset, 196u);
174 rval = flist.RemoveBuffer(offset, flist.GetBufferSizeByIndex(98));
175 EXPECT_EQ(rval, MBError::NO_MEMORY);
178 TEST_F(FreeListTest, GetTotSize_test)
180 FreeList flist("./freelist", 4, 555);
183 flist.AddBuffer(8, 183);
184 tot += flist.GetAlignmentSize(183);
185 flist.AddBuffer(240, 44);
186 tot += flist.GetAlignmentSize(44);
187 flist.AddBufferByIndex(33, 1024);
188 tot += flist.GetBufferSizeByIndex(33);
189 flist.AddBufferByIndex(133, 2056);
190 tot += flist.GetBufferSizeByIndex(133);
191 EXPECT_EQ(flist.GetTotSize(), tot);
192 EXPECT_EQ(flist.Count(), 4);
195 TEST_F(FreeListTest, StoreLoadEmpty_test)
198 FreeList flist("./freelist", 4, 555);
200 rval = flist.StoreListOnDisk();
201 EXPECT_EQ(rval, MBError::SUCCESS);
202 rval = access("./freelist", R_OK);
206 TEST_F(FreeListTest, StoreLoadSmallFilling_test)
210 FreeList flist("./freelist", 4, 555);
212 flist.AddBuffer(32, 17);
213 flist.AddBuffer(84, 11);
214 flist.AddBuffer(144, 23);
215 flist.AddBuffer(444, 3);
216 rval = flist.StoreListOnDisk();
217 EXPECT_EQ(rval, MBError::SUCCESS);
218 rval = access("./freelist", F_OK);
220 EXPECT_EQ(flist.Count(), 0);
221 EXPECT_EQ(flist.GetTotSize(), 0u);
223 flist.LoadListFromDisk();
224 rval = access("./freelist", R_OK);
226 rval = flist.RemoveBuffer(offset, 11);
227 EXPECT_EQ(rval, MBError::SUCCESS);
228 EXPECT_EQ(offset, 84u);
229 rval = flist.RemoveBuffer(offset, 23);
230 EXPECT_EQ(rval, MBError::SUCCESS);
231 EXPECT_EQ(offset, 144u);
232 rval = flist.RemoveBuffer(offset, 17);
233 EXPECT_EQ(rval, MBError::SUCCESS);
234 EXPECT_EQ(offset, 32u);
235 rval = flist.RemoveBuffer(offset, 2);
236 EXPECT_EQ(rval, MBError::SUCCESS);
237 EXPECT_EQ(offset, 444u);
240 TEST_F(FreeListTest, StoreLoadFullFilling_test)
246 FreeList flist("./freelist", 4, num_buff);
247 std::list<size_t> buff_list;
252 for(int i = 0; i < num_buff; i++)
254 size = rand() % 111 + 2;
255 flist.AddBuffer(offset, size);
256 buff_list.push_back(offset);
257 buff_list.push_back(size);
258 offset += flist.GetAlignmentSize(size);
261 rval = flist.StoreListOnDisk();
262 EXPECT_EQ(rval, MBError::SUCCESS);
263 rval = access("./freelist", F_OK);
265 EXPECT_EQ(flist.Count(), 0);
266 EXPECT_EQ(flist.GetTotSize(), 0u);
268 flist.LoadListFromDisk();
269 rval = access("./freelist", R_OK);
272 for (std::list<size_t>::iterator it = buff_list.begin(); it != buff_list.end(); ++it)
277 rval = flist.RemoveBuffer(offset, size);
278 EXPECT_EQ(rval, MBError::SUCCESS);
281 rval = flist.RemoveBuffer(offset, size);
282 EXPECT_EQ(rval, MBError::NO_MEMORY);
285 TEST_F(FreeListTest, StoreLoadHalfFilling_test)
291 FreeList flist("./freelist", 4, num_buff);
292 std::list<size_t> buff_list;
297 for(int i = 0; i < num_buff; i++)
299 size = rand() % 98 + 1;
302 flist.AddBuffer(offset, size);
303 buff_list.push_back(offset);
304 buff_list.push_back(size);
306 offset += flist.GetAlignmentSize(size);
309 rval = flist.StoreListOnDisk();
310 EXPECT_EQ(rval, MBError::SUCCESS);
311 rval = access("./freelist", F_OK);
313 EXPECT_EQ(flist.Count(), 0);
314 EXPECT_EQ(flist.GetTotSize(), 0u);
316 flist.LoadListFromDisk();
317 rval = access("./freelist", R_OK);
320 for (std::list<size_t>::iterator it = buff_list.begin(); it != buff_list.end(); ++it)
325 rval = flist.RemoveBuffer(offset, size);
326 EXPECT_EQ(rval, MBError::SUCCESS);
329 rval = flist.RemoveBuffer(offset, size);
330 EXPECT_EQ(rval, MBError::NO_MEMORY);