file_appender_test.cxx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //
  2. // file_appender_test.cxx
  3. // logger_test
  4. //
  5. // Created by Sam Jaffe on 4/13/19.
  6. //
  7. #include <cstdlib>
  8. #include <fstream>
  9. #include <gmock/gmock.h>
  10. #include "resource_factory/prototype_factory.hpp"
  11. #include "logger/exception.h"
  12. #include "logger/log_manager.h"
  13. #include "logger/properties.h"
  14. #include "logger_impl.h"
  15. #include "mock_logger.h"
  16. class FileAppenderTest : public testing::Test {
  17. protected:
  18. void SetUp() override;
  19. void TearDown() override;
  20. std::string filename() const { return data; }
  21. std::shared_ptr<logging::log_appender>
  22. get(logging::properties const &) const;
  23. private:
  24. std::shared_ptr<StubLayout> playout;
  25. char data[24];
  26. };
  27. void FileAppenderTest::SetUp() {
  28. strncpy(data, "test_log_fileXXXXXX.log", sizeof(data));
  29. int fd = -1;
  30. if ((fd = mkstemps(data, 4)) != -1) {
  31. close(fd); // We'll open this elsewhere
  32. } else {
  33. throw std::runtime_error(strerror(errno));
  34. }
  35. playout.reset(new StubLayout);
  36. }
  37. void FileAppenderTest::TearDown() {
  38. playout.reset();
  39. remove(data);
  40. memset(data, 0, sizeof(data));
  41. }
  42. std::shared_ptr<logging::log_appender>
  43. FileAppenderTest::get(logging::properties const & props) const {
  44. auto pappender = logging::appenders::instance().get("File", props);
  45. return std::make_shared<logging::log_appender>(pappender, playout);
  46. }
  47. TEST_F(FileAppenderTest, ThrowsIfNoFilename) {
  48. EXPECT_THROW(logging::appenders::instance().get("File", {}),
  49. logging::invalid_property_type);
  50. }
  51. std::string slurp(std::string const & filename) {
  52. std::ifstream in(filename);
  53. std::stringstream ss;
  54. ss << in.rdbuf();
  55. return ss.str();
  56. }
  57. TEST_F(FileAppenderTest, WritesFile) {
  58. using namespace logging;
  59. using namespace logging::property;
  60. properties props{_obj({
  61. {"filename", _v(filename())}
  62. })};
  63. using testing::Eq;
  64. logpacket pkt{{}, level::error, {}, {}, "This is a test message"};
  65. EXPECT_NO_THROW(get(props)->write(pkt));
  66. EXPECT_THAT(slurp(filename()), Eq("This is a test message"));
  67. }
  68. TEST_F(FileAppenderTest, AppendsToFile) {
  69. using namespace logging;
  70. using namespace logging::property;
  71. properties props{_obj({
  72. {"filename", _v(filename())}
  73. })};
  74. using testing::Eq;
  75. logpacket pkt{{}, level::error, {}, {}, "Test"};
  76. for (int i = 0; i < 2; ++i) {
  77. EXPECT_NO_THROW(get(props)->write(pkt));
  78. }
  79. EXPECT_THAT(slurp(filename()), Eq("TestTest"));
  80. }
  81. TEST_F(FileAppenderTest, OverwritesFileWithSetting) {
  82. using namespace logging;
  83. using namespace logging::property;
  84. properties props{_obj({
  85. {"filename", _v(filename())},
  86. {"fileAppend", _v(false)}
  87. })};
  88. using testing::Eq;
  89. logpacket pkt{{}, level::error, {}, {}, "Test"};
  90. for (int i = 0; i < 2; ++i) {
  91. EXPECT_NO_THROW(get(props)->write(pkt));
  92. }
  93. EXPECT_THAT(slurp(filename()), Eq("Test"));
  94. }