summaryrefslogtreecommitdiffstats
path: root/lldb/unittests/Core/LogTest.cpp
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2017-02-15 16:11:59 +0000
committerPavel Labath <labath@google.com>2017-02-15 16:11:59 +0000
commit5fb8af40df212612ee7845420669119213857811 (patch)
tree62e2e8aff5e213848873b1767343a1db81bdcd44 /lldb/unittests/Core/LogTest.cpp
parentcf8af0ad61457bb0da6e6819c22767b75e5a1865 (diff)
downloadbcm5719-llvm-5fb8af40df212612ee7845420669119213857811.tar.gz
bcm5719-llvm-5fb8af40df212612ee7845420669119213857811.zip
Refactor log channel registration mechanism
Summary: We currently have two log channel registration mechanisms. One uses a set of function pointers and the other one is based on the PluginManager. The PluginManager dependency is unfortunate, as logging is also used in lldb-server, and the PluginManager pulls in a lot of classes which are not used in lldb-server. Both approach have the problem that they leave too much to do for the user, and so the individual log channels end up reimplementing command line argument parsing, category listing, etc. Here, I replace the PluginManager-based approach with a one. The new API is more declarative, so the user only needs to specify the list of list of channels, their descriptions, etc., and all the common tasks like enabling/disabling categories are hadled by common code. I migrate the LogChannelDWARF (only user of the PluginManager method) to the new API. In the follow-up commits I'll replace the other channels with something similar. Reviewers: clayborg, zturner, beanz Subscribers: aprantl, lldb-commits Differential Revision: https://reviews.llvm.org/D29895 llvm-svn: 295190
Diffstat (limited to 'lldb/unittests/Core/LogTest.cpp')
-rw-r--r--lldb/unittests/Core/LogTest.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/lldb/unittests/Core/LogTest.cpp b/lldb/unittests/Core/LogTest.cpp
index 993cb10c055..f93b9f21b3e 100644
--- a/lldb/unittests/Core/LogTest.cpp
+++ b/lldb/unittests/Core/LogTest.cpp
@@ -12,10 +12,30 @@
#include "lldb/Core/Log.h"
#include "lldb/Host/Host.h"
#include "lldb/Utility/StreamString.h"
+#include "llvm/Support/ManagedStatic.h"
using namespace lldb;
using namespace lldb_private;
+enum { FOO = 1, BAR = 2 };
+static constexpr Log::Category test_categories[] = {
+ {"foo", "log foo", FOO}, {"bar", "log bar", BAR},
+};
+static constexpr uint32_t default_flags = FOO;
+
+static Log::Channel test_channel(test_categories, default_flags);
+
+struct LogChannelTest : public ::testing::Test {
+ static void SetUpTestCase() {
+ Log::Register("chan", test_channel);
+ }
+
+ static void TearDownTestCase() {
+ Log::Unregister("chan");
+ llvm::llvm_shutdown();
+ }
+};
+
static std::string GetLogString(uint32_t log_options, const char *format,
int arg) {
std::string stream_string;
@@ -57,3 +77,96 @@ TEST(LogTest, log_options) {
GetLogString(LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD,
"Hello World {0}", 47));
}
+
+TEST(LogTest, Register) {
+ llvm::llvm_shutdown_obj obj;
+ Log::Register("chan", test_channel);
+ Log::Unregister("chan");
+ Log::Register("chan", test_channel);
+ Log::Unregister("chan");
+}
+
+TEST(LogTest, Unregister) {
+ llvm::llvm_shutdown_obj obj;
+ Log::Register("chan", test_channel);
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAny(FOO));
+ const char *cat1[] = {"foo", nullptr};
+ std::string message;
+ std::shared_ptr<llvm::raw_string_ostream> stream_sp(
+ new llvm::raw_string_ostream(message));
+ StreamString err;
+ EXPECT_TRUE(Log::EnableLogChannel(stream_sp, 0, "chan", cat1, err));
+ EXPECT_NE(nullptr, test_channel.GetLogIfAny(FOO));
+ Log::Unregister("chan");
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAny(FOO));
+}
+
+TEST_F(LogChannelTest, Enable) {
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAll(FOO));
+ std::string message;
+ std::shared_ptr<llvm::raw_string_ostream> stream_sp(
+ new llvm::raw_string_ostream(message));
+ StreamString err;
+ EXPECT_FALSE(Log::EnableLogChannel(stream_sp, 0, "chanchan", nullptr, err));
+ EXPECT_EQ("Invalid log channel 'chanchan'.\n", err.GetString());
+ err.Clear();
+
+ EXPECT_TRUE(Log::EnableLogChannel(stream_sp, 0, "chan", nullptr, err));
+ EXPECT_EQ("", err.GetString());
+ EXPECT_NE(nullptr, test_channel.GetLogIfAll(FOO));
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAll(BAR));
+
+ const char *cat2[] = {"bar", nullptr};
+ EXPECT_TRUE(Log::EnableLogChannel(stream_sp, 0, "chan", cat2, err));
+ EXPECT_NE(nullptr, test_channel.GetLogIfAll(FOO | BAR));
+
+ const char *cat3[] = {"baz", nullptr};
+ EXPECT_TRUE(Log::EnableLogChannel(stream_sp, 0, "chan", cat3, err));
+ EXPECT_TRUE(err.GetString().contains("unrecognized log category 'baz'"))
+ << "err: " << err.GetString().str();
+ EXPECT_NE(nullptr, test_channel.GetLogIfAll(FOO | BAR));
+}
+
+TEST_F(LogChannelTest, Disable) {
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAll(FOO));
+ const char *cat12[] = {"foo", "bar", nullptr};
+ std::string message;
+ std::shared_ptr<llvm::raw_string_ostream> stream_sp(
+ new llvm::raw_string_ostream(message));
+ StreamString err;
+ EXPECT_TRUE(Log::EnableLogChannel(stream_sp, 0, "chan", cat12, err));
+ EXPECT_NE(nullptr, test_channel.GetLogIfAll(FOO | BAR));
+
+ const char *cat2[] = {"bar", nullptr};
+ EXPECT_TRUE(Log::DisableLogChannel("chan", cat2, err));
+ EXPECT_NE(nullptr, test_channel.GetLogIfAll(FOO));
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAll(BAR));
+
+ const char *cat3[] = {"baz", nullptr};
+ EXPECT_TRUE(Log::DisableLogChannel("chan", cat3, err));
+ EXPECT_TRUE(err.GetString().contains("unrecognized log category 'baz'"))
+ << "err: " << err.GetString().str();
+ EXPECT_NE(nullptr, test_channel.GetLogIfAll(FOO));
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAll(BAR));
+ err.Clear();
+
+ EXPECT_TRUE(Log::DisableLogChannel("chan", nullptr, err));
+ EXPECT_EQ(nullptr, test_channel.GetLogIfAny(FOO | BAR));
+}
+
+TEST_F(LogChannelTest, List) {
+ StreamString str;
+ EXPECT_TRUE(Log::ListChannelCategories("chan", str));
+ std::string expected =
+ R"(Logging categories for 'chan':
+ all - all available logging categories
+ default - default set of logging categories
+ foo - log foo
+ bar - log bar
+)";
+ EXPECT_EQ(expected, str.GetString().str());
+ str.Clear();
+
+ EXPECT_FALSE(Log::ListChannelCategories("chanchan", str));
+ EXPECT_EQ("Invalid log channel 'chanchan'.\n", str.GetString().str());
+}
OpenPOWER on IntegriCloud