tls_backend_ut.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "tls_backend.h"
  2. #include "log.h"
  3. #include <yql/essentials/utils/log/ut/log_parser.h>
  4. #include <library/cpp/testing/unittest/registar.h>
  5. #include <library/cpp/logger/stream.h>
  6. #include <library/cpp/logger/null.h>
  7. #include <util/system/thread.h>
  8. #include <util/string/split.h>
  9. #include <thread>
  10. #include <chrono>
  11. using namespace NYql;
  12. using namespace NLog;
  13. class TRunnable {
  14. public:
  15. TRunnable(TStringBuf name, int count)
  16. : Name_(name)
  17. , Count_(count)
  18. {
  19. }
  20. void operator()() {
  21. using namespace std::chrono_literals;
  22. YQL_LOG(INFO) << "this message will be missed";
  23. {
  24. TScopedBackend<TStreamLogBackend> logBackend(&Logs_);
  25. for (int i = 0; i < Count_; i++) {
  26. YQL_LOG(INFO) << Name_;
  27. std::this_thread::sleep_for(20ms);
  28. }
  29. }
  30. YQL_LOG(INFO) << "this message will be missed";
  31. }
  32. const TString& GetLogs() const {
  33. return Logs_.Str();
  34. }
  35. private:
  36. TString Name_;
  37. int Count_;
  38. TStringStream Logs_;
  39. };
  40. Y_UNIT_TEST_SUITE(TTlsLogBackendTest)
  41. {
  42. Y_UNIT_TEST(CaptureOutputs) {
  43. YqlLoggerScope logger(new TTlsLogBackend(new TNullLogBackend));
  44. YQL_LOG(INFO) << "this message will be missed";
  45. TRunnable r1("t1", 3);
  46. std::thread t1(std::ref(r1));
  47. TRunnable r2("t2", 2);
  48. std::thread t2(std::ref(r2));
  49. t1.join();
  50. t2.join();
  51. // Cout << "--[t1 logs]-----------------\n" << r1.GetLogs() << Endl;
  52. // Cout << "--[t2 logs]-----------------\n" << r2.GetLogs() << Endl;
  53. { // t1
  54. TString row1Str, row2Str, row3Str, _;
  55. Split(r1.GetLogs(), '\n', row1Str, row2Str, row3Str, _);
  56. ui64 threadId = 0;
  57. {
  58. TLogRow logRow = ParseLogRow(row1Str);
  59. UNIT_ASSERT_EQUAL(logRow.Level, ELevel::INFO);
  60. UNIT_ASSERT_EQUAL(logRow.Component, EComponent::Default);
  61. UNIT_ASSERT(logRow.ThreadId > 0);
  62. UNIT_ASSERT_STRINGS_EQUAL(logRow.Message, "t1");
  63. threadId = logRow.ThreadId;
  64. }
  65. {
  66. TLogRow logRow = ParseLogRow(row2Str);
  67. UNIT_ASSERT_EQUAL(logRow.Level, ELevel::INFO);
  68. UNIT_ASSERT_EQUAL(logRow.Component, EComponent::Default);
  69. UNIT_ASSERT_EQUAL(logRow.ThreadId, threadId);
  70. UNIT_ASSERT_STRINGS_EQUAL(logRow.Message, "t1");
  71. }
  72. {
  73. TLogRow logRow = ParseLogRow(row3Str);
  74. UNIT_ASSERT_EQUAL(logRow.Level, ELevel::INFO);
  75. UNIT_ASSERT_EQUAL(logRow.Component, EComponent::Default);
  76. UNIT_ASSERT_EQUAL(logRow.ThreadId, threadId);
  77. UNIT_ASSERT_STRINGS_EQUAL(logRow.Message, "t1");
  78. }
  79. }
  80. { // t2
  81. TString row1Str, row2Str, _;
  82. Split(r2.GetLogs(), '\n', row1Str, row2Str, _);
  83. ui64 threadId = 0;
  84. {
  85. TLogRow logRow = ParseLogRow(row1Str);
  86. UNIT_ASSERT_EQUAL(logRow.Level, ELevel::INFO);
  87. UNIT_ASSERT_EQUAL(logRow.Component, EComponent::Default);
  88. UNIT_ASSERT(logRow.ThreadId > 0);
  89. UNIT_ASSERT_STRINGS_EQUAL(logRow.Message, "t2");
  90. threadId = logRow.ThreadId;
  91. }
  92. {
  93. TLogRow logRow = ParseLogRow(row2Str);
  94. UNIT_ASSERT_EQUAL(logRow.Level, ELevel::INFO);
  95. UNIT_ASSERT_EQUAL(logRow.Component, EComponent::Default);
  96. UNIT_ASSERT_EQUAL(logRow.ThreadId, threadId);
  97. UNIT_ASSERT_STRINGS_EQUAL(logRow.Message, "t2");
  98. }
  99. }
  100. }
  101. }