113481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Authors: keith.ray@gmail.com (Keith Ray)
3113481Sgiacomo.travaglini@arm.com//
3213481Sgiacomo.travaglini@arm.com// Google Test filepath utilities
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// This file tests classes and functions used internally by
3513481Sgiacomo.travaglini@arm.com// Google Test.  They are subject to change without notice.
3613481Sgiacomo.travaglini@arm.com//
3713481Sgiacomo.travaglini@arm.com// This file is #included from gtest_unittest.cc, to avoid changing
3813481Sgiacomo.travaglini@arm.com// build or make-files for some existing Google Test clients. Do not
3913481Sgiacomo.travaglini@arm.com// #include this file anywhere else!
4013481Sgiacomo.travaglini@arm.com
4113481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-filepath.h"
4213481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
4313481Sgiacomo.travaglini@arm.com
4413481Sgiacomo.travaglini@arm.com// Indicates that this translation unit is part of Google Test's
4513481Sgiacomo.travaglini@arm.com// implementation.  It must come before gtest-internal-inl.h is
4613481Sgiacomo.travaglini@arm.com// included, or there will be a compiler error.  This trick is to
4713481Sgiacomo.travaglini@arm.com// prevent a user from accidentally including gtest-internal-inl.h in
4813481Sgiacomo.travaglini@arm.com// his code.
4913481Sgiacomo.travaglini@arm.com#define GTEST_IMPLEMENTATION_ 1
5013481Sgiacomo.travaglini@arm.com#include "src/gtest-internal-inl.h"
5113481Sgiacomo.travaglini@arm.com#undef GTEST_IMPLEMENTATION_
5213481Sgiacomo.travaglini@arm.com
5313481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS_MOBILE
5413481Sgiacomo.travaglini@arm.com# include <windows.h>  // NOLINT
5513481Sgiacomo.travaglini@arm.com#elif GTEST_OS_WINDOWS
5613481Sgiacomo.travaglini@arm.com# include <direct.h>  // NOLINT
5713481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS_MOBILE
5813481Sgiacomo.travaglini@arm.com
5913481Sgiacomo.travaglini@arm.comnamespace testing {
6013481Sgiacomo.travaglini@arm.comnamespace internal {
6113481Sgiacomo.travaglini@arm.comnamespace {
6213481Sgiacomo.travaglini@arm.com
6313481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS_MOBILE
6413481Sgiacomo.travaglini@arm.com// TODO(wan@google.com): Move these to the POSIX adapter section in
6513481Sgiacomo.travaglini@arm.com// gtest-port.h.
6613481Sgiacomo.travaglini@arm.com
6713481Sgiacomo.travaglini@arm.com// Windows CE doesn't have the remove C function.
6813481Sgiacomo.travaglini@arm.comint remove(const char* path) {
6913481Sgiacomo.travaglini@arm.com  LPCWSTR wpath = String::AnsiToUtf16(path);
7013481Sgiacomo.travaglini@arm.com  int ret = DeleteFile(wpath) ? 0 : -1;
7113481Sgiacomo.travaglini@arm.com  delete [] wpath;
7213481Sgiacomo.travaglini@arm.com  return ret;
7313481Sgiacomo.travaglini@arm.com}
7413481Sgiacomo.travaglini@arm.com// Windows CE doesn't have the _rmdir C function.
7513481Sgiacomo.travaglini@arm.comint _rmdir(const char* path) {
7613481Sgiacomo.travaglini@arm.com  FilePath filepath(path);
7713481Sgiacomo.travaglini@arm.com  LPCWSTR wpath = String::AnsiToUtf16(
7813481Sgiacomo.travaglini@arm.com      filepath.RemoveTrailingPathSeparator().c_str());
7913481Sgiacomo.travaglini@arm.com  int ret = RemoveDirectory(wpath) ? 0 : -1;
8013481Sgiacomo.travaglini@arm.com  delete [] wpath;
8113481Sgiacomo.travaglini@arm.com  return ret;
8213481Sgiacomo.travaglini@arm.com}
8313481Sgiacomo.travaglini@arm.com
8413481Sgiacomo.travaglini@arm.com#else
8513481Sgiacomo.travaglini@arm.com
8613481Sgiacomo.travaglini@arm.comTEST(GetCurrentDirTest, ReturnsCurrentDir) {
8713481Sgiacomo.travaglini@arm.com  const FilePath original_dir = FilePath::GetCurrentDir();
8813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(original_dir.IsEmpty());
8913481Sgiacomo.travaglini@arm.com
9013481Sgiacomo.travaglini@arm.com  posix::ChDir(GTEST_PATH_SEP_);
9113481Sgiacomo.travaglini@arm.com  const FilePath cwd = FilePath::GetCurrentDir();
9213481Sgiacomo.travaglini@arm.com  posix::ChDir(original_dir.c_str());
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.com# if GTEST_OS_WINDOWS
9513481Sgiacomo.travaglini@arm.com
9613481Sgiacomo.travaglini@arm.com  // Skips the ":".
9713481Sgiacomo.travaglini@arm.com  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
9813481Sgiacomo.travaglini@arm.com  ASSERT_TRUE(cwd_without_drive != NULL);
9913481Sgiacomo.travaglini@arm.com  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
10013481Sgiacomo.travaglini@arm.com
10113481Sgiacomo.travaglini@arm.com# else
10213481Sgiacomo.travaglini@arm.com
10313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
10413481Sgiacomo.travaglini@arm.com
10513481Sgiacomo.travaglini@arm.com# endif
10613481Sgiacomo.travaglini@arm.com}
10713481Sgiacomo.travaglini@arm.com
10813481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS_MOBILE
10913481Sgiacomo.travaglini@arm.com
11013481Sgiacomo.travaglini@arm.comTEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
11113481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("").IsEmpty());
11213481Sgiacomo.travaglini@arm.com}
11313481Sgiacomo.travaglini@arm.com
11413481Sgiacomo.travaglini@arm.comTEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
11513481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("a").IsEmpty());
11613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath(".").IsEmpty());
11713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("a/b").IsEmpty());
11813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
11913481Sgiacomo.travaglini@arm.com}
12013481Sgiacomo.travaglini@arm.com
12113481Sgiacomo.travaglini@arm.com// RemoveDirectoryName "" -> ""
12213481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, WhenEmptyName) {
12313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", FilePath("").RemoveDirectoryName().string());
12413481Sgiacomo.travaglini@arm.com}
12513481Sgiacomo.travaglini@arm.com
12613481Sgiacomo.travaglini@arm.com// RemoveDirectoryName "afile" -> "afile"
12713481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, ButNoDirectory) {
12813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("afile",
12913481Sgiacomo.travaglini@arm.com      FilePath("afile").RemoveDirectoryName().string());
13013481Sgiacomo.travaglini@arm.com}
13113481Sgiacomo.travaglini@arm.com
13213481Sgiacomo.travaglini@arm.com// RemoveDirectoryName "/afile" -> "afile"
13313481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
13413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("afile",
13513481Sgiacomo.travaglini@arm.com      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
13613481Sgiacomo.travaglini@arm.com}
13713481Sgiacomo.travaglini@arm.com
13813481Sgiacomo.travaglini@arm.com// RemoveDirectoryName "adir/" -> ""
13913481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
14013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("",
14113481Sgiacomo.travaglini@arm.com      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().string());
14213481Sgiacomo.travaglini@arm.com}
14313481Sgiacomo.travaglini@arm.com
14413481Sgiacomo.travaglini@arm.com// RemoveDirectoryName "adir/afile" -> "afile"
14513481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
14613481Sgiacomo.travaglini@arm.com  EXPECT_EQ("afile",
14713481Sgiacomo.travaglini@arm.com      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
14813481Sgiacomo.travaglini@arm.com}
14913481Sgiacomo.travaglini@arm.com
15013481Sgiacomo.travaglini@arm.com// RemoveDirectoryName "adir/subdir/afile" -> "afile"
15113481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
15213481Sgiacomo.travaglini@arm.com  EXPECT_EQ("afile",
15313481Sgiacomo.travaglini@arm.com      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
15413481Sgiacomo.travaglini@arm.com      .RemoveDirectoryName().string());
15513481Sgiacomo.travaglini@arm.com}
15613481Sgiacomo.travaglini@arm.com
15713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_ALT_PATH_SEP_
15813481Sgiacomo.travaglini@arm.com
15913481Sgiacomo.travaglini@arm.com// Tests that RemoveDirectoryName() works with the alternate separator
16013481Sgiacomo.travaglini@arm.com// on Windows.
16113481Sgiacomo.travaglini@arm.com
16213481Sgiacomo.travaglini@arm.com// RemoveDirectoryName("/afile") -> "afile"
16313481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
16413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("afile", FilePath("/afile").RemoveDirectoryName().string());
16513481Sgiacomo.travaglini@arm.com}
16613481Sgiacomo.travaglini@arm.com
16713481Sgiacomo.travaglini@arm.com// RemoveDirectoryName("adir/") -> ""
16813481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
16913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", FilePath("adir/").RemoveDirectoryName().string());
17013481Sgiacomo.travaglini@arm.com}
17113481Sgiacomo.travaglini@arm.com
17213481Sgiacomo.travaglini@arm.com// RemoveDirectoryName("adir/afile") -> "afile"
17313481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
17413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("afile", FilePath("adir/afile").RemoveDirectoryName().string());
17513481Sgiacomo.travaglini@arm.com}
17613481Sgiacomo.travaglini@arm.com
17713481Sgiacomo.travaglini@arm.com// RemoveDirectoryName("adir/subdir/afile") -> "afile"
17813481Sgiacomo.travaglini@arm.comTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
17913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("afile",
18013481Sgiacomo.travaglini@arm.com            FilePath("adir/subdir/afile").RemoveDirectoryName().string());
18113481Sgiacomo.travaglini@arm.com}
18213481Sgiacomo.travaglini@arm.com
18313481Sgiacomo.travaglini@arm.com#endif
18413481Sgiacomo.travaglini@arm.com
18513481Sgiacomo.travaglini@arm.com// RemoveFileName "" -> "./"
18613481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, EmptyName) {
18713481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS_MOBILE
18813481Sgiacomo.travaglini@arm.com  // On Windows CE, we use the root as the current directory.
18913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
19013481Sgiacomo.travaglini@arm.com#else
19113481Sgiacomo.travaglini@arm.com  EXPECT_EQ("." GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
19213481Sgiacomo.travaglini@arm.com#endif
19313481Sgiacomo.travaglini@arm.com}
19413481Sgiacomo.travaglini@arm.com
19513481Sgiacomo.travaglini@arm.com// RemoveFileName "adir/" -> "adir/"
19613481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, ButNoFile) {
19713481Sgiacomo.travaglini@arm.com  EXPECT_EQ("adir" GTEST_PATH_SEP_,
19813481Sgiacomo.travaglini@arm.com      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().string());
19913481Sgiacomo.travaglini@arm.com}
20013481Sgiacomo.travaglini@arm.com
20113481Sgiacomo.travaglini@arm.com// RemoveFileName "adir/afile" -> "adir/"
20213481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, GivesDirName) {
20313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("adir" GTEST_PATH_SEP_,
20413481Sgiacomo.travaglini@arm.com            FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveFileName().string());
20513481Sgiacomo.travaglini@arm.com}
20613481Sgiacomo.travaglini@arm.com
20713481Sgiacomo.travaglini@arm.com// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
20813481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, GivesDirAndSubDirName) {
20913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
21013481Sgiacomo.travaglini@arm.com      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
21113481Sgiacomo.travaglini@arm.com      .RemoveFileName().string());
21213481Sgiacomo.travaglini@arm.com}
21313481Sgiacomo.travaglini@arm.com
21413481Sgiacomo.travaglini@arm.com// RemoveFileName "/afile" -> "/"
21513481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, GivesRootDir) {
21613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GTEST_PATH_SEP_,
21713481Sgiacomo.travaglini@arm.com      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().string());
21813481Sgiacomo.travaglini@arm.com}
21913481Sgiacomo.travaglini@arm.com
22013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_ALT_PATH_SEP_
22113481Sgiacomo.travaglini@arm.com
22213481Sgiacomo.travaglini@arm.com// Tests that RemoveFileName() works with the alternate separator on
22313481Sgiacomo.travaglini@arm.com// Windows.
22413481Sgiacomo.travaglini@arm.com
22513481Sgiacomo.travaglini@arm.com// RemoveFileName("adir/") -> "adir/"
22613481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
22713481Sgiacomo.travaglini@arm.com  EXPECT_EQ("adir" GTEST_PATH_SEP_,
22813481Sgiacomo.travaglini@arm.com            FilePath("adir/").RemoveFileName().string());
22913481Sgiacomo.travaglini@arm.com}
23013481Sgiacomo.travaglini@arm.com
23113481Sgiacomo.travaglini@arm.com// RemoveFileName("adir/afile") -> "adir/"
23213481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
23313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("adir" GTEST_PATH_SEP_,
23413481Sgiacomo.travaglini@arm.com            FilePath("adir/afile").RemoveFileName().string());
23513481Sgiacomo.travaglini@arm.com}
23613481Sgiacomo.travaglini@arm.com
23713481Sgiacomo.travaglini@arm.com// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
23813481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
23913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
24013481Sgiacomo.travaglini@arm.com            FilePath("adir/subdir/afile").RemoveFileName().string());
24113481Sgiacomo.travaglini@arm.com}
24213481Sgiacomo.travaglini@arm.com
24313481Sgiacomo.travaglini@arm.com// RemoveFileName("/afile") -> "\"
24413481Sgiacomo.travaglini@arm.comTEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
24513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("/afile").RemoveFileName().string());
24613481Sgiacomo.travaglini@arm.com}
24713481Sgiacomo.travaglini@arm.com
24813481Sgiacomo.travaglini@arm.com#endif
24913481Sgiacomo.travaglini@arm.com
25013481Sgiacomo.travaglini@arm.comTEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
25113481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
25213481Sgiacomo.travaglini@arm.com      0, "xml");
25313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
25413481Sgiacomo.travaglini@arm.com}
25513481Sgiacomo.travaglini@arm.com
25613481Sgiacomo.travaglini@arm.comTEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
25713481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
25813481Sgiacomo.travaglini@arm.com      12, "xml");
25913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
26013481Sgiacomo.travaglini@arm.com}
26113481Sgiacomo.travaglini@arm.com
26213481Sgiacomo.travaglini@arm.comTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
26313481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
26413481Sgiacomo.travaglini@arm.com      FilePath("bar"), 0, "xml");
26513481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
26613481Sgiacomo.travaglini@arm.com}
26713481Sgiacomo.travaglini@arm.com
26813481Sgiacomo.travaglini@arm.comTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
26913481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
27013481Sgiacomo.travaglini@arm.com      FilePath("bar"), 12, "xml");
27113481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
27213481Sgiacomo.travaglini@arm.com}
27313481Sgiacomo.travaglini@arm.com
27413481Sgiacomo.travaglini@arm.comTEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
27513481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
27613481Sgiacomo.travaglini@arm.com      0, "xml");
27713481Sgiacomo.travaglini@arm.com  EXPECT_EQ("bar.xml", actual.string());
27813481Sgiacomo.travaglini@arm.com}
27913481Sgiacomo.travaglini@arm.com
28013481Sgiacomo.travaglini@arm.comTEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
28113481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
28213481Sgiacomo.travaglini@arm.com      14, "xml");
28313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("bar_14.xml", actual.string());
28413481Sgiacomo.travaglini@arm.com}
28513481Sgiacomo.travaglini@arm.com
28613481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
28713481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
28813481Sgiacomo.travaglini@arm.com                                          FilePath("bar.xml"));
28913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
29013481Sgiacomo.travaglini@arm.com}
29113481Sgiacomo.travaglini@arm.com
29213481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
29313481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
29413481Sgiacomo.travaglini@arm.com                                          FilePath("bar.xml"));
29513481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
29613481Sgiacomo.travaglini@arm.com}
29713481Sgiacomo.travaglini@arm.com
29813481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, Path1BeingEmpty) {
29913481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(FilePath(""),
30013481Sgiacomo.travaglini@arm.com                                          FilePath("bar.xml"));
30113481Sgiacomo.travaglini@arm.com  EXPECT_EQ("bar.xml", actual.string());
30213481Sgiacomo.travaglini@arm.com}
30313481Sgiacomo.travaglini@arm.com
30413481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, Path2BeingEmpty) {
30513481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(FilePath("foo"), FilePath(""));
30613481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_, actual.string());
30713481Sgiacomo.travaglini@arm.com}
30813481Sgiacomo.travaglini@arm.com
30913481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, BothPathBeingEmpty) {
31013481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(FilePath(""),
31113481Sgiacomo.travaglini@arm.com                                          FilePath(""));
31213481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", actual.string());
31313481Sgiacomo.travaglini@arm.com}
31413481Sgiacomo.travaglini@arm.com
31513481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, Path1ContainsPathSep) {
31613481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
31713481Sgiacomo.travaglini@arm.com                                          FilePath("foobar.xml"));
31813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
31913481Sgiacomo.travaglini@arm.com            actual.string());
32013481Sgiacomo.travaglini@arm.com}
32113481Sgiacomo.travaglini@arm.com
32213481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, Path2ContainsPathSep) {
32313481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(
32413481Sgiacomo.travaglini@arm.com      FilePath("foo" GTEST_PATH_SEP_),
32513481Sgiacomo.travaglini@arm.com      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
32613481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
32713481Sgiacomo.travaglini@arm.com            actual.string());
32813481Sgiacomo.travaglini@arm.com}
32913481Sgiacomo.travaglini@arm.com
33013481Sgiacomo.travaglini@arm.comTEST(ConcatPathsTest, Path2EndsWithPathSep) {
33113481Sgiacomo.travaglini@arm.com  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
33213481Sgiacomo.travaglini@arm.com                                          FilePath("bar" GTEST_PATH_SEP_));
33313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.string());
33413481Sgiacomo.travaglini@arm.com}
33513481Sgiacomo.travaglini@arm.com
33613481Sgiacomo.travaglini@arm.com// RemoveTrailingPathSeparator "" -> ""
33713481Sgiacomo.travaglini@arm.comTEST(RemoveTrailingPathSeparatorTest, EmptyString) {
33813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", FilePath("").RemoveTrailingPathSeparator().string());
33913481Sgiacomo.travaglini@arm.com}
34013481Sgiacomo.travaglini@arm.com
34113481Sgiacomo.travaglini@arm.com// RemoveTrailingPathSeparator "foo" -> "foo"
34213481Sgiacomo.travaglini@arm.comTEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
34313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo", FilePath("foo").RemoveTrailingPathSeparator().string());
34413481Sgiacomo.travaglini@arm.com}
34513481Sgiacomo.travaglini@arm.com
34613481Sgiacomo.travaglini@arm.com// RemoveTrailingPathSeparator "foo/" -> "foo"
34713481Sgiacomo.travaglini@arm.comTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
34813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo",
34913481Sgiacomo.travaglini@arm.com      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());
35013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_ALT_PATH_SEP_
35113481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo", FilePath("foo/").RemoveTrailingPathSeparator().string());
35213481Sgiacomo.travaglini@arm.com#endif
35313481Sgiacomo.travaglini@arm.com}
35413481Sgiacomo.travaglini@arm.com
35513481Sgiacomo.travaglini@arm.com// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
35613481Sgiacomo.travaglini@arm.comTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
35713481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
35813481Sgiacomo.travaglini@arm.com            FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
35913481Sgiacomo.travaglini@arm.com                .RemoveTrailingPathSeparator().string());
36013481Sgiacomo.travaglini@arm.com}
36113481Sgiacomo.travaglini@arm.com
36213481Sgiacomo.travaglini@arm.com// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
36313481Sgiacomo.travaglini@arm.comTEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
36413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
36513481Sgiacomo.travaglini@arm.com            FilePath("foo" GTEST_PATH_SEP_ "bar")
36613481Sgiacomo.travaglini@arm.com                .RemoveTrailingPathSeparator().string());
36713481Sgiacomo.travaglini@arm.com}
36813481Sgiacomo.travaglini@arm.com
36913481Sgiacomo.travaglini@arm.comTEST(DirectoryTest, RootDirectoryExists) {
37013481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS  // We are on Windows.
37113481Sgiacomo.travaglini@arm.com  char current_drive[_MAX_PATH];  // NOLINT
37213481Sgiacomo.travaglini@arm.com  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
37313481Sgiacomo.travaglini@arm.com  current_drive[1] = ':';
37413481Sgiacomo.travaglini@arm.com  current_drive[2] = '\\';
37513481Sgiacomo.travaglini@arm.com  current_drive[3] = '\0';
37613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
37713481Sgiacomo.travaglini@arm.com#else
37813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("/").DirectoryExists());
37913481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
38013481Sgiacomo.travaglini@arm.com}
38113481Sgiacomo.travaglini@arm.com
38213481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
38313481Sgiacomo.travaglini@arm.comTEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
38413481Sgiacomo.travaglini@arm.com  const int saved_drive_ = _getdrive();
38513481Sgiacomo.travaglini@arm.com  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
38613481Sgiacomo.travaglini@arm.com  for (char drive = 'Z'; drive >= 'A'; drive--)
38713481Sgiacomo.travaglini@arm.com    if (_chdrive(drive - 'A' + 1) == -1) {
38813481Sgiacomo.travaglini@arm.com      char non_drive[_MAX_PATH];  // NOLINT
38913481Sgiacomo.travaglini@arm.com      non_drive[0] = drive;
39013481Sgiacomo.travaglini@arm.com      non_drive[1] = ':';
39113481Sgiacomo.travaglini@arm.com      non_drive[2] = '\\';
39213481Sgiacomo.travaglini@arm.com      non_drive[3] = '\0';
39313481Sgiacomo.travaglini@arm.com      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
39413481Sgiacomo.travaglini@arm.com      break;
39513481Sgiacomo.travaglini@arm.com    }
39613481Sgiacomo.travaglini@arm.com  _chdrive(saved_drive_);
39713481Sgiacomo.travaglini@arm.com}
39813481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
39913481Sgiacomo.travaglini@arm.com
40013481Sgiacomo.travaglini@arm.com#if !GTEST_OS_WINDOWS_MOBILE
40113481Sgiacomo.travaglini@arm.com// Windows CE _does_ consider an empty directory to exist.
40213481Sgiacomo.travaglini@arm.comTEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
40313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("").DirectoryExists());
40413481Sgiacomo.travaglini@arm.com}
40513481Sgiacomo.travaglini@arm.com#endif  // !GTEST_OS_WINDOWS_MOBILE
40613481Sgiacomo.travaglini@arm.com
40713481Sgiacomo.travaglini@arm.comTEST(DirectoryTest, CurrentDirectoryExists) {
40813481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS  // We are on Windows.
40913481Sgiacomo.travaglini@arm.com# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
41013481Sgiacomo.travaglini@arm.com
41113481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath(".").DirectoryExists());
41213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
41313481Sgiacomo.travaglini@arm.com
41413481Sgiacomo.travaglini@arm.com# endif  // _WIN32_CE
41513481Sgiacomo.travaglini@arm.com#else
41613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath(".").DirectoryExists());
41713481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("./").DirectoryExists());
41813481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
41913481Sgiacomo.travaglini@arm.com}
42013481Sgiacomo.travaglini@arm.com
42113481Sgiacomo.travaglini@arm.com// "foo/bar" == foo//bar" == "foo///bar"
42213481Sgiacomo.travaglini@arm.comTEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
42313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
42413481Sgiacomo.travaglini@arm.com            FilePath("foo" GTEST_PATH_SEP_ "bar").string());
42513481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
42613481Sgiacomo.travaglini@arm.com            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
42713481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
42813481Sgiacomo.travaglini@arm.com            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
42913481Sgiacomo.travaglini@arm.com                     GTEST_PATH_SEP_ "bar").string());
43013481Sgiacomo.travaglini@arm.com}
43113481Sgiacomo.travaglini@arm.com
43213481Sgiacomo.travaglini@arm.com// "/bar" == //bar" == "///bar"
43313481Sgiacomo.travaglini@arm.comTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
43413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
43513481Sgiacomo.travaglini@arm.com    FilePath(GTEST_PATH_SEP_ "bar").string());
43613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
43713481Sgiacomo.travaglini@arm.com    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
43813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
43913481Sgiacomo.travaglini@arm.com    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
44013481Sgiacomo.travaglini@arm.com}
44113481Sgiacomo.travaglini@arm.com
44213481Sgiacomo.travaglini@arm.com// "foo/" == foo//" == "foo///"
44313481Sgiacomo.travaglini@arm.comTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
44413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_,
44513481Sgiacomo.travaglini@arm.com    FilePath("foo" GTEST_PATH_SEP_).string());
44613481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_,
44713481Sgiacomo.travaglini@arm.com    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
44813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_,
44913481Sgiacomo.travaglini@arm.com    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
45013481Sgiacomo.travaglini@arm.com}
45113481Sgiacomo.travaglini@arm.com
45213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_ALT_PATH_SEP_
45313481Sgiacomo.travaglini@arm.com
45413481Sgiacomo.travaglini@arm.com// Tests that separators at the end of the string are normalized
45513481Sgiacomo.travaglini@arm.com// regardless of their combination (e.g. "foo\" =="foo/\" ==
45613481Sgiacomo.travaglini@arm.com// "foo\\/").
45713481Sgiacomo.travaglini@arm.comTEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
45813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_,
45913481Sgiacomo.travaglini@arm.com            FilePath("foo/").string());
46013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_,
46113481Sgiacomo.travaglini@arm.com            FilePath("foo" GTEST_PATH_SEP_ "/").string());
46213481Sgiacomo.travaglini@arm.com  EXPECT_EQ("foo" GTEST_PATH_SEP_,
46313481Sgiacomo.travaglini@arm.com            FilePath("foo//" GTEST_PATH_SEP_).string());
46413481Sgiacomo.travaglini@arm.com}
46513481Sgiacomo.travaglini@arm.com
46613481Sgiacomo.travaglini@arm.com#endif
46713481Sgiacomo.travaglini@arm.com
46813481Sgiacomo.travaglini@arm.comTEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
46913481Sgiacomo.travaglini@arm.com  FilePath default_path;
47013481Sgiacomo.travaglini@arm.com  FilePath non_default_path("path");
47113481Sgiacomo.travaglini@arm.com  non_default_path = default_path;
47213481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", non_default_path.string());
47313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", default_path.string());  // RHS var is unchanged.
47413481Sgiacomo.travaglini@arm.com}
47513481Sgiacomo.travaglini@arm.com
47613481Sgiacomo.travaglini@arm.comTEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
47713481Sgiacomo.travaglini@arm.com  FilePath non_default_path("path");
47813481Sgiacomo.travaglini@arm.com  FilePath default_path;
47913481Sgiacomo.travaglini@arm.com  default_path = non_default_path;
48013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("path", default_path.string());
48113481Sgiacomo.travaglini@arm.com  EXPECT_EQ("path", non_default_path.string());  // RHS var is unchanged.
48213481Sgiacomo.travaglini@arm.com}
48313481Sgiacomo.travaglini@arm.com
48413481Sgiacomo.travaglini@arm.comTEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
48513481Sgiacomo.travaglini@arm.com  const FilePath const_default_path("const_path");
48613481Sgiacomo.travaglini@arm.com  FilePath non_default_path("path");
48713481Sgiacomo.travaglini@arm.com  non_default_path = const_default_path;
48813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("const_path", non_default_path.string());
48913481Sgiacomo.travaglini@arm.com}
49013481Sgiacomo.travaglini@arm.com
49113481Sgiacomo.travaglini@arm.comclass DirectoryCreationTest : public Test {
49213481Sgiacomo.travaglini@arm.com protected:
49313481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
49413481Sgiacomo.travaglini@arm.com    testdata_path_.Set(FilePath(
49513481Sgiacomo.travaglini@arm.com        TempDir() + GetCurrentExecutableName().string() +
49613481Sgiacomo.travaglini@arm.com        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_));
49713481Sgiacomo.travaglini@arm.com    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
49813481Sgiacomo.travaglini@arm.com
49913481Sgiacomo.travaglini@arm.com    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
50013481Sgiacomo.travaglini@arm.com        0, "txt"));
50113481Sgiacomo.travaglini@arm.com    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
50213481Sgiacomo.travaglini@arm.com        1, "txt"));
50313481Sgiacomo.travaglini@arm.com
50413481Sgiacomo.travaglini@arm.com    remove(testdata_file_.c_str());
50513481Sgiacomo.travaglini@arm.com    remove(unique_file0_.c_str());
50613481Sgiacomo.travaglini@arm.com    remove(unique_file1_.c_str());
50713481Sgiacomo.travaglini@arm.com    posix::RmDir(testdata_path_.c_str());
50813481Sgiacomo.travaglini@arm.com  }
50913481Sgiacomo.travaglini@arm.com
51013481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
51113481Sgiacomo.travaglini@arm.com    remove(testdata_file_.c_str());
51213481Sgiacomo.travaglini@arm.com    remove(unique_file0_.c_str());
51313481Sgiacomo.travaglini@arm.com    remove(unique_file1_.c_str());
51413481Sgiacomo.travaglini@arm.com    posix::RmDir(testdata_path_.c_str());
51513481Sgiacomo.travaglini@arm.com  }
51613481Sgiacomo.travaglini@arm.com
51713481Sgiacomo.travaglini@arm.com  void CreateTextFile(const char* filename) {
51813481Sgiacomo.travaglini@arm.com    FILE* f = posix::FOpen(filename, "w");
51913481Sgiacomo.travaglini@arm.com    fprintf(f, "text\n");
52013481Sgiacomo.travaglini@arm.com    fclose(f);
52113481Sgiacomo.travaglini@arm.com  }
52213481Sgiacomo.travaglini@arm.com
52313481Sgiacomo.travaglini@arm.com  // Strings representing a directory and a file, with identical paths
52413481Sgiacomo.travaglini@arm.com  // except for the trailing separator character that distinquishes
52513481Sgiacomo.travaglini@arm.com  // a directory named 'test' from a file named 'test'. Example names:
52613481Sgiacomo.travaglini@arm.com  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
52713481Sgiacomo.travaglini@arm.com  FilePath testdata_file_;  // "/tmp/directory_creation/test"
52813481Sgiacomo.travaglini@arm.com  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
52913481Sgiacomo.travaglini@arm.com  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
53013481Sgiacomo.travaglini@arm.com};
53113481Sgiacomo.travaglini@arm.com
53213481Sgiacomo.travaglini@arm.comTEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
53313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
53413481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
53513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(testdata_path_.DirectoryExists());
53613481Sgiacomo.travaglini@arm.com}
53713481Sgiacomo.travaglini@arm.com
53813481Sgiacomo.travaglini@arm.comTEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
53913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
54013481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
54113481Sgiacomo.travaglini@arm.com  // Call 'create' again... should still succeed.
54213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
54313481Sgiacomo.travaglini@arm.com}
54413481Sgiacomo.travaglini@arm.com
54513481Sgiacomo.travaglini@arm.comTEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
54613481Sgiacomo.travaglini@arm.com  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
54713481Sgiacomo.travaglini@arm.com      FilePath("unique"), "txt"));
54813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(unique_file0_.string(), file_path.string());
54913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
55013481Sgiacomo.travaglini@arm.com
55113481Sgiacomo.travaglini@arm.com  testdata_path_.CreateDirectoriesRecursively();
55213481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
55313481Sgiacomo.travaglini@arm.com  CreateTextFile(file_path.c_str());
55413481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(file_path.FileOrDirectoryExists());
55513481Sgiacomo.travaglini@arm.com
55613481Sgiacomo.travaglini@arm.com  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
55713481Sgiacomo.travaglini@arm.com      FilePath("unique"), "txt"));
55813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(unique_file1_.string(), file_path2.string());
55913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
56013481Sgiacomo.travaglini@arm.com  CreateTextFile(file_path2.c_str());
56113481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
56213481Sgiacomo.travaglini@arm.com}
56313481Sgiacomo.travaglini@arm.com
56413481Sgiacomo.travaglini@arm.comTEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
56513481Sgiacomo.travaglini@arm.com  // force a failure by putting a file where we will try to create a directory.
56613481Sgiacomo.travaglini@arm.com  CreateTextFile(testdata_file_.c_str());
56713481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
56813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(testdata_file_.DirectoryExists());
56913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
57013481Sgiacomo.travaglini@arm.com}
57113481Sgiacomo.travaglini@arm.com
57213481Sgiacomo.travaglini@arm.comTEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
57313481Sgiacomo.travaglini@arm.com  const FilePath test_detail_xml("test_detail.xml");
57413481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
57513481Sgiacomo.travaglini@arm.com}
57613481Sgiacomo.travaglini@arm.com
57713481Sgiacomo.travaglini@arm.comTEST(FilePathTest, DefaultConstructor) {
57813481Sgiacomo.travaglini@arm.com  FilePath fp;
57913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", fp.string());
58013481Sgiacomo.travaglini@arm.com}
58113481Sgiacomo.travaglini@arm.com
58213481Sgiacomo.travaglini@arm.comTEST(FilePathTest, CharAndCopyConstructors) {
58313481Sgiacomo.travaglini@arm.com  const FilePath fp("spicy");
58413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("spicy", fp.string());
58513481Sgiacomo.travaglini@arm.com
58613481Sgiacomo.travaglini@arm.com  const FilePath fp_copy(fp);
58713481Sgiacomo.travaglini@arm.com  EXPECT_EQ("spicy", fp_copy.string());
58813481Sgiacomo.travaglini@arm.com}
58913481Sgiacomo.travaglini@arm.com
59013481Sgiacomo.travaglini@arm.comTEST(FilePathTest, StringConstructor) {
59113481Sgiacomo.travaglini@arm.com  const FilePath fp(std::string("cider"));
59213481Sgiacomo.travaglini@arm.com  EXPECT_EQ("cider", fp.string());
59313481Sgiacomo.travaglini@arm.com}
59413481Sgiacomo.travaglini@arm.com
59513481Sgiacomo.travaglini@arm.comTEST(FilePathTest, Set) {
59613481Sgiacomo.travaglini@arm.com  const FilePath apple("apple");
59713481Sgiacomo.travaglini@arm.com  FilePath mac("mac");
59813481Sgiacomo.travaglini@arm.com  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
59913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("apple", mac.string());
60013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("apple", apple.string());
60113481Sgiacomo.travaglini@arm.com}
60213481Sgiacomo.travaglini@arm.com
60313481Sgiacomo.travaglini@arm.comTEST(FilePathTest, ToString) {
60413481Sgiacomo.travaglini@arm.com  const FilePath file("drink");
60513481Sgiacomo.travaglini@arm.com  EXPECT_EQ("drink", file.string());
60613481Sgiacomo.travaglini@arm.com}
60713481Sgiacomo.travaglini@arm.com
60813481Sgiacomo.travaglini@arm.comTEST(FilePathTest, RemoveExtension) {
60913481Sgiacomo.travaglini@arm.com  EXPECT_EQ("app", FilePath("app.cc").RemoveExtension("cc").string());
61013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("app", FilePath("app.exe").RemoveExtension("exe").string());
61113481Sgiacomo.travaglini@arm.com  EXPECT_EQ("APP", FilePath("APP.EXE").RemoveExtension("exe").string());
61213481Sgiacomo.travaglini@arm.com}
61313481Sgiacomo.travaglini@arm.com
61413481Sgiacomo.travaglini@arm.comTEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
61513481Sgiacomo.travaglini@arm.com  EXPECT_EQ("app", FilePath("app").RemoveExtension("exe").string());
61613481Sgiacomo.travaglini@arm.com}
61713481Sgiacomo.travaglini@arm.com
61813481Sgiacomo.travaglini@arm.comTEST(FilePathTest, IsDirectory) {
61913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("cola").IsDirectory());
62013481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
62113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_ALT_PATH_SEP_
62213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("koala/").IsDirectory());
62313481Sgiacomo.travaglini@arm.com#endif
62413481Sgiacomo.travaglini@arm.com}
62513481Sgiacomo.travaglini@arm.com
62613481Sgiacomo.travaglini@arm.comTEST(FilePathTest, IsAbsolutePath) {
62713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
62813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("").IsAbsolutePath());
62913481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
63013481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
63113481Sgiacomo.travaglini@arm.com                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
63213481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
63313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
63413481Sgiacomo.travaglini@arm.com                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
63513481Sgiacomo.travaglini@arm.com#else
63613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
63713481Sgiacomo.travaglini@arm.com              .IsAbsolutePath());
63813481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
63913481Sgiacomo.travaglini@arm.com}
64013481Sgiacomo.travaglini@arm.com
64113481Sgiacomo.travaglini@arm.comTEST(FilePathTest, IsRootDirectory) {
64213481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
64313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
64413481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
64513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
64613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("").IsRootDirectory());
64713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
64813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
64913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
65013481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
65113481Sgiacomo.travaglini@arm.com#else
65213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("/").IsRootDirectory());
65313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(FilePath("//").IsRootDirectory());
65413481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("").IsRootDirectory());
65513481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
65613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
65713481Sgiacomo.travaglini@arm.com#endif
65813481Sgiacomo.travaglini@arm.com}
65913481Sgiacomo.travaglini@arm.com
66013481Sgiacomo.travaglini@arm.com}  // namespace
66113481Sgiacomo.travaglini@arm.com}  // namespace internal
66213481Sgiacomo.travaglini@arm.com}  // namespace testing
663