2 * Copyright (C) 2018 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>
21 #include <gtest/gtest.h>
23 #include "../rollable_file.h"
24 #include "../mabain_consts.h"
26 #include "../resource_pool.h"
28 using namespace mabain;
32 #define ROLLABLE_FILE_TEST_DIR "/var/tmp/mabain_test"
33 #define FAKE_DATA "dsklckk sldk&&sdijds8990s9090230290399&&^^%%sdhsjdhsjdhsjxnmzn lkvlsdlq;';'a;b; ;;slv; ;;;sdfl; lls;lf;sld;sld;sld;sll;skl;klk;gk;akl;s"
34 #define ONE_MEGA 1024*1024ul
36 class RollableFileTest : public ::testing::Test
42 virtual ~RollableFileTest() {
47 virtual void SetUp() {
48 std::string cmd = std::string("mkdir -p ") + ROLLABLE_FILE_TEST_DIR;
49 if(system(cmd.c_str()) != 0) {
52 virtual void TearDown() {
53 ResourcePool::getInstance().RemoveAll();
54 std::string cmd = std::string("rm -rf ") + ROLLABLE_FILE_TEST_DIR + "/_*";
55 if(system(cmd.c_str()) != 0) {
66 TEST_F(RollableFileTest, constructor_test)
68 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_d",
69 4*ONE_MEGA, 4*ONE_MEGA, CONSTS::ACCESS_MODE_WRITER, 0);
70 EXPECT_EQ(rfile != NULL, true);
72 ResourcePool::getInstance().RemoveAll();
74 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_d",
75 4*ONE_MEGA, 4*ONE_MEGA, CONSTS::ACCESS_MODE_READER, 2);
76 EXPECT_EQ(rfile != NULL, true);
79 TEST_F(RollableFileTest, RandomWrite_test)
81 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_d",
82 4*ONE_MEGA, 4*ONE_MEGA, CONSTS::ACCESS_MODE_WRITER, 0);
84 EXPECT_EQ(rfile != NULL, true);
92 rfile->Reserve(offset, nbytes, ptr);
93 nbytes = rfile->RandomWrite((const void *)FAKE_DATA, nbytes, offset);
94 EXPECT_EQ(nbytes, 5u);
97 rfile->RandomRead(buff, nbytes, offset);
98 EXPECT_EQ(memcmp(buff, FAKE_DATA, nbytes)==0, true);
101 offset = ONE_MEGA + 28372;
102 rfile->Reserve(offset, nbytes, ptr);
103 nbytes = rfile->RandomWrite((const void *)FAKE_DATA, nbytes, offset);
104 EXPECT_EQ(nbytes, 78u);
105 rfile->RandomRead(buff, nbytes, offset);
106 EXPECT_EQ(memcmp(buff, FAKE_DATA, nbytes)==0, true);
109 TEST_F(RollableFileTest, RandomRead_test)
111 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_i",
112 4*ONE_MEGA, 4*ONE_MEGA,
113 CONSTS::ACCESS_MODE_WRITER | CONSTS::USE_SLIDING_WINDOW, 0);
115 EXPECT_EQ(rfile != NULL, true);
116 std::atomic<size_t> sliding_addr;
117 rfile->InitShmSlidingAddr(&sliding_addr);
125 rfile->Reserve(offset, nbytes, ptr);
126 nbytes = rfile->RandomWrite((const void *)FAKE_DATA, nbytes, offset);
127 EXPECT_EQ(nbytes, 15u);
130 rfile->RandomRead(buff, nbytes, offset);
131 EXPECT_EQ(memcmp(buff, FAKE_DATA, nbytes)==0, true);
134 offset = 8*ONE_MEGA + 28372;
135 rfile->Reserve(offset, nbytes, ptr);
136 nbytes = rfile->RandomWrite((const void *)FAKE_DATA, nbytes, offset);
137 EXPECT_EQ(nbytes, 35u);
138 rfile->RandomRead(buff, nbytes, offset);
139 EXPECT_EQ(memcmp(buff, FAKE_DATA, nbytes)==0, true);
142 TEST_F(RollableFileTest, Reserve_test)
144 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_i",
145 4*ONE_MEGA, 4*ONE_MEGA,
146 CONSTS::ACCESS_MODE_WRITER | CONSTS::USE_SLIDING_WINDOW, 0);
147 EXPECT_EQ(rfile != NULL, true);
156 rval = rfile->Reserve(offset, size, ptr, true);
157 EXPECT_EQ(rval, MBError::SUCCESS);
158 EXPECT_EQ(offset, 0u);
159 EXPECT_EQ(ptr != NULL, true);
163 rval = rfile->Reserve(offset, size, ptr, true);
164 EXPECT_EQ(rval, MBError::SUCCESS);
165 EXPECT_EQ(offset, 12123u);
166 EXPECT_EQ(ptr != NULL, true);
169 TEST_F(RollableFileTest, GetShmPtr_test)
171 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_i",
172 4*ONE_MEGA, 4*ONE_MEGA,
173 CONSTS::ACCESS_MODE_WRITER | CONSTS::USE_SLIDING_WINDOW, 0);
174 EXPECT_EQ(rfile != NULL, true);
183 rval = rfile->Reserve(offset, size, ptr, true);
184 EXPECT_EQ(rval, MBError::SUCCESS);
185 EXPECT_EQ(offset, 42321u);
186 EXPECT_EQ(ptr != NULL, true);
187 EXPECT_EQ(ptr == rfile->GetShmPtr(offset, size), true);
190 TEST_F(RollableFileTest, CheckAlignment_test)
192 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_i",
193 4*ONE_MEGA, 4*ONE_MEGA, CONSTS::ACCESS_MODE_WRITER, 0);
194 EXPECT_EQ(rfile != NULL, true);
201 offset = rfile->CheckAlignment(offset, size);
202 EXPECT_EQ(offset, 1001u);
204 offset = 4*ONE_MEGA-12;
206 offset = rfile->CheckAlignment(offset, size);
207 EXPECT_EQ(offset, 4*ONE_MEGA);
210 TEST_F(RollableFileTest, Flush_test)
212 rfile = new RollableFile(std::string(ROLLABLE_FILE_TEST_DIR) + "/_mabain_i",
213 4*ONE_MEGA, 4*ONE_MEGA,
214 CONSTS::ACCESS_MODE_WRITER | CONSTS::USE_SLIDING_WINDOW, 0);
215 EXPECT_EQ(rfile != NULL, true);
216 std::atomic<size_t> sliding_addr;
217 rfile->InitShmSlidingAddr(&sliding_addr);
220 size_t offset = ONE_MEGA + 28372;
222 rfile->Reserve(offset, nbytes, ptr);
223 nbytes = rfile->RandomWrite((const void *)FAKE_DATA, nbytes, offset);
224 EXPECT_EQ(nbytes, 78);
225 offset = 4*ONE_MEGA + 233232;
227 rfile->Reserve(offset, nbytes, ptr);
228 nbytes = rfile->RandomWrite((const void *)FAKE_DATA, nbytes, offset);
229 EXPECT_EQ(nbytes, 101);