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::appender> get(logging::properties const &) const;
  21. private:
  22. std::shared_ptr<StubLayout> playout;
  23. char data[24];
  24. };
  25. void FileAppenderTest::SetUp() {
  26. strncpy(data, "test_log_fileXXXXXX.log", sizeof(data));
  27. int fd = -1;
  28. if ((fd = mkstemps(data, 4)) != -1) {
  29. close(fd); // We'll open this elsewhere
  30. } else {
  31. throw std::runtime_error(strerror(errno));
  32. }
  33. playout.reset(new StubLayout);
  34. }
  35. void FileAppenderTest::TearDown() {
  36. playout.reset();
  37. remove(data);
  38. memset(data, 0, sizeof(data));
  39. }
  40. std::shared_ptr<logging::appender>
  41. FileAppenderTest::get(logging::properties const & props) const {
  42. auto pappender = logging::appenders::instance().get("File", props);
  43. pappender->layout = playout;
  44. return pappender;
  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. }