BOOST_CHECK_EQUAL(true, I2n::rmdir(unique_dir));
}
+BOOST_AUTO_TEST_CASE(TestRecursiveDeleteSymlinkedDirs1)
+{
+ // Create unique directory
+ string unique_dir = I2n::mkdtemp("foobar.XXXXXX");
+ BOOST_REQUIRE(unique_dir.size() > 0);
+
+ // Test if it's really a directory
+ BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory());
+
+ // Create dirs and files below it
+ const std::string sub_dir = unique_dir + "/" + "some_subdir";
+ const std::string some_file = sub_dir + "/" + "some_file";
+ const std::string dir_symlink_within_unique_dir = unique_dir + "/" + "dir_symlink_within_unique_dir";
+ BOOST_CHECK_EQUAL(true, I2n::mkdir(sub_dir));
+ BOOST_CHECK_EQUAL(true, write_file(some_file, "foobar"));
+ BOOST_CHECK_EQUAL(true, symlink(sub_dir, dir_symlink_within_unique_dir));
+
+ // Unlink it
+ BOOST_CHECK_EQUAL(true, I2n::recursive_delete(unique_dir));
+ BOOST_CHECK_EQUAL(false, Stat(unique_dir).is_directory());
+}
+
+BOOST_AUTO_TEST_CASE(TestRecursiveDeleteSymlinkedDirs2)
+{
+ // Create unique directory
+ string unique_dir = I2n::mkdtemp("foobar.XXXXXX");
+ BOOST_REQUIRE(unique_dir.size() > 0);
+
+ // Test if it's really a directory
+ BOOST_CHECK_EQUAL(true, Stat(unique_dir).is_directory());
+
+ // Create another unique directory
+ string other_unique_dir = I2n::mkdtemp("foobar_other.XXXXXX");
+ BOOST_REQUIRE(other_unique_dir.size() > 0);
+
+ // Test if it's really a directory
+ BOOST_CHECK_EQUAL(true, Stat(other_unique_dir).is_directory());
+
+ const std::string other_file = other_unique_dir + "/" + "other_file";
+ BOOST_CHECK_EQUAL(true, write_file(other_file, "foobar"));
+
+ // Create dirs and files below it
+ const std::string sub_dir = unique_dir + "/" + "some_subdir";
+ const std::string some_file = sub_dir + "/" + "some_file";
+ const std::string dir_symlink_to_outside_unique_dir = unique_dir + "/" + "dir_symlink_to_outside_unique_dir";
+ BOOST_CHECK_EQUAL(true, I2n::mkdir(sub_dir));
+ BOOST_CHECK_EQUAL(true, write_file(some_file, "foobar"));
+ BOOST_CHECK_EQUAL(true, symlink(other_unique_dir, dir_symlink_to_outside_unique_dir));
+
+ // Unlink it
+ BOOST_CHECK_EQUAL(true, I2n::recursive_delete(unique_dir));
+ BOOST_CHECK_EQUAL(false, Stat(unique_dir).is_directory());
+
+ // other unique dir must still be there
+ BOOST_CHECK_EQUAL(true, Stat(other_unique_dir).is_directory());
+ BOOST_CHECK_EQUAL(true, Stat(other_file).is_regular_file());
+
+ // finally delete the other unique dir
+ BOOST_CHECK_EQUAL(true, I2n::recursive_delete(other_unique_dir));
+ BOOST_CHECK_EQUAL(false, Stat(other_unique_dir).is_directory());
+}
+
BOOST_AUTO_TEST_CASE(TestMkdtempBrokenTemplate)
{
// Broken directory template -> fail