test_log_listener_safe.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/fuchsia/test_log_listener_safe.h"
  5. #include "base/callback_helpers.h"
  6. #include "base/fuchsia/fuchsia_logging.h"
  7. #include "base/run_loop.h"
  8. #include "base/strings/string_piece.h"
  9. #include "base/test/bind.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. #include "third_party/abseil-cpp/absl/types/optional.h"
  12. namespace base {
  13. TestLogListenerSafe::TestLogListenerSafe() = default;
  14. TestLogListenerSafe::~TestLogListenerSafe() = default;
  15. void TestLogListenerSafe::set_on_log_message(
  16. base::RepeatingCallback<void(const fuchsia::logger::LogMessage&)>
  17. callback) {
  18. on_log_message_ = std::move(callback);
  19. }
  20. void TestLogListenerSafe::Log(fuchsia::logger::LogMessage message,
  21. LogCallback callback) {
  22. if (on_log_message_)
  23. on_log_message_.Run(message);
  24. callback();
  25. }
  26. void TestLogListenerSafe::LogMany(
  27. std::vector<fuchsia::logger::LogMessage> messages,
  28. LogManyCallback callback) {
  29. for (const auto& message : messages)
  30. on_log_message_.Run(message);
  31. callback();
  32. }
  33. void TestLogListenerSafe::Done() {}
  34. void TestLogListenerSafe::NotImplemented_(const std::string& name) {
  35. ADD_FAILURE() << "NotImplemented_: " << name;
  36. }
  37. SimpleTestLogListener::SimpleTestLogListener() : binding_(&listener_) {}
  38. SimpleTestLogListener::~SimpleTestLogListener() = default;
  39. void SimpleTestLogListener::ListenToLog(
  40. fuchsia::logger::Log* log,
  41. std::unique_ptr<fuchsia::logger::LogFilterOptions> options) {
  42. ignore_before_ = zx::clock::get_monotonic();
  43. listener_.set_on_log_message(base::BindRepeating(
  44. &SimpleTestLogListener::PushLoggedMessage, base::Unretained(this)));
  45. log->ListenSafe(binding_.NewBinding(), std::move(options));
  46. }
  47. absl::optional<fuchsia::logger::LogMessage>
  48. SimpleTestLogListener::RunUntilMessageReceived(
  49. base::StringPiece expected_string) {
  50. while (!logged_messages_.empty()) {
  51. fuchsia::logger::LogMessage message = logged_messages_.front();
  52. logged_messages_.pop_front();
  53. if (base::StringPiece(message.msg).find(expected_string) !=
  54. std::string::npos) {
  55. return message;
  56. }
  57. }
  58. absl::optional<fuchsia::logger::LogMessage> logged_message;
  59. base::RunLoop loop;
  60. binding_.set_error_handler(
  61. [quit_loop = loop.QuitClosure()](zx_status_t status) {
  62. ZX_LOG(ERROR, status) << "LogListenerSafe disconnected";
  63. quit_loop.Run();
  64. });
  65. on_log_message_ = base::BindLambdaForTesting(
  66. [ignore_before = ignore_before_, &logged_message,
  67. expected_string = std::string(expected_string),
  68. quit_loop =
  69. loop.QuitClosure()](const fuchsia::logger::LogMessage& message) {
  70. if (zx::time(message.time) < ignore_before)
  71. return;
  72. if (message.msg.find(expected_string) == std::string::npos)
  73. return;
  74. logged_message.emplace(message);
  75. quit_loop.Run();
  76. });
  77. loop.Run();
  78. binding_.set_error_handler({});
  79. on_log_message_ = NullCallback();
  80. return logged_message;
  81. }
  82. void SimpleTestLogListener::PushLoggedMessage(
  83. const fuchsia::logger::LogMessage& message) {
  84. DVLOG(1) << "TestLogListener received: " << message.msg;
  85. if (zx::time(message.time) < ignore_before_)
  86. return;
  87. if (on_log_message_) {
  88. DCHECK(logged_messages_.empty());
  89. on_log_message_.Run(message);
  90. } else {
  91. logged_messages_.push_back(std::move(message));
  92. }
  93. }
  94. } // namespace base