Home | History | Annotate | Download | only in testsupport
      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 <stdio.h>
     12 
     13 // File utilities for testing purposes.
     14 //
     15 // The ProjectRootPath() method is a convenient way of getting an absolute
     16 // path to the project source tree root directory. Using this, it is easy to
     17 // refer to test resource files in a portable way.
     18 //
     19 // Notice that even if Windows platforms use backslash as path delimiter, it is
     20 // also supported to use slash, so there's no need for #ifdef checks in test
     21 // code for setting up the paths to the resource files.
     22 //
     23 // Example use:
     24 // Assume we have the following code being used in a test source file:
     25 // const std::string kInputFile = webrtc::test::ProjectRootPath() +
     26 //     "test/data/voice_engine/audio_long16.wav";
     27 // // Use the kInputFile for the tests...
     28 //
     29 // Then here's some example outputs for different platforms:
     30 // Linux:
     31 // * Source tree located in /home/user/webrtc/trunk
     32 // * Test project located in /home/user/webrtc/trunk/src/testproject
     33 // * Test binary compiled as:
     34 //   /home/user/webrtc/trunk/out/Debug/testproject_unittests
     35 // Then ProjectRootPath() will return /home/user/webrtc/trunk/ no matter if
     36 // the test binary is executed from standing in either of:
     37 // /home/user/webrtc/trunk
     38 // or
     39 // /home/user/webrtc/trunk/out/Debug
     40 // (or any other directory below the trunk for that matter).
     41 //
     42 // Windows:
     43 // * Source tree located in C:\Users\user\webrtc\trunk
     44 // * Test project located in C:\Users\user\webrtc\trunk\src\testproject
     45 // * Test binary compiled as:
     46 //   C:\Users\user\webrtc\trunk\src\testproject\Debug\testproject_unittests.exe
     47 // Then ProjectRootPath() will return C:\Users\user\webrtc\trunk\ when the
     48 // test binary is executed from inside Visual Studio.
     49 // It will also return the same path if the test is executed from a command
     50 // prompt standing in C:\Users\user\webrtc\trunk\src\testproject\Debug
     51 //
     52 // Mac:
     53 // * Source tree located in /Users/user/webrtc/trunk
     54 // * Test project located in /Users/user/webrtc/trunk/src/testproject
     55 // * Test binary compiled as:
     56 //   /Users/user/webrtc/trunk/xcodebuild/Debug/testproject_unittests
     57 // Then ProjectRootPath() will return /Users/user/webrtc/trunk/ no matter if
     58 // the test binary is executed from standing in either of:
     59 // /Users/user/webrtc/trunk
     60 // or
     61 // /Users/user/webrtc/trunk/out/Debug
     62 // (or any other directory below the trunk for that matter).
     63 
     64 #ifndef WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
     65 #define WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
     66 
     67 #include <string>
     68 
     69 namespace webrtc {
     70 namespace test {
     71 
     72 // This is the "directory" returned if the ProjectPath() function fails
     73 // to find the project root.
     74 extern const char* kCannotFindProjectRootDir;
     75 
     76 // Finds the root dir of the project, to be able to set correct paths to
     77 // resource files used by tests.
     78 // The implementation is simple: it just looks for the file defined by
     79 // kProjectRootFileName, starting in the current directory (the working
     80 // directory) and then steps upward until it is found (or it is at the root of
     81 // the file system).
     82 // If the current working directory is above the project root dir, it will not
     83 // be found.
     84 //
     85 // If symbolic links occur in the path they will be resolved and the actual
     86 // directory will be returned.
     87 //
     88 // Returns the absolute path to the project root dir (usually the trunk dir)
     89 // WITH a trailing path delimiter.
     90 // If the project root is not found, the string specified by
     91 // kCannotFindProjectRootDir is returned.
     92 std::string ProjectRootPath();
     93 
     94 // Creates and returns the absolute path to the output directory where log files
     95 // and other test artifacts should be put. The output directory is generally a
     96 // directory named "out" at the top-level of the project, i.e. a subfolder to
     97 // the path returned by ProjectRootPath(). The exception is Android where we use
     98 // /sdcard/ instead.
     99 //
    100 // Details described for ProjectRootPath() apply here too.
    101 //
    102 // Returns the path WITH a trailing path delimiter. If the project root is not
    103 // found, the current working directory ("./") is returned as a fallback.
    104 std::string OutputPath();
    105 
    106 // Generates an empty file with a unique name in the specified directory and
    107 // returns the file name and path.
    108 std::string TempFilename(const std::string &dir, const std::string &prefix);
    109 
    110 // Returns a path to a resource file for the currently executing platform.
    111 // Adapts to what filenames are currently present in the
    112 // [project-root]/resources/ dir.
    113 // Returns an absolute path according to this priority list (the directory
    114 // part of the path is left out for readability):
    115 // 1. [name]_[platform]_[architecture].[extension]
    116 // 2. [name]_[platform].[extension]
    117 // 3. [name]_[architecture].[extension]
    118 // 4. [name].[extension]
    119 // Where
    120 // * platform is either of "win", "mac" or "linux".
    121 // * architecture is either of "32" or "64".
    122 //
    123 // Arguments:
    124 //    name - Name of the resource file. If a plain filename (no directory path)
    125 //           is supplied, the file is assumed to be located in resources/
    126 //           If a directory path is prepended to the filename, a subdirectory
    127 //           hierarchy reflecting that path is assumed to be present.
    128 //    extension - File extension, without the dot, i.e. "bmp" or "yuv".
    129 std::string ResourcePath(std::string name, std::string extension);
    130 
    131 // Gets the current working directory for the executing program.
    132 // Returns "./" if for some reason it is not possible to find the working
    133 // directory.
    134 std::string WorkingDir();
    135 
    136 // Creates a directory if it not already exists.
    137 // Returns true if successful. Will print an error message to stderr and return
    138 // false if a file with the same name already exists.
    139 bool CreateDir(std::string directory_name);
    140 
    141 // Checks if a file exists.
    142 bool FileExists(std::string& file_name);
    143 
    144 // File size of the supplied file in bytes. Will return 0 if the file is
    145 // empty or if the file does not exist/is readable.
    146 size_t GetFileSize(std::string filename);
    147 
    148 // Sets the executable path, i.e. the path to the executable that is being used
    149 // when launching it. This is usually the path relative to the working directory
    150 // but can also be an absolute path. The intention with this function is to pass
    151 // the argv[0] being sent into the main function to make it possible for
    152 // fileutils.h to find the correct project paths even when the working directory
    153 // is outside the project tree (which happens in some cases).
    154 void SetExecutablePath(const std::string& path_to_executable);
    155 
    156 }  // namespace test
    157 }  // namespace webrtc
    158 
    159 #endif  // WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
    160