console_appender_test.cxx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 "mock_logger.h"
  13. class ConsoleAppenderTest : public testing::Test {
  14. protected:
  15. void SetUp() override;
  16. void TearDown() override;
  17. std::string cout() const { return cout_->str(); }
  18. std::string cerr() const { return cerr_->str(); }
  19. std::shared_ptr<logging::appender> get(logging::properties const &) const;
  20. private:
  21. std::shared_ptr<StubLayout> playout;
  22. std::unique_ptr<scoped_buffer_capture_t> cout_, cerr_;
  23. };
  24. void ConsoleAppenderTest::SetUp() {
  25. playout.reset(new StubLayout);
  26. cout_.reset(new scoped_buffer_capture_t(std::cout));
  27. cerr_.reset(new scoped_buffer_capture_t(std::cerr));
  28. }
  29. void ConsoleAppenderTest::TearDown() {
  30. cerr_.reset();
  31. cout_.reset();
  32. playout.reset();
  33. }
  34. std::shared_ptr<logging::appender>
  35. ConsoleAppenderTest::get(logging::properties const & props) const {
  36. auto pappender = logging::appenders::instance().get("Console", props);
  37. pappender->layout = playout;
  38. return pappender;
  39. }
  40. TEST_F(ConsoleAppenderTest, ErrorOnUnknownTarget) {
  41. using namespace logging::property;
  42. logging::properties props{_obj({
  43. {"target", _v("COUT")}
  44. })};
  45. EXPECT_THROW(logging::appenders::instance().get("Console", props),
  46. std::logic_error);
  47. }
  48. TEST_F(ConsoleAppenderTest, LogsToStdOut) {
  49. using namespace logging;
  50. using namespace logging::property;
  51. properties props{_obj({
  52. {"target", _v("SYSTEM_OUT")}
  53. })};
  54. using testing::Eq;
  55. using testing::IsEmpty;
  56. logpacket pkt{{}, level::error, {}, {}, "This is a test message"};
  57. EXPECT_NO_THROW(get(props)->write(pkt));
  58. EXPECT_THAT(cout(), Eq("This is a test message"));
  59. EXPECT_THAT(cerr(), IsEmpty());
  60. }
  61. TEST_F(ConsoleAppenderTest, LogsToStdErr) {
  62. using namespace logging;
  63. using namespace logging::property;
  64. properties props{_obj({
  65. {"target", _v("SYSTEM_ERR")}
  66. })};
  67. using testing::Eq;
  68. using testing::IsEmpty;
  69. logpacket pkt{{}, level::error, {}, {}, "This is a test message"};
  70. EXPECT_NO_THROW(get(props)->write(pkt));
  71. EXPECT_THAT(cout(), IsEmpty());
  72. EXPECT_THAT(cerr(), Eq("This is a test message"));
  73. }