diff options
Diffstat (limited to 'unittests/Utility')
-rw-r--r-- | unittests/Utility/ArchSpecTest.cpp | 154 | ||||
-rw-r--r-- | unittests/Utility/CMakeLists.txt | 5 | ||||
-rw-r--r-- | unittests/Utility/Helpers/CMakeLists.txt | 11 | ||||
-rw-r--r-- | unittests/Utility/Helpers/MockTildeExpressionResolver.cpp | 80 | ||||
-rw-r--r-- | unittests/Utility/Helpers/MockTildeExpressionResolver.h | 37 | ||||
-rw-r--r-- | unittests/Utility/Helpers/TestUtilities.cpp | 22 | ||||
-rw-r--r-- | unittests/Utility/Helpers/TestUtilities.h | 20 | ||||
-rw-r--r-- | unittests/Utility/JSONTest.cpp | 26 | ||||
-rw-r--r-- | unittests/Utility/StructuredDataTest.cpp | 2 | ||||
-rw-r--r-- | unittests/Utility/TaskPoolTest.cpp | 43 | ||||
-rw-r--r-- | unittests/Utility/TildeExpressionResolverTest.cpp | 2 | ||||
-rw-r--r-- | unittests/Utility/VASprintfTest.cpp | 12 |
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())); } |