X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=unittests%2FSupport%2FPath.cpp;h=9b7cd2fbdbba26aecc4262752e0d22b38c7ed102;hp=cfba227dbe93fe723d855d95bcb15a418ba916ec;hb=da4cf2cda9456f16cbaaae1d8bb5883bad798f15;hpb=3d7575d7e2e8bdb6603f6754dfa86aacf1a4bbf3 diff --git a/unittests/Support/Path.cpp b/unittests/Support/Path.cpp index cfba227dbe9..9b7cd2fbdbb 100644 --- a/unittests/Support/Path.cpp +++ b/unittests/Support/Path.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/Path.h" +#include "llvm/Support/ConvertUTF.h" #include "llvm/Support/Errc.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" @@ -150,6 +151,11 @@ TEST(Support, Path) { path::native(*i, temp_store); } + + SmallString<32> Relative("foo.cpp"); + ASSERT_NO_ERROR(sys::fs::make_absolute("/root", Relative)); + Relative[5] = '/'; // Fix up windows paths. + ASSERT_EQ("/root/foo.cpp", Relative); } TEST(Support, RelativePathIterator) { @@ -158,7 +164,7 @@ TEST(Support, RelativePathIterator) { PathComponents ExpectedPathComponents; PathComponents ActualPathComponents; - StringRef(Path).split(ExpectedPathComponents, "/"); + StringRef(Path).split(ExpectedPathComponents, '/'); for (path::const_iterator I = path::begin(Path), E = path::end(Path); I != E; ++I) { @@ -178,7 +184,7 @@ TEST(Support, RelativePathDotIterator) { PathComponents ExpectedPathComponents; PathComponents ActualPathComponents; - StringRef(Path).split(ExpectedPathComponents, "/"); + StringRef(Path).split(ExpectedPathComponents, '/'); for (path::const_iterator I = path::begin(Path), E = path::end(Path); I != E; ++I) { @@ -198,7 +204,7 @@ TEST(Support, AbsolutePathIterator) { PathComponents ExpectedPathComponents; PathComponents ActualPathComponents; - StringRef(Path).split(ExpectedPathComponents, "/"); + StringRef(Path).split(ExpectedPathComponents, '/'); // The root path will also be a component when iterating ExpectedPathComponents[0] = "/"; @@ -221,7 +227,7 @@ TEST(Support, AbsolutePathDotIterator) { PathComponents ExpectedPathComponents; PathComponents ActualPathComponents; - StringRef(Path).split(ExpectedPathComponents, "/"); + StringRef(Path).split(ExpectedPathComponents, '/'); // The root path will also be a component when iterating ExpectedPathComponents[0] = "/"; @@ -294,16 +300,55 @@ TEST(Support, AbsolutePathIteratorEnd) { } TEST(Support, HomeDirectory) { -#ifdef LLVM_ON_UNIX - // This test only makes sense on Unix if $HOME is set. - if (::getenv("HOME")) { + std::string expected; +#ifdef LLVM_ON_WIN32 + if (wchar_t const *path = ::_wgetenv(L"USERPROFILE")) { + auto pathLen = ::wcslen(path); + ArrayRef ref{reinterpret_cast(path), + pathLen * sizeof(wchar_t)}; + convertUTF16ToUTF8String(ref, expected); + } +#else + if (char const *path = ::getenv("HOME")) + expected = path; #endif + // Do not try to test it if we don't know what to expect. + // On Windows we use something better than env vars. + if (!expected.empty()) { SmallString<128> HomeDir; - EXPECT_TRUE(path::home_directory(HomeDir)); - EXPECT_FALSE(HomeDir.empty()); -#ifdef LLVM_ON_UNIX + auto status = path::home_directory(HomeDir); + EXPECT_TRUE(status); + EXPECT_EQ(expected, HomeDir); + } +} + +TEST(Support, UserCacheDirectory) { + SmallString<13> CacheDir; + SmallString<20> CacheDir2; + auto Status = path::user_cache_directory(CacheDir, ""); + EXPECT_TRUE(Status ^ CacheDir.empty()); + + if (Status) { + EXPECT_TRUE(path::user_cache_directory(CacheDir2, "")); // should succeed + EXPECT_EQ(CacheDir, CacheDir2); // and return same paths + + EXPECT_TRUE(path::user_cache_directory(CacheDir, "A", "B", "file.c")); + auto It = path::rbegin(CacheDir); + EXPECT_EQ("file.c", *It); + EXPECT_EQ("B", *++It); + EXPECT_EQ("A", *++It); + auto ParentDir = *++It; + + // Test Unicode: "/(pi)r^2/aleth.0" + EXPECT_TRUE(path::user_cache_directory(CacheDir2, "\xCF\x80r\xC2\xB2", + "\xE2\x84\xB5.0")); + auto It2 = path::rbegin(CacheDir2); + EXPECT_EQ("\xE2\x84\xB5.0", *It2); + EXPECT_EQ("\xCF\x80r\xC2\xB2", *++It2); + auto ParentDir2 = *++It2; + + EXPECT_EQ(ParentDir, ParentDir2); } -#endif } class FileSystemTest : public testing::Test { @@ -799,4 +844,37 @@ TEST(Support, RemoveLeadingDotSlash) { Path2 = path::remove_leading_dotslash(Path2); EXPECT_EQ(Path2, ""); } + +static std::string remove_dots(StringRef path, + bool remove_dot_dot) { + SmallString<256> buffer(path); + path::remove_dots(buffer, remove_dot_dot); + return buffer.str(); +} + +TEST(Support, RemoveDots) { +#if defined(LLVM_ON_WIN32) + EXPECT_EQ("foolz\\wat", remove_dots(".\\.\\\\foolz\\wat", false)); + EXPECT_EQ("", remove_dots(".\\\\\\\\\\", false)); + + EXPECT_EQ("a\\..\\b\\c", remove_dots(".\\a\\..\\b\\c", false)); + EXPECT_EQ("b\\c", remove_dots(".\\a\\..\\b\\c", true)); + EXPECT_EQ("c", remove_dots(".\\.\\c", true)); + + SmallString<64> Path1(".\\.\\c"); + EXPECT_TRUE(path::remove_dots(Path1, true)); + EXPECT_EQ("c", Path1); +#else + EXPECT_EQ("foolz/wat", remove_dots("././/foolz/wat", false)); + EXPECT_EQ("", remove_dots("./////", false)); + + EXPECT_EQ("a/../b/c", remove_dots("./a/../b/c", false)); + EXPECT_EQ("b/c", remove_dots("./a/../b/c", true)); + EXPECT_EQ("c", remove_dots("././c", true)); + + SmallString<64> Path1("././c"); + EXPECT_TRUE(path::remove_dots(Path1, true)); + EXPECT_EQ("c", Path1); +#endif +} } // anonymous namespace