aboutsummaryrefslogtreecommitdiff
path: root/test/testsupport/fileutils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/testsupport/fileutils.cc')
-rw-r--r--test/testsupport/fileutils.cc167
1 files changed, 167 insertions, 0 deletions
diff --git a/test/testsupport/fileutils.cc b/test/testsupport/fileutils.cc
new file mode 100644
index 0000000000..1e6bbcaa4c
--- /dev/null
+++ b/test/testsupport/fileutils.cc
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "testsupport/fileutils.h"
+
+#ifdef WIN32
+#include <direct.h>
+#define GET_CURRENT_DIR _getcwd
+#else
+#include <unistd.h>
+#define GET_CURRENT_DIR getcwd
+#endif
+
+#include <sys/stat.h> // To check for directory existence.
+#ifndef S_ISDIR // Not defined in stat.h on Windows.
+#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
+
+#include <cstdio>
+
+#include "typedefs.h" // For architecture defines
+
+namespace webrtc {
+namespace test {
+
+#ifdef WIN32
+static const char* kPathDelimiter = "\\";
+#else
+static const char* kPathDelimiter = "/";
+#endif
+// The file we're looking for to identify the project root dir.
+static const char* kProjectRootFileName = "DEPS";
+static const char* kOutputDirName = "out";
+static const char* kFallbackPath = "./";
+static const char* kResourcesDirName = "resources";
+const char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR";
+
+std::string ProjectRootPath() {
+ std::string working_dir = WorkingDir();
+ if (working_dir == kFallbackPath) {
+ return kCannotFindProjectRootDir;
+ }
+ // Check for our file that verifies the root dir.
+ std::string current_path(working_dir);
+ FILE* file = NULL;
+ int path_delimiter_index = current_path.find_last_of(kPathDelimiter);
+ while (path_delimiter_index > -1) {
+ std::string root_filename = current_path + kPathDelimiter +
+ kProjectRootFileName;
+ file = fopen(root_filename.c_str(), "r");
+ if (file != NULL) {
+ fclose(file);
+ return current_path + kPathDelimiter;
+ }
+ // Move up one directory in the directory tree.
+ current_path = current_path.substr(0, path_delimiter_index);
+ path_delimiter_index = current_path.find_last_of(kPathDelimiter);
+ }
+ // Reached the root directory.
+ fprintf(stderr, "Cannot find project root directory!\n");
+ return kCannotFindProjectRootDir;
+}
+
+std::string OutputPath() {
+ std::string path = ProjectRootPath();
+ if (path == kCannotFindProjectRootDir) {
+ return kFallbackPath;
+ }
+ path += kOutputDirName;
+ if (!CreateDirectory(path)) {
+ return kFallbackPath;
+ }
+ return path + kPathDelimiter;
+}
+
+std::string WorkingDir() {
+ char path_buffer[FILENAME_MAX];
+ if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) {
+ fprintf(stderr, "Cannot get current directory!\n");
+ return kFallbackPath;
+ } else {
+ return std::string(path_buffer);
+ }
+}
+
+bool CreateDirectory(std::string directory_name) {
+ struct stat path_info = {0};
+ // Check if the path exists already:
+ if (stat(directory_name.c_str(), &path_info) == 0) {
+ if (!S_ISDIR(path_info.st_mode)) {
+ fprintf(stderr, "Path %s exists but is not a directory! Remove this "
+ "file and re-run to create the directory.\n",
+ directory_name.c_str());
+ return false;
+ }
+ } else {
+#ifdef WIN32
+ return _mkdir(directory_name.c_str()) == 0;
+#else
+ return mkdir(directory_name.c_str(), S_IRWXU | S_IRWXG | S_IRWXO) == 0;
+#endif
+ }
+ return true;
+}
+
+bool FileExists(std::string file_name) {
+ struct stat file_info = {0};
+ return stat(file_name.c_str(), &file_info) == 0;
+}
+
+std::string ResourcePath(std::string name, std::string extension) {
+ std::string platform = "win";
+#ifdef WEBRTC_LINUX
+ platform = "linux";
+#endif // WEBRTC_LINUX
+#ifdef WEBRTC_MAC
+ platform = "mac";
+#endif // WEBRTC_MAC
+
+#ifdef WEBRTC_ARCH_64_BITS
+ std::string architecture = "64";
+#else
+ std::string architecture = "32";
+#endif // WEBRTC_ARCH_64_BITS
+
+ std::string resources_path = ProjectRootPath() + kResourcesDirName +
+ kPathDelimiter;
+ std::string resource_file = resources_path + name + "_" + platform + "_" +
+ architecture + "." + extension;
+ if (FileExists(resource_file)) {
+ return resource_file;
+ }
+ // Try without architecture.
+ resource_file = resources_path + name + "_" + platform + "." + extension;
+ if (FileExists(resource_file)) {
+ return resource_file;
+ }
+ // Try without platform.
+ resource_file = resources_path + name + "_" + architecture + "." + extension;
+ if (FileExists(resource_file)) {
+ return resource_file;
+ }
+ // Fall back on name without architecture or platform.
+ return resources_path + name + "." + extension;
+}
+
+size_t GetFileSize(std::string filename) {
+ FILE* f = fopen(filename.c_str(), "rb");
+ size_t size = 0;
+ if (f != NULL) {
+ if (fseek(f, 0, SEEK_END) == 0) {
+ size = ftell(f);
+ }
+ fclose(f);
+ }
+ return size;
+}
+
+} // namespace test
+} // namespace webrtc