11be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2008, Google Inc. 21be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All rights reserved. 31be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without 51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are 61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met: 71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Redistributions of source code must retain the above copyright 91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer. 101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Redistributions in binary form must reproduce the above 111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer 121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the 131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution. 141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Neither the name of Google Inc. nor the names of its 151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from 161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission. 171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Author: keith.ray@gmail.com (Keith Ray) 311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Google Test filepath utilities 331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This header file declares classes and functions used internally by 351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Google Test. They are subject to change without notice. 361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This file is #included in <gtest/internal/gtest-internal.h>. 381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Do not include this header file separately! 391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ 411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ 421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-string.h" 441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace testing { 461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace internal { 471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// FilePath - a class for file and directory pathname manipulation which 491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// handles platform-specific conventions (like the pathname separator). 501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Used for helper functions for naming files in a directory for xml output. 511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Except for Set methods, all methods are const or static, which provides an 521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "immutable value object" -- useful for peace of mind. 531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A FilePath with a value ending in a path separator ("like/this/") represents 541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// a directory, otherwise it is assumed to represent a file. In either case, 551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// it may or may not represent an actual file or directory in the file system. 561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Names are NOT checked for syntax correctness -- no checking for illegal 571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// characters, malformed paths, etc. 581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass GTEST_API_ FilePath { 601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania public: 611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania FilePath() : pathname_("") { } 621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } 631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania explicit FilePath(const char* pathname) : pathname_(pathname) { 651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Normalize(); 661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania explicit FilePath(const String& pathname) : pathname_(pathname) { 691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Normalize(); 701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania FilePath& operator=(const FilePath& rhs) { 731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Set(rhs); 741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return *this; 751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania void Set(const FilePath& rhs) { 781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania pathname_ = rhs.pathname_; 791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania String ToString() const { return pathname_; } 821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char* c_str() const { return pathname_.c_str(); } 831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns the current working directory, or "" if unsuccessful. 851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static FilePath GetCurrentDir(); 861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Given directory = "dir", base_name = "test", number = 0, 881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // extension = "xml", returns "dir/test.xml". If number is greater 891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // than zero (e.g., 12), returns "dir/test_12.xml". 901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // On Windows platform, uses \ as the separator rather than /. 911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static FilePath MakeFileName(const FilePath& directory, 921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const FilePath& base_name, 931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania int number, 941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char* extension); 951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Given directory = "dir", relative_path = "test.xml", 971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // returns "dir/test.xml". 981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // On Windows, uses \ as the separator rather than /. 991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static FilePath ConcatPaths(const FilePath& directory, 1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const FilePath& relative_path); 1011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns a pathname for a file that does not currently exist. The pathname 1031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // will be directory/base_name.extension or 1041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // directory/base_name_<number>.extension if directory/base_name.extension 1051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // already exists. The number will be incremented until a pathname is found 1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // that does not already exist. 1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. 1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // There could be a race condition if two or more processes are calling this 1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // function at the same time -- they could both pick the same filename. 1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania static FilePath GenerateUniqueFileName(const FilePath& directory, 1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const FilePath& base_name, 1121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char* extension); 1131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns true iff the path is NULL or "". 1151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; } 1161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // If input name has a trailing separator character, removes it and returns 1181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // the name, otherwise return the name string unmodified. 1191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // On Windows platform, uses \ as the separator, other platforms use /. 1201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania FilePath RemoveTrailingPathSeparator() const; 1211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns a copy of the FilePath with the directory part removed. 1231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Example: FilePath("path/to/file").RemoveDirectoryName() returns 1241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // FilePath("file"). If there is no directory part ("just_a_file"), it returns 1251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // the FilePath unmodified. If there is no file part ("just_a_dir/") it 1261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // returns an empty FilePath (""). 1271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // On Windows platform, '\' is the path separator, otherwise it is '/'. 1281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania FilePath RemoveDirectoryName() const; 1291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // RemoveFileName returns the directory path with the filename removed. 1311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". 1321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // If the FilePath is "a_file" or "/a_file", RemoveFileName returns 1331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does 1341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // not have a file, like "just/a/dir/", it returns the FilePath unmodified. 1351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // On Windows platform, '\' is the path separator, otherwise it is '/'. 1361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania FilePath RemoveFileName() const; 1371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns a copy of the FilePath with the case-insensitive extension removed. 1391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns 1401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // FilePath("dir/file"). If a case-insensitive extension is not 1411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // found, returns a copy of the original FilePath. 1421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania FilePath RemoveExtension(const char* extension) const; 1431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Creates directories so that path exists. Returns true if successful or if 1451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // the directories already exist; returns false if unable to create 1461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // directories for any reason. Will also return false if the FilePath does 1471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // not represent a directory (that is, it doesn't end with a path separator). 1481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool CreateDirectoriesRecursively() const; 1491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Create the directory so that path exists. Returns true if successful or 1511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // if the directory already exists; returns false if unable to create the 1521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // directory for any reason, including if the parent directory does not 1531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // exist. Not named "CreateDirectory" because that's a macro on Windows. 1541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool CreateFolder() const; 1551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns true if FilePath describes something in the file-system, 1571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // either a file, directory, or whatever, and that something exists. 1581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool FileOrDirectoryExists() const; 1591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns true if pathname describes a directory in the file-system 1611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // that exists. 1621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool DirectoryExists() const; 1631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns true if FilePath ends with a path separator, which indicates that 1651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // it is intended to represent a directory. Returns false otherwise. 1661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // This does NOT check that a directory (or file) actually exists. 1671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool IsDirectory() const; 1681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns true if pathname describes a root directory. (Windows has one 1701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // root directory per disk drive.) 1711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool IsRootDirectory() const; 1721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Returns true if pathname describes an absolute path. 1741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania bool IsAbsolutePath() const; 1751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania private: 1771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Replaces multiple consecutive separators with a single separator. 1781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // For example, "bar///foo" becomes "bar/foo". Does not eliminate other 1791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // redundancies that might be in a pathname involving "." or "..". 1801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // 1811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // A pathname with multiple consecutive separators may occur either through 1821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // user error or as a result of some scripts or APIs that generate a pathname 1831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // with a trailing separator. On other platforms the same API or script 1841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // may NOT generate a pathname with a trailing "/". Then elsewhere that 1851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // pathname may have another "/" and pathname components added to it, 1861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // without checking for the separator already being there. 1871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // The script language and operating system may allow paths like "foo//bar" 1881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // but some of the functions in FilePath will not handle that correctly. In 1891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // particular, RemoveTrailingPathSeparator() only removes one separator, and 1901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // it is called in CreateDirectoriesRecursively() assuming that it will change 1911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // a pathname from directory syntax (trailing separator) to filename syntax. 19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // 19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // On Windows this method also replaces the alternate path separator '/' with 19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // the primary path separator '\\', so that for example "bar\\/\\foo" becomes 19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // "bar\\foo". 1961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania void Normalize(); 1981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 19941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Returns a pointer to the last occurence of a valid path separator in 20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // the FilePath. On Windows, for example, both '/' and '\' are valid path 20141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // separators. Returns NULL if no path separator was found. 20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const char* FindLastPathSeparator() const; 20341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 2041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania String pathname_; 2051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}; // class FilePath 2061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} // namespace internal 2081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} // namespace testing 2091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ 211