file_appender_test.cxx 2.7 KB

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