17951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org/*
27a281a563452715e48724b07725f2a2fa34dcca3andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
37951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org *
47951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org *  Use of this source code is governed by a BSD-style license
57951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org *  that can be found in the LICENSE file in the root of the source
67951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org *  tree. An additional intellectual property rights grant can be found
77951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org *  in the file PATENTS.  All contributing project authors may
87951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
97951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org */
107951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org
1134741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
127951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org
137de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <assert.h>
14f2aafe4355c4b7ecbd122798f08a5c5ec5d2693ahenrike@webrtc.org
15f2aafe4355c4b7ecbd122798f08a5c5ec5d2693ahenrike@webrtc.org#ifdef WIN32
167951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#include <direct.h>
177de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <tchar.h>
187de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <windows.h>
19de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org#include <algorithm>
207de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org
2198f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/utf_util_win.h"
227951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#define GET_CURRENT_DIR _getcwd
237951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#else
247951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#include <unistd.h>
257de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org
2600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
277951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#define GET_CURRENT_DIR getcwd
284d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#endif
294d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org
304d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#include <sys/stat.h>  // To check for directory existence.
314d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#ifndef S_ISDIR  // Not defined in stat.h on Windows.
324d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
337951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#endif
347951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org
3512dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <stdio.h>
367de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <stdlib.h>
3712dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <string.h>
387951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org
3934741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include "webrtc/typedefs.h"  // For architecture defines
404ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org
417951e819af005e0c45a19367c549984d67509969kjellander@webrtc.orgnamespace webrtc {
427951e819af005e0c45a19367c549984d67509969kjellander@webrtc.orgnamespace test {
437951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org
441d34fe979c52e5826c5c8162759b0167b2607836henrika#if defined(WEBRTC_IOS)
451d34fe979c52e5826c5c8162759b0167b2607836henrika// Defined in iosfileutils.mm.  No header file to discourage use elsewhere.
461d34fe979c52e5826c5c8162759b0167b2607836henrikastd::string IOSResourcePath(std::string name, std::string extension);
471d34fe979c52e5826c5c8162759b0167b2607836henrika#endif
481d34fe979c52e5826c5c8162759b0167b2607836henrika
4934773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgnamespace {
5034773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org
514d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#ifdef WIN32
5234773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kPathDelimiter = "\\";
534d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#else
5434773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kPathDelimiter = "/";
554d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#endif
56363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
57363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#ifdef WEBRTC_ANDROID
5872fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kRootDirName = "/sdcard/";
59363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#else
601e10bb32b92798012338bf8b44ba990b9904128dandrew@webrtc.org// The file we're looking for to identify the project root dir.
6134773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kProjectRootFileName = "DEPS";
6272fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kOutputDirName = "out";
6372fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kFallbackPath = "./";
64fb59442c4048c443f23b8f581db5bc85f34947e9leozwang@webrtc.org#endif
651d34fe979c52e5826c5c8162759b0167b2607836henrika#if !defined(WEBRTC_IOS)
6672fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kResourcesDirName = "resources";
671d34fe979c52e5826c5c8162759b0167b2607836henrika#endif
681e10bb32b92798012338bf8b44ba990b9904128dandrew@webrtc.org
6983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.orgchar relative_dir_path[FILENAME_MAX];
7083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.orgbool relative_dir_path_set = false;
7134773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org
7234773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org}  // namespace
7334773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org
7434773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR";
7534773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org
76193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.orgvoid SetExecutablePath(const std::string& path) {
77193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  std::string working_dir = WorkingDir();
78193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  std::string temp_path = path;
79193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org
80193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  // Handle absolute paths; convert them to relative paths to the working dir.
81193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  if (path.find(working_dir) != std::string::npos) {
82193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org    temp_path = path.substr(working_dir.length() + 1);
83193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  }
84de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org  // On Windows, when tests are run under memory tools like DrMemory and TSan,
85de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org  // slashes occur in the path as directory separators. Make sure we replace
86de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org  // such cases with backslashes in order for the paths to be correct.
87de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org#ifdef WIN32
88de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org  std::replace(temp_path.begin(), temp_path.end(), '/', '\\');
89de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org#endif
90de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org
91193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  // Trim away the executable name; only store the relative dir path.
92193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  temp_path = temp_path.substr(0, temp_path.find_last_of(kPathDelimiter));
9383b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org  strncpy(relative_dir_path, temp_path.c_str(), FILENAME_MAX);
9483b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org  relative_dir_path_set = true;
9583b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org}
9683b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org
9783b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.orgbool FileExists(std::string& file_name) {
98f81b46177164dd722b6b3ad4093f1718b91e564fGlenn Kasten  struct stat file_info = {0, 0};
9983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org  return stat(file_name.c_str(), &file_info) == 0;
10083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org}
10183b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org
102363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#ifdef WEBRTC_ANDROID
103363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
104363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.orgstd::string ProjectRootPath() {
10572fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  return kRootDirName;
106363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org}
107363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
108363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.orgstd::string OutputPath() {
10972fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  return kRootDirName;
110363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org}
111363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
112363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.orgstd::string WorkingDir() {
11372fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  return kRootDirName;
114363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org}
115363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
116363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#else // WEBRTC_ANDROID
117363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
1180db7dc6e18e24294a57d4efc2ea5280ea025a830andrew@webrtc.orgstd::string ProjectRootPath() {
11983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org  std::string path = WorkingDir();
12083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org  if (path == kFallbackPath) {
1217951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org    return kCannotFindProjectRootDir;
1227951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org  }
12383b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org  if (relative_dir_path_set) {
12483b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org    path = path + kPathDelimiter + relative_dir_path;
12583b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org  }
1267951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org  // Check for our file that verifies the root dir.
127193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  size_t path_delimiter_index = path.find_last_of(kPathDelimiter);
128193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org  while (path_delimiter_index != std::string::npos) {
12983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org    std::string root_filename = path + kPathDelimiter + kProjectRootFileName;
13083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org    if (FileExists(root_filename)) {
13183b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org      return path + kPathDelimiter;
1327951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org    }
1337951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org    // Move up one directory in the directory tree.
13483b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org    path = path.substr(0, path_delimiter_index);
13583b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org    path_delimiter_index = path.find_last_of(kPathDelimiter);
1367951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org  }
1377951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org  // Reached the root directory.
1387951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org  fprintf(stderr, "Cannot find project root directory!\n");
1397951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org  return kCannotFindProjectRootDir;
1407951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org}
1417951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org
1420db7dc6e18e24294a57d4efc2ea5280ea025a830andrew@webrtc.orgstd::string OutputPath() {
14372fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  std::string path = ProjectRootPath();
14472fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  if (path == kCannotFindProjectRootDir) {
14572fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org    return kFallbackPath;
14672fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  }
14772fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  path += kOutputDirName;
14872fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  if (!CreateDir(path)) {
14972fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org    return kFallbackPath;
15072fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  }
15172fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org  return path + kPathDelimiter;
1524ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org}
1534ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org
1544ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.orgstd::string WorkingDir() {
1554ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  char path_buffer[FILENAME_MAX];
1564ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) {
1574ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    fprintf(stderr, "Cannot get current directory!\n");
1584ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    return kFallbackPath;
1595b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  } else {
1604ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    return std::string(path_buffer);
1614ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  }
1624ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org}
1634ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org
164363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#endif  // !WEBRTC_ANDROID
165363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
1667de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org// Generate a temporary filename in a safe way.
1677de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org// Largely copied from talk/base/{unixfilesystem,win32filesystem}.cc.
1687de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.orgstd::string TempFilename(const std::string &dir, const std::string &prefix) {
1697de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#ifdef WIN32
1707de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  wchar_t filename[MAX_PATH];
1717de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  if (::GetTempFileName(ToUtf16(dir).c_str(),
1727de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org                        ToUtf16(prefix).c_str(), 0, filename) != 0)
1737de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org    return ToUtf8(filename);
1747de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  assert(false);
1757de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  return "";
1767de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#else
1777de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  int len = dir.size() + prefix.size() + 2 + 6;
17800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<char[]> tempname(new char[len]);
1797de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org
1807de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  snprintf(tempname.get(), len, "%s/%sXXXXXX", dir.c_str(),
1817de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org           prefix.c_str());
1827de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  int fd = ::mkstemp(tempname.get());
1837de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  if (fd == -1) {
1847de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org    assert(false);
1857de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org    return "";
1867de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  } else {
1877de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org    ::close(fd);
1887de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  }
1897de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  std::string ret(tempname.get());
1907de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org  return ret;
1917de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#endif
1927de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org}
1937de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org
1947de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.orgbool CreateDir(std::string directory_name) {
195f81b46177164dd722b6b3ad4093f1718b91e564fGlenn Kasten  struct stat path_info = {0, 0};
1964d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org  // Check if the path exists already:
1974ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  if (stat(directory_name.c_str(), &path_info) == 0) {
1984d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org    if (!S_ISDIR(path_info.st_mode)) {
1994ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org      fprintf(stderr, "Path %s exists but is not a directory! Remove this "
2004ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org              "file and re-run to create the directory.\n",
2014ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org              directory_name.c_str());
2024ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org      return false;
2034d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org    }
2044d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org  } else {
2054d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#ifdef WIN32
2064ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    return _mkdir(directory_name.c_str()) == 0;
2074d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#else
2084ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    return mkdir(directory_name.c_str(),  S_IRWXU | S_IRWXG | S_IRWXO) == 0;
2094d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#endif
2104d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org  }
2114ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  return true;
2124d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org}
2134ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org
2144ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.orgstd::string ResourcePath(std::string name, std::string extension) {
2151d34fe979c52e5826c5c8162759b0167b2607836henrika#if defined(WEBRTC_IOS)
2161d34fe979c52e5826c5c8162759b0167b2607836henrika  return IOSResourcePath(name, extension);
2171d34fe979c52e5826c5c8162759b0167b2607836henrika#else
2184ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  std::string platform = "win";
2194ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#ifdef WEBRTC_LINUX
2204ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  platform = "linux";
2214ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#endif  // WEBRTC_LINUX
2224ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#ifdef WEBRTC_MAC
2234ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  platform = "mac";
2244ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#endif  // WEBRTC_MAC
2254ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org
2264ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#ifdef WEBRTC_ARCH_64_BITS
2274ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  std::string architecture = "64";
2284ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#else
2294ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  std::string architecture = "32";
2304ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#endif  // WEBRTC_ARCH_64_BITS
2314ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org
2325b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  std::string resources_path = ProjectRootPath() + kResourcesDirName +
2335b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org      kPathDelimiter;
2344ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  std::string resource_file = resources_path + name + "_" + platform + "_" +
2354ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org      architecture + "." + extension;
23680b2661dc6adb530aa891bc9376fcc5ef1dadc54kjellander@webrtc.org  if (FileExists(resource_file)) {
2374ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    return resource_file;
2384ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  }
2394ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  // Try without architecture.
2404ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  resource_file = resources_path + name + "_" + platform + "." + extension;
2414ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  if (FileExists(resource_file)) {
2424ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    return resource_file;
2434ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  }
2444ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  // Try without platform.
2454ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  resource_file = resources_path + name + "_" + architecture + "." + extension;
2464ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  if (FileExists(resource_file)) {
2474ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org    return resource_file;
2484ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  }
249363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org
2504ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  // Fall back on name without architecture or platform.
2514ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org  return resources_path + name + "." + extension;
2521d34fe979c52e5826c5c8162759b0167b2607836henrika#endif  // defined (WEBRTC_IOS)
2534ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org}
2544ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org
2555b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.orgsize_t GetFileSize(std::string filename) {
2565b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  FILE* f = fopen(filename.c_str(), "rb");
2575b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  size_t size = 0;
2585b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  if (f != NULL) {
2595b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org    if (fseek(f, 0, SEEK_END) == 0) {
2605b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org      size = ftell(f);
2615b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org    }
2625b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org    fclose(f);
2635b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  }
2645b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org  return size;
2655b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org}
2665b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org
2677951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org}  // namespace test
2684d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org}  // namespace webrtc
269