console_appender_test.cxx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //
  2. // console_appender_test.cxx
  3. // logger_test
  4. //
  5. // Created by Sam Jaffe on 4/13/19.
  6. //
  7. #include <gmock/gmock.h>
  8. #include "resource_factory/prototype_factory.hpp"
  9. #include "scoped_buffer_capture.h"
  10. #include "logger/log_manager.h"
  11. #include "logger/properties.h"
  12. #include "logger_impl.h"
  13. #include "mock_logger.h"
  14. class ConsoleAppenderTest : public testing::Test {
  15. protected:
  16. void SetUp() override;
  17. void TearDown() override;
  18. std::string cout() const { return cout_->str(); }
  19. std::string cerr() const { return cerr_->str(); }
  20. std::shared_ptr<logging::log_appender> get(logging::properties const &) const;
  21. private:
  22. std::shared_ptr<StubLayout> playout;
  23. std::unique_ptr<scoped_buffer_capture_t> cout_, cerr_;
  24. };
  25. void ConsoleAppenderTest::SetUp() {
  26. playout.reset(new StubLayout);
  27. cout_.reset(new scoped_buffer_capture_t(std::cout));
  28. cerr_.reset(new scoped_buffer_capture_t(std::cerr));
  29. }
  30. void ConsoleAppenderTest::TearDown() {
  31. cerr_.reset();
  32. cout_.reset();
  33. playout.reset();
  34. }
  35. std::shared_ptr<logging::log_appender>
  36. ConsoleAppenderTest::get(logging::properties const & props) const {
  37. auto pappender = logging::appenders::instance().get("Console", props);
  38. return std::make_shared<logging::log_appender>(pappender, playout);
  39. }
  40. TEST_F(ConsoleAppenderTest, ErrorOnUnknownTarget) {
  41. using namespace logging::property;
  42. logging::properties props{_obj({{"target", _v("COUT")}})};
  43. EXPECT_THROW(logging::appenders::instance().get("Console", props),
  44. std::logic_error);
  45. }
  46. TEST_F(ConsoleAppenderTest, LogsToStdOut) {
  47. using namespace logging;
  48. using namespace logging::property;
  49. properties props{_obj({{"target", _v("SYSTEM_OUT")}})};
  50. using testing::Eq;
  51. using testing::IsEmpty;
  52. logpacket pkt{{}, level::error, {}, {}, "This is a test message"};
  53. EXPECT_NO_THROW(get(props)->write(pkt));
  54. EXPECT_THAT(cout(), Eq("This is a test message"));
  55. EXPECT_THAT(cerr(), IsEmpty());
  56. }
  57. TEST_F(ConsoleAppenderTest, WillNotLogBelowThreshold) {
  58. using namespace logging;
  59. using namespace logging::property;
  60. properties props{_obj({{"target", _v("SYSTEM_OUT")}})};
  61. EXPECT_FALSE(get(props)->should_log(level::warn));
  62. EXPECT_TRUE(get(props)->should_log(level::error));
  63. }
  64. TEST_F(ConsoleAppenderTest, LogsToStdErr) {
  65. using namespace logging;
  66. using namespace logging::property;
  67. properties props{
  68. _obj({{"target", _v("SYSTEM_ERR")}, {"threshold", _v("FATAL")}})};
  69. using testing::Eq;
  70. using testing::IsEmpty;
  71. logpacket pkt{{}, level::error, {}, {}, "This is a test message"};
  72. EXPECT_NO_THROW(get(props)->write(pkt));
  73. EXPECT_THAT(cout(), IsEmpty());
  74. EXPECT_THAT(cerr(), Eq("This is a test message"));
  75. }