format_test.cxx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //
  2. // format_test.cxx
  3. // logger_test
  4. //
  5. // Created by Sam Jaffe on 4/4/19.
  6. //
  7. #include <gmock/gmock.h>
  8. #include "logger/exception.h"
  9. #include "logger/format.h"
  10. #include "logger/logpacket.h"
  11. using namespace logging;
  12. TEST(FormatTest, EmptyFormatterCanParse) {
  13. EXPECT_NO_THROW(format::parse_format_string(""));
  14. }
  15. TEST(FormatTest, ThrowsForEndOfStringAfterPct) {
  16. EXPECT_THROW(format::parse_format_string("%"),
  17. format_parsing_exception);
  18. }
  19. TEST(FormatTest, RawStringFmtReturnsSelf) {
  20. using testing::Eq;
  21. auto fmt = format::parse_format_string("TEST STRING");
  22. EXPECT_THAT(fmt.process({}), Eq("TEST STRING"));
  23. }
  24. TEST(FormatTest, NCharReturnsNewLine) {
  25. using testing::Eq;
  26. auto fmt = format::parse_format_string("%n");
  27. EXPECT_THAT(fmt.process({}), Eq("\n"));
  28. }
  29. TEST(FormatTest, DoublePctIsLiteral) {
  30. using testing::Eq;
  31. auto fmt = format::parse_format_string("%%");
  32. EXPECT_THAT(fmt.process({}), Eq("%"));
  33. }
  34. TEST(FormatTest, CatchesRawContentBeforeFmt) {
  35. using testing::Eq;
  36. auto fmt = format::parse_format_string("TEST%%");
  37. EXPECT_THAT(fmt.process({}), Eq("TEST%"));
  38. }
  39. TEST(FormatTest, CatchesRawContentAfterFmt) {
  40. using testing::Eq;
  41. auto fmt = format::parse_format_string("%%TEST");
  42. EXPECT_THAT(fmt.process({}), Eq("%TEST"));
  43. }
  44. // Thursday, April 4, 2019 6:17:20 PM GMT
  45. namespace {
  46. constexpr const int NOW = 1554401840;
  47. }
  48. TEST(FormatTest, HandlesDateFormatter) {
  49. using testing::Eq;
  50. auto fmt = format::parse_format_string("%d");
  51. EXPECT_THAT(fmt.process({{NOW,0}}), Eq("2019-04-04 18:17:20,000"));
  52. }
  53. TEST(FormatTest, FormatsMilliseconds) {
  54. using testing::Eq;
  55. auto fmt = format::parse_format_string("%d");
  56. EXPECT_THAT(fmt.process({{NOW,123000}}), Eq("2019-04-04 18:17:20,123"));
  57. }
  58. TEST(FormatTest, ThrowsIfCustomFmtUnterminated) {
  59. using testing::Eq;
  60. EXPECT_THROW(format::parse_format_string("%d{%"),
  61. format_parsing_exception);
  62. }
  63. TEST(FormatTest, SupportsCustomFormatWithBrace) {
  64. using testing::Eq;
  65. auto fmt = format::parse_format_string("%d{%Y}");
  66. EXPECT_THAT(fmt.process({{NOW,0}}), Eq("2019"));
  67. }
  68. TEST(FormatTest, FormatsCustomMilliseconds) {
  69. using testing::Eq;
  70. auto fmt = format::parse_format_string("%d{%_ms}");
  71. EXPECT_THAT(fmt.process({{NOW,123000}}), Eq("123"));
  72. }
  73. TEST(FormatTest, SupportsISO8601Format) {
  74. using testing::Eq;
  75. auto fmt = format::parse_format_string("%d{ISO8601}");
  76. EXPECT_THAT(fmt.process({{NOW,0}}), Eq("2019-04-04T18:17:20.000Z"));
  77. }
  78. TEST(FormatTest, SupportsSingleDayFormat) {
  79. using testing::Eq;
  80. auto fmt = format::parse_format_string("%d{ABSOLUTE}");
  81. EXPECT_THAT(fmt.process({{NOW,0}}), Eq("18:17:20,000"));
  82. }
  83. TEST(FormatTest, SupportsHumanDateFormat) {
  84. using testing::Eq;
  85. auto fmt = format::parse_format_string("%d{DATE}");
  86. EXPECT_THAT(fmt.process({{NOW,0}}), Eq("04 Apr 2019 18:17:20,000"));
  87. }
  88. TEST(FormatTest, LoggerIdIsCToken) {
  89. using testing::Eq;
  90. auto fmt = format::parse_format_string("%c");
  91. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO"}),
  92. Eq("UNIT_TEST"));
  93. }
  94. TEST(FormatTest, LogLevelIsPToken) {
  95. using testing::Eq;
  96. auto fmt = format::parse_format_string("%p");
  97. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO"}),
  98. Eq("ERROR"));
  99. }
  100. TEST(FormatTest, LogMessageIsMToken) {
  101. using testing::Eq;
  102. auto fmt = format::parse_format_string("%m");
  103. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO"}),
  104. Eq("HELLO"));
  105. }
  106. TEST(FormatTest, ThrowsOnUnknownToken) {
  107. using testing::Eq;
  108. EXPECT_THROW(format::parse_format_string("%q"),
  109. unknown_format_specifier);
  110. }
  111. TEST(FormatTest, TokenCanBeTruncatedInFormat) {
  112. using testing::Eq;
  113. auto fmt = format::parse_format_string("%.3m");
  114. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO"}),
  115. Eq("HEL"));
  116. }
  117. TEST(FormatTest, TokenCanBeLeftPadded) {
  118. using testing::Eq;
  119. auto fmt = format::parse_format_string("%6m");
  120. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO"}),
  121. Eq(" HELLO"));
  122. }
  123. TEST(FormatTest, TokenCanBeRightPadded) {
  124. using testing::Eq;
  125. auto fmt = format::parse_format_string("%-6m");
  126. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO"}),
  127. Eq("HELLO "));
  128. }
  129. TEST(FormatTest, TokenCanBeSizeBound) {
  130. using testing::Eq;
  131. auto fmt = format::parse_format_string("%6.8m");
  132. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO"}),
  133. Eq(" HELLO"));
  134. EXPECT_THAT(fmt.process({{}, level::error, {}, "UNIT_TEST", "HELLO FRIEND"}),
  135. Eq("HELLO FR"));
  136. }