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"
|
#include "webrtc/base/win32.h"
|
||||||
#define GET_CURRENT_DIR _getcwd
|
#define GET_CURRENT_DIR _getcwd
|
||||||
#else
|
#else
|
||||||
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define GET_CURRENT_DIR getcwd
|
#define GET_CURRENT_DIR getcwd
|
||||||
@ -39,7 +40,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "webrtc/base/checks.h"
|
||||||
#include "webrtc/typedefs.h" // For architecture defines
|
#include "webrtc/typedefs.h" // For architecture defines
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
@ -126,7 +129,7 @@ std::string WorkingDir() {
|
|||||||
return kRootDirName;
|
return kRootDirName;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // WEBRTC_ANDROID
|
#else // WEBRTC_ANDROID
|
||||||
|
|
||||||
std::string ProjectRootPath() {
|
std::string ProjectRootPath() {
|
||||||
#if defined(WEBRTC_IOS)
|
#if defined(WEBRTC_IOS)
|
||||||
@ -212,6 +215,57 @@ std::string TempFilename(const std::string &dir, const std::string &prefix) {
|
|||||||
#endif
|
#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) {
|
bool CreateDir(const std::string& directory_name) {
|
||||||
struct stat path_info = {0};
|
struct stat path_info = {0};
|
||||||
// Check if the path exists already:
|
// Check if the path exists already:
|
||||||
|
|||||||
@ -14,6 +14,9 @@
|
|||||||
#define WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
|
#define WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "webrtc/base/optional.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
namespace test {
|
namespace test {
|
||||||
@ -66,6 +69,12 @@ std::string ResourcePath(const std::string& name,
|
|||||||
// directory.
|
// directory.
|
||||||
std::string WorkingDir();
|
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.
|
// Creates a directory if it not already exists.
|
||||||
// Returns true if successful. Will print an error message to stderr and return
|
// Returns true if successful. Will print an error message to stderr and return
|
||||||
// false if a file with the same name already exists.
|
// false if a file with the same name already exists.
|
||||||
|
|||||||
@ -12,9 +12,14 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "webrtc/base/checks.h"
|
||||||
|
#include "webrtc/base/optional.h"
|
||||||
|
#include "webrtc/base/pathutils.h"
|
||||||
#include "webrtc/test/gtest.h"
|
#include "webrtc/test/gtest.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@ -24,11 +29,41 @@ static const char* kPathDelimiter = "\\";
|
|||||||
static const char* kPathDelimiter = "/";
|
static const char* kPathDelimiter = "/";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const std::string kResourcesDir = "resources";
|
static const char kTestName[] = "fileutils_unittest";
|
||||||
static const std::string kTestName = "fileutils_unittest";
|
static const char kExtension[] = "tmp";
|
||||||
static const std::string kExtension = "tmp";
|
|
||||||
|
|
||||||
namespace webrtc {
|
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
|
// Test fixture to restore the working directory between each test, since some
|
||||||
// of them change it with chdir during execution (not restored by the
|
// 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());
|
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
|
} // namespace webrtc
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user