[Lldb-commits] [lldb] r298465 - Delete the remainder of platform specific code in FileSpec.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 21 17:27:25 PDT 2017


Author: zturner
Date: Tue Mar 21 19:27:24 2017
New Revision: 298465

URL: http://llvm.org/viewvc/llvm-project?rev=298465&view=rev
Log:
Delete the remainder of platform specific code in FileSpec.

Differential Revision: https://reviews.llvm.org/D31129

Added:
    lldb/trunk/unittests/Utility/Mocks/
    lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt
    lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp
    lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h
    lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp
Modified:
    lldb/trunk/include/lldb/Host/FileSpec.h
    lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h
    lldb/trunk/source/API/SBDeclaration.cpp
    lldb/trunk/source/API/SBFileSpec.cpp
    lldb/trunk/source/API/SBFileSpecList.cpp
    lldb/trunk/source/API/SBLineEntry.cpp
    lldb/trunk/source/Host/common/FileSpec.cpp
    lldb/trunk/source/Host/windows/FileSystem.cpp
    lldb/trunk/source/Host/windows/HostInfoWindows.cpp
    lldb/trunk/source/Target/TargetList.cpp
    lldb/trunk/source/Utility/TildeExpressionResolver.cpp
    lldb/trunk/unittests/CMakeLists.txt
    lldb/trunk/unittests/Interpreter/CMakeLists.txt
    lldb/trunk/unittests/Interpreter/TestCompletion.cpp
    lldb/trunk/unittests/Utility/CMakeLists.txt

Modified: lldb/trunk/include/lldb/Host/FileSpec.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/FileSpec.h?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Host/FileSpec.h (original)
+++ lldb/trunk/include/lldb/Host/FileSpec.h Tue Mar 21 19:27:24 2017
@@ -17,7 +17,6 @@
 
 // Other libraries and framework includes
 // Project includes
-#include "lldb/Host/PosixApi.h"
 #include "lldb/Utility/ConstString.h"
 #include "lldb/lldb-private.h"
 
@@ -539,26 +538,6 @@ public:
 
   ConstString GetLastPathComponent() const;
 
-  //------------------------------------------------------------------
-  /// Resolves the user name at the beginning of \a src_path, and writes the
-  /// output
-  /// to \a dst_path.  Note, \a src_path can contain other path components after
-  /// the
-  /// user name, they will be copied over, and if the path doesn't start with
-  /// "~" it
-  /// will also be copied over to \a dst_path.
-  ///
-  /// @param[in] src_path
-  ///     Input path to be resolved.
-  ///
-  /// @param[in] dst_path
-  ///     Buffer to store the resolved path.
-  //------------------------------------------------------------------
-  static void ResolveUsername(llvm::SmallVectorImpl<char> &path);
-
-  static size_t ResolvePartialUsername(llvm::StringRef partial_name,
-                                       StringList &matches);
-
   enum EnumerateDirectoryResult {
     eEnumerateDirectoryResultNext,  // Enumerate next entry in the current
                                     // directory

Modified: lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h (original)
+++ lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h Tue Mar 21 19:27:24 2017
@@ -44,6 +44,11 @@ public:
   /// \returns true if there were any matches, false otherwise.
   virtual bool ResolvePartial(llvm::StringRef Expr,
                               llvm::StringSet<> &Output) = 0;
+
+  /// \brief Resolve an entire path that begins with a tilde expression,
+  /// replacing the username portion with the matched result.
+  bool ResolveFullPath(llvm::StringRef Expr,
+                       llvm::SmallVectorImpl<char> &Output);
 };
 
 class StandardTildeExpressionResolver : public TildeExpressionResolver {

Modified: lldb/trunk/source/API/SBDeclaration.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBDeclaration.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/API/SBDeclaration.cpp (original)
+++ lldb/trunk/source/API/SBDeclaration.cpp Tue Mar 21 19:27:24 2017
@@ -1,5 +1,4 @@
-//===-- SBDeclaration.cpp -----------------------------------------*- C++
-//-*-===//
+//===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -10,6 +9,7 @@
 
 #include "lldb/API/SBDeclaration.h"
 #include "lldb/API/SBStream.h"
+#include "lldb/Host/PosixApi.h"
 #include "lldb/Symbol/Declaration.h"
 #include "lldb/Utility/Log.h"
 #include "lldb/Utility/Stream.h"

Modified: lldb/trunk/source/API/SBFileSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBFileSpec.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/API/SBFileSpec.cpp (original)
+++ lldb/trunk/source/API/SBFileSpec.cpp Tue Mar 21 19:27:24 2017
@@ -13,6 +13,7 @@
 #include "lldb/API/SBFileSpec.h"
 #include "lldb/API/SBStream.h"
 #include "lldb/Host/FileSpec.h"
+#include "lldb/Host/PosixApi.h"
 #include "lldb/Utility/Log.h"
 #include "lldb/Utility/Stream.h"
 

Modified: lldb/trunk/source/API/SBFileSpecList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBFileSpecList.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/API/SBFileSpecList.cpp (original)
+++ lldb/trunk/source/API/SBFileSpecList.cpp Tue Mar 21 19:27:24 2017
@@ -14,6 +14,7 @@
 #include "lldb/API/SBStream.h"
 #include "lldb/Core/FileSpecList.h"
 #include "lldb/Host/FileSpec.h"
+#include "lldb/Host/PosixApi.h"
 #include "lldb/Utility/Log.h"
 #include "lldb/Utility/Stream.h"
 

Modified: lldb/trunk/source/API/SBLineEntry.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBLineEntry.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/API/SBLineEntry.cpp (original)
+++ lldb/trunk/source/API/SBLineEntry.cpp Tue Mar 21 19:27:24 2017
@@ -11,6 +11,7 @@
 
 #include "lldb/API/SBLineEntry.h"
 #include "lldb/API/SBStream.h"
+#include "lldb/Host/PosixApi.h"
 #include "lldb/Symbol/LineEntry.h"
 #include "lldb/Utility/Log.h"
 #include "lldb/Utility/StreamString.h"

Modified: lldb/trunk/source/Host/common/FileSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/FileSpec.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/FileSpec.cpp (original)
+++ lldb/trunk/source/Host/common/FileSpec.cpp Tue Mar 21 19:27:24 2017
@@ -7,21 +7,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include <fstream>
-#include <set>
-#include <string.h>
-
-#include "llvm/Config/llvm-config.h"
-#ifndef LLVM_ON_WIN32
-#include <pwd.h>
-#endif
-
 #include "lldb/Host/FileSpec.h"
 #include "lldb/Utility/CleanUp.h"
 #include "lldb/Utility/RegularExpression.h"
 #include "lldb/Utility/Stream.h"
 #include "lldb/Utility/StreamString.h"
 #include "lldb/Utility/StringList.h"
+#include "lldb/Utility/TildeExpressionResolver.h"
 
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
@@ -144,115 +136,13 @@ size_t ParentPathEnd(llvm::StringRef pat
 
 } // end anonymous namespace
 
-// Resolves the username part of a path of the form ~user/other/directories, and
-// writes the result into dst_path.  This will also resolve "~" to the current
-// user.
-// If you want to complete "~" to the list of users, pass it to
-// ResolvePartialUsername.
-void FileSpec::ResolveUsername(llvm::SmallVectorImpl<char> &path) {
-#ifndef LLVM_ON_WIN32
-  if (path.empty() || path[0] != '~')
-    return;
-
-  llvm::StringRef path_str(path.data(), path.size());
-  size_t slash_pos = path_str.find('/', 1);
-  if (slash_pos == 1 || path.size() == 1) {
-    // A path of ~/ resolves to the current user's home dir
-    llvm::SmallString<64> home_dir;
-    // llvm::sys::path::home_directory() only checks if "HOME" is set in the
-    // environment and does nothing else to locate the user home directory
-    if (!llvm::sys::path::home_directory(home_dir)) {
-      struct passwd *pw = getpwuid(getuid());
-      if (pw && pw->pw_dir && pw->pw_dir[0]) {
-        // Update our environemnt so llvm::sys::path::home_directory() works
-        // next time
-        setenv("HOME", pw->pw_dir, 0);
-        home_dir.assign(llvm::StringRef(pw->pw_dir));
-      } else {
-        return;
-      }
-    }
-
-    // Overwrite the ~ with the first character of the homedir, and insert
-    // the rest.  This way we only trigger one move, whereas an insert
-    // followed by a delete (or vice versa) would trigger two.
-    path[0] = home_dir[0];
-    path.insert(path.begin() + 1, home_dir.begin() + 1, home_dir.end());
-    return;
-  }
-
-  auto username_begin = path.begin() + 1;
-  auto username_end = (slash_pos == llvm::StringRef::npos)
-                          ? path.end()
-                          : (path.begin() + slash_pos);
-  size_t replacement_length = std::distance(path.begin(), username_end);
-
-  llvm::SmallString<20> username(username_begin, username_end);
-  struct passwd *user_entry = ::getpwnam(username.c_str());
-  if (user_entry != nullptr) {
-    // Copy over the first n characters of the path, where n is the smaller of
-    // the length
-    // of the home directory and the slash pos.
-    llvm::StringRef homedir(user_entry->pw_dir);
-    size_t initial_copy_length = std::min(homedir.size(), replacement_length);
-    auto src_begin = homedir.begin();
-    auto src_end = src_begin + initial_copy_length;
-    std::copy(src_begin, src_end, path.begin());
-    if (replacement_length > homedir.size()) {
-      // We copied the entire home directory, but the ~username portion of the
-      // path was
-      // longer, so there's characters that need to be removed.
-      path.erase(path.begin() + initial_copy_length, username_end);
-    } else if (replacement_length < homedir.size()) {
-      // We copied all the way up to the slash in the destination, but there's
-      // still more
-      // characters that need to be inserted.
-      path.insert(username_end, src_end, homedir.end());
-    }
-  } else {
-    // Unable to resolve username (user doesn't exist?)
-    path.clear();
-  }
-#endif
-}
-
-size_t FileSpec::ResolvePartialUsername(llvm::StringRef partial_name,
-                                        StringList &matches) {
-#if !defined(LLVM_ON_WIN32) && !defined(__ANDROID__)
-  size_t extant_entries = matches.GetSize();
-
-  setpwent();
-  struct passwd *user_entry;
-  partial_name = partial_name.drop_front();
-  std::set<std::string> name_list;
-
-  while ((user_entry = getpwent()) != NULL) {
-    if (llvm::StringRef(user_entry->pw_name).startswith(partial_name)) {
-      std::string tmp_buf("~");
-      tmp_buf.append(user_entry->pw_name);
-      tmp_buf.push_back('/');
-      name_list.insert(tmp_buf);
-    }
-  }
-
-  for (auto &name : name_list) {
-    matches.AppendString(name);
-  }
-  return matches.GetSize() - extant_entries;
-#else
-  // Resolving home directories is not supported, just copy the path...
-  return 0;
-#endif // #ifdef LLVM_ON_WIN32
-}
-
 void FileSpec::Resolve(llvm::SmallVectorImpl<char> &path) {
   if (path.empty())
     return;
 
-#ifndef LLVM_ON_WIN32
-  if (path[0] == '~')
-    ResolveUsername(path);
-#endif // #ifdef LLVM_ON_WIN32
+  llvm::SmallString<32> Source(path.begin(), path.end());
+  StandardTildeExpressionResolver Resolver;
+  Resolver.ResolveFullPath(Source, path);
 
   // Save a copy of the original path that's passed in
   llvm::SmallString<128> original_path(path.begin(), path.end());

Modified: lldb/trunk/source/Host/windows/FileSystem.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/FileSystem.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/Host/windows/FileSystem.cpp (original)
+++ lldb/trunk/source/Host/windows/FileSystem.cpp Tue Mar 21 19:27:24 2017
@@ -15,6 +15,7 @@
 
 #include "lldb/Host/FileSystem.h"
 #include "lldb/Host/windows/AutoHandle.h"
+#include "lldb/Host/windows/PosixApi.h"
 
 #include "llvm/Support/ConvertUTF.h"
 #include "llvm/Support/FileSystem.h"

Modified: lldb/trunk/source/Host/windows/HostInfoWindows.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/HostInfoWindows.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/Host/windows/HostInfoWindows.cpp (original)
+++ lldb/trunk/source/Host/windows/HostInfoWindows.cpp Tue Mar 21 19:27:24 2017
@@ -14,6 +14,7 @@
 #include <mutex> // std::once
 
 #include "lldb/Host/windows/HostInfoWindows.h"
+#include "lldb/Host/windows/PosixApi.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/Support/ConvertUTF.h"
 #include "llvm/Support/FileSystem.h"

Modified: lldb/trunk/source/Target/TargetList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/TargetList.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/Target/TargetList.cpp (original)
+++ lldb/trunk/source/Target/TargetList.cpp Tue Mar 21 19:27:24 2017
@@ -23,6 +23,7 @@
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Platform.h"
 #include "lldb/Target/Process.h"
+#include "lldb/Utility/TildeExpressionResolver.h"
 
 // Other libraries and framework includes
 #include "llvm/ADT/SmallString.h"
@@ -347,10 +348,10 @@ Error TargetList::CreateTargetInternal(D
   FileSpec file(user_exe_path, false);
   if (!file.Exists() && user_exe_path.startswith("~")) {
     // we want to expand the tilde but we don't want to resolve any symbolic
-    // links
-    // so we can't use the FileSpec constructor's resolve flag
-    llvm::SmallString<64> unglobbed_path(user_exe_path);
-    FileSpec::ResolveUsername(unglobbed_path);
+    // links so we can't use the FileSpec constructor's resolve flag
+    llvm::SmallString<64> unglobbed_path;
+    StandardTildeExpressionResolver Resolver;
+    Resolver.ResolveFullPath(user_exe_path, unglobbed_path);
 
     if (unglobbed_path.empty())
       file = FileSpec(user_exe_path, false);

Modified: lldb/trunk/source/Utility/TildeExpressionResolver.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/TildeExpressionResolver.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/source/Utility/TildeExpressionResolver.cpp (original)
+++ lldb/trunk/source/Utility/TildeExpressionResolver.cpp Tue Mar 21 19:27:24 2017
@@ -68,3 +68,22 @@ bool StandardTildeExpressionResolver::Re
   return true;
 #endif
 }
+
+bool TildeExpressionResolver::ResolveFullPath(
+    StringRef Expr, llvm::SmallVectorImpl<char> &Output) {
+  Output.clear();
+  if (!Expr.startswith("~")) {
+    Output.append(Expr.begin(), Expr.end());
+    return false;
+  }
+
+  namespace path = llvm::sys::path;
+  StringRef Left =
+      Expr.take_until([](char c) { return path::is_separator(c); });
+
+  if (!ResolveExact(Left, Output))
+    return false;
+
+  Output.append(Expr.begin() + Left.size(), Expr.end());
+  return true;
+}

Modified: lldb/trunk/unittests/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/CMakeLists.txt?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/unittests/CMakeLists.txt (original)
+++ lldb/trunk/unittests/CMakeLists.txt Tue Mar 21 19:27:24 2017
@@ -2,6 +2,7 @@ add_custom_target(LLDBUnitTests)
 set_target_properties(LLDBUnitTests PROPERTIES FOLDER "LLDB tests")
 
 include_directories(${LLDB_SOURCE_ROOT})
+include_directories(${LLDB_PROJECT_ROOT})
 
 set(LLDB_GTEST_COMMON_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/gtest_common.h)
 if (MSVC)

Modified: lldb/trunk/unittests/Interpreter/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Interpreter/CMakeLists.txt?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/unittests/Interpreter/CMakeLists.txt (original)
+++ lldb/trunk/unittests/Interpreter/CMakeLists.txt Tue Mar 21 19:27:24 2017
@@ -4,6 +4,7 @@ add_lldb_unittest(InterpreterTests
 
   LINK_LIBS
     lldbInterpreter
+    lldbUtilityMocks
   )
 
 target_link_libraries(InterpreterTests

Modified: lldb/trunk/unittests/Interpreter/TestCompletion.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Interpreter/TestCompletion.cpp?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/unittests/Interpreter/TestCompletion.cpp (original)
+++ lldb/trunk/unittests/Interpreter/TestCompletion.cpp Tue Mar 21 19:27:24 2017
@@ -8,7 +8,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "gtest/gtest.h"
-
 #include "lldb/Interpreter/CommandCompletions.h"
 #include "lldb/Utility/StringList.h"
 #include "lldb/Utility/TildeExpressionResolver.h"
@@ -18,6 +17,8 @@
 #include "llvm/Support/Path.h"
 #include "llvm/Support/raw_ostream.h"
 
+#include "unittests/Utility/Mocks/MockTildeExpressionResolver.h"
+
 namespace fs = llvm::sys::fs;
 namespace path = llvm::sys::path;
 using namespace llvm;
@@ -36,74 +37,6 @@ using namespace lldb_private;
 
 namespace {
 
-class MockTildeExpressionResolver : public TildeExpressionResolver {
-  StringRef CurrentUser;
-  StringMap<StringRef> UserDirectories;
-
-public:
-  explicit MockTildeExpressionResolver(StringRef CurrentUser, StringRef HomeDir)
-      : CurrentUser(CurrentUser) {
-    UserDirectories.insert(std::make_pair(CurrentUser, HomeDir));
-  }
-
-  void AddKnownUser(StringRef User, StringRef HomeDir) {
-    assert(UserDirectories.find(User) == UserDirectories.end());
-    UserDirectories.insert(std::make_pair(User, HomeDir));
-  }
-
-  void Clear() {
-    CurrentUser = StringRef();
-    UserDirectories.clear();
-  }
-
-  void SetCurrentUser(StringRef User) {
-    assert(UserDirectories.find(User) != UserDirectories.end());
-    CurrentUser = User;
-  }
-
-  bool ResolveExact(StringRef Expr, SmallVectorImpl<char> &Output) override {
-    Output.clear();
-
-    assert(!llvm::any_of(
-        Expr, [](char c) { return llvm::sys::path::is_separator(c); }));
-    assert(Expr.empty() || Expr[0] == '~');
-    Expr = Expr.drop_front();
-    if (Expr.empty()) {
-      auto Dir = UserDirectories[CurrentUser];
-      Output.append(Dir.begin(), Dir.end());
-      return true;
-    }
-
-    for (const auto &User : UserDirectories) {
-      if (User.getKey() != Expr)
-        continue;
-      Output.append(User.getValue().begin(), User.getValue().end());
-      return true;
-    }
-    return false;
-  }
-
-  bool ResolvePartial(StringRef Expr, StringSet<> &Output) override {
-    Output.clear();
-
-    assert(!llvm::any_of(
-        Expr, [](char c) { return llvm::sys::path::is_separator(c); }));
-    assert(Expr.empty() || Expr[0] == '~');
-    Expr = Expr.drop_front();
-
-    SmallString<16> QualifiedName("~");
-    for (const auto &User : UserDirectories) {
-      if (!User.getKey().startswith(Expr))
-        continue;
-      QualifiedName.resize(1);
-      QualifiedName.append(User.getKey().begin(), User.getKey().end());
-      Output.insert(QualifiedName);
-    }
-
-    return !Output.empty();
-  }
-};
-
 class CompletionTest : public testing::Test {
 protected:
   /// Unique temporary directory in which all created filesystem entities must

Modified: lldb/trunk/unittests/Utility/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/CMakeLists.txt?rev=298465&r1=298464&r2=298465&view=diff
==============================================================================
--- lldb/trunk/unittests/Utility/CMakeLists.txt (original)
+++ lldb/trunk/unittests/Utility/CMakeLists.txt Tue Mar 21 19:27:24 2017
@@ -1,3 +1,5 @@
+add_subdirectory(Mocks)
+
 add_lldb_unittest(UtilityTests
   ConstStringTest.cpp
   ErrorTest.cpp
@@ -5,12 +7,14 @@ add_lldb_unittest(UtilityTests
   NameMatchesTest.cpp
   StringExtractorTest.cpp
   TaskPoolTest.cpp
+  TildeExpressionResolverTest.cpp
   TimeoutTest.cpp
   UriParserTest.cpp
   VASprintfTest.cpp
 
   LINK_LIBS
       lldbUtility
+      lldbUtilityMocks
   LINK_COMPONENTS
     Support
   )

Added: lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt?rev=298465&view=auto
==============================================================================
--- lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt (added)
+++ lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt Tue Mar 21 19:27:24 2017
@@ -0,0 +1,9 @@
+add_lldb_library(lldbUtilityMocks
+  MockTildeExpressionResolver.cpp
+
+  LINK_LIBS
+    lldbUtility
+
+  LINK_COMPONENTS
+    Support
+  )

Added: lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp?rev=298465&view=auto
==============================================================================
--- lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp (added)
+++ lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp Tue Mar 21 19:27:24 2017
@@ -0,0 +1,80 @@
+//===----------------- MockTildeExpressionResolver.cpp ----------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MockTildeExpressionResolver.h"
+#include "llvm/Support/Path.h"
+
+using namespace lldb_private;
+using namespace llvm;
+
+MockTildeExpressionResolver::MockTildeExpressionResolver(StringRef CurrentUser,
+                                                         StringRef HomeDir)
+    : CurrentUser(CurrentUser) {
+  UserDirectories.insert(std::make_pair(CurrentUser, HomeDir));
+}
+
+void MockTildeExpressionResolver::AddKnownUser(StringRef User,
+                                               StringRef HomeDir) {
+  assert(UserDirectories.find(User) == UserDirectories.end());
+  UserDirectories.insert(std::make_pair(User, HomeDir));
+}
+
+void MockTildeExpressionResolver::Clear() {
+  CurrentUser = StringRef();
+  UserDirectories.clear();
+}
+
+void MockTildeExpressionResolver::SetCurrentUser(StringRef User) {
+  assert(UserDirectories.find(User) != UserDirectories.end());
+  CurrentUser = User;
+}
+
+bool MockTildeExpressionResolver::ResolveExact(StringRef Expr,
+                                               SmallVectorImpl<char> &Output) {
+  Output.clear();
+
+  assert(!llvm::any_of(
+      Expr, [](char c) { return llvm::sys::path::is_separator(c); }));
+  assert(Expr.empty() || Expr[0] == '~');
+  Expr = Expr.drop_front();
+  if (Expr.empty()) {
+    auto Dir = UserDirectories[CurrentUser];
+    Output.append(Dir.begin(), Dir.end());
+    return true;
+  }
+
+  for (const auto &User : UserDirectories) {
+    if (User.getKey() != Expr)
+      continue;
+    Output.append(User.getValue().begin(), User.getValue().end());
+    return true;
+  }
+  return false;
+}
+
+bool MockTildeExpressionResolver::ResolvePartial(StringRef Expr,
+                                                 StringSet<> &Output) {
+  Output.clear();
+
+  assert(!llvm::any_of(
+      Expr, [](char c) { return llvm::sys::path::is_separator(c); }));
+  assert(Expr.empty() || Expr[0] == '~');
+  Expr = Expr.drop_front();
+
+  SmallString<16> QualifiedName("~");
+  for (const auto &User : UserDirectories) {
+    if (!User.getKey().startswith(Expr))
+      continue;
+    QualifiedName.resize(1);
+    QualifiedName.append(User.getKey().begin(), User.getKey().end());
+    Output.insert(QualifiedName);
+  }
+
+  return !Output.empty();
+}

Added: lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h?rev=298465&view=auto
==============================================================================
--- lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h (added)
+++ lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h Tue Mar 21 19:27:24 2017
@@ -0,0 +1,37 @@
+//===--------------------- TildeExpressionResolver.h ------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_UNITTESTS_UTILITY_MOCKS_MOCK_TILDE_EXPRESSION_RESOLVER_H
+#define LLDB_UNITTESTS_UTILITY_MOCKS_MOCK_TILDE_EXPRESSION_RESOLVER_H
+
+#include "lldb/Utility/TildeExpressionResolver.h"
+
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringMap.h"
+
+namespace lldb_private {
+class MockTildeExpressionResolver : public TildeExpressionResolver {
+  llvm::StringRef CurrentUser;
+  llvm::StringMap<llvm::StringRef> UserDirectories;
+
+public:
+  MockTildeExpressionResolver(llvm::StringRef CurrentUser,
+                              llvm::StringRef HomeDir);
+
+  void AddKnownUser(llvm::StringRef User, llvm::StringRef HomeDir);
+  void Clear();
+  void SetCurrentUser(llvm::StringRef User);
+
+  bool ResolveExact(llvm::StringRef Expr,
+                    llvm::SmallVectorImpl<char> &Output) override;
+  bool ResolvePartial(llvm::StringRef Expr, llvm::StringSet<> &Output) override;
+};
+}
+
+#endif

Added: lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp?rev=298465&view=auto
==============================================================================
--- lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp (added)
+++ lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp Tue Mar 21 19:27:24 2017
@@ -0,0 +1,36 @@
+#include "gtest/gtest.h"
+
+#include "Mocks/MockTildeExpressionResolver.h"
+#include "lldb/Utility/TildeExpressionResolver.h"
+
+#include "llvm/ADT/SmallString.h"
+
+using namespace llvm;
+using namespace lldb_private;
+
+TEST(TildeExpressionResolver, ResolveFullPath) {
+  MockTildeExpressionResolver Resolver("James", "/james");
+  Resolver.AddKnownUser("Kirk", "/kirk");
+  Resolver.AddKnownUser("Lars", "/lars");
+  Resolver.AddKnownUser("Jason", "/jason");
+  Resolver.AddKnownUser("Larry", "/larry");
+
+  SmallString<32> Result;
+  ASSERT_TRUE(Resolver.ResolveFullPath("~", Result));
+  EXPECT_EQ("/james", Result);
+  ASSERT_TRUE(Resolver.ResolveFullPath("~/", Result));
+  EXPECT_EQ("/james/", Result);
+
+  ASSERT_TRUE(Resolver.ResolveFullPath("~James/bar/baz", Result));
+  EXPECT_EQ("/james/bar/baz", Result);
+
+  ASSERT_TRUE(Resolver.ResolveFullPath("~Jason/", Result));
+  EXPECT_EQ("/jason/", Result);
+
+  ASSERT_TRUE(Resolver.ResolveFullPath("~Lars", Result));
+  EXPECT_EQ("/lars", Result);
+
+  ASSERT_FALSE(Resolver.ResolveFullPath("~Jaso", Result));
+  ASSERT_FALSE(Resolver.ResolveFullPath("", Result));
+  ASSERT_FALSE(Resolver.ResolveFullPath("Jason", Result));
+}




More information about the lldb-commits mailing list