• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "testsupport/fileutils.h"
12 
13 #ifdef WIN32
14 #include <direct.h>
15 #define GET_CURRENT_DIR _getcwd
16 #else
17 #include <unistd.h>
18 #define GET_CURRENT_DIR getcwd
19 #endif
20 
21 #include <sys/stat.h>  // To check for directory existence.
22 #ifndef S_ISDIR  // Not defined in stat.h on Windows.
23 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
24 #endif
25 
26 #include <cstdio>
27 
28 #include "typedefs.h"  // For architecture defines
29 
30 namespace webrtc {
31 namespace test {
32 
33 #ifdef WIN32
34 static const char* kPathDelimiter = "\\";
35 #else
36 static const char* kPathDelimiter = "/";
37 #endif
38 // The file we're looking for to identify the project root dir.
39 static const char* kProjectRootFileName = "DEPS";
40 static const char* kOutputDirName = "out";
41 static const char* kFallbackPath = "./";
42 static const char* kResourcesDirName = "resources";
43 const char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR";
44 
ProjectRootPath()45 std::string ProjectRootPath() {
46   std::string working_dir = WorkingDir();
47   if (working_dir == kFallbackPath) {
48     return kCannotFindProjectRootDir;
49   }
50   // Check for our file that verifies the root dir.
51   std::string current_path(working_dir);
52   FILE* file = NULL;
53   int path_delimiter_index = current_path.find_last_of(kPathDelimiter);
54   while (path_delimiter_index > -1) {
55     std::string root_filename = current_path + kPathDelimiter +
56         kProjectRootFileName;
57     file = fopen(root_filename.c_str(), "r");
58     if (file != NULL) {
59       fclose(file);
60       return current_path + kPathDelimiter;
61     }
62     // Move up one directory in the directory tree.
63     current_path = current_path.substr(0, path_delimiter_index);
64     path_delimiter_index = current_path.find_last_of(kPathDelimiter);
65   }
66   // Reached the root directory.
67   fprintf(stderr, "Cannot find project root directory!\n");
68   return kCannotFindProjectRootDir;
69 }
70 
OutputPath()71 std::string OutputPath() {
72   std::string path = ProjectRootPath();
73   if (path == kCannotFindProjectRootDir) {
74     return kFallbackPath;
75   }
76   path += kOutputDirName;
77   if (!CreateDirectory(path)) {
78     return kFallbackPath;
79   }
80   return path + kPathDelimiter;
81 }
82 
WorkingDir()83 std::string WorkingDir() {
84   char path_buffer[FILENAME_MAX];
85   if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) {
86     fprintf(stderr, "Cannot get current directory!\n");
87     return kFallbackPath;
88   } else {
89     return std::string(path_buffer);
90   }
91 }
92 
CreateDirectory(std::string directory_name)93 bool CreateDirectory(std::string directory_name) {
94   struct stat path_info = {0};
95   // Check if the path exists already:
96   if (stat(directory_name.c_str(), &path_info) == 0) {
97     if (!S_ISDIR(path_info.st_mode)) {
98       fprintf(stderr, "Path %s exists but is not a directory! Remove this "
99               "file and re-run to create the directory.\n",
100               directory_name.c_str());
101       return false;
102     }
103   } else {
104 #ifdef WIN32
105     return _mkdir(directory_name.c_str()) == 0;
106 #else
107     return mkdir(directory_name.c_str(),  S_IRWXU | S_IRWXG | S_IRWXO) == 0;
108 #endif
109   }
110   return true;
111 }
112 
FileExists(std::string file_name)113 bool FileExists(std::string file_name) {
114   struct stat file_info = {0};
115   return stat(file_name.c_str(), &file_info) == 0;
116 }
117 
ResourcePath(std::string name,std::string extension)118 std::string ResourcePath(std::string name, std::string extension) {
119   std::string platform = "win";
120 #ifdef WEBRTC_LINUX
121   platform = "linux";
122 #endif  // WEBRTC_LINUX
123 #ifdef WEBRTC_MAC
124   platform = "mac";
125 #endif  // WEBRTC_MAC
126 
127 #ifdef WEBRTC_ARCH_64_BITS
128   std::string architecture = "64";
129 #else
130   std::string architecture = "32";
131 #endif  // WEBRTC_ARCH_64_BITS
132 
133   std::string resources_path = ProjectRootPath() + kResourcesDirName +
134       kPathDelimiter;
135   std::string resource_file = resources_path + name + "_" + platform + "_" +
136       architecture + "." + extension;
137   if (FileExists(resource_file)) {
138     return resource_file;
139   }
140   // Try without architecture.
141   resource_file = resources_path + name + "_" + platform + "." + extension;
142   if (FileExists(resource_file)) {
143     return resource_file;
144   }
145   // Try without platform.
146   resource_file = resources_path + name + "_" + architecture + "." + extension;
147   if (FileExists(resource_file)) {
148     return resource_file;
149   }
150   // Fall back on name without architecture or platform.
151   return resources_path + name + "." + extension;
152 }
153 
GetFileSize(std::string filename)154 size_t GetFileSize(std::string filename) {
155   FILE* f = fopen(filename.c_str(), "rb");
156   size_t size = 0;
157   if (f != NULL) {
158     if (fseek(f, 0, SEEK_END) == 0) {
159       size = ftell(f);
160     }
161     fclose(f);
162   }
163   return size;
164 }
165 
166 }  // namespace test
167 }  // namespace webrtc
168