test_file_helper.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * This content is released under the MIT License as specified in
  3. * https://raw.githubusercontent.com/gabime/spdlog/master/LICENSE
  4. */
  5. #include "includes.h"
  6. #define TEST_FILENAME "test_logs/file_helper_test.txt"
  7. using spdlog::details::file_helper;
  8. static void write_with_helper(file_helper &helper, size_t howmany) {
  9. spdlog::memory_buf_t formatted;
  10. spdlog::fmt_lib::format_to(std::back_inserter(formatted), "{}", std::string(howmany, '1'));
  11. helper.write(formatted);
  12. helper.flush();
  13. }
  14. TEST_CASE("file_helper_filename", "[file_helper::filename()]") {
  15. prepare_logdir();
  16. file_helper helper;
  17. spdlog::filename_t target_filename = SPDLOG_FILENAME_T(TEST_FILENAME);
  18. helper.open(target_filename);
  19. REQUIRE(helper.filename() == target_filename);
  20. }
  21. TEST_CASE("file_helper_size", "[file_helper::size()]") {
  22. prepare_logdir();
  23. spdlog::filename_t target_filename = SPDLOG_FILENAME_T(TEST_FILENAME);
  24. size_t expected_size = 123;
  25. {
  26. file_helper helper;
  27. helper.open(target_filename);
  28. write_with_helper(helper, expected_size);
  29. REQUIRE(static_cast<size_t>(helper.size()) == expected_size);
  30. }
  31. REQUIRE(get_filesize(TEST_FILENAME) == expected_size);
  32. }
  33. TEST_CASE("file_helper_reopen", "[file_helper::reopen()]") {
  34. prepare_logdir();
  35. spdlog::filename_t target_filename = SPDLOG_FILENAME_T(TEST_FILENAME);
  36. file_helper helper;
  37. helper.open(target_filename);
  38. write_with_helper(helper, 12);
  39. REQUIRE(helper.size() == 12);
  40. helper.reopen(true);
  41. REQUIRE(helper.size() == 0);
  42. }
  43. TEST_CASE("file_helper_reopen2", "[file_helper::reopen(false)]") {
  44. prepare_logdir();
  45. spdlog::filename_t target_filename = SPDLOG_FILENAME_T(TEST_FILENAME);
  46. size_t expected_size = 14;
  47. file_helper helper;
  48. helper.open(target_filename);
  49. write_with_helper(helper, expected_size);
  50. REQUIRE(helper.size() == expected_size);
  51. helper.reopen(false);
  52. REQUIRE(helper.size() == expected_size);
  53. }
  54. static void test_split_ext(const spdlog::filename_t::value_type *fname,
  55. const spdlog::filename_t::value_type *expect_base,
  56. const spdlog::filename_t::value_type *expect_ext) {
  57. spdlog::filename_t filename(fname);
  58. spdlog::filename_t expected_base(expect_base);
  59. spdlog::filename_t expected_ext(expect_ext);
  60. spdlog::filename_t basename;
  61. spdlog::filename_t ext;
  62. std::tie(basename, ext) = file_helper::split_by_extension(filename);
  63. REQUIRE(basename == expected_base);
  64. REQUIRE(ext == expected_ext);
  65. }
  66. TEST_CASE("file_helper_split_by_extension", "[file_helper::split_by_extension()]") {
  67. test_split_ext(SPDLOG_FILENAME_T("mylog.txt"), SPDLOG_FILENAME_T("mylog"),
  68. SPDLOG_FILENAME_T(".txt"));
  69. test_split_ext(SPDLOG_FILENAME_T(".mylog.txt"), SPDLOG_FILENAME_T(".mylog"),
  70. SPDLOG_FILENAME_T(".txt"));
  71. test_split_ext(SPDLOG_FILENAME_T(".mylog"), SPDLOG_FILENAME_T(".mylog"), SPDLOG_FILENAME_T(""));
  72. test_split_ext(SPDLOG_FILENAME_T("/aaa/bb.d/mylog"), SPDLOG_FILENAME_T("/aaa/bb.d/mylog"),
  73. SPDLOG_FILENAME_T(""));
  74. test_split_ext(SPDLOG_FILENAME_T("/aaa/bb.d/mylog.txt"), SPDLOG_FILENAME_T("/aaa/bb.d/mylog"),
  75. SPDLOG_FILENAME_T(".txt"));
  76. test_split_ext(SPDLOG_FILENAME_T("aaa/bbb/ccc/mylog.txt"),
  77. SPDLOG_FILENAME_T("aaa/bbb/ccc/mylog"), SPDLOG_FILENAME_T(".txt"));
  78. test_split_ext(SPDLOG_FILENAME_T("aaa/bbb/ccc/mylog."), SPDLOG_FILENAME_T("aaa/bbb/ccc/mylog."),
  79. SPDLOG_FILENAME_T(""));
  80. test_split_ext(SPDLOG_FILENAME_T("aaa/bbb/ccc/.mylog.txt"),
  81. SPDLOG_FILENAME_T("aaa/bbb/ccc/.mylog"), SPDLOG_FILENAME_T(".txt"));
  82. test_split_ext(SPDLOG_FILENAME_T("/aaa/bbb/ccc/mylog.txt"),
  83. SPDLOG_FILENAME_T("/aaa/bbb/ccc/mylog"), SPDLOG_FILENAME_T(".txt"));
  84. test_split_ext(SPDLOG_FILENAME_T("/aaa/bbb/ccc/.mylog"),
  85. SPDLOG_FILENAME_T("/aaa/bbb/ccc/.mylog"), SPDLOG_FILENAME_T(""));
  86. test_split_ext(SPDLOG_FILENAME_T("../mylog.txt"), SPDLOG_FILENAME_T("../mylog"),
  87. SPDLOG_FILENAME_T(".txt"));
  88. test_split_ext(SPDLOG_FILENAME_T(".././mylog.txt"), SPDLOG_FILENAME_T(".././mylog"),
  89. SPDLOG_FILENAME_T(".txt"));
  90. test_split_ext(SPDLOG_FILENAME_T(".././mylog.txt/xxx"), SPDLOG_FILENAME_T(".././mylog.txt/xxx"),
  91. SPDLOG_FILENAME_T(""));
  92. test_split_ext(SPDLOG_FILENAME_T("/mylog.txt"), SPDLOG_FILENAME_T("/mylog"),
  93. SPDLOG_FILENAME_T(".txt"));
  94. test_split_ext(SPDLOG_FILENAME_T("//mylog.txt"), SPDLOG_FILENAME_T("//mylog"),
  95. SPDLOG_FILENAME_T(".txt"));
  96. test_split_ext(SPDLOG_FILENAME_T(""), SPDLOG_FILENAME_T(""), SPDLOG_FILENAME_T(""));
  97. test_split_ext(SPDLOG_FILENAME_T("."), SPDLOG_FILENAME_T("."), SPDLOG_FILENAME_T(""));
  98. test_split_ext(SPDLOG_FILENAME_T("..txt"), SPDLOG_FILENAME_T("."), SPDLOG_FILENAME_T(".txt"));
  99. }
  100. TEST_CASE("file_event_handlers", "[file_helper]") {
  101. enum class flags { before_open, after_open, before_close, after_close };
  102. prepare_logdir();
  103. spdlog::filename_t test_filename = SPDLOG_FILENAME_T(TEST_FILENAME);
  104. // define event handles that update vector of flags when called
  105. std::vector<flags> events;
  106. spdlog::file_event_handlers handlers;
  107. handlers.before_open = [&](spdlog::filename_t filename) {
  108. REQUIRE(filename == test_filename);
  109. events.push_back(flags::before_open);
  110. };
  111. handlers.after_open = [&](spdlog::filename_t filename, std::FILE *fstream) {
  112. REQUIRE(filename == test_filename);
  113. REQUIRE(fstream);
  114. fputs("after_open\n", fstream);
  115. events.push_back(flags::after_open);
  116. };
  117. handlers.before_close = [&](spdlog::filename_t filename, std::FILE *fstream) {
  118. REQUIRE(filename == test_filename);
  119. REQUIRE(fstream);
  120. fputs("before_close\n", fstream);
  121. events.push_back(flags::before_close);
  122. };
  123. handlers.after_close = [&](spdlog::filename_t filename) {
  124. REQUIRE(filename == test_filename);
  125. events.push_back(flags::after_close);
  126. };
  127. {
  128. spdlog::details::file_helper helper{handlers};
  129. REQUIRE(events.empty());
  130. helper.open(test_filename);
  131. REQUIRE(events == std::vector<flags>{flags::before_open, flags::after_open});
  132. events.clear();
  133. helper.close();
  134. REQUIRE(events == std::vector<flags>{flags::before_close, flags::after_close});
  135. REQUIRE(file_contents(TEST_FILENAME) == "after_open\nbefore_close\n");
  136. helper.reopen(true);
  137. events.clear();
  138. }
  139. // make sure that the file_helper destrcutor calls the close callbacks if needed
  140. REQUIRE(events == std::vector<flags>{flags::before_close, flags::after_close});
  141. REQUIRE(file_contents(TEST_FILENAME) == "after_open\nbefore_close\n");
  142. }
  143. TEST_CASE("file_helper_open", "[file_helper]") {
  144. prepare_logdir();
  145. spdlog::filename_t target_filename = SPDLOG_FILENAME_T(TEST_FILENAME);
  146. file_helper helper;
  147. helper.open(target_filename);
  148. helper.close();
  149. target_filename += SPDLOG_FILENAME_T("/invalid");
  150. REQUIRE_THROWS_AS(helper.open(target_filename), spdlog::spdlog_ex);
  151. }