180814287SRaphael Isemann //===-- PathMappingListTest.cpp -------------------------------------------===//
286188d8aSGreg Clayton //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
686188d8aSGreg Clayton //
786188d8aSGreg Clayton //===----------------------------------------------------------------------===//
886188d8aSGreg Clayton
986188d8aSGreg Clayton #include "lldb/Target/PathMappingList.h"
1086188d8aSGreg Clayton #include "lldb/Utility/FileSpec.h"
1121e01330SAdrian Prantl #include "llvm/ADT/ArrayRef.h"
1286188d8aSGreg Clayton #include "gtest/gtest.h"
1386188d8aSGreg Clayton #include <utility>
1486188d8aSGreg Clayton
1586188d8aSGreg Clayton using namespace lldb_private;
1686188d8aSGreg Clayton
1786188d8aSGreg Clayton namespace {
1886188d8aSGreg Clayton struct Matches {
19fe547e04SPavel Labath FileSpec original;
20fe547e04SPavel Labath FileSpec remapped;
Matches__anon8b2c8d0a0111::Matches218f3be7a3SJonas Devlieghere Matches(const char *o, const char *r) : original(o), remapped(r) {}
Matches__anon8b2c8d0a0111::Matches2221e01330SAdrian Prantl Matches(const char *o, llvm::sys::path::Style style, const char *r)
2321e01330SAdrian Prantl : original(o, style), remapped(r) {}
2486188d8aSGreg Clayton };
25fe547e04SPavel Labath } // namespace
2686188d8aSGreg Clayton
TestPathMappings(const PathMappingList & map,llvm::ArrayRef<Matches> matches,llvm::ArrayRef<ConstString> fails)27fe547e04SPavel Labath static void TestPathMappings(const PathMappingList &map,
2886188d8aSGreg Clayton llvm::ArrayRef<Matches> matches,
2986188d8aSGreg Clayton llvm::ArrayRef<ConstString> fails) {
3086188d8aSGreg Clayton ConstString actual_remapped;
3186188d8aSGreg Clayton for (const auto &fail : fails) {
322e638403SPavel Labath SCOPED_TRACE(fail.GetCString());
332e638403SPavel Labath EXPECT_FALSE(map.RemapPath(fail, actual_remapped))
342e638403SPavel Labath << "actual_remapped: " << actual_remapped.GetCString();
3586188d8aSGreg Clayton }
3686188d8aSGreg Clayton for (const auto &match : matches) {
372e638403SPavel Labath SCOPED_TRACE(match.original.GetPath() + " -> " + match.remapped.GetPath());
38fe547e04SPavel Labath std::string orig_normalized = match.original.GetPath();
39fe547e04SPavel Labath EXPECT_TRUE(
40fe547e04SPavel Labath map.RemapPath(ConstString(match.original.GetPath()), actual_remapped));
418f3be7a3SJonas Devlieghere EXPECT_EQ(FileSpec(actual_remapped.GetStringRef()), match.remapped);
4286188d8aSGreg Clayton FileSpec unmapped_spec;
43fe547e04SPavel Labath EXPECT_TRUE(map.ReverseRemapPath(match.remapped, unmapped_spec));
4486188d8aSGreg Clayton std::string unmapped_path = unmapped_spec.GetPath();
4586188d8aSGreg Clayton EXPECT_EQ(unmapped_path, orig_normalized);
4686188d8aSGreg Clayton }
4786188d8aSGreg Clayton }
4886188d8aSGreg Clayton
TEST(PathMappingListTest,RelativeTests)4986188d8aSGreg Clayton TEST(PathMappingListTest, RelativeTests) {
5086188d8aSGreg Clayton Matches matches[] = {
5186188d8aSGreg Clayton {".", "/tmp"},
5286188d8aSGreg Clayton {"./", "/tmp"},
5386188d8aSGreg Clayton {"./////", "/tmp"},
5486188d8aSGreg Clayton {"./foo.c", "/tmp/foo.c"},
5586188d8aSGreg Clayton {"foo.c", "/tmp/foo.c"},
5686188d8aSGreg Clayton {"./bar/foo.c", "/tmp/bar/foo.c"},
5786188d8aSGreg Clayton {"bar/foo.c", "/tmp/bar/foo.c"},
5886188d8aSGreg Clayton };
5986188d8aSGreg Clayton ConstString fails[] = {
602e638403SPavel Labath #ifdef _WIN32
612e638403SPavel Labath ConstString("C:\\"),
622e638403SPavel Labath ConstString("C:\\a"),
632e638403SPavel Labath #else
6486188d8aSGreg Clayton ConstString("/a"),
6586188d8aSGreg Clayton ConstString("/"),
662e638403SPavel Labath #endif
6786188d8aSGreg Clayton };
6886188d8aSGreg Clayton PathMappingList map;
69*dfd499a6SXu Jun map.Append(".", "/tmp", false);
7086188d8aSGreg Clayton TestPathMappings(map, matches, fails);
7186188d8aSGreg Clayton PathMappingList map2;
72*dfd499a6SXu Jun map2.Append("", "/tmp", false);
7386188d8aSGreg Clayton TestPathMappings(map, matches, fails);
7486188d8aSGreg Clayton }
7586188d8aSGreg Clayton
TEST(PathMappingListTest,AbsoluteTests)7686188d8aSGreg Clayton TEST(PathMappingListTest, AbsoluteTests) {
7786188d8aSGreg Clayton PathMappingList map;
78*dfd499a6SXu Jun map.Append("/old", "/new", false);
7986188d8aSGreg Clayton Matches matches[] = {
8086188d8aSGreg Clayton {"/old", "/new"},
8186188d8aSGreg Clayton {"/old/", "/new"},
8286188d8aSGreg Clayton {"/old/foo/.", "/new/foo"},
8386188d8aSGreg Clayton {"/old/foo.c", "/new/foo.c"},
8486188d8aSGreg Clayton {"/old/foo.c/.", "/new/foo.c"},
8586188d8aSGreg Clayton {"/old/./foo.c", "/new/foo.c"},
8686188d8aSGreg Clayton };
8786188d8aSGreg Clayton ConstString fails[] = {
8886188d8aSGreg Clayton ConstString("/foo"),
8986188d8aSGreg Clayton ConstString("/"),
9086188d8aSGreg Clayton ConstString("foo.c"),
9186188d8aSGreg Clayton ConstString("./foo.c"),
9286188d8aSGreg Clayton ConstString("../foo.c"),
9386188d8aSGreg Clayton ConstString("../bar/foo.c"),
9486188d8aSGreg Clayton };
9586188d8aSGreg Clayton TestPathMappings(map, matches, fails);
9686188d8aSGreg Clayton }
9786188d8aSGreg Clayton
TEST(PathMappingListTest,RemapRoot)9886188d8aSGreg Clayton TEST(PathMappingListTest, RemapRoot) {
9986188d8aSGreg Clayton PathMappingList map;
100*dfd499a6SXu Jun map.Append("/", "/new", false);
10186188d8aSGreg Clayton Matches matches[] = {
10286188d8aSGreg Clayton {"/old", "/new/old"},
10386188d8aSGreg Clayton {"/old/", "/new/old"},
10486188d8aSGreg Clayton {"/old/foo/.", "/new/old/foo"},
10586188d8aSGreg Clayton {"/old/foo.c", "/new/old/foo.c"},
10686188d8aSGreg Clayton {"/old/foo.c/.", "/new/old/foo.c"},
10786188d8aSGreg Clayton {"/old/./foo.c", "/new/old/foo.c"},
10886188d8aSGreg Clayton };
10986188d8aSGreg Clayton ConstString fails[] = {
11086188d8aSGreg Clayton ConstString("foo.c"),
11186188d8aSGreg Clayton ConstString("./foo.c"),
11286188d8aSGreg Clayton ConstString("../foo.c"),
11386188d8aSGreg Clayton ConstString("../bar/foo.c"),
11486188d8aSGreg Clayton };
11586188d8aSGreg Clayton TestPathMappings(map, matches, fails);
11686188d8aSGreg Clayton }
11721e01330SAdrian Prantl
11821e01330SAdrian Prantl #ifndef _WIN32
TEST(PathMappingListTest,CrossPlatformTests)11921e01330SAdrian Prantl TEST(PathMappingListTest, CrossPlatformTests) {
12021e01330SAdrian Prantl PathMappingList map;
121*dfd499a6SXu Jun map.Append(R"(C:\old)", "/new", false);
12221e01330SAdrian Prantl Matches matches[] = {
12321e01330SAdrian Prantl {R"(C:\old)", llvm::sys::path::Style::windows, "/new"},
12421e01330SAdrian Prantl {R"(C:\old\)", llvm::sys::path::Style::windows, "/new"},
12521e01330SAdrian Prantl {R"(C:\old\foo\.)", llvm::sys::path::Style::windows, "/new/foo"},
12621e01330SAdrian Prantl {R"(C:\old\foo.c)", llvm::sys::path::Style::windows, "/new/foo.c"},
12721e01330SAdrian Prantl {R"(C:\old\foo.c\.)", llvm::sys::path::Style::windows, "/new/foo.c"},
12821e01330SAdrian Prantl {R"(C:\old\.\foo.c)", llvm::sys::path::Style::windows, "/new/foo.c"},
12921e01330SAdrian Prantl };
13021e01330SAdrian Prantl ConstString fails[] = {
13121e01330SAdrian Prantl ConstString("/foo"),
13221e01330SAdrian Prantl ConstString("/"),
13321e01330SAdrian Prantl ConstString("foo.c"),
13421e01330SAdrian Prantl ConstString("./foo.c"),
13521e01330SAdrian Prantl ConstString("../foo.c"),
13621e01330SAdrian Prantl ConstString("../bar/foo.c"),
13721e01330SAdrian Prantl };
13821e01330SAdrian Prantl TestPathMappings(map, matches, fails);
13921e01330SAdrian Prantl }
14021e01330SAdrian Prantl #endif
141