In order to land https://codereview.webrtc.org/2790933002/ and due to the
ongoing clean-up work (see https://codereview.webrtc.org/2887093002, https://codereview.webrtc.org/2894583002/ and https://codereview.webrtc.org/2891923002/), ReadDirectory() has been added in webrtc/test/testsupport/fileutils.h. BUG=NOBUG Review-Url: https://codereview.webrtc.org/2898753002 Cr-Commit-Position: refs/heads/master@{#18369}
This commit is contained in:
parent
57fa7683a7
commit
00b16f4dc8
@ -24,6 +24,7 @@
|
||||
#include "webrtc/base/win32.h"
|
||||
#define GET_CURRENT_DIR _getcwd
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define GET_CURRENT_DIR getcwd
|
||||
@ -39,7 +40,9 @@
|
||||
#include <string.h>
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "webrtc/base/checks.h"
|
||||
#include "webrtc/typedefs.h" // For architecture defines
|
||||
|
||||
namespace webrtc {
|
||||
@ -126,7 +129,7 @@ std::string WorkingDir() {
|
||||
return kRootDirName;
|
||||
}
|
||||
|
||||
#else // WEBRTC_ANDROID
|
||||
#else // WEBRTC_ANDROID
|
||||
|
||||
std::string ProjectRootPath() {
|
||||
#if defined(WEBRTC_IOS)
|
||||
@ -212,6 +215,57 @@ std::string TempFilename(const std::string &dir, const std::string &prefix) {
|
||||
#endif
|
||||
}
|
||||
|
||||
rtc::Optional<std::vector<std::string>> ReadDirectory(std::string path) {
|
||||
if (path.length() == 0)
|
||||
return rtc::Optional<std::vector<std::string>>();
|
||||
|
||||
#if defined(WEBRTC_WIN)
|
||||
// Append separator character if needed.
|
||||
if (path.back() != '\\')
|
||||
path += '\\';
|
||||
|
||||
// Init.
|
||||
WIN32_FIND_DATA data;
|
||||
HANDLE handle = ::FindFirstFile(rtc::ToUtf16(path + '*').c_str(), &data);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return rtc::Optional<std::vector<std::string>>();
|
||||
|
||||
// Populate output.
|
||||
std::vector<std::string> found_entries;
|
||||
do {
|
||||
const std::string name = rtc::ToUtf8(data.cFileName);
|
||||
if (name != "." && name != "..")
|
||||
found_entries.emplace_back(path + name);
|
||||
} while (::FindNextFile(handle, &data) == TRUE);
|
||||
|
||||
// Release resources.
|
||||
if (handle != INVALID_HANDLE_VALUE)
|
||||
::FindClose(handle);
|
||||
#else
|
||||
// Append separator character if needed.
|
||||
if (path.back() != '/')
|
||||
path += '/';
|
||||
|
||||
// Init.
|
||||
DIR* dir = ::opendir(path.c_str());
|
||||
if (dir == nullptr)
|
||||
return rtc::Optional<std::vector<std::string>>();
|
||||
|
||||
// Populate output.
|
||||
std::vector<std::string> found_entries;
|
||||
while (dirent* dirent = readdir(dir)) {
|
||||
const std::string& name = dirent->d_name;
|
||||
if (name != "." && name != "..")
|
||||
found_entries.emplace_back(path + name);
|
||||
}
|
||||
|
||||
// Release resources.
|
||||
closedir(dir);
|
||||
#endif
|
||||
|
||||
return rtc::Optional<std::vector<std::string>>(std::move(found_entries));
|
||||
}
|
||||
|
||||
bool CreateDir(const std::string& directory_name) {
|
||||
struct stat path_info = {0};
|
||||
// Check if the path exists already:
|
||||
|
||||
@ -14,6 +14,9 @@
|
||||
#define WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "webrtc/base/optional.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace test {
|
||||
@ -66,6 +69,12 @@ std::string ResourcePath(const std::string& name,
|
||||
// directory.
|
||||
std::string WorkingDir();
|
||||
|
||||
// Reads the content of a directory and, in case of success, returns a vector
|
||||
// of strings with one element for each found file or directory. Each element is
|
||||
// a path created by prepending |dir| to the file/directory name. "." and ".."
|
||||
// are never added in the returned vector.
|
||||
rtc::Optional<std::vector<std::string>> ReadDirectory(std::string path);
|
||||
|
||||
// Creates a directory if it not already exists.
|
||||
// Returns true if successful. Will print an error message to stderr and return
|
||||
// false if a file with the same name already exists.
|
||||
|
||||
@ -12,9 +12,14 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <string>
|
||||
|
||||
#include "webrtc/base/checks.h"
|
||||
#include "webrtc/base/optional.h"
|
||||
#include "webrtc/base/pathutils.h"
|
||||
#include "webrtc/test/gtest.h"
|
||||
|
||||
#ifdef WIN32
|
||||
@ -24,11 +29,41 @@ static const char* kPathDelimiter = "\\";
|
||||
static const char* kPathDelimiter = "/";
|
||||
#endif
|
||||
|
||||
static const std::string kResourcesDir = "resources";
|
||||
static const std::string kTestName = "fileutils_unittest";
|
||||
static const std::string kExtension = "tmp";
|
||||
static const char kTestName[] = "fileutils_unittest";
|
||||
static const char kExtension[] = "tmp";
|
||||
|
||||
namespace webrtc {
|
||||
namespace test {
|
||||
|
||||
namespace {
|
||||
|
||||
// Remove files and directories in a directory non-recursively and writes the
|
||||
// number of deleted items in |num_deleted_entries|.
|
||||
void CleanDir(const std::string& dir, size_t* num_deleted_entries) {
|
||||
RTC_DCHECK(num_deleted_entries);
|
||||
*num_deleted_entries = 0;
|
||||
rtc::Optional<std::vector<std::string>> dir_content = ReadDirectory(dir);
|
||||
EXPECT_TRUE(dir_content);
|
||||
for (const auto& entry : *dir_content) {
|
||||
if (DirExists(entry)) {
|
||||
EXPECT_TRUE(RemoveDir(entry));
|
||||
(*num_deleted_entries)++;
|
||||
} else if (FileExists(entry)) {
|
||||
EXPECT_TRUE(RemoveFile(entry));
|
||||
(*num_deleted_entries)++;
|
||||
} else {
|
||||
FAIL();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WriteStringInFile(const std::string& what, const std::string& file_path) {
|
||||
std::ofstream out(file_path);
|
||||
out << what;
|
||||
out.close();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// Test fixture to restore the working directory between each test, since some
|
||||
// of them change it with chdir during execution (not restored by the
|
||||
@ -170,4 +205,36 @@ TEST_F(FileUtilsTest, DirExists) {
|
||||
remove(temp_filename.c_str());
|
||||
}
|
||||
|
||||
TEST_F(FileUtilsTest, WriteReadDeleteFilesAndDirs) {
|
||||
size_t num_deleted_entries;
|
||||
|
||||
// Create an empty temporary directory for this test.
|
||||
const std::string temp_directory =
|
||||
OutputPath() + "TempFileUtilsTestReadDirectory" + kPathDelimiter;
|
||||
CreateDir(temp_directory);
|
||||
EXPECT_NO_FATAL_FAILURE(CleanDir(temp_directory, &num_deleted_entries));
|
||||
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 an empty directory.
|
||||
const std::string temp_subdir = temp_directory + "subdir" + kPathDelimiter;
|
||||
EXPECT_TRUE(CreateDir(temp_subdir));
|
||||
EXPECT_TRUE(DirExists(temp_subdir));
|
||||
|
||||
// Checks.
|
||||
rtc::Optional<std::vector<std::string>> dir_content =
|
||||
ReadDirectory(temp_directory);
|
||||
EXPECT_TRUE(dir_content);
|
||||
EXPECT_EQ(2u, dir_content->size());
|
||||
EXPECT_NO_FATAL_FAILURE(CleanDir(temp_directory, &num_deleted_entries));
|
||||
EXPECT_EQ(2u, num_deleted_entries);
|
||||
EXPECT_TRUE(RemoveDir(temp_directory));
|
||||
EXPECT_FALSE(DirExists(temp_directory));
|
||||
}
|
||||
|
||||
} // namespace test
|
||||
} // namespace webrtc
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user