inital commit
[c11concurrency-benchmarks.git] / mabain / src / unittest / free_list_test.cpp
1 /**
2  * Copyright (C) 2017 Cisco Inc.
3  *
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.
7  *
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.
12  *
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/>.
15  */
16
17 // @author Changxue Deng <chadeng@cisco.com>
18
19 #include <unistd.h>
20 #include <stdlib.h>
21 #include <list>
22
23 #include <gtest/gtest.h>
24
25 #include "../free_list.h"
26 #include "../error.h"
27
28 using namespace mabain;
29
30 namespace {
31
32 class FreeListTest : public ::testing::Test
33 {
34 public:
35     FreeListTest() {}
36     virtual ~FreeListTest() {}
37     virtual void SetUp() {}
38     virtual void TearDown() {}
39
40 protected:
41 };
42
43 TEST_F(FreeListTest, AddBufferByIndex_test)
44 {
45     int rval;
46     FreeList flist("./freelist", 4, 1000);
47
48     rval = flist.AddBufferByIndex(0, 100);
49     EXPECT_EQ(rval, 0);
50     EXPECT_EQ(flist.Count(), 1);
51     EXPECT_EQ(flist.GetBufferCountByIndex(0), 1u);
52
53     rval = flist.AddBufferByIndex(111, 128);
54     EXPECT_EQ(rval, 0);
55     EXPECT_EQ(flist.Count(), 2);
56     EXPECT_EQ(flist.GetBufferCountByIndex(111), 1u);
57 }
58
59 TEST_F(FreeListTest, RemoveBufferByIndex_test)
60 {
61     FreeList flist("./freelist", 8, 2000);
62
63     flist.AddBufferByIndex(33, 72);
64     EXPECT_EQ(flist.RemoveBufferByIndex(33), 72u);
65
66
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);
73 }
74
75 TEST_F(FreeListTest, GetAlignmentSize_test)
76 {
77     FreeList flist("./freelist", 8, 1222);
78
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);
89 }
90
91 TEST_F(FreeListTest, GetBufferIndex_test)
92 {
93     FreeList flist("./freelist", 4, 222);
94
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);
100 }
101
102 TEST_F(FreeListTest, GetBufferCountByIndex_test)
103 {
104     FreeList flist("./freelist", 4, 333);
105
106     flist.AddBufferByIndex(7, 4);
107     flist.AddBufferByIndex(7, 24);
108     flist.AddBufferByIndex(7, 8);
109
110     EXPECT_EQ(flist.GetBufferCountByIndex(7), 3u);
111 }
112
113 TEST_F(FreeListTest, GetBufferSizeByIndex_test)
114 {
115     FreeList flist("./freelist", 4, 333);
116
117     flist.AddBufferByIndex(13, 64);
118     flist.AddBufferByIndex(3, 28);
119     flist.AddBufferByIndex(101, 256);
120     flist.AddBufferByIndex(101, 516);
121
122     EXPECT_EQ(flist.GetBufferCountByIndex(13), 1u);
123     EXPECT_EQ(flist.GetBufferCountByIndex(3), 1u);
124     EXPECT_EQ(flist.GetBufferCountByIndex(101), 2u);
125 }
126
127 TEST_F(FreeListTest, ReleaseBuffer_test)
128 {
129     int rval;
130     FreeList flist("./freelist", 4, 444);
131
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);
138 }
139
140 TEST_F(FreeListTest, AddBuffer_test)
141 {
142     int rval;
143     FreeList flist("./freelist", 4, 555);
144
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);
154
155     rval = flist.AddBuffer(260, 135);
156     EXPECT_EQ(rval, MBError::SUCCESS);
157     EXPECT_EQ(flist.GetBufferCountByIndex(flist.GetBufferIndex(135)), 1u);
158 }
159
160 TEST_F(FreeListTest, RemoveBuffer_test)
161 {
162     int rval;
163     FreeList flist("./freelist", 4, 555);
164     size_t offset;
165
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);
176 }
177
178 TEST_F(FreeListTest, GetTotSize_test)
179 {
180     FreeList flist("./freelist", 4, 555);
181     size_t tot = 0;
182
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);
193 }
194
195 TEST_F(FreeListTest, StoreLoadEmpty_test)
196 {
197     int rval;
198     FreeList flist("./freelist", 4, 555);
199
200     rval = flist.StoreListOnDisk();
201     EXPECT_EQ(rval, MBError::SUCCESS);
202     rval = access("./freelist", R_OK);
203     EXPECT_EQ(rval, -1);
204 }
205
206 TEST_F(FreeListTest, StoreLoadSmallFilling_test)
207 {
208     int rval;
209     size_t offset;
210     FreeList flist("./freelist", 4, 555);
211
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);
219     EXPECT_EQ(rval, 0);
220     EXPECT_EQ(flist.Count(), 0);
221     EXPECT_EQ(flist.GetTotSize(), 0u);
222
223     flist.LoadListFromDisk();
224     rval = access("./freelist", R_OK);
225     EXPECT_EQ(rval, -1);
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);
238 }
239
240 TEST_F(FreeListTest, StoreLoadFullFilling_test)
241 {
242     int rval;
243     size_t offset;
244     int size;
245     int num_buff = 1011;
246     FreeList flist("./freelist", 4, num_buff);
247     std::list<size_t> buff_list;
248
249     srand(time(NULL));
250
251     offset = 0;
252     for(int i = 0; i < num_buff; i++)
253     {
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);
259     } 
260
261     rval = flist.StoreListOnDisk();
262     EXPECT_EQ(rval, MBError::SUCCESS);
263     rval = access("./freelist", F_OK);
264     EXPECT_EQ(rval, 0);
265     EXPECT_EQ(flist.Count(), 0);
266     EXPECT_EQ(flist.GetTotSize(), 0u);
267
268     flist.LoadListFromDisk();
269     rval = access("./freelist", R_OK);
270     EXPECT_EQ(rval, -1);
271
272     for (std::list<size_t>::iterator it = buff_list.begin(); it != buff_list.end(); ++it)
273     {
274         offset = *it;
275         it++;
276         size = *it;
277         rval = flist.RemoveBuffer(offset, size);
278         EXPECT_EQ(rval, MBError::SUCCESS);
279     }
280     size = 34;
281     rval = flist.RemoveBuffer(offset, size);
282     EXPECT_EQ(rval, MBError::NO_MEMORY);
283 }
284
285 TEST_F(FreeListTest, StoreLoadHalfFilling_test)
286 {
287     int rval;
288     size_t offset;
289     int size;
290     int num_buff = 1000;
291     FreeList flist("./freelist", 4, num_buff);
292     std::list<size_t> buff_list;
293
294     srand(time(NULL));
295
296     offset = 24;
297     for(int i = 0; i < num_buff; i++)
298     {
299         size = rand() % 98 + 1;
300         if(i % 2  == 0)
301         {
302             flist.AddBuffer(offset, size);
303             buff_list.push_back(offset);
304             buff_list.push_back(size);
305         }
306         offset += flist.GetAlignmentSize(size);
307     } 
308
309     rval = flist.StoreListOnDisk();
310     EXPECT_EQ(rval, MBError::SUCCESS);
311     rval = access("./freelist", F_OK);
312     EXPECT_EQ(rval, 0);
313     EXPECT_EQ(flist.Count(), 0);
314     EXPECT_EQ(flist.GetTotSize(), 0u);
315
316     flist.LoadListFromDisk();
317     rval = access("./freelist", R_OK);
318     EXPECT_EQ(rval, -1);
319
320     for (std::list<size_t>::iterator it = buff_list.begin(); it != buff_list.end(); ++it)
321     {
322         offset = *it;
323         it++;
324         size = *it;
325         rval = flist.RemoveBuffer(offset, size);
326         EXPECT_EQ(rval, MBError::SUCCESS);
327     }
328     size = 34;
329     rval = flist.RemoveBuffer(offset, size);
330     EXPECT_EQ(rval, MBError::NO_MEMORY);
331 }
332
333 }