console_appender_test.cxx 2.3 KB

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