1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1120a5c465cf17718743e5c5758baf9266bbb6d852pbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
131ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <assert.h>
14151f6f2b95bc99093ecaf0d41e1843f0c0c1a547henrike@webrtc.org
15151f6f2b95bc99093ecaf0d41e1843f0c0c1a547henrike@webrtc.org#ifdef WIN32
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <direct.h>
171ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <tchar.h>
181ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <windows.h>
1927103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org#include <algorithm>
201ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
211ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include "webrtc/system_wrappers/interface/utf_util_win.h"
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define GET_CURRENT_DIR _getcwd
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <unistd.h>
251ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
261ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define GET_CURRENT_DIR getcwd
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <sys/stat.h>  // To check for directory existence.
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef S_ISDIR  // Not defined in stat.h on Windows.
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
353f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdio.h>
361ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <stdlib.h>
373f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <string.h>
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
3920a5c465cf17718743e5c5758baf9266bbb6d852pbos@webrtc.org#include "webrtc/typedefs.h"  // For architecture defines
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace test {
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgnamespace {
45e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WIN32
47e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kPathDelimiter = "\\";
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
49e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kPathDelimiter = "/";
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID
53e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kResourcesDirName = "resources";
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The file we're looking for to identify the project root dir.
56e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kProjectRootFileName = "DEPS";
57e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kResourcesDirName = "resources";
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kFallbackPath = "./";
61e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kOutputDirName = "out";
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgchar relative_dir_path[FILENAME_MAX];
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool relative_dir_path_set = false;
64e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org
65e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org}  // namespace
66e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org
67e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR";
68e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org
69e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgstd::string OutputPathAndroid();
70f9c7018a0b8ae48b1b921e69041f7281750dbf9dpbos@webrtc.orgstd::string ProjectRootPathAndroid();
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetExecutablePath(const std::string& path) {
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string working_dir = WorkingDir();
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string temp_path = path;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Handle absolute paths; convert them to relative paths to the working dir.
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (path.find(working_dir) != std::string::npos) {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    temp_path = path.substr(working_dir.length() + 1);
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
8027103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org  // On Windows, when tests are run under memory tools like DrMemory and TSan,
8127103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org  // slashes occur in the path as directory separators. Make sure we replace
8227103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org  // such cases with backslashes in order for the paths to be correct.
8327103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org#ifdef WIN32
8427103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org  std::replace(temp_path.begin(), temp_path.end(), '/', '\\');
8527103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org#endif
8627103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Trim away the executable name; only store the relative dir path.
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  temp_path = temp_path.substr(0, temp_path.find_last_of(kPathDelimiter));
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  strncpy(relative_dir_path, temp_path.c_str(), FILENAME_MAX);
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  relative_dir_path_set = true;
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool FileExists(std::string& file_name) {
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  struct stat file_info = {0};
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return stat(file_name.c_str(), &file_info) == 0;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgstd::string OutputPathImpl() {
99e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  std::string path = ProjectRootPath();
100e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  if (path == kCannotFindProjectRootDir) {
101e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org    return kFallbackPath;
102e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  }
103e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  path += kOutputDirName;
1041ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  if (!CreateDir(path)) {
105e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org    return kFallbackPath;
106e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  }
107e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  return path + kPathDelimiter;
108e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org}
109e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string ProjectRootPath() {
113f9c7018a0b8ae48b1b921e69041f7281750dbf9dpbos@webrtc.org  return ProjectRootPathAndroid();
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string OutputPath() {
117e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  return OutputPathAndroid();
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string WorkingDir() {
121e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  return ProjectRootPath();
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else // WEBRTC_ANDROID
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string ProjectRootPath() {
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string path = WorkingDir();
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (path == kFallbackPath) {
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return kCannotFindProjectRootDir;
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (relative_dir_path_set) {
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    path = path + kPathDelimiter + relative_dir_path;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check for our file that verifies the root dir.
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t path_delimiter_index = path.find_last_of(kPathDelimiter);
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  while (path_delimiter_index != std::string::npos) {
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string root_filename = path + kPathDelimiter + kProjectRootFileName;
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (FileExists(root_filename)) {
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return path + kPathDelimiter;
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Move up one directory in the directory tree.
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    path = path.substr(0, path_delimiter_index);
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    path_delimiter_index = path.find_last_of(kPathDelimiter);
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Reached the root directory.
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  fprintf(stderr, "Cannot find project root directory!\n");
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return kCannotFindProjectRootDir;
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string OutputPath() {
151e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org  return OutputPathImpl();
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string WorkingDir() {
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char path_buffer[FILENAME_MAX];
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) {
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fprintf(stderr, "Cannot get current directory!\n");
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return kFallbackPath;
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } else {
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return std::string(path_buffer);
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // !WEBRTC_ANDROID
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1661ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org// Generate a temporary filename in a safe way.
1671ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org// Largely copied from talk/base/{unixfilesystem,win32filesystem}.cc.
1681ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orgstd::string TempFilename(const std::string &dir, const std::string &prefix) {
1691ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#ifdef WIN32
1701ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  wchar_t filename[MAX_PATH];
1711ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  if (::GetTempFileName(ToUtf16(dir).c_str(),
1721ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org                        ToUtf16(prefix).c_str(), 0, filename) != 0)
1731ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org    return ToUtf8(filename);
1741ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  assert(false);
1751ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  return "";
1761ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#else
1771ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  int len = dir.size() + prefix.size() + 2 + 6;
1781ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  scoped_ptr<char[]> tempname(new char[len]);
1791ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
1801ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  snprintf(tempname.get(), len, "%s/%sXXXXXX", dir.c_str(),
1811ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org           prefix.c_str());
1821ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  int fd = ::mkstemp(tempname.get());
1831ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  if (fd == -1) {
1841ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org    assert(false);
1851ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org    return "";
1861ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  } else {
1871ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org    ::close(fd);
1881ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  }
1891ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  std::string ret(tempname.get());
1901ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org  return ret;
1911ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#endif
1921ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org}
1931ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org
1941ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orgbool CreateDir(std::string directory_name) {
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  struct stat path_info = {0};
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check if the path exists already:
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (stat(directory_name.c_str(), &path_info) == 0) {
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!S_ISDIR(path_info.st_mode)) {
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      fprintf(stderr, "Path %s exists but is not a directory! Remove this "
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              "file and re-run to create the directory.\n",
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              directory_name.c_str());
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return false;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } else {
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WIN32
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return _mkdir(directory_name.c_str()) == 0;
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return mkdir(directory_name.c_str(),  S_IRWXU | S_IRWXG | S_IRWXO) == 0;
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string ResourcePath(std::string name, std::string extension) {
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string platform = "win";
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_LINUX
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  platform = "linux";
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_LINUX
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_MAC
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  platform = "mac";
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_MAC
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ARCH_64_BITS
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string architecture = "64";
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string architecture = "32";
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_ARCH_64_BITS
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string resources_path = ProjectRootPath() + kResourcesDirName +
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      kPathDelimiter;
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string resource_file = resources_path + name + "_" + platform + "_" +
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      architecture + "." + extension;
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (FileExists(resource_file)) {
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return resource_file;
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Try without architecture.
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  resource_file = resources_path + name + "_" + platform + "." + extension;
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (FileExists(resource_file)) {
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return resource_file;
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Try without platform.
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  resource_file = resources_path + name + "_" + architecture + "." + extension;
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (FileExists(resource_file)) {
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return resource_file;
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Fall back on name without architecture or platform.
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return resources_path + name + "." + extension;
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgsize_t GetFileSize(std::string filename) {
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FILE* f = fopen(filename.c_str(), "rb");
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  size_t size = 0;
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (f != NULL) {
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (fseek(f, 0, SEEK_END) == 0) {
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      size = ftell(f);
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fclose(f);
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return size;
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace test
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
265