tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

googletest-filepath-test.cc (22642B)


      1 // Copyright 2008, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 //
     30 // Google Test filepath utilities
     31 //
     32 // This file tests classes and functions used internally by
     33 // Google Test.  They are subject to change without notice.
     34 //
     35 // This file is #included from gtest-internal.h.
     36 // Do not #include this file anywhere else!
     37 
     38 #include "gtest/internal/gtest-filepath.h"
     39 #include "gtest/gtest.h"
     40 #include "src/gtest-internal-inl.h"
     41 
     42 #if GTEST_OS_WINDOWS_MOBILE
     43 # include <windows.h>  // NOLINT
     44 #elif GTEST_OS_WINDOWS
     45 # include <direct.h>  // NOLINT
     46 #endif  // GTEST_OS_WINDOWS_MOBILE
     47 
     48 namespace testing {
     49 namespace internal {
     50 namespace {
     51 
     52 #if GTEST_OS_WINDOWS_MOBILE
     53 
     54 // Windows CE doesn't have the remove C function.
     55 int remove(const char* path) {
     56  LPCWSTR wpath = String::AnsiToUtf16(path);
     57  int ret = DeleteFile(wpath) ? 0 : -1;
     58  delete [] wpath;
     59  return ret;
     60 }
     61 // Windows CE doesn't have the _rmdir C function.
     62 int _rmdir(const char* path) {
     63  FilePath filepath(path);
     64  LPCWSTR wpath = String::AnsiToUtf16(
     65      filepath.RemoveTrailingPathSeparator().c_str());
     66  int ret = RemoveDirectory(wpath) ? 0 : -1;
     67  delete [] wpath;
     68  return ret;
     69 }
     70 
     71 #else
     72 
     73 TEST(GetCurrentDirTest, ReturnsCurrentDir) {
     74  const FilePath original_dir = FilePath::GetCurrentDir();
     75  EXPECT_FALSE(original_dir.IsEmpty());
     76 
     77  posix::ChDir(GTEST_PATH_SEP_);
     78  const FilePath cwd = FilePath::GetCurrentDir();
     79  posix::ChDir(original_dir.c_str());
     80 
     81 # if GTEST_OS_WINDOWS || GTEST_OS_OS2
     82 
     83  // Skips the ":".
     84  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
     85  ASSERT_TRUE(cwd_without_drive != NULL);
     86  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
     87 
     88 # else
     89 
     90  EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
     91 
     92 # endif
     93 }
     94 
     95 #endif  // GTEST_OS_WINDOWS_MOBILE
     96 
     97 TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
     98  EXPECT_TRUE(FilePath("").IsEmpty());
     99 }
    100 
    101 TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
    102  EXPECT_FALSE(FilePath("a").IsEmpty());
    103  EXPECT_FALSE(FilePath(".").IsEmpty());
    104  EXPECT_FALSE(FilePath("a/b").IsEmpty());
    105  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
    106 }
    107 
    108 // RemoveDirectoryName "" -> ""
    109 TEST(RemoveDirectoryNameTest, WhenEmptyName) {
    110  EXPECT_EQ("", FilePath("").RemoveDirectoryName().string());
    111 }
    112 
    113 // RemoveDirectoryName "afile" -> "afile"
    114 TEST(RemoveDirectoryNameTest, ButNoDirectory) {
    115  EXPECT_EQ("afile",
    116      FilePath("afile").RemoveDirectoryName().string());
    117 }
    118 
    119 // RemoveDirectoryName "/afile" -> "afile"
    120 TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
    121  EXPECT_EQ("afile",
    122      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
    123 }
    124 
    125 // RemoveDirectoryName "adir/" -> ""
    126 TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
    127  EXPECT_EQ("",
    128      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().string());
    129 }
    130 
    131 // RemoveDirectoryName "adir/afile" -> "afile"
    132 TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
    133  EXPECT_EQ("afile",
    134      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
    135 }
    136 
    137 // RemoveDirectoryName "adir/subdir/afile" -> "afile"
    138 TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
    139  EXPECT_EQ("afile",
    140      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
    141      .RemoveDirectoryName().string());
    142 }
    143 
    144 #if GTEST_HAS_ALT_PATH_SEP_
    145 
    146 // Tests that RemoveDirectoryName() works with the alternate separator
    147 // on Windows.
    148 
    149 // RemoveDirectoryName("/afile") -> "afile"
    150 TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
    151  EXPECT_EQ("afile", FilePath("/afile").RemoveDirectoryName().string());
    152 }
    153 
    154 // RemoveDirectoryName("adir/") -> ""
    155 TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
    156  EXPECT_EQ("", FilePath("adir/").RemoveDirectoryName().string());
    157 }
    158 
    159 // RemoveDirectoryName("adir/afile") -> "afile"
    160 TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
    161  EXPECT_EQ("afile", FilePath("adir/afile").RemoveDirectoryName().string());
    162 }
    163 
    164 // RemoveDirectoryName("adir/subdir/afile") -> "afile"
    165 TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
    166  EXPECT_EQ("afile",
    167            FilePath("adir/subdir/afile").RemoveDirectoryName().string());
    168 }
    169 
    170 #endif
    171 
    172 // RemoveFileName "" -> "./"
    173 TEST(RemoveFileNameTest, EmptyName) {
    174 #if GTEST_OS_WINDOWS_MOBILE
    175  // On Windows CE, we use the root as the current directory.
    176  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
    177 #else
    178  EXPECT_EQ("." GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
    179 #endif
    180 }
    181 
    182 // RemoveFileName "adir/" -> "adir/"
    183 TEST(RemoveFileNameTest, ButNoFile) {
    184  EXPECT_EQ("adir" GTEST_PATH_SEP_,
    185      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().string());
    186 }
    187 
    188 // RemoveFileName "adir/afile" -> "adir/"
    189 TEST(RemoveFileNameTest, GivesDirName) {
    190  EXPECT_EQ("adir" GTEST_PATH_SEP_,
    191            FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveFileName().string());
    192 }
    193 
    194 // RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
    195 TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
    196  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
    197      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
    198      .RemoveFileName().string());
    199 }
    200 
    201 // RemoveFileName "/afile" -> "/"
    202 TEST(RemoveFileNameTest, GivesRootDir) {
    203  EXPECT_EQ(GTEST_PATH_SEP_,
    204      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().string());
    205 }
    206 
    207 #if GTEST_HAS_ALT_PATH_SEP_
    208 
    209 // Tests that RemoveFileName() works with the alternate separator on
    210 // Windows.
    211 
    212 // RemoveFileName("adir/") -> "adir/"
    213 TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
    214  EXPECT_EQ("adir" GTEST_PATH_SEP_,
    215            FilePath("adir/").RemoveFileName().string());
    216 }
    217 
    218 // RemoveFileName("adir/afile") -> "adir/"
    219 TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
    220  EXPECT_EQ("adir" GTEST_PATH_SEP_,
    221            FilePath("adir/afile").RemoveFileName().string());
    222 }
    223 
    224 // RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
    225 TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
    226  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
    227            FilePath("adir/subdir/afile").RemoveFileName().string());
    228 }
    229 
    230 // RemoveFileName("/afile") -> "\"
    231 TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
    232  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("/afile").RemoveFileName().string());
    233 }
    234 
    235 #endif
    236 
    237 TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
    238  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
    239      0, "xml");
    240  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
    241 }
    242 
    243 TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
    244  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
    245      12, "xml");
    246  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
    247 }
    248 
    249 TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
    250  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
    251      FilePath("bar"), 0, "xml");
    252  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
    253 }
    254 
    255 TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
    256  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
    257      FilePath("bar"), 12, "xml");
    258  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
    259 }
    260 
    261 TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
    262  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
    263      0, "xml");
    264  EXPECT_EQ("bar.xml", actual.string());
    265 }
    266 
    267 TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
    268  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
    269      14, "xml");
    270  EXPECT_EQ("bar_14.xml", actual.string());
    271 }
    272 
    273 TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
    274  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
    275                                          FilePath("bar.xml"));
    276  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
    277 }
    278 
    279 TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
    280  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
    281                                          FilePath("bar.xml"));
    282  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
    283 }
    284 
    285 TEST(ConcatPathsTest, Path1BeingEmpty) {
    286  FilePath actual = FilePath::ConcatPaths(FilePath(""),
    287                                          FilePath("bar.xml"));
    288  EXPECT_EQ("bar.xml", actual.string());
    289 }
    290 
    291 TEST(ConcatPathsTest, Path2BeingEmpty) {
    292  FilePath actual = FilePath::ConcatPaths(FilePath("foo"), FilePath(""));
    293  EXPECT_EQ("foo" GTEST_PATH_SEP_, actual.string());
    294 }
    295 
    296 TEST(ConcatPathsTest, BothPathBeingEmpty) {
    297  FilePath actual = FilePath::ConcatPaths(FilePath(""),
    298                                          FilePath(""));
    299  EXPECT_EQ("", actual.string());
    300 }
    301 
    302 TEST(ConcatPathsTest, Path1ContainsPathSep) {
    303  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
    304                                          FilePath("foobar.xml"));
    305  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
    306            actual.string());
    307 }
    308 
    309 TEST(ConcatPathsTest, Path2ContainsPathSep) {
    310  FilePath actual = FilePath::ConcatPaths(
    311      FilePath("foo" GTEST_PATH_SEP_),
    312      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
    313  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
    314            actual.string());
    315 }
    316 
    317 TEST(ConcatPathsTest, Path2EndsWithPathSep) {
    318  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
    319                                          FilePath("bar" GTEST_PATH_SEP_));
    320  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.string());
    321 }
    322 
    323 // RemoveTrailingPathSeparator "" -> ""
    324 TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
    325  EXPECT_EQ("", FilePath("").RemoveTrailingPathSeparator().string());
    326 }
    327 
    328 // RemoveTrailingPathSeparator "foo" -> "foo"
    329 TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
    330  EXPECT_EQ("foo", FilePath("foo").RemoveTrailingPathSeparator().string());
    331 }
    332 
    333 // RemoveTrailingPathSeparator "foo/" -> "foo"
    334 TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
    335  EXPECT_EQ("foo",
    336      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());
    337 #if GTEST_HAS_ALT_PATH_SEP_
    338  EXPECT_EQ("foo", FilePath("foo/").RemoveTrailingPathSeparator().string());
    339 #endif
    340 }
    341 
    342 // RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
    343 TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
    344  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
    345            FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
    346                .RemoveTrailingPathSeparator().string());
    347 }
    348 
    349 // RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
    350 TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
    351  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
    352            FilePath("foo" GTEST_PATH_SEP_ "bar")
    353                .RemoveTrailingPathSeparator().string());
    354 }
    355 
    356 TEST(DirectoryTest, RootDirectoryExists) {
    357 #if GTEST_OS_WINDOWS  // We are on Windows.
    358  char current_drive[_MAX_PATH];  // NOLINT
    359  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
    360  current_drive[1] = ':';
    361  current_drive[2] = '\\';
    362  current_drive[3] = '\0';
    363  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
    364 #else
    365  EXPECT_TRUE(FilePath("/").DirectoryExists());
    366 #endif  // GTEST_OS_WINDOWS
    367 }
    368 
    369 #if GTEST_OS_WINDOWS
    370 TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
    371  const int saved_drive_ = _getdrive();
    372  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
    373  for (char drive = 'Z'; drive >= 'A'; drive--)
    374    if (_chdrive(drive - 'A' + 1) == -1) {
    375      char non_drive[_MAX_PATH];  // NOLINT
    376      non_drive[0] = drive;
    377      non_drive[1] = ':';
    378      non_drive[2] = '\\';
    379      non_drive[3] = '\0';
    380      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
    381      break;
    382    }
    383  _chdrive(saved_drive_);
    384 }
    385 #endif  // GTEST_OS_WINDOWS
    386 
    387 #if !GTEST_OS_WINDOWS_MOBILE
    388 // Windows CE _does_ consider an empty directory to exist.
    389 TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
    390  EXPECT_FALSE(FilePath("").DirectoryExists());
    391 }
    392 #endif  // !GTEST_OS_WINDOWS_MOBILE
    393 
    394 TEST(DirectoryTest, CurrentDirectoryExists) {
    395 #if GTEST_OS_WINDOWS  // We are on Windows.
    396 # ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
    397 
    398  EXPECT_TRUE(FilePath(".").DirectoryExists());
    399  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
    400 
    401 # endif  // _WIN32_CE
    402 #else
    403  EXPECT_TRUE(FilePath(".").DirectoryExists());
    404  EXPECT_TRUE(FilePath("./").DirectoryExists());
    405 #endif  // GTEST_OS_WINDOWS
    406 }
    407 
    408 // "foo/bar" == foo//bar" == "foo///bar"
    409 TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
    410  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
    411            FilePath("foo" GTEST_PATH_SEP_ "bar").string());
    412  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
    413            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
    414  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
    415            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
    416                     GTEST_PATH_SEP_ "bar").string());
    417 }
    418 
    419 // "/bar" == //bar" == "///bar"
    420 TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
    421  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
    422    FilePath(GTEST_PATH_SEP_ "bar").string());
    423  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
    424    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
    425  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
    426    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
    427 }
    428 
    429 // "foo/" == foo//" == "foo///"
    430 TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
    431  EXPECT_EQ("foo" GTEST_PATH_SEP_,
    432    FilePath("foo" GTEST_PATH_SEP_).string());
    433  EXPECT_EQ("foo" GTEST_PATH_SEP_,
    434    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
    435  EXPECT_EQ("foo" GTEST_PATH_SEP_,
    436    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
    437 }
    438 
    439 #if GTEST_HAS_ALT_PATH_SEP_
    440 
    441 // Tests that separators at the end of the string are normalized
    442 // regardless of their combination (e.g. "foo\" =="foo/\" ==
    443 // "foo\\/").
    444 TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
    445  EXPECT_EQ("foo" GTEST_PATH_SEP_,
    446            FilePath("foo/").string());
    447  EXPECT_EQ("foo" GTEST_PATH_SEP_,
    448            FilePath("foo" GTEST_PATH_SEP_ "/").string());
    449  EXPECT_EQ("foo" GTEST_PATH_SEP_,
    450            FilePath("foo//" GTEST_PATH_SEP_).string());
    451 }
    452 
    453 #endif
    454 
    455 TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
    456  FilePath default_path;
    457  FilePath non_default_path("path");
    458  non_default_path = default_path;
    459  EXPECT_EQ("", non_default_path.string());
    460  EXPECT_EQ("", default_path.string());  // RHS var is unchanged.
    461 }
    462 
    463 TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
    464  FilePath non_default_path("path");
    465  FilePath default_path;
    466  default_path = non_default_path;
    467  EXPECT_EQ("path", default_path.string());
    468  EXPECT_EQ("path", non_default_path.string());  // RHS var is unchanged.
    469 }
    470 
    471 TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
    472  const FilePath const_default_path("const_path");
    473  FilePath non_default_path("path");
    474  non_default_path = const_default_path;
    475  EXPECT_EQ("const_path", non_default_path.string());
    476 }
    477 
    478 class DirectoryCreationTest : public Test {
    479 protected:
    480  void SetUp() override {
    481    testdata_path_.Set(FilePath(
    482        TempDir() + GetCurrentExecutableName().string() +
    483        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_));
    484    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
    485 
    486    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
    487        0, "txt"));
    488    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
    489        1, "txt"));
    490 
    491    remove(testdata_file_.c_str());
    492    remove(unique_file0_.c_str());
    493    remove(unique_file1_.c_str());
    494    posix::RmDir(testdata_path_.c_str());
    495  }
    496 
    497  void TearDown() override {
    498    remove(testdata_file_.c_str());
    499    remove(unique_file0_.c_str());
    500    remove(unique_file1_.c_str());
    501    posix::RmDir(testdata_path_.c_str());
    502  }
    503 
    504  void CreateTextFile(const char* filename) {
    505    FILE* f = posix::FOpen(filename, "w");
    506    fprintf(f, "text\n");
    507    fclose(f);
    508  }
    509 
    510  // Strings representing a directory and a file, with identical paths
    511  // except for the trailing separator character that distinquishes
    512  // a directory named 'test' from a file named 'test'. Example names:
    513  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
    514  FilePath testdata_file_;  // "/tmp/directory_creation/test"
    515  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
    516  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
    517 };
    518 
    519 TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
    520  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
    521  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
    522  EXPECT_TRUE(testdata_path_.DirectoryExists());
    523 }
    524 
    525 TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
    526  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
    527  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
    528  // Call 'create' again... should still succeed.
    529  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
    530 }
    531 
    532 TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
    533  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
    534      FilePath("unique"), "txt"));
    535  EXPECT_EQ(unique_file0_.string(), file_path.string());
    536  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
    537 
    538  testdata_path_.CreateDirectoriesRecursively();
    539  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
    540  CreateTextFile(file_path.c_str());
    541  EXPECT_TRUE(file_path.FileOrDirectoryExists());
    542 
    543  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
    544      FilePath("unique"), "txt"));
    545  EXPECT_EQ(unique_file1_.string(), file_path2.string());
    546  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
    547  CreateTextFile(file_path2.c_str());
    548  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
    549 }
    550 
    551 TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
    552  // force a failure by putting a file where we will try to create a directory.
    553  CreateTextFile(testdata_file_.c_str());
    554  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
    555  EXPECT_FALSE(testdata_file_.DirectoryExists());
    556  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
    557 }
    558 
    559 TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
    560  const FilePath test_detail_xml("test_detail.xml");
    561  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
    562 }
    563 
    564 TEST(FilePathTest, DefaultConstructor) {
    565  FilePath fp;
    566  EXPECT_EQ("", fp.string());
    567 }
    568 
    569 TEST(FilePathTest, CharAndCopyConstructors) {
    570  const FilePath fp("spicy");
    571  EXPECT_EQ("spicy", fp.string());
    572 
    573  const FilePath fp_copy(fp);
    574  EXPECT_EQ("spicy", fp_copy.string());
    575 }
    576 
    577 TEST(FilePathTest, StringConstructor) {
    578  const FilePath fp(std::string("cider"));
    579  EXPECT_EQ("cider", fp.string());
    580 }
    581 
    582 TEST(FilePathTest, Set) {
    583  const FilePath apple("apple");
    584  FilePath mac("mac");
    585  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
    586  EXPECT_EQ("apple", mac.string());
    587  EXPECT_EQ("apple", apple.string());
    588 }
    589 
    590 TEST(FilePathTest, ToString) {
    591  const FilePath file("drink");
    592  EXPECT_EQ("drink", file.string());
    593 }
    594 
    595 TEST(FilePathTest, RemoveExtension) {
    596  EXPECT_EQ("app", FilePath("app.cc").RemoveExtension("cc").string());
    597  EXPECT_EQ("app", FilePath("app.exe").RemoveExtension("exe").string());
    598  EXPECT_EQ("APP", FilePath("APP.EXE").RemoveExtension("exe").string());
    599 }
    600 
    601 TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
    602  EXPECT_EQ("app", FilePath("app").RemoveExtension("exe").string());
    603 }
    604 
    605 TEST(FilePathTest, IsDirectory) {
    606  EXPECT_FALSE(FilePath("cola").IsDirectory());
    607  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
    608 #if GTEST_HAS_ALT_PATH_SEP_
    609  EXPECT_TRUE(FilePath("koala/").IsDirectory());
    610 #endif
    611 }
    612 
    613 TEST(FilePathTest, IsAbsolutePath) {
    614  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
    615  EXPECT_FALSE(FilePath("").IsAbsolutePath());
    616 #if GTEST_OS_WINDOWS
    617  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
    618                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
    619  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
    620  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
    621                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
    622 #else
    623  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
    624              .IsAbsolutePath());
    625 #endif  // GTEST_OS_WINDOWS
    626 }
    627 
    628 TEST(FilePathTest, IsRootDirectory) {
    629 #if GTEST_OS_WINDOWS
    630  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
    631  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
    632  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
    633  EXPECT_FALSE(FilePath("").IsRootDirectory());
    634  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
    635  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
    636  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
    637  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
    638 #else
    639  EXPECT_TRUE(FilePath("/").IsRootDirectory());
    640  EXPECT_TRUE(FilePath("//").IsRootDirectory());
    641  EXPECT_FALSE(FilePath("").IsRootDirectory());
    642  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
    643  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
    644 #endif
    645 }
    646 
    647 }  // namespace
    648 }  // namespace internal
    649 }  // namespace testing