summaryrefslogtreecommitdiff
path: root/unittests/Utility
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/Utility')
-rw-r--r--unittests/Utility/ArchSpecTest.cpp154
-rw-r--r--unittests/Utility/CMakeLists.txt5
-rw-r--r--unittests/Utility/Helpers/CMakeLists.txt11
-rw-r--r--unittests/Utility/Helpers/MockTildeExpressionResolver.cpp80
-rw-r--r--unittests/Utility/Helpers/MockTildeExpressionResolver.h37
-rw-r--r--unittests/Utility/Helpers/TestUtilities.cpp22
-rw-r--r--unittests/Utility/Helpers/TestUtilities.h20
-rw-r--r--unittests/Utility/JSONTest.cpp26
-rw-r--r--unittests/Utility/StructuredDataTest.cpp2
-rw-r--r--unittests/Utility/TaskPoolTest.cpp43
-rw-r--r--unittests/Utility/TildeExpressionResolverTest.cpp2
-rw-r--r--unittests/Utility/VASprintfTest.cpp12
12 files changed, 194 insertions, 220 deletions
diff --git a/unittests/Utility/ArchSpecTest.cpp b/unittests/Utility/ArchSpecTest.cpp
new file mode 100644
index 0000000000000..a45e28e658b8f
--- /dev/null
+++ b/unittests/Utility/ArchSpecTest.cpp
@@ -0,0 +1,154 @@
+//===-- ArchSpecTest.cpp ----------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "gtest/gtest.h"
+
+#include "lldb/Utility/ArchSpec.h"
+#include "llvm/BinaryFormat/MachO.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleSimple) {
+
+ // Success conditions. Valid cpu/subtype combinations using both - and .
+ ArchSpec AS;
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10", AS));
+ EXPECT_EQ(12u, AS.GetMachOCPUType());
+ EXPECT_EQ(10u, AS.GetMachOCPUSubType());
+
+ AS = ArchSpec();
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15", AS));
+ EXPECT_EQ(12u, AS.GetMachOCPUType());
+ EXPECT_EQ(15u, AS.GetMachOCPUSubType());
+
+ AS = ArchSpec();
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12.15", AS));
+ EXPECT_EQ(12u, AS.GetMachOCPUType());
+ EXPECT_EQ(15u, AS.GetMachOCPUSubType());
+
+ // Failure conditions.
+
+ // Valid string, unknown cpu/subtype.
+ AS = ArchSpec();
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("13.11", AS));
+ EXPECT_EQ(0u, AS.GetMachOCPUType());
+ EXPECT_EQ(0u, AS.GetMachOCPUSubType());
+
+ // Missing / invalid cpu or subtype
+ AS = ArchSpec();
+ EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13", AS));
+
+ AS = ArchSpec();
+ EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13.A", AS));
+
+ AS = ArchSpec();
+ EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("A.13", AS));
+
+ // Empty string.
+ AS = ArchSpec();
+ EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("", AS));
+}
+
+TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleExtra) {
+ ArchSpec AS;
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor-os", AS));
+ EXPECT_EQ(12u, AS.GetMachOCPUType());
+ EXPECT_EQ(15u, AS.GetMachOCPUSubType());
+ EXPECT_EQ("vendor", AS.GetTriple().getVendorName());
+ EXPECT_EQ("os", AS.GetTriple().getOSName());
+
+ AS = ArchSpec();
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor-os-name", AS));
+ EXPECT_EQ(12u, AS.GetMachOCPUType());
+ EXPECT_EQ(10u, AS.GetMachOCPUSubType());
+ EXPECT_EQ("vendor", AS.GetTriple().getVendorName());
+ EXPECT_EQ("os", AS.GetTriple().getOSName());
+
+ AS = ArchSpec();
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor.os-name", AS));
+ EXPECT_EQ(12u, AS.GetMachOCPUType());
+ EXPECT_EQ(15u, AS.GetMachOCPUSubType());
+ EXPECT_EQ("vendor.os", AS.GetTriple().getVendorName());
+ EXPECT_EQ("name", AS.GetTriple().getOSName());
+
+ // These there should parse correctly, but the vendor / OS should be defaulted
+ // since they are unrecognized.
+ AS = ArchSpec();
+ EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor", AS));
+ EXPECT_EQ(12u, AS.GetMachOCPUType());
+ EXPECT_EQ(10u, AS.GetMachOCPUSubType());
+ EXPECT_EQ("apple", AS.GetTriple().getVendorName());
+ EXPECT_EQ("", AS.GetTriple().getOSName());
+
+ AS = ArchSpec();
+ EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12.10.10", AS));
+
+ AS = ArchSpec();
+ EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12-10.10", AS));
+}
+
+TEST(ArchSpecTest, TestSetTriple) {
+ ArchSpec AS;
+
+ // Various flavors of valid triples.
+ EXPECT_TRUE(AS.SetTriple("12-10-apple-darwin"));
+ EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_ARM), AS.GetMachOCPUType());
+ EXPECT_EQ(10u, AS.GetMachOCPUSubType());
+ EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str())
+ .consume_front("armv7f-apple-darwin"));
+ EXPECT_EQ(ArchSpec::eCore_arm_armv7f, AS.GetCore());
+
+ AS = ArchSpec();
+ EXPECT_TRUE(AS.SetTriple("18.100-apple-darwin"));
+ EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_POWERPC), AS.GetMachOCPUType());
+ EXPECT_EQ(100u, AS.GetMachOCPUSubType());
+ EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str())
+ .consume_front("powerpc-apple-darwin"));
+ EXPECT_EQ(ArchSpec::eCore_ppc_ppc970, AS.GetCore());
+
+ AS = ArchSpec();
+ EXPECT_TRUE(AS.SetTriple("i686-pc-windows"));
+ EXPECT_EQ(llvm::Triple::x86, AS.GetTriple().getArch());
+ EXPECT_EQ(llvm::Triple::PC, AS.GetTriple().getVendor());
+ EXPECT_EQ(llvm::Triple::Win32, AS.GetTriple().getOS());
+ EXPECT_TRUE(
+ llvm::StringRef(AS.GetTriple().str()).consume_front("i686-pc-windows"));
+ EXPECT_STREQ("i686", AS.GetArchitectureName());
+ EXPECT_EQ(ArchSpec::eCore_x86_32_i686, AS.GetCore());
+
+ // Various flavors of invalid triples.
+ AS = ArchSpec();
+ EXPECT_FALSE(AS.SetTriple("unknown-unknown-unknown"));
+
+ AS = ArchSpec();
+ EXPECT_FALSE(AS.SetTriple("unknown"));
+
+ AS = ArchSpec();
+ EXPECT_FALSE(AS.SetTriple(""));
+}
+
+TEST(ArchSpecTest, MergeFrom) {
+ ArchSpec A;
+ ArchSpec B("x86_64-pc-linux");
+
+ EXPECT_FALSE(A.IsValid());
+ ASSERT_TRUE(B.IsValid());
+ EXPECT_EQ(llvm::Triple::ArchType::x86_64, B.GetTriple().getArch());
+ EXPECT_EQ(llvm::Triple::VendorType::PC, B.GetTriple().getVendor());
+ EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS());
+ EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, B.GetCore());
+
+ A.MergeFrom(B);
+ ASSERT_TRUE(A.IsValid());
+ EXPECT_EQ(llvm::Triple::ArchType::x86_64, A.GetTriple().getArch());
+ EXPECT_EQ(llvm::Triple::VendorType::PC, A.GetTriple().getVendor());
+ EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());
+ EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, A.GetCore());
+}
diff --git a/unittests/Utility/CMakeLists.txt b/unittests/Utility/CMakeLists.txt
index 91cdbbda3ec37..13f840af2bb90 100644
--- a/unittests/Utility/CMakeLists.txt
+++ b/unittests/Utility/CMakeLists.txt
@@ -1,13 +1,12 @@
-add_subdirectory(Helpers)
-
add_lldb_unittest(UtilityTests
+ ArchSpecTest.cpp
ConstStringTest.cpp
+ JSONTest.cpp
LogTest.cpp
NameMatchesTest.cpp
StatusTest.cpp
StringExtractorTest.cpp
StructuredDataTest.cpp
- TaskPoolTest.cpp
TildeExpressionResolverTest.cpp
TimeoutTest.cpp
TimerTest.cpp
diff --git a/unittests/Utility/Helpers/CMakeLists.txt b/unittests/Utility/Helpers/CMakeLists.txt
deleted file mode 100644
index 36c774cb68265..0000000000000
--- a/unittests/Utility/Helpers/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-set(EXCLUDE_FROM_ALL ON)
-add_lldb_library(lldbUtilityHelpers
- MockTildeExpressionResolver.cpp
- TestUtilities.cpp
-
- LINK_LIBS
- lldbUtility
-
- LINK_COMPONENTS
- Support
- )
diff --git a/unittests/Utility/Helpers/MockTildeExpressionResolver.cpp b/unittests/Utility/Helpers/MockTildeExpressionResolver.cpp
deleted file mode 100644
index 832836682b500..0000000000000
--- a/unittests/Utility/Helpers/MockTildeExpressionResolver.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-//===----------------- 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();
-}
diff --git a/unittests/Utility/Helpers/MockTildeExpressionResolver.h b/unittests/Utility/Helpers/MockTildeExpressionResolver.h
deleted file mode 100644
index 18be1102e1fd4..0000000000000
--- a/unittests/Utility/Helpers/MockTildeExpressionResolver.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//===--------------------- 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;
-};
-} // namespace lldb_private
-
-#endif
diff --git a/unittests/Utility/Helpers/TestUtilities.cpp b/unittests/Utility/Helpers/TestUtilities.cpp
deleted file mode 100644
index eacf876614207..0000000000000
--- a/unittests/Utility/Helpers/TestUtilities.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//===- TestUtilities.cpp ----------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "TestUtilities.h"
-#include "llvm/ADT/SmallString.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
-
-extern const char *TestMainArgv0;
-
-std::string lldb_private::GetInputFilePath(const llvm::Twine &name) {
- llvm::SmallString<128> result = llvm::sys::path::parent_path(TestMainArgv0);
- llvm::sys::fs::make_absolute(result);
- llvm::sys::path::append(result, "Inputs", name);
- return result.str();
-}
diff --git a/unittests/Utility/Helpers/TestUtilities.h b/unittests/Utility/Helpers/TestUtilities.h
deleted file mode 100644
index 8d848797b7b2e..0000000000000
--- a/unittests/Utility/Helpers/TestUtilities.h
+++ /dev/null
@@ -1,20 +0,0 @@
-//===- TestUtilities.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_HELPERS_TESTUTILITIES_H
-#define LLDB_UNITTESTS_UTILITY_HELPERS_TESTUTILITIES_H
-
-#include "llvm/ADT/Twine.h"
-#include <string>
-
-namespace lldb_private {
-std::string GetInputFilePath(const llvm::Twine &name);
-}
-
-#endif
diff --git a/unittests/Utility/JSONTest.cpp b/unittests/Utility/JSONTest.cpp
new file mode 100644
index 0000000000000..0c23350517ce6
--- /dev/null
+++ b/unittests/Utility/JSONTest.cpp
@@ -0,0 +1,26 @@
+#include "gtest/gtest.h"
+
+#include "lldb/Utility/JSON.h"
+#include "lldb/Utility/StreamString.h"
+
+using namespace lldb_private;
+
+TEST(JSONTest, Dictionary) {
+ JSONObject o;
+ o.SetObject("key", std::make_shared<JSONString>("value"));
+
+ StreamString stream;
+ o.Write(stream);
+
+ ASSERT_EQ(stream.GetString(), R"({"key":"value"})");
+}
+
+TEST(JSONTest, Newlines) {
+ JSONObject o;
+ o.SetObject("key", std::make_shared<JSONString>("hello\nworld"));
+
+ StreamString stream;
+ o.Write(stream);
+
+ ASSERT_EQ(stream.GetString(), R"({"key":"hello\nworld"})");
+}
diff --git a/unittests/Utility/StructuredDataTest.cpp b/unittests/Utility/StructuredDataTest.cpp
index f346dd9e83223..15a2ca6bf70af 100644
--- a/unittests/Utility/StructuredDataTest.cpp
+++ b/unittests/Utility/StructuredDataTest.cpp
@@ -9,7 +9,7 @@
#include "gtest/gtest.h"
-#include "Helpers/TestUtilities.h"
+#include "TestingSupport/TestUtilities.h"
#include "lldb/Utility/Status.h"
#include "lldb/Utility/StreamString.h"
#include "lldb/Utility/StructuredData.h"
diff --git a/unittests/Utility/TaskPoolTest.cpp b/unittests/Utility/TaskPoolTest.cpp
deleted file mode 100644
index e340a81b27dbd..0000000000000
--- a/unittests/Utility/TaskPoolTest.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#include "gtest/gtest.h"
-
-#include "lldb/Utility/TaskPool.h"
-
-TEST(TaskPoolTest, AddTask) {
- auto fn = [](int x) { return x * x + 1; };
-
- auto f1 = TaskPool::AddTask(fn, 1);
- auto f2 = TaskPool::AddTask(fn, 2);
- auto f3 = TaskPool::AddTask(fn, 3);
- auto f4 = TaskPool::AddTask(fn, 4);
-
- ASSERT_EQ(10, f3.get());
- ASSERT_EQ(2, f1.get());
- ASSERT_EQ(17, f4.get());
- ASSERT_EQ(5, f2.get());
-}
-
-TEST(TaskPoolTest, RunTasks) {
- std::vector<int> r(4);
-
- auto fn = [](int x, int &y) { y = x * x + 1; };
-
- TaskPool::RunTasks([fn, &r]() { fn(1, r[0]); }, [fn, &r]() { fn(2, r[1]); },
- [fn, &r]() { fn(3, r[2]); }, [fn, &r]() { fn(4, r[3]); });
-
- ASSERT_EQ(2, r[0]);
- ASSERT_EQ(5, r[1]);
- ASSERT_EQ(10, r[2]);
- ASSERT_EQ(17, r[3]);
-}
-
-TEST(TaskPoolTest, TaskMap) {
- int data[4];
- auto fn = [&data](int x) { data[x] = x * x; };
-
- TaskMapOverInt(0, 4, fn);
-
- ASSERT_EQ(data[0], 0);
- ASSERT_EQ(data[1], 1);
- ASSERT_EQ(data[2], 4);
- ASSERT_EQ(data[3], 9);
-}
diff --git a/unittests/Utility/TildeExpressionResolverTest.cpp b/unittests/Utility/TildeExpressionResolverTest.cpp
index a24e998cb81da..bc1ca7a448115 100644
--- a/unittests/Utility/TildeExpressionResolverTest.cpp
+++ b/unittests/Utility/TildeExpressionResolverTest.cpp
@@ -1,6 +1,6 @@
#include "gtest/gtest.h"
-#include "Helpers/MockTildeExpressionResolver.h"
+#include "TestingSupport/MockTildeExpressionResolver.h"
#include "lldb/Utility/TildeExpressionResolver.h"
#include "llvm/ADT/SmallString.h"
diff --git a/unittests/Utility/VASprintfTest.cpp b/unittests/Utility/VASprintfTest.cpp
index 0b440942eb5a5..cb5b2533688e7 100644
--- a/unittests/Utility/VASprintfTest.cpp
+++ b/unittests/Utility/VASprintfTest.cpp
@@ -14,6 +14,12 @@
#include <locale.h>
+#if defined (_WIN32)
+#define TEST_ENCODING ".932" // On Windows, test codepage 932
+#else
+#define TEST_ENCODING "C" // ...otherwise, any widely available uni-byte LC
+#endif
+
using namespace lldb_private;
using namespace llvm;
@@ -46,7 +52,8 @@ TEST(VASprintfTest, EncodingError) {
// Save the current locale first.
std::string Current(::setlocale(LC_ALL, nullptr));
- setlocale(LC_ALL, ".932");
+ // Ensure tested locale is successfully set
+ ASSERT_TRUE(setlocale(LC_ALL, TEST_ENCODING));
wchar_t Invalid[2];
Invalid[0] = 0x100;
@@ -55,5 +62,6 @@ TEST(VASprintfTest, EncodingError) {
EXPECT_FALSE(Sprintf(Buffer, "%ls", Invalid));
EXPECT_EQ("<Encoding error>", Buffer);
- setlocale(LC_ALL, Current.c_str());
+ // Ensure we've restored the original locale once tested
+ ASSERT_TRUE(setlocale(LC_ALL, Current.c_str()));
}