2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
22 * tests for the modules "filefunc", "daemonfunc"
24 * (c) Copyright 2007-2008 by Intra2net AG
39 #define BOOST_TEST_DYN_LINK
40 #include <boost/test/unit_test.hpp>
42 #include <filefunc.hxx>
43 #include <daemonfunc.hpp>
46 #define DOUT(msg) std::cout << msg << std::endl
48 #define DOUT(msg) do {} while (0)
54 class TestFileFuncFixture
57 typedef std::list< std::string > StringList;
58 std::set<std::string> used_check_files;
60 std::string get_check_file_path(std::string tag)
63 result= "__unittest__" + tag + ".dat";
64 used_check_files.insert(result);
66 } // eo get_check_file_path
68 void remove_check_files()
70 for (std::set<std::string>::iterator it= used_check_files.begin();
71 it != used_check_files.end();
74 std::string filepath(*it);
75 if (path_exists(filepath))
81 used_check_files.clear();
82 } // eo remove_check_files
89 ~TestFileFuncFixture()
95 BOOST_FIXTURE_TEST_SUITE(TestFileFunc, TestFileFuncFixture)
97 BOOST_AUTO_TEST_CASE(StatTest1)
99 I2n::Stat stat("Makefile");
101 BOOST_CHECK_EQUAL( true, (bool)stat );
102 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
103 BOOST_CHECK_EQUAL( false, stat.is_directory() );
105 stat= Stat("/dev/null");
107 BOOST_CHECK_EQUAL( true, (bool)stat );
108 BOOST_CHECK_EQUAL( false, stat.is_regular_file() );
109 BOOST_CHECK_EQUAL( false, stat.is_directory() );
110 BOOST_CHECK_EQUAL( true, stat.is_device() );
111 BOOST_CHECK_EQUAL( true, stat.is_character_device() );
112 BOOST_CHECK_EQUAL( false, stat.is_block_device() );
115 BOOST_AUTO_TEST_CASE(StatRecheck)
120 I2n::Stat stat(".foobar");
121 BOOST_CHECK_EQUAL( false, (bool)stat );
123 write_file(".foobar","hello world");
127 BOOST_CHECK_EQUAL( true, (bool)stat );
128 BOOST_CHECK_EQUAL( true, stat.size() > 0 );
133 BOOST_AUTO_TEST_CASE(DirTest1)
135 typedef std::vector< std::string > StringVector;
138 bool res= I2n::get_dir(".",names);
140 BOOST_CHECK_EQUAL( true, res );
141 BOOST_CHECK( ! names.empty() );
143 StringVector::iterator it = std::find( names.begin(), names.end(), "Makefile");
144 BOOST_CHECK( it != names.end() );
146 it = std::find( names.begin(), names.end(), "." );
147 BOOST_CHECK( it == names.end() );
149 names= get_dir(".",true);
150 BOOST_CHECK( ! names.empty() );
152 for (it= names.begin(); it!=names.end(); ++it)
154 DOUT(" \"" << *it << "\"");
155 BOOST_CHECK_EQUAL( false, it->empty() );
158 it = std::find( names.begin(), names.end(), "." );
159 BOOST_CHECK( it != names.end() );
164 BOOST_AUTO_TEST_CASE(PathCuts1)
166 std::string path1("/an/absolute/path");
168 BOOST_CHECK_EQUAL( std::string("/an/absolute"), dirname(path1) );
169 BOOST_CHECK_EQUAL( std::string("path"), basename(path1) );
171 std::string path2("just.a.name");
172 BOOST_CHECK_EQUAL( std::string("just.a.name"), basename(path2) );
173 BOOST_CHECK_EQUAL( std::string("."), dirname(path2) );
178 BOOST_AUTO_TEST_CASE(NormalizePath1)
182 path= normalize_path("/a/simple/path/");
183 BOOST_CHECK_EQUAL( std::string("/a/simple/path"), path );
185 path= normalize_path("//another///simple/.//path//");
186 BOOST_CHECK_EQUAL( std::string("/another/simple/path"), path );
188 path= normalize_path("//..//..//a/dummy///../././simple/././/path//");
189 BOOST_CHECK_EQUAL( std::string("/a/simple/path"), path );
191 path= normalize_path("../a/dummy//././..//simple//nice//absolute//.././..//relative/path//");
192 BOOST_CHECK_EQUAL( std::string("../a/simple/relative/path"), path );
194 path= normalize_path("../../a/dummy//././..//simple/../nice//absolute//../.x/..//relative/path//");
195 BOOST_CHECK_EQUAL( std::string("../../a/nice/relative/path"), path );
197 } // eo NormalizePath1
199 BOOST_AUTO_TEST_CASE(NormalizePath2)
203 path= normalize_path("/");
204 BOOST_CHECK_EQUAL( std::string("/"), path );
206 path= normalize_path("//");
207 BOOST_CHECK_EQUAL( std::string("/"), path );
209 path= normalize_path("/.//");
210 BOOST_CHECK_EQUAL( std::string("/"), path );
212 path= normalize_path(".");
213 BOOST_CHECK_EQUAL( std::string(""), path );
215 path= normalize_path("./");
216 BOOST_CHECK_EQUAL( std::string(""), path );
218 path= normalize_path(".///");
219 BOOST_CHECK_EQUAL( std::string(""), path );
221 path= normalize_path("/./data/files");
222 BOOST_CHECK_EQUAL( std::string("/data/files"), path );
224 path= normalize_path("./data/files/");
225 BOOST_CHECK_EQUAL( std::string("data/files"), path );
226 } // eo NormalizePath2
228 BOOST_AUTO_TEST_CASE(TestUserAndGroupStuff1)
230 User user_root((uid_t)0);
231 BOOST_CHECK_EQUAL( true, user_root.is_valid() );
232 BOOST_CHECK_EQUAL( true, (bool)user_root );
234 BOOST_CHECK_EQUAL( std::string("root"), user_root.Name );
235 BOOST_CHECK_EQUAL( (uid_t)0, user_root.Uid );
236 BOOST_CHECK_EQUAL( (gid_t)0, user_root.Gid );
238 User user_root2("root");
239 BOOST_CHECK_EQUAL( true, user_root2.is_valid() );
240 BOOST_CHECK_EQUAL( true, (bool)user_root2 );
242 BOOST_CHECK_EQUAL( std::string("root"), user_root2.Name );
243 BOOST_CHECK_EQUAL( (uid_t)0, user_root2.Uid );
244 BOOST_CHECK_EQUAL( (gid_t)0, user_root2.Gid );
246 Group group_root("root");
247 BOOST_CHECK_EQUAL( true, group_root.is_valid() );
248 BOOST_CHECK_EQUAL( true, (bool)group_root );
250 BOOST_CHECK_EQUAL( std::string("root"), group_root.Name );
251 BOOST_CHECK_EQUAL( (gid_t)0, group_root.Gid );
253 } // TestUserAndGroupStuff1()
255 BOOST_AUTO_TEST_CASE(TestUserAndGroupStuff2)
257 // Test if is_valid() works correctly
259 BOOST_CHECK_EQUAL( false, user_root.is_valid() );
262 BOOST_CHECK_EQUAL( false, group_root.is_valid() );
265 BOOST_AUTO_TEST_CASE(TestFileModes1)
267 std::string path= get_check_file_path("FileModes1");
269 write_file(path,"42");
271 Stat stat(path, false);
272 BOOST_CHECK_EQUAL( true, stat.is_valid() );
274 User user( stat.uid() );
275 Group group( stat.gid() );
277 BOOST_CHECK_EQUAL( true, user.is_valid() );
278 BOOST_CHECK_EQUAL( true, group.is_valid() );
280 bool res=chown( path, user.Name.c_str(), group.Gid );
282 BOOST_CHECK_EQUAL( true, res );
283 } // eo TestFileModes1()
287 BOOST_AUTO_TEST_CASE(TestPidOf1)
289 using I2n::Daemon::pid_of;
291 std::vector< pid_t > pid_list;
293 bool res= pid_of("init", pid_list);
294 BOOST_CHECK_EQUAL( true, res);
296 if (pid_list.empty())
298 res= pid_of("systemd", pid_list);
299 BOOST_CHECK_EQUAL( true, res);
302 BOOST_CHECK_EQUAL( false, pid_list.empty() );
304 std::vector< pid_t >::const_iterator pos1 =
305 std::find( pid_list.begin(), pid_list.end(), 1);
307 BOOST_CHECK( pos1 != pid_list.end() );
310 BOOST_AUTO_TEST_CASE(TestCopyFileSourceFail)
312 bool res = copy_file("does not exist", "destination");
313 BOOST_CHECK_EQUAL( false, res );
316 BOOST_AUTO_TEST_CASE(TestCopyFileDestFail)
318 bool res = copy_file("/etc/HOSTNAME", "/proc/not/writable");
319 BOOST_CHECK_EQUAL( false, res );
322 BOOST_AUTO_TEST_CASE(TestCopyFileOk)
324 string input = "copy_source";
325 string data = "test";
328 ofstream finput(input.c_str());
333 input_size = file_size(input);
336 string output = "copy_dest";
337 long output_size = 0;
338 bool res = copy_file(input, output);
341 output_size = file_size(output);
346 bool size_is_zero = output_size == 0 ? true : false;
348 BOOST_CHECK_EQUAL( true, res );
349 BOOST_CHECK_EQUAL( input_size, output_size );
350 BOOST_CHECK_EQUAL( false, size_is_zero );
353 BOOST_AUTO_TEST_CASE(TestMkdtemp)
355 // Create unique directory
356 string unique_dir = I2n::mkdtemp("foobar.XXXXXX");
357 BOOST_REQUIRE(unique_dir.size() > 0);
359 // Test if it's really a directory
360 BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory());
363 BOOST_CHECK_EQUAL(true, I2n::recursive_delete(unique_dir));
366 BOOST_AUTO_TEST_CASE(TestMkdtempBrokenTemplate)
368 // Broken directory template -> fail
369 string unique_dir = I2n::mkdtemp("foobar.XXX");
370 BOOST_CHECK_EQUAL("", unique_dir);
373 BOOST_AUTO_TEST_CASE(DirectoryCreation)
375 string dirname = "test_directory";
377 I2n::rmdir (dirname);
379 BOOST_CHECK_EQUAL(true, I2n::mkdir(dirname));
380 BOOST_CHECK_EQUAL(true, Stat(dirname).is_directory());
381 // Verify default permissions
382 BOOST_CHECK_EQUAL(0700, Stat(dirname).mode());
384 BOOST_CHECK_EQUAL(true, I2n::rmdir(dirname));
386 // Second call must fail: Directory already deleted
387 BOOST_CHECK_EQUAL(false, I2n::rmdir(dirname));
390 BOOST_AUTO_TEST_CASE(DirectoryCreatePermission)
392 string dirname = "test_directory";
394 // Save and fix umask
395 mode_t previous_mask = I2n::umask(0);
397 I2n::rmdir (dirname);
398 BOOST_CHECK_EQUAL(true, I2n::mkdir(dirname, 0770));
399 BOOST_CHECK_EQUAL(0770, Stat(dirname).mode());
400 I2n::rmdir (dirname);
403 I2n::umask(previous_mask);
406 BOOST_AUTO_TEST_CASE(ChangeDirectory)
408 string current_directory = I2n::getcwd();
409 BOOST_REQUIRE(!current_directory.empty());
411 BOOST_CHECK_EQUAL(true, I2n::chdir("/"));
412 BOOST_CHECK_EQUAL("/", I2n::getcwd());
414 BOOST_CHECK_EQUAL(true, I2n::chdir(current_directory));
415 BOOST_REQUIRE_EQUAL(current_directory, I2n::getcwd());
418 BOOST_AUTO_TEST_CASE(WriteFileEmptyData)
423 I2n::Stat stat(".foobar");
424 BOOST_CHECK_EQUAL( false, (bool)stat );
426 // Call write_file() with empty data. Should still create the file.
427 write_file(".foobar","");
431 BOOST_CHECK_EQUAL( true, (bool)stat );
432 BOOST_CHECK_EQUAL( true, stat.size() == 0 );
437 BOOST_AUTO_TEST_CASE(FileContentDiffersIsIdentical)
439 BOOST_CHECK_EQUAL( false, file_content_differs("/etc/passwd", "/etc/passwd") );
442 BOOST_AUTO_TEST_CASE(FileContentDiffersNonExistent)
444 BOOST_CHECK_EQUAL( true, file_content_differs("/etc/passwd", "abc") );
445 BOOST_CHECK_EQUAL( true, file_content_differs("abc", "/etc/passwd") );
448 BOOST_AUTO_TEST_CASE(FileContentDiffersEqualSize)
450 const string name1 = "file1", name2 = "file2";
452 ofstream out1(name1.c_str());
455 ofstream out2(name2.c_str());
459 bool res = file_content_differs(name1, name2);
463 BOOST_CHECK_EQUAL( true, res );
466 BOOST_AUTO_TEST_SUITE_END()