Summary: This creates an abstract base class called "UserIDResolver", which can be implemented to provide user/group ID resolution capabilities for various objects. Posix host implement a PosixUserIDResolver, which does that using posix apis (getpwuid and friends). PlatformGDBRemote forwards queries over the gdb-remote link, etc. ProcessInstanceInfo class is refactored to make use of this interface instead of taking a platform pointer as an argument. The base resolver class already implements caching and thread-safety, so implementations don't have to worry about that. The main motivating factor for this was to remove external dependencies from the ProcessInstanceInfo class (so it can be put next to ProcessLaunchInfo and friends), but it has other benefits too: - ability to test the user name caching code - ability to test ProcessInstanceInfo dumping code - consistent interface for user/group resolution between Platform and Host classes. Reviewers: zturner, clayborg, jingham Subscribers: mgorny, lldb-commits Differential Revision: https://reviews.llvm.org/D58167 llvm-svn: 355323
76 lines
2.2 KiB
C++
76 lines
2.2 KiB
C++
//===-- ProcessInstanceInfoTest.cpp -----------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Target/Process.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace lldb_private;
|
|
|
|
namespace {
|
|
/// A very simple resolver which fails for even ids and returns a simple string
|
|
/// for odd ones.
|
|
class DummyUserIDResolver : public UserIDResolver {
|
|
protected:
|
|
llvm::Optional<std::string> DoGetUserName(id_t uid) {
|
|
if (uid % 2)
|
|
return ("user" + llvm::Twine(uid)).str();
|
|
return llvm::None;
|
|
}
|
|
|
|
llvm::Optional<std::string> DoGetGroupName(id_t gid) {
|
|
if (gid % 2)
|
|
return ("group" + llvm::Twine(gid)).str();
|
|
return llvm::None;
|
|
}
|
|
};
|
|
} // namespace
|
|
|
|
TEST(ProcessInstanceInfo, Dump) {
|
|
ProcessInstanceInfo info("a.out", ArchSpec("x86_64-pc-linux"), 47);
|
|
info.SetUserID(1);
|
|
info.SetEffectiveUserID(2);
|
|
info.SetGroupID(3);
|
|
info.SetEffectiveGroupID(4);
|
|
|
|
DummyUserIDResolver resolver;
|
|
StreamString s;
|
|
info.Dump(s, resolver);
|
|
EXPECT_STREQ(R"( pid = 47
|
|
name = a.out
|
|
file = a.out
|
|
arch = x86_64-pc-linux
|
|
uid = 1 (user1)
|
|
gid = 3 (group3)
|
|
euid = 2 ()
|
|
egid = 4 ()
|
|
)",
|
|
s.GetData());
|
|
}
|
|
|
|
TEST(ProcessInstanceInfo, DumpTable) {
|
|
ProcessInstanceInfo info("a.out", ArchSpec("x86_64-pc-linux"), 47);
|
|
info.SetUserID(1);
|
|
info.SetEffectiveUserID(2);
|
|
info.SetGroupID(3);
|
|
info.SetEffectiveGroupID(4);
|
|
|
|
DummyUserIDResolver resolver;
|
|
StreamString s;
|
|
|
|
const bool show_args = false;
|
|
const bool verbose = true;
|
|
ProcessInstanceInfo::DumpTableHeader(s, show_args, verbose);
|
|
info.DumpAsTableRow(s, resolver, show_args, verbose);
|
|
EXPECT_STREQ(
|
|
R"(PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE ARGUMENTS
|
|
====== ====== ========== ========== ========== ========== ======================== ============================
|
|
47 0 user1 group3 2 4 x86_64-pc-linux
|
|
)",
|
|
s.GetData());
|
|
}
|