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")));
 }