aboutsummaryrefslogtreecommitdiff
path: root/unittests/Target
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/Target')
-rw-r--r--unittests/Target/CMakeLists.txt15
-rw-r--r--unittests/Target/Inputs/TestModule.c9
-rw-r--r--unittests/Target/Inputs/TestModule.sobin0 -> 5602 bytes
-rw-r--r--unittests/Target/MemoryRegionInfoTest.cpp20
-rw-r--r--unittests/Target/ModuleCacheTest.cpp169
5 files changed, 213 insertions, 0 deletions
diff --git a/unittests/Target/CMakeLists.txt b/unittests/Target/CMakeLists.txt
new file mode 100644
index 000000000000..e4f6e52b0634
--- /dev/null
+++ b/unittests/Target/CMakeLists.txt
@@ -0,0 +1,15 @@
+add_lldb_unittest(TargetTests
+ MemoryRegionInfoTest.cpp
+ ModuleCacheTest.cpp
+
+ LINK_LIBS
+ lldbCore
+ lldbHost
+ lldbSymbol
+ lldbUtility
+ lldbPluginObjectFileELF
+ LINK_COMPONENTS
+ Support
+ )
+
+add_unittest_inputs(TargetTests TestModule.so)
diff --git a/unittests/Target/Inputs/TestModule.c b/unittests/Target/Inputs/TestModule.c
new file mode 100644
index 000000000000..6347f7264944
--- /dev/null
+++ b/unittests/Target/Inputs/TestModule.c
@@ -0,0 +1,9 @@
+// Compile with $CC -nostdlib -shared TestModule.c -o TestModule.so
+// The actual contents of the test module is not important here. I am using this
+// because it
+// produces an extremely tiny (but still perfectly valid) module.
+
+void boom(void) {
+ char *BOOM;
+ *BOOM = 47;
+}
diff --git a/unittests/Target/Inputs/TestModule.so b/unittests/Target/Inputs/TestModule.so
new file mode 100644
index 000000000000..9e9bf0b6e17e
--- /dev/null
+++ b/unittests/Target/Inputs/TestModule.so
Binary files differ
diff --git a/unittests/Target/MemoryRegionInfoTest.cpp b/unittests/Target/MemoryRegionInfoTest.cpp
new file mode 100644
index 000000000000..704f7f8c48c6
--- /dev/null
+++ b/unittests/Target/MemoryRegionInfoTest.cpp
@@ -0,0 +1,20 @@
+//===-- MemoryRegionInfoTest.cpp --------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Target/MemoryRegionInfo.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "gtest/gtest.h"
+
+using namespace lldb_private;
+
+TEST(MemoryRegionInfoTest, Formatv) {
+ EXPECT_EQ("yes", llvm::formatv("{0}", MemoryRegionInfo::eYes).str());
+ EXPECT_EQ("no", llvm::formatv("{0}", MemoryRegionInfo::eNo).str());
+ EXPECT_EQ("don't know", llvm::formatv("{0}", MemoryRegionInfo::eDontKnow).str());
+}
diff --git a/unittests/Target/ModuleCacheTest.cpp b/unittests/Target/ModuleCacheTest.cpp
new file mode 100644
index 000000000000..09b3edc4148b
--- /dev/null
+++ b/unittests/Target/ModuleCacheTest.cpp
@@ -0,0 +1,169 @@
+#include "gtest/gtest.h"
+
+#include "llvm/ADT/SmallString.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
+
+#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Host/HostInfo.h"
+#include "lldb/Symbol/SymbolContext.h"
+#include "lldb/Target/ModuleCache.h"
+
+extern const char *TestMainArgv0;
+
+using namespace lldb_private;
+using namespace lldb;
+
+namespace {
+
+class ModuleCacheTest : public testing::Test {
+public:
+ static void SetUpTestCase();
+
+ static void TearDownTestCase();
+
+protected:
+ static FileSpec s_cache_dir;
+ static llvm::SmallString<128> s_test_executable;
+
+ void TryGetAndPut(const FileSpec &cache_dir, const char *hostname,
+ bool expect_download);
+};
+}
+
+FileSpec ModuleCacheTest::s_cache_dir;
+llvm::SmallString<128> ModuleCacheTest::s_test_executable;
+
+static const char dummy_hostname[] = "dummy_hostname";
+static const char dummy_remote_dir[] = "bin";
+static const char module_name[] = "TestModule.so";
+static const char module_uuid[] =
+ "F4E7E991-9B61-6AD4-0073-561AC3D9FA10-C043A476";
+static const uint32_t uuid_bytes = 20;
+static const size_t module_size = 5602;
+
+static FileSpec GetDummyRemotePath() {
+ FileSpec fs("/", false, FileSpec::ePathSyntaxPosix);
+ fs.AppendPathComponent(dummy_remote_dir);
+ fs.AppendPathComponent(module_name);
+ return fs;
+}
+
+static FileSpec GetUuidView(FileSpec spec) {
+ spec.AppendPathComponent(".cache");
+ spec.AppendPathComponent(module_uuid);
+ spec.AppendPathComponent(module_name);
+ return spec;
+}
+
+static FileSpec GetSysrootView(FileSpec spec, const char *hostname) {
+ spec.AppendPathComponent(hostname);
+ spec.AppendPathComponent(dummy_remote_dir);
+ spec.AppendPathComponent(module_name);
+ return spec;
+}
+
+void ModuleCacheTest::SetUpTestCase() {
+ HostInfo::Initialize();
+ ObjectFileELF::Initialize();
+
+ FileSpec tmpdir_spec;
+ HostInfo::GetLLDBPath(lldb::ePathTypeLLDBTempSystemDir, s_cache_dir);
+
+ llvm::StringRef exe_folder = llvm::sys::path::parent_path(TestMainArgv0);
+ s_test_executable = exe_folder;
+ llvm::sys::path::append(s_test_executable, "Inputs", module_name);
+}
+
+void ModuleCacheTest::TearDownTestCase() {
+ ObjectFileELF::Terminate();
+ HostInfo::Terminate();
+}
+
+static void VerifyDiskState(const FileSpec &cache_dir, const char *hostname) {
+ FileSpec uuid_view = GetUuidView(cache_dir);
+ EXPECT_TRUE(uuid_view.Exists()) << "uuid_view is: " << uuid_view.GetCString();
+ EXPECT_EQ(module_size, uuid_view.GetByteSize());
+
+ FileSpec sysroot_view = GetSysrootView(cache_dir, hostname);
+ EXPECT_TRUE(sysroot_view.Exists()) << "sysroot_view is: "
+ << sysroot_view.GetCString();
+ EXPECT_EQ(module_size, sysroot_view.GetByteSize());
+}
+
+void ModuleCacheTest::TryGetAndPut(const FileSpec &cache_dir,
+ const char *hostname, bool expect_download) {
+ ModuleCache mc;
+ ModuleSpec module_spec;
+ module_spec.GetFileSpec() = GetDummyRemotePath();
+ module_spec.GetUUID().SetFromCString(module_uuid, uuid_bytes);
+ module_spec.SetObjectSize(module_size);
+ ModuleSP module_sp;
+ bool did_create;
+ bool download_called = false;
+
+ Error error = mc.GetAndPut(
+ cache_dir, hostname, module_spec,
+ [this, &download_called](const ModuleSpec &module_spec,
+ const FileSpec &tmp_download_file_spec) {
+ download_called = true;
+ EXPECT_STREQ(GetDummyRemotePath().GetCString(),
+ module_spec.GetFileSpec().GetCString());
+ std::error_code ec = llvm::sys::fs::copy_file(
+ s_test_executable, tmp_download_file_spec.GetCString());
+ EXPECT_FALSE(ec);
+ return Error();
+ },
+ [](const ModuleSP &module_sp, const FileSpec &tmp_download_file_spec) {
+ return Error("Not supported.");
+ },
+ module_sp, &did_create);
+ EXPECT_EQ(expect_download, download_called);
+
+ EXPECT_TRUE(error.Success()) << "Error was: " << error.AsCString();
+ EXPECT_TRUE(did_create);
+ ASSERT_TRUE(bool(module_sp));
+
+ SymbolContextList sc_list;
+ EXPECT_EQ(1u, module_sp->FindFunctionSymbols(ConstString("boom"),
+ eFunctionNameTypeFull, sc_list));
+ EXPECT_STREQ(GetDummyRemotePath().GetCString(),
+ module_sp->GetPlatformFileSpec().GetCString());
+ EXPECT_STREQ(module_uuid, module_sp->GetUUID().GetAsString().c_str());
+}
+
+TEST_F(ModuleCacheTest, GetAndPut) {
+ FileSpec test_cache_dir = s_cache_dir;
+ test_cache_dir.AppendPathComponent("GetAndPut");
+
+ const bool expect_download = true;
+ TryGetAndPut(test_cache_dir, dummy_hostname, expect_download);
+ VerifyDiskState(test_cache_dir, dummy_hostname);
+}
+
+TEST_F(ModuleCacheTest, GetAndPutUuidExists) {
+ FileSpec test_cache_dir = s_cache_dir;
+ test_cache_dir.AppendPathComponent("GetAndPutUuidExists");
+
+ FileSpec uuid_view = GetUuidView(test_cache_dir);
+ std::error_code ec =
+ llvm::sys::fs::create_directories(uuid_view.GetDirectory().GetCString());
+ ASSERT_FALSE(ec);
+ ec = llvm::sys::fs::copy_file(s_test_executable, uuid_view.GetCString());
+ ASSERT_FALSE(ec);
+
+ const bool expect_download = false;
+ TryGetAndPut(test_cache_dir, dummy_hostname, expect_download);
+ VerifyDiskState(test_cache_dir, dummy_hostname);
+}
+
+TEST_F(ModuleCacheTest, GetAndPutStrangeHostname) {
+ FileSpec test_cache_dir = s_cache_dir;
+ test_cache_dir.AppendPathComponent("GetAndPutStrangeHostname");
+
+ const bool expect_download = true;
+ TryGetAndPut(test_cache_dir, "tab\tcolon:asterisk*", expect_download);
+ VerifyDiskState(test_cache_dir, "tab_colon_asterisk_");
+}