log_manager_test.cxx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. //
  2. // log_manager_test.cxx
  3. // logger_test
  4. //
  5. // Created by Sam Jaffe on 4/2/19.
  6. //
  7. #include "logger/log_manager.h"
  8. #include "resource_factory/prototype_factory.hpp"
  9. #include "logger/c_logger.h"
  10. #include "logger/exception.h"
  11. #include "logger/logger.h"
  12. #include "logger/properties.h"
  13. #include "mock_logger.h"
  14. using namespace logging;
  15. class LogManagerTest : public ::testing::Test {
  16. public:
  17. void SetUp() override;
  18. void TearDown() override;
  19. protected:
  20. std::shared_ptr<MockAppender> appender;
  21. std::shared_ptr<MockLayout> layout;
  22. private:
  23. appenders::scoped_binding abinding_;
  24. layouts::scoped_binding lbinding_;
  25. };
  26. namespace logging {
  27. level level_from_string(std::string const & value);
  28. }
  29. void LogManagerTest::SetUp() {
  30. auto GetMock = [this](properties const & props) {
  31. appender = std::make_shared<MockAppender>();
  32. if (props.contains("threshold")) {
  33. appender->threshold = level_from_string(props["threshold"]);
  34. }
  35. return appender;
  36. };
  37. abinding_ = appenders::instance().bind_scoped("Mock", GetMock);
  38. auto GetMockLayout = [this](properties const &) {
  39. return layout = std::make_shared<MockLayout>();
  40. };
  41. lbinding_ = layouts::instance().bind_scoped("MockLayout", GetMockLayout);
  42. }
  43. void LogManagerTest::TearDown() {
  44. abinding_.reset();
  45. lbinding_.reset();
  46. }
  47. extern properties const APPENDER_LEVEL_PROPERTY_SCHEMA;
  48. extern properties const DEFAULT_LAYOUT_PROPERTY_SCHEMA;
  49. extern properties const LOGGER_LEVEL_PROPERTY_SCHEMA;
  50. extern properties const MIN_PROPERTY_SCHEMA;
  51. extern properties const MULTIPLEX_PROPERTY_SCHEMA;
  52. TEST_F(LogManagerTest, CanInjectMock) {
  53. manager().configure(MIN_PROPERTY_SCHEMA);
  54. EXPECT_THAT(appender, ::testing::NotNull());
  55. EXPECT_THAT(layout, ::testing::NotNull());
  56. }
  57. TEST_F(LogManagerTest, IfNoLayoutIsProvidedThenWeUseTheDefault) {
  58. manager().configure(DEFAULT_LAYOUT_PROPERTY_SCHEMA);
  59. EXPECT_THAT(appender, ::testing::NotNull());
  60. EXPECT_THAT(layout, testing::IsNull());
  61. }
  62. TEST_F(LogManagerTest, WillThrowAppenderIsStringType) {
  63. using namespace logging::property;
  64. // clang-format off
  65. properties const BAD_SCHEMA = _obj({
  66. {"configuration", _obj({
  67. {"loggers", _obj({
  68. {"root", _obj({
  69. {"appenders", _v("Mock")}
  70. })}
  71. })},
  72. {"appenders", _obj({})}
  73. })}
  74. });
  75. // clang-format on
  76. EXPECT_THROW(manager().configure(BAD_SCHEMA), invalid_property_type);
  77. }
  78. TEST_F(LogManagerTest, WillThrowIfDefiningEmptyStringLogger) {
  79. using namespace logging::property;
  80. // clang-format off
  81. properties const BAD_SCHEMA = _obj({
  82. {"configuration", _obj({
  83. {"loggers", _obj({
  84. {"", _obj({
  85. })}
  86. })},
  87. {"appenders", _obj({})}
  88. })}
  89. });
  90. // clang-format on
  91. EXPECT_THROW(manager().configure(BAD_SCHEMA), invalid_property);
  92. }
  93. using ::testing::_;
  94. using ::testing::AnyNumber;
  95. TEST_F(LogManagerTest, CanFetchInjectedMock) {
  96. manager mgr;
  97. mgr.configure(MIN_PROPERTY_SCHEMA);
  98. EXPECT_CALL(*appender, flush()).Times(AnyNumber());
  99. EXPECT_CALL(*appender, write(MessageEq("TEST MESSAGE"), _));
  100. c_logger l = mgr.c_get();
  101. l.error("TEST MESSAGE");
  102. }
  103. TEST_F(LogManagerTest, MultiplexMockLogsToMultipleImpls) {
  104. manager mgr;
  105. mgr.configure(MULTIPLEX_PROPERTY_SCHEMA);
  106. EXPECT_CALL(*appender, flush()).Times(AnyNumber());
  107. EXPECT_CALL(*appender, write(MessageEq("TEST MESSAGE"), _)).Times(2);
  108. c_logger l = mgr.c_get();
  109. l.error("TEST MESSAGE");
  110. }
  111. TEST_F(LogManagerTest, LevelCanBeBakedIntoAppenderProperties) {
  112. manager mgr;
  113. mgr.configure(APPENDER_LEVEL_PROPERTY_SCHEMA);
  114. EXPECT_CALL(*appender, flush()).Times(AnyNumber());
  115. EXPECT_CALL(*appender, write(MessageEq("TEST MESSAGE"), _)).Times(1);
  116. EXPECT_CALL(*appender, write(MessageEq("LOWER MESSAGE"), _)).Times(0);
  117. c_logger l = mgr.c_get();
  118. l.warn("TEST MESSAGE");
  119. l.info("LOWER MESSAGE");
  120. }
  121. TEST_F(LogManagerTest, LevelCanBeBakedIntoLoggerProperties) {
  122. manager mgr;
  123. mgr.configure(LOGGER_LEVEL_PROPERTY_SCHEMA);
  124. EXPECT_CALL(*appender, flush()).Times(AnyNumber());
  125. EXPECT_CALL(*appender, write(_, _)).Times(0);
  126. c_logger l = mgr.c_get();
  127. l.warn("TEST MESSAGE");
  128. }
  129. TEST_F(LogManagerTest, CanFetchLoggerByName) {
  130. manager mgr;
  131. mgr.configure(MIN_PROPERTY_SCHEMA);
  132. EXPECT_CALL(*appender, flush()).Times(AnyNumber());
  133. EXPECT_CALL(*appender, write(MessageEq("TEST MESSAGE"), _));
  134. c_logger l = mgr.c_get("root");
  135. l.error("TEST MESSAGE");
  136. }
  137. TEST_F(LogManagerTest, ReturnsDefaultLoggerIfUnknownName) {
  138. manager mgr;
  139. mgr.configure(MIN_PROPERTY_SCHEMA);
  140. EXPECT_NO_THROW(mgr.c_get("Mock"));
  141. EXPECT_NO_THROW(mgr.get("Mock"));
  142. }