Commit | Line | Data |
---|---|---|
0e23f538 TJ |
1 | /* |
2 | The software in this package is distributed under the GNU General | |
3 | Public License version 2 (with a special exception described below). | |
4 | ||
5 | A copy of GNU General Public License (GPL) is included in this distribution, | |
6 | in the file COPYING.GPL. | |
7 | ||
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. | |
13 | ||
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. | |
16 | ||
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. | |
19 | */ | |
5de0c58a RP |
20 | /** @file |
21 | * | |
22 | * tests for the modules "filefunc", "daemonfunc" | |
23 | * | |
24 | * (c) Copyright 2007-2008 by Intra2net AG | |
5de0c58a RP |
25 | */ |
26 | ||
27 | //#define NOISEDEBUG | |
28 | ||
29 | #include <string> | |
30 | #include <vector> | |
31 | #include <list> | |
9fe0853b | 32 | #include <set> |
5de0c58a RP |
33 | #include <iostream> |
34 | #include <iomanip> | |
1a2fc4e8 | 35 | #include <fstream> |
5de0c58a RP |
36 | #include <sstream> |
37 | #include <algorithm> | |
38 | ||
9fe0853b TJ |
39 | #define BOOST_TEST_DYN_LINK |
40 | #include <boost/test/unit_test.hpp> | |
5de0c58a RP |
41 | |
42 | #include <filefunc.hxx> | |
90246b4a | 43 | #include <daemonfunc.hpp> |
34ed5e5e GE |
44 | #include <pipestream.hxx> |
45 | #include <stringfunc.hxx> | |
5de0c58a RP |
46 | |
47 | #ifdef NOISEDEBUG | |
48 | #define DOUT(msg) std::cout << msg << std::endl | |
49 | #else | |
50 | #define DOUT(msg) do {} while (0) | |
51 | #endif | |
52 | ||
1a2fc4e8 | 53 | using namespace std; |
5de0c58a RP |
54 | using namespace I2n; |
55 | ||
9fe0853b | 56 | class TestFileFuncFixture |
48d97d6c | 57 | { |
48d97d6c | 58 | protected: |
48d97d6c | 59 | typedef std::list< std::string > StringList; |
48d97d6c TJ |
60 | std::set<std::string> used_check_files; |
61 | ||
62 | std::string get_check_file_path(std::string tag) | |
63 | { | |
64 | std::string result; | |
65 | result= "__unittest__" + tag + ".dat"; | |
66 | used_check_files.insert(result); | |
67 | return result; | |
68 | } // eo get_check_file_path | |
69 | ||
48d97d6c TJ |
70 | void remove_check_files() |
71 | { | |
72 | for (std::set<std::string>::iterator it= used_check_files.begin(); | |
73 | it != used_check_files.end(); | |
74 | ++it) | |
75 | { | |
76 | std::string filepath(*it); | |
77 | if (path_exists(filepath)) | |
78 | { | |
79 | unlink(filepath); | |
80 | } | |
81 | //TODO | |
82 | } | |
83 | used_check_files.clear(); | |
84 | } // eo remove_check_files | |
85 | ||
48d97d6c | 86 | public: |
9fe0853b TJ |
87 | TestFileFuncFixture() |
88 | { | |
89 | } | |
48d97d6c | 90 | |
9fe0853b TJ |
91 | ~TestFileFuncFixture() |
92 | { | |
93 | remove_check_files(); | |
94 | } | |
95 | }; | |
48d97d6c | 96 | |
9fe0853b | 97 | BOOST_FIXTURE_TEST_SUITE(TestFileFunc, TestFileFuncFixture) |
48d97d6c | 98 | |
9fe0853b TJ |
99 | BOOST_AUTO_TEST_CASE(StatTest1) |
100 | { | |
263b5807 | 101 | I2n::Stat stat("Makefile"); |
48d97d6c | 102 | |
9fe0853b TJ |
103 | BOOST_CHECK_EQUAL( true, (bool)stat ); |
104 | BOOST_CHECK_EQUAL( true, stat.is_regular_file() ); | |
105 | BOOST_CHECK_EQUAL( false, stat.is_directory() ); | |
48d97d6c | 106 | |
9fe0853b | 107 | stat= Stat("/dev/null"); |
48d97d6c | 108 | |
9fe0853b TJ |
109 | BOOST_CHECK_EQUAL( true, (bool)stat ); |
110 | BOOST_CHECK_EQUAL( false, stat.is_regular_file() ); | |
111 | BOOST_CHECK_EQUAL( false, stat.is_directory() ); | |
112 | BOOST_CHECK_EQUAL( true, stat.is_device() ); | |
113 | BOOST_CHECK_EQUAL( true, stat.is_character_device() ); | |
114 | BOOST_CHECK_EQUAL( false, stat.is_block_device() ); | |
115 | } // eo StatTest1 | |
48d97d6c | 116 | |
a9f2cccc GE |
117 | BOOST_AUTO_TEST_CASE(StatSize) |
118 | { | |
119 | write_file("/tmp/test","some nice content to make sure the file system optimizations don't inline this into the inode block"); | |
120 | ||
121 | I2n::Stat stat("/tmp/test"); | |
122 | ||
123 | BOOST_CHECK_EQUAL( true, (bool)stat ); | |
124 | BOOST_CHECK_EQUAL( true, stat.is_regular_file() ); | |
125 | ||
126 | BOOST_CHECK_EQUAL( true, ( stat.bytes_on_disk() >= 512 ) ); | |
127 | ||
128 | unlink("/tmp/test"); | |
129 | } // eo StatSize | |
130 | ||
96fe2dc5 GE |
131 | BOOST_AUTO_TEST_CASE(StatRecheck) |
132 | { | |
133 | // just to be sure | |
134 | unlink(".foobar"); | |
135 | ||
136 | I2n::Stat stat(".foobar"); | |
137 | BOOST_CHECK_EQUAL( false, (bool)stat ); | |
138 | ||
139 | write_file(".foobar","hello world"); | |
140 | ||
141 | stat.recheck(); | |
142 | ||
143 | BOOST_CHECK_EQUAL( true, (bool)stat ); | |
144 | BOOST_CHECK_EQUAL( true, stat.size() > 0 ); | |
145 | ||
146 | unlink(".foobar"); | |
147 | } | |
48d97d6c | 148 | |
9fe0853b TJ |
149 | BOOST_AUTO_TEST_CASE(DirTest1) |
150 | { | |
151 | typedef std::vector< std::string > StringVector; | |
152 | StringVector names; | |
48d97d6c | 153 | |
9fe0853b | 154 | bool res= I2n::get_dir(".",names); |
48d97d6c | 155 | |
9fe0853b TJ |
156 | BOOST_CHECK_EQUAL( true, res ); |
157 | BOOST_CHECK( ! names.empty() ); | |
48d97d6c | 158 | |
263b5807 | 159 | StringVector::iterator it = std::find( names.begin(), names.end(), "Makefile"); |
9fe0853b | 160 | BOOST_CHECK( it != names.end() ); |
48d97d6c | 161 | |
9fe0853b TJ |
162 | it = std::find( names.begin(), names.end(), "." ); |
163 | BOOST_CHECK( it == names.end() ); | |
48d97d6c | 164 | |
9fe0853b TJ |
165 | names= get_dir(".",true); |
166 | BOOST_CHECK( ! names.empty() ); | |
48d97d6c | 167 | |
9fe0853b TJ |
168 | for (it= names.begin(); it!=names.end(); ++it) |
169 | { | |
170 | DOUT(" \"" << *it << "\""); | |
171 | BOOST_CHECK_EQUAL( false, it->empty() ); | |
172 | } | |
48d97d6c | 173 | |
9fe0853b TJ |
174 | it = std::find( names.begin(), names.end(), "." ); |
175 | BOOST_CHECK( it != names.end() ); | |
176 | } // eo DirTest1 | |
48d97d6c TJ |
177 | |
178 | ||
179 | ||
9fe0853b TJ |
180 | BOOST_AUTO_TEST_CASE(PathCuts1) |
181 | { | |
182 | std::string path1("/an/absolute/path"); | |
48d97d6c | 183 | |
9fe0853b TJ |
184 | BOOST_CHECK_EQUAL( std::string("/an/absolute"), dirname(path1) ); |
185 | BOOST_CHECK_EQUAL( std::string("path"), basename(path1) ); | |
48d97d6c | 186 | |
9fe0853b TJ |
187 | std::string path2("just.a.name"); |
188 | BOOST_CHECK_EQUAL( std::string("just.a.name"), basename(path2) ); | |
189 | BOOST_CHECK_EQUAL( std::string("."), dirname(path2) ); | |
190 | } // eo PathCuts1() | |
48d97d6c | 191 | |
48d97d6c | 192 | |
48d97d6c | 193 | |
9fe0853b TJ |
194 | BOOST_AUTO_TEST_CASE(NormalizePath1) |
195 | { | |
196 | std::string path; | |
48d97d6c | 197 | |
9fe0853b TJ |
198 | path= normalize_path("/a/simple/path/"); |
199 | BOOST_CHECK_EQUAL( std::string("/a/simple/path"), path ); | |
48d97d6c | 200 | |
9fe0853b TJ |
201 | path= normalize_path("//another///simple/.//path//"); |
202 | BOOST_CHECK_EQUAL( std::string("/another/simple/path"), path ); | |
19166500 | 203 | |
9fe0853b TJ |
204 | path= normalize_path("//..//..//a/dummy///../././simple/././/path//"); |
205 | BOOST_CHECK_EQUAL( std::string("/a/simple/path"), path ); | |
19166500 | 206 | |
9fe0853b TJ |
207 | path= normalize_path("../a/dummy//././..//simple//nice//absolute//.././..//relative/path//"); |
208 | BOOST_CHECK_EQUAL( std::string("../a/simple/relative/path"), path ); | |
19166500 | 209 | |
9fe0853b TJ |
210 | path= normalize_path("../../a/dummy//././..//simple/../nice//absolute//../.x/..//relative/path//"); |
211 | BOOST_CHECK_EQUAL( std::string("../../a/nice/relative/path"), path ); | |
19166500 | 212 | |
9fe0853b | 213 | } // eo NormalizePath1 |
19166500 | 214 | |
9fe0853b TJ |
215 | BOOST_AUTO_TEST_CASE(NormalizePath2) |
216 | { | |
217 | std::string path; | |
19166500 | 218 | |
9fe0853b TJ |
219 | path= normalize_path("/"); |
220 | BOOST_CHECK_EQUAL( std::string("/"), path ); | |
19166500 | 221 | |
9fe0853b TJ |
222 | path= normalize_path("//"); |
223 | BOOST_CHECK_EQUAL( std::string("/"), path ); | |
48d97d6c | 224 | |
9fe0853b TJ |
225 | path= normalize_path("/.//"); |
226 | BOOST_CHECK_EQUAL( std::string("/"), path ); | |
48d97d6c | 227 | |
9fe0853b TJ |
228 | path= normalize_path("."); |
229 | BOOST_CHECK_EQUAL( std::string(""), path ); | |
48d97d6c | 230 | |
9fe0853b TJ |
231 | path= normalize_path("./"); |
232 | BOOST_CHECK_EQUAL( std::string(""), path ); | |
48d97d6c | 233 | |
9fe0853b TJ |
234 | path= normalize_path(".///"); |
235 | BOOST_CHECK_EQUAL( std::string(""), path ); | |
48d97d6c | 236 | |
9fe0853b TJ |
237 | path= normalize_path("/./data/files"); |
238 | BOOST_CHECK_EQUAL( std::string("/data/files"), path ); | |
48d97d6c | 239 | |
9fe0853b TJ |
240 | path= normalize_path("./data/files/"); |
241 | BOOST_CHECK_EQUAL( std::string("data/files"), path ); | |
242 | } // eo NormalizePath2 | |
48d97d6c | 243 | |
9fe0853b TJ |
244 | BOOST_AUTO_TEST_CASE(TestUserAndGroupStuff1) |
245 | { | |
246 | User user_root((uid_t)0); | |
247 | BOOST_CHECK_EQUAL( true, user_root.is_valid() ); | |
248 | BOOST_CHECK_EQUAL( true, (bool)user_root ); | |
48d97d6c | 249 | |
9fe0853b TJ |
250 | BOOST_CHECK_EQUAL( std::string("root"), user_root.Name ); |
251 | BOOST_CHECK_EQUAL( (uid_t)0, user_root.Uid ); | |
252 | BOOST_CHECK_EQUAL( (gid_t)0, user_root.Gid ); | |
48d97d6c | 253 | |
9fe0853b TJ |
254 | User user_root2("root"); |
255 | BOOST_CHECK_EQUAL( true, user_root2.is_valid() ); | |
256 | BOOST_CHECK_EQUAL( true, (bool)user_root2 ); | |
48d97d6c | 257 | |
9fe0853b TJ |
258 | BOOST_CHECK_EQUAL( std::string("root"), user_root2.Name ); |
259 | BOOST_CHECK_EQUAL( (uid_t)0, user_root2.Uid ); | |
260 | BOOST_CHECK_EQUAL( (gid_t)0, user_root2.Gid ); | |
48d97d6c | 261 | |
9fe0853b TJ |
262 | Group group_root("root"); |
263 | BOOST_CHECK_EQUAL( true, group_root.is_valid() ); | |
264 | BOOST_CHECK_EQUAL( true, (bool)group_root ); | |
48d97d6c | 265 | |
9fe0853b TJ |
266 | BOOST_CHECK_EQUAL( std::string("root"), group_root.Name ); |
267 | BOOST_CHECK_EQUAL( (gid_t)0, group_root.Gid ); | |
48d97d6c | 268 | |
9fe0853b | 269 | } // TestUserAndGroupStuff1() |
48d97d6c | 270 | |
9fe0853b TJ |
271 | BOOST_AUTO_TEST_CASE(TestUserAndGroupStuff2) |
272 | { | |
273 | // Test if is_valid() works correctly | |
274 | User user_root; | |
275 | BOOST_CHECK_EQUAL( false, user_root.is_valid() ); | |
48d97d6c | 276 | |
9fe0853b TJ |
277 | Group group_root; |
278 | BOOST_CHECK_EQUAL( false, group_root.is_valid() ); | |
279 | } | |
48d97d6c | 280 | |
9fe0853b TJ |
281 | BOOST_AUTO_TEST_CASE(TestFileModes1) |
282 | { | |
283 | std::string path= get_check_file_path("FileModes1"); | |
48d97d6c | 284 | |
9fe0853b | 285 | write_file(path,"42"); |
48d97d6c | 286 | |
9fe0853b TJ |
287 | Stat stat(path, false); |
288 | BOOST_CHECK_EQUAL( true, stat.is_valid() ); | |
48d97d6c | 289 | |
9fe0853b TJ |
290 | User user( stat.uid() ); |
291 | Group group( stat.gid() ); | |
48d97d6c | 292 | |
9fe0853b TJ |
293 | BOOST_CHECK_EQUAL( true, user.is_valid() ); |
294 | BOOST_CHECK_EQUAL( true, group.is_valid() ); | |
48d97d6c | 295 | |
9fe0853b | 296 | bool res=chown( path, user.Name.c_str(), group.Gid ); |
48d97d6c | 297 | |
9fe0853b TJ |
298 | BOOST_CHECK_EQUAL( true, res ); |
299 | } // eo TestFileModes1() | |
48d97d6c | 300 | |
48d97d6c | 301 | |
48d97d6c | 302 | |
9fe0853b TJ |
303 | BOOST_AUTO_TEST_CASE(TestPidOf1) |
304 | { | |
305 | using I2n::Daemon::pid_of; | |
48d97d6c | 306 | |
9fe0853b | 307 | std::vector< pid_t > pid_list; |
1a2fc4e8 | 308 | |
9fe0853b | 309 | bool res= pid_of("init", pid_list); |
9fe0853b | 310 | BOOST_CHECK_EQUAL( true, res); |
246bcd58 GE |
311 | |
312 | if (pid_list.empty()) | |
313 | { | |
314 | res= pid_of("systemd", pid_list); | |
315 | BOOST_CHECK_EQUAL( true, res); | |
316 | } | |
317 | ||
9fe0853b | 318 | BOOST_CHECK_EQUAL( false, pid_list.empty() ); |
1a2fc4e8 | 319 | |
9fe0853b TJ |
320 | std::vector< pid_t >::const_iterator pos1 = |
321 | std::find( pid_list.begin(), pid_list.end(), 1); | |
48d97d6c | 322 | |
9fe0853b TJ |
323 | BOOST_CHECK( pos1 != pid_list.end() ); |
324 | } // eo TestPidOf1() | |
1a2fc4e8 | 325 | |
9fe0853b TJ |
326 | BOOST_AUTO_TEST_CASE(TestCopyFileSourceFail) |
327 | { | |
328 | bool res = copy_file("does not exist", "destination"); | |
329 | BOOST_CHECK_EQUAL( false, res ); | |
330 | } | |
48d97d6c | 331 | |
9fe0853b TJ |
332 | BOOST_AUTO_TEST_CASE(TestCopyFileDestFail) |
333 | { | |
334 | bool res = copy_file("/etc/HOSTNAME", "/proc/not/writable"); | |
335 | BOOST_CHECK_EQUAL( false, res ); | |
336 | } | |
5de0c58a | 337 | |
9fe0853b TJ |
338 | BOOST_AUTO_TEST_CASE(TestCopyFileOk) |
339 | { | |
340 | string input = "copy_source"; | |
341 | string data = "test"; | |
342 | ||
343 | long input_size = 0; | |
344 | ofstream finput(input.c_str()); | |
345 | if (finput) | |
346 | { | |
347 | finput << data; | |
348 | finput.close(); | |
349 | input_size = file_size(input); | |
350 | } | |
351 | ||
352 | string output = "copy_dest"; | |
353 | long output_size = 0; | |
354 | bool res = copy_file(input, output); | |
355 | if (res) | |
356 | { | |
357 | output_size = file_size(output); | |
358 | } | |
359 | unlink(input); | |
360 | unlink(output); | |
361 | ||
362 | bool size_is_zero = output_size == 0 ? true : false; | |
363 | ||
364 | BOOST_CHECK_EQUAL( true, res ); | |
365 | BOOST_CHECK_EQUAL( input_size, output_size ); | |
366 | BOOST_CHECK_EQUAL( false, size_is_zero ); | |
367 | } | |
368 | ||
faf8475b TJ |
369 | BOOST_AUTO_TEST_CASE(TestMkdtemp) |
370 | { | |
371 | // Create unique directory | |
372 | string unique_dir = I2n::mkdtemp("foobar.XXXXXX"); | |
373 | BOOST_REQUIRE(unique_dir.size() > 0); | |
374 | ||
375 | // Test if it's really a directory | |
376 | BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory()); | |
377 | ||
378 | // Unlink it | |
997987a6 TJ |
379 | BOOST_CHECK_EQUAL(true, rmdir(unique_dir)); |
380 | } | |
381 | ||
382 | BOOST_AUTO_TEST_CASE(TestRecursiveDelete) | |
383 | { | |
384 | // Create unique directory | |
385 | string unique_dir = I2n::mkdtemp("foobar.XXXXXX"); | |
386 | BOOST_REQUIRE(unique_dir.size() > 0); | |
387 | ||
388 | // Test if it's really a directory | |
389 | BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory()); | |
390 | ||
391 | // Create dirs and files below it | |
392 | const std::string sub_dir = unique_dir + "/" + "some_subdir"; | |
393 | const std::string some_file = sub_dir + "/" + "some_file"; | |
394 | BOOST_CHECK_EQUAL(true, I2n::mkdir(sub_dir)); | |
395 | BOOST_CHECK_EQUAL(true, write_file(some_file, "foobar")); | |
396 | ||
397 | // Unlink it | |
faf8475b | 398 | BOOST_CHECK_EQUAL(true, I2n::recursive_delete(unique_dir)); |
997987a6 TJ |
399 | BOOST_CHECK_EQUAL(false, Stat(unique_dir).is_directory()); |
400 | } | |
401 | ||
402 | BOOST_AUTO_TEST_CASE(TestRecursiveDeleteKeepParentDir) | |
403 | { | |
404 | // Create unique directory | |
405 | string unique_dir = I2n::mkdtemp("foobar.XXXXXX"); | |
406 | BOOST_REQUIRE(unique_dir.size() > 0); | |
407 | ||
408 | // Test if it's really a directory | |
409 | BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory()); | |
410 | ||
411 | // Create dirs and files below it | |
412 | const std::string sub_dir = unique_dir + "/" + "some_subdir"; | |
413 | const std::string some_file = sub_dir + "/" + "some_file"; | |
414 | const std::string other_file = unique_dir + "/" + "other_file"; | |
415 | ||
416 | BOOST_CHECK_EQUAL(true, I2n::mkdir(sub_dir)); | |
417 | BOOST_CHECK_EQUAL(true, write_file(some_file, "foobar")); | |
418 | BOOST_CHECK_EQUAL(true, write_file(other_file, "foobar")); | |
419 | ||
420 | // Unlink it | |
421 | BOOST_CHECK_EQUAL(true, I2n::recursive_delete(unique_dir, true)); | |
422 | ||
423 | // check result | |
424 | BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory()); | |
425 | BOOST_CHECK_EQUAL(false, Stat(sub_dir).is_directory()); | |
426 | BOOST_CHECK_EQUAL(false, Stat(other_file).is_regular_file()); | |
427 | ||
428 | BOOST_CHECK_EQUAL(true, I2n::rmdir(unique_dir)); | |
faf8475b TJ |
429 | } |
430 | ||
a50de522 GE |
431 | BOOST_AUTO_TEST_CASE(TestRecursiveDeleteSymlinkedDirs1) |
432 | { | |
433 | // Create unique directory | |
434 | string unique_dir = I2n::mkdtemp("foobar.XXXXXX"); | |
435 | BOOST_REQUIRE(unique_dir.size() > 0); | |
436 | ||
437 | // Test if it's really a directory | |
438 | BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory()); | |
439 | ||
440 | // Create dirs and files below it | |
441 | const std::string sub_dir = unique_dir + "/" + "some_subdir"; | |
442 | const std::string some_file = sub_dir + "/" + "some_file"; | |
443 | const std::string dir_symlink_within_unique_dir = unique_dir + "/" + "dir_symlink_within_unique_dir"; | |
444 | BOOST_CHECK_EQUAL(true, I2n::mkdir(sub_dir)); | |
445 | BOOST_CHECK_EQUAL(true, write_file(some_file, "foobar")); | |
446 | BOOST_CHECK_EQUAL(true, symlink(sub_dir, dir_symlink_within_unique_dir)); | |
447 | ||
448 | // Unlink it | |
449 | BOOST_CHECK_EQUAL(true, I2n::recursive_delete(unique_dir)); | |
450 | BOOST_CHECK_EQUAL(false, Stat(unique_dir).is_directory()); | |
451 | } | |
452 | ||
453 | BOOST_AUTO_TEST_CASE(TestRecursiveDeleteSymlinkedDirs2) | |
454 | { | |
455 | // Create unique directory | |
456 | string unique_dir = I2n::mkdtemp("foobar.XXXXXX"); | |
457 | BOOST_REQUIRE(unique_dir.size() > 0); | |
458 | ||
459 | // Test if it's really a directory | |
460 | BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory()); | |
461 | ||
462 | // Create another unique directory | |
463 | string other_unique_dir = I2n::mkdtemp("foobar_other.XXXXXX"); | |
464 | BOOST_REQUIRE(other_unique_dir.size() > 0); | |
465 | ||
466 | // Test if it's really a directory | |
467 | BOOST_CHECK_EQUAL(true, Stat(other_unique_dir).is_directory()); | |
468 | ||
469 | const std::string other_file = other_unique_dir + "/" + "other_file"; | |
470 | BOOST_CHECK_EQUAL(true, write_file(other_file, "foobar")); | |
471 | ||
472 | // Create dirs and files below it | |
473 | const std::string sub_dir = unique_dir + "/" + "some_subdir"; | |
474 | const std::string some_file = sub_dir + "/" + "some_file"; | |
475 | const std::string dir_symlink_to_outside_unique_dir = unique_dir + "/" + "dir_symlink_to_outside_unique_dir"; | |
476 | BOOST_CHECK_EQUAL(true, I2n::mkdir(sub_dir)); | |
477 | BOOST_CHECK_EQUAL(true, write_file(some_file, "foobar")); | |
478 | BOOST_CHECK_EQUAL(true, symlink(other_unique_dir, dir_symlink_to_outside_unique_dir)); | |
479 | ||
480 | // Unlink it | |
481 | BOOST_CHECK_EQUAL(true, I2n::recursive_delete(unique_dir)); | |
482 | BOOST_CHECK_EQUAL(false, Stat(unique_dir).is_directory()); | |
483 | ||
484 | // other unique dir must still be there | |
485 | BOOST_CHECK_EQUAL(true, Stat(other_unique_dir).is_directory()); | |
486 | BOOST_CHECK_EQUAL(true, Stat(other_file).is_regular_file()); | |
487 | ||
488 | // finally delete the other unique dir | |
489 | BOOST_CHECK_EQUAL(true, I2n::recursive_delete(other_unique_dir)); | |
490 | BOOST_CHECK_EQUAL(false, Stat(other_unique_dir).is_directory()); | |
491 | } | |
492 | ||
faf8475b TJ |
493 | BOOST_AUTO_TEST_CASE(TestMkdtempBrokenTemplate) |
494 | { | |
495 | // Broken directory template -> fail | |
496 | string unique_dir = I2n::mkdtemp("foobar.XXX"); | |
497 | BOOST_CHECK_EQUAL("", unique_dir); | |
498 | } | |
499 | ||
44725532 TJ |
500 | BOOST_AUTO_TEST_CASE(DirectoryCreation) |
501 | { | |
502 | string dirname = "test_directory"; | |
503 | ||
504 | I2n::rmdir (dirname); | |
505 | ||
506 | BOOST_CHECK_EQUAL(true, I2n::mkdir(dirname)); | |
507 | BOOST_CHECK_EQUAL(true, Stat(dirname).is_directory()); | |
508 | // Verify default permissions | |
509 | BOOST_CHECK_EQUAL(0700, Stat(dirname).mode()); | |
510 | ||
511 | BOOST_CHECK_EQUAL(true, I2n::rmdir(dirname)); | |
512 | ||
513 | // Second call must fail: Directory already deleted | |
514 | BOOST_CHECK_EQUAL(false, I2n::rmdir(dirname)); | |
515 | } | |
516 | ||
517 | BOOST_AUTO_TEST_CASE(DirectoryCreatePermission) | |
518 | { | |
519 | string dirname = "test_directory"; | |
520 | ||
901e2943 TJ |
521 | // Save and fix umask |
522 | mode_t previous_mask = I2n::umask(0); | |
44725532 TJ |
523 | |
524 | I2n::rmdir (dirname); | |
525 | BOOST_CHECK_EQUAL(true, I2n::mkdir(dirname, 0770)); | |
901e2943 | 526 | BOOST_CHECK_EQUAL(0770, Stat(dirname).mode()); |
44725532 TJ |
527 | I2n::rmdir (dirname); |
528 | ||
901e2943 TJ |
529 | // Restore umask |
530 | I2n::umask(previous_mask); | |
44725532 TJ |
531 | } |
532 | ||
533 | BOOST_AUTO_TEST_CASE(ChangeDirectory) | |
534 | { | |
535 | string current_directory = I2n::getcwd(); | |
536 | BOOST_REQUIRE(!current_directory.empty()); | |
537 | ||
538 | BOOST_CHECK_EQUAL(true, I2n::chdir("/")); | |
539 | BOOST_CHECK_EQUAL("/", I2n::getcwd()); | |
540 | ||
541 | BOOST_CHECK_EQUAL(true, I2n::chdir(current_directory)); | |
542 | BOOST_REQUIRE_EQUAL(current_directory, I2n::getcwd()); | |
543 | } | |
544 | ||
c5935370 TJ |
545 | BOOST_AUTO_TEST_CASE(WriteFileEmptyData) |
546 | { | |
547 | // just to be sure | |
548 | unlink(".foobar"); | |
549 | ||
550 | I2n::Stat stat(".foobar"); | |
551 | BOOST_CHECK_EQUAL( false, (bool)stat ); | |
552 | ||
553 | // Call write_file() with empty data. Should still create the file. | |
554 | write_file(".foobar",""); | |
555 | ||
556 | stat.recheck(); | |
557 | ||
558 | BOOST_CHECK_EQUAL( true, (bool)stat ); | |
559 | BOOST_CHECK_EQUAL( true, stat.size() == 0 ); | |
560 | ||
561 | unlink(".foobar"); | |
562 | } | |
563 | ||
9d1eb8c8 TJ |
564 | BOOST_AUTO_TEST_CASE(FileContentDiffersIsIdentical) |
565 | { | |
566 | BOOST_CHECK_EQUAL( false, file_content_differs("/etc/passwd", "/etc/passwd") ); | |
567 | } | |
568 | ||
569 | BOOST_AUTO_TEST_CASE(FileContentDiffersNonExistent) | |
570 | { | |
571 | BOOST_CHECK_EQUAL( true, file_content_differs("/etc/passwd", "abc") ); | |
572 | BOOST_CHECK_EQUAL( true, file_content_differs("abc", "/etc/passwd") ); | |
573 | } | |
574 | ||
575 | BOOST_AUTO_TEST_CASE(FileContentDiffersEqualSize) | |
576 | { | |
577 | const string name1 = "file1", name2 = "file2"; | |
578 | { | |
579 | ofstream out1(name1.c_str()); | |
580 | out1 << "abc"; | |
581 | ||
582 | ofstream out2(name2.c_str()); | |
583 | out2 << "xyz"; | |
584 | } | |
585 | ||
586 | bool res = file_content_differs(name1, name2); | |
587 | unlink(name1); | |
588 | unlink(name2); | |
589 | ||
590 | BOOST_CHECK_EQUAL( true, res ); | |
591 | } | |
592 | ||
34ed5e5e GE |
593 | BOOST_AUTO_TEST_CASE(FreeDiskSpace1) |
594 | { | |
595 | inpipestream cmd_df("df -B 1 --output=avail /tmp | tail -n 1"); | |
596 | string dfstr; | |
597 | if (cmd_df) | |
598 | getline(cmd_df, dfstr); | |
599 | ||
600 | long long dfout=-1; | |
601 | string_to<long long>(dfstr,dfout); | |
602 | ||
603 | BOOST_CHECK_EQUAL( dfout, get_free_diskspace("/tmp") ); | |
604 | } | |
605 | ||
606 | BOOST_AUTO_TEST_CASE(FreeDiskSpace2) | |
607 | { | |
608 | BOOST_CHECK_EQUAL( -1, get_free_diskspace("/this/path/is/really/bogus") ); | |
609 | } | |
610 | ||
9fe0853b | 611 | BOOST_AUTO_TEST_SUITE_END() |