3 * tests for the modules "filefunc", "daemonfunc"
5 * (c) Copyright 2007-2008 by Intra2net AG
22 #define BOOST_TEST_DYN_LINK
23 #include <boost/test/unit_test.hpp>
25 #include <filefunc.hxx>
26 #include <daemonfunc.hpp>
29 #define DOUT(msg) std::cout << msg << std::endl
31 #define DOUT(msg) do {} while (0)
37 class TestFileFuncFixture
40 typedef std::list< std::string > StringList;
41 std::set<std::string> used_check_files;
43 std::string get_check_file_path(std::string tag)
46 result= "__unittest__" + tag + ".dat";
47 used_check_files.insert(result);
49 } // eo get_check_file_path
51 void remove_check_files()
53 for (std::set<std::string>::iterator it= used_check_files.begin();
54 it != used_check_files.end();
57 std::string filepath(*it);
58 if (path_exists(filepath))
64 used_check_files.clear();
65 } // eo remove_check_files
72 ~TestFileFuncFixture()
78 BOOST_FIXTURE_TEST_SUITE(TestFileFunc, TestFileFuncFixture)
80 BOOST_AUTO_TEST_CASE(StatTest1)
82 I2n::Stat stat("Makefile");
84 BOOST_CHECK_EQUAL( true, (bool)stat );
85 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
86 BOOST_CHECK_EQUAL( false, stat.is_directory() );
88 stat= Stat("/dev/null");
90 BOOST_CHECK_EQUAL( true, (bool)stat );
91 BOOST_CHECK_EQUAL( false, stat.is_regular_file() );
92 BOOST_CHECK_EQUAL( false, stat.is_directory() );
93 BOOST_CHECK_EQUAL( true, stat.is_device() );
94 BOOST_CHECK_EQUAL( true, stat.is_character_device() );
95 BOOST_CHECK_EQUAL( false, stat.is_block_device() );
98 BOOST_AUTO_TEST_CASE(StatRecheck)
103 I2n::Stat stat(".foobar");
104 BOOST_CHECK_EQUAL( false, (bool)stat );
106 write_file(".foobar","hello world");
110 BOOST_CHECK_EQUAL( true, (bool)stat );
111 BOOST_CHECK_EQUAL( true, stat.size() > 0 );
116 BOOST_AUTO_TEST_CASE(DirTest1)
118 typedef std::vector< std::string > StringVector;
121 bool res= I2n::get_dir(".",names);
123 BOOST_CHECK_EQUAL( true, res );
124 BOOST_CHECK( ! names.empty() );
126 StringVector::iterator it = std::find( names.begin(), names.end(), "Makefile");
127 BOOST_CHECK( it != names.end() );
129 it = std::find( names.begin(), names.end(), "." );
130 BOOST_CHECK( it == names.end() );
132 names= get_dir(".",true);
133 BOOST_CHECK( ! names.empty() );
135 for (it= names.begin(); it!=names.end(); ++it)
137 DOUT(" \"" << *it << "\"");
138 BOOST_CHECK_EQUAL( false, it->empty() );
141 it = std::find( names.begin(), names.end(), "." );
142 BOOST_CHECK( it != names.end() );
147 BOOST_AUTO_TEST_CASE(PathCuts1)
149 std::string path1("/an/absolute/path");
151 BOOST_CHECK_EQUAL( std::string("/an/absolute"), dirname(path1) );
152 BOOST_CHECK_EQUAL( std::string("path"), basename(path1) );
154 std::string path2("just.a.name");
155 BOOST_CHECK_EQUAL( std::string("just.a.name"), basename(path2) );
156 BOOST_CHECK_EQUAL( std::string("."), dirname(path2) );
161 BOOST_AUTO_TEST_CASE(NormalizePath1)
165 path= normalize_path("/a/simple/path/");
166 BOOST_CHECK_EQUAL( std::string("/a/simple/path"), path );
168 path= normalize_path("//another///simple/.//path//");
169 BOOST_CHECK_EQUAL( std::string("/another/simple/path"), path );
171 path= normalize_path("//..//..//a/dummy///../././simple/././/path//");
172 BOOST_CHECK_EQUAL( std::string("/a/simple/path"), path );
174 path= normalize_path("../a/dummy//././..//simple//nice//absolute//.././..//relative/path//");
175 BOOST_CHECK_EQUAL( std::string("../a/simple/relative/path"), path );
177 path= normalize_path("../../a/dummy//././..//simple/../nice//absolute//../.x/..//relative/path//");
178 BOOST_CHECK_EQUAL( std::string("../../a/nice/relative/path"), path );
180 } // eo NormalizePath1
182 BOOST_AUTO_TEST_CASE(NormalizePath2)
186 path= normalize_path("/");
187 BOOST_CHECK_EQUAL( std::string("/"), path );
189 path= normalize_path("//");
190 BOOST_CHECK_EQUAL( std::string("/"), path );
192 path= normalize_path("/.//");
193 BOOST_CHECK_EQUAL( std::string("/"), path );
195 path= normalize_path(".");
196 BOOST_CHECK_EQUAL( std::string(""), path );
198 path= normalize_path("./");
199 BOOST_CHECK_EQUAL( std::string(""), path );
201 path= normalize_path(".///");
202 BOOST_CHECK_EQUAL( std::string(""), path );
204 path= normalize_path("/./data/files");
205 BOOST_CHECK_EQUAL( std::string("/data/files"), path );
207 path= normalize_path("./data/files/");
208 BOOST_CHECK_EQUAL( std::string("data/files"), path );
209 } // eo NormalizePath2
211 BOOST_AUTO_TEST_CASE(TestUserAndGroupStuff1)
213 User user_root((uid_t)0);
214 BOOST_CHECK_EQUAL( true, user_root.is_valid() );
215 BOOST_CHECK_EQUAL( true, (bool)user_root );
217 BOOST_CHECK_EQUAL( std::string("root"), user_root.Name );
218 BOOST_CHECK_EQUAL( (uid_t)0, user_root.Uid );
219 BOOST_CHECK_EQUAL( (gid_t)0, user_root.Gid );
221 User user_root2("root");
222 BOOST_CHECK_EQUAL( true, user_root2.is_valid() );
223 BOOST_CHECK_EQUAL( true, (bool)user_root2 );
225 BOOST_CHECK_EQUAL( std::string("root"), user_root2.Name );
226 BOOST_CHECK_EQUAL( (uid_t)0, user_root2.Uid );
227 BOOST_CHECK_EQUAL( (gid_t)0, user_root2.Gid );
229 Group group_root("root");
230 BOOST_CHECK_EQUAL( true, group_root.is_valid() );
231 BOOST_CHECK_EQUAL( true, (bool)group_root );
233 BOOST_CHECK_EQUAL( std::string("root"), group_root.Name );
234 BOOST_CHECK_EQUAL( (gid_t)0, group_root.Gid );
236 } // TestUserAndGroupStuff1()
238 BOOST_AUTO_TEST_CASE(TestUserAndGroupStuff2)
240 // Test if is_valid() works correctly
242 BOOST_CHECK_EQUAL( false, user_root.is_valid() );
245 BOOST_CHECK_EQUAL( false, group_root.is_valid() );
248 BOOST_AUTO_TEST_CASE(TestFileModes1)
250 std::string path= get_check_file_path("FileModes1");
252 write_file(path,"42");
254 Stat stat(path, false);
255 BOOST_CHECK_EQUAL( true, stat.is_valid() );
257 User user( stat.uid() );
258 Group group( stat.gid() );
260 BOOST_CHECK_EQUAL( true, user.is_valid() );
261 BOOST_CHECK_EQUAL( true, group.is_valid() );
263 bool res=chown( path, user.Name.c_str(), group.Gid );
265 BOOST_CHECK_EQUAL( true, res );
266 } // eo TestFileModes1()
270 BOOST_AUTO_TEST_CASE(TestPidOf1)
272 using I2n::Daemon::pid_of;
274 std::vector< pid_t > pid_list;
276 bool res= pid_of("init", pid_list);
278 BOOST_CHECK_EQUAL( true, res);
279 BOOST_CHECK_EQUAL( false, pid_list.empty() );
281 std::vector< pid_t >::const_iterator pos1 =
282 std::find( pid_list.begin(), pid_list.end(), 1);
284 BOOST_CHECK( pos1 != pid_list.end() );
287 BOOST_AUTO_TEST_CASE(TestCopyFileSourceFail)
289 bool res = copy_file("does not exist", "destination");
290 BOOST_CHECK_EQUAL( false, res );
293 BOOST_AUTO_TEST_CASE(TestCopyFileDestFail)
295 bool res = copy_file("/etc/HOSTNAME", "/proc/not/writable");
296 BOOST_CHECK_EQUAL( false, res );
299 BOOST_AUTO_TEST_CASE(TestCopyFileOk)
301 string input = "copy_source";
302 string data = "test";
305 ofstream finput(input.c_str());
310 input_size = file_size(input);
313 string output = "copy_dest";
314 long output_size = 0;
315 bool res = copy_file(input, output);
318 output_size = file_size(output);
323 bool size_is_zero = output_size == 0 ? true : false;
325 BOOST_CHECK_EQUAL( true, res );
326 BOOST_CHECK_EQUAL( input_size, output_size );
327 BOOST_CHECK_EQUAL( false, size_is_zero );
330 BOOST_AUTO_TEST_SUITE_END()