Add function to delete a non-empty folder.
There are no function that can delete non-empty folders, adding it with this CL.
Bug: None
Change-Id: I25d3e00b393d80b8af99a5b5d8b713ab4ad4c9ba
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/378022
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Emil Vardar (xWF) <vardar@google.com>
Cr-Commit-Position: refs/heads/main@{#43956}
diff --git a/test/testsupport/file_utils.cc b/test/testsupport/file_utils.cc
index aa25827..bff784f 100644
--- a/test/testsupport/file_utils.cc
+++ b/test/testsupport/file_utils.cc
@@ -42,8 +42,11 @@
#include <stdlib.h>
#include <memory>
+#include <optional>
+#include <string>
#include <type_traits>
#include <utility>
+#include <vector>
#if defined(WEBRTC_IOS)
#include "test/testsupport/ios_file_utils.h"
@@ -221,6 +224,26 @@
#endif
}
+bool RemoveNonEmptyDir(absl::string_view directory_name) {
+ std::optional<std::vector<std::string>> dir_content =
+ ReadDirectory(directory_name);
+ if (dir_content.has_value()) {
+ for (const std::string& entry : *dir_content) {
+ if (DirExists(entry)) {
+ if (!RemoveNonEmptyDir(entry)) {
+ return false;
+ }
+ } else if (FileExists(entry)) {
+ if (!RemoveFile(entry)) {
+ return false;
+ }
+ }
+ }
+ }
+ // Directory should be emptied.
+ return RemoveDir(directory_name);
+}
+
bool RemoveFile(absl::string_view file_name) {
#ifdef WIN32
return DeleteFileA(std::string(file_name).c_str()) != FALSE;
diff --git a/test/testsupport/file_utils.h b/test/testsupport/file_utils.h
index 22d3d11..b0652ea 100644
--- a/test/testsupport/file_utils.h
+++ b/test/testsupport/file_utils.h
@@ -90,6 +90,9 @@
// Removes a directory, which must already be empty.
bool RemoveDir(absl::string_view directory_name);
+// Removes all the files inside a non-empty directory and the directory itself.
+bool RemoveNonEmptyDir(absl::string_view directory_name);
+
// Removes a file.
bool RemoveFile(absl::string_view file_name);
diff --git a/test/testsupport/file_utils_unittest.cc b/test/testsupport/file_utils_unittest.cc
index fff6563..34962f1 100644
--- a/test/testsupport/file_utils_unittest.cc
+++ b/test/testsupport/file_utils_unittest.cc
@@ -281,6 +281,30 @@
EXPECT_FALSE(DirExists(temp_directory));
}
+TEST_F(FileUtilsTest, DeleteNonEmptyDirectory) {
+ const std::string temp_directory =
+ OutputPathWithRandomDirectory() + Path("TempFileUtilsTestReadDirectory/");
+ CreateDir(temp_directory);
+ EXPECT_TRUE(DirExists(temp_directory));
+
+ // Add a file.
+ const std::string temp_filename = temp_directory + "TempFilenameTest";
+ WriteStringInFile("test\n", temp_filename);
+ EXPECT_TRUE(FileExists(temp_filename));
+
+ // Add a directory with one file.
+ const std::string temp_subdir = temp_directory + Path("subdir/");
+ EXPECT_TRUE(CreateDir(temp_subdir));
+ EXPECT_TRUE(DirExists(temp_subdir));
+ const std::string temp_filename2 = temp_subdir + "TempFilenameTest2";
+ WriteStringInFile("test2\n", temp_filename2);
+ EXPECT_TRUE(FileExists(temp_filename2));
+
+ // Checks.
+ EXPECT_TRUE(RemoveNonEmptyDir(temp_directory));
+ EXPECT_FALSE(DirExists(temp_directory));
+}
+
TEST_F(FileUtilsTest, DirNameStripsFilename) {
EXPECT_EQ(Path("/some/path"), DirName(Path("/some/path/file.txt")));
}