blob: d5b7297608605a5eec99351c10999529193c32d0 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_FUCHSIA_TEST_LOG_LISTENER_SAFE_H_
#define BASE_FUCHSIA_TEST_LOG_LISTENER_SAFE_H_
#include <fuchsia/logger/cpp/fidl_test_base.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/zx/time.h>
#include <memory>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/containers/circular_deque.h"
#include "base/strings/string_piece.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace base {
// LogListenerSafe implementation that invokes a caller-supplied callback for
// each received message.
// Note that messages will be delivered in order of receipt from the system
// logger, starting with any recent messages that the logging service had
// cached, i.e. including messages that may pre-date this log-listener being
// created.
class TestLogListenerSafe final
: public fuchsia::logger::testing::LogListenerSafe_TestBase {
public:
using OnLogMessageCallback =
base::RepeatingCallback<void(const fuchsia::logger::LogMessage&)>;
TestLogListenerSafe();
~TestLogListenerSafe() override;
TestLogListenerSafe(const TestLogListenerSafe&) = delete;
TestLogListenerSafe& operator=(const TestLogListenerSafe&) = delete;
// Sets a callback to be invoked with every message received via Log().
void set_on_log_message(OnLogMessageCallback callback);
private:
// LogListenerSafe implementation.
void Log(fuchsia::logger::LogMessage message, LogCallback callback) override;
void LogMany(std::vector<fuchsia::logger::LogMessage> messages,
LogManyCallback callback) override;
void Done() override;
void NotImplemented_(const std::string& name) override;
OnLogMessageCallback on_log_message_;
};
// Helper that manages a TestLogListenerSafe to simplify running the message
// loop until specific messages are received.
// Messages received prior to ListenToLog() being called will be silently
// ignored.
class SimpleTestLogListener {
public:
SimpleTestLogListener();
~SimpleTestLogListener();
SimpleTestLogListener(const SimpleTestLogListener&) = delete;
SimpleTestLogListener& operator=(const SimpleTestLogListener&) = delete;
// Attaches this instance to receive data matching |options|, from |log|.
void ListenToLog(fuchsia::logger::Log* log,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options);
// Runs the message loop until a log message containing |expected_string| is
// received, and returns it. Returns |absl::nullopt| if |binding_| disconnects
// without the |expected_string| having been logged.
absl::optional<fuchsia::logger::LogMessage> RunUntilMessageReceived(
base::StringPiece expected_string);
private:
// Pushes |message| to the |logged_messages_| queue, or to |on_log_message_|.
void PushLoggedMessage(const fuchsia::logger::LogMessage& message);
// Used to ignore messages with timestamps prior to this listener's creation.
zx::time ignore_before_;
TestLogListenerSafe listener_;
fidl::Binding<fuchsia::logger::LogListenerSafe> binding_;
base::circular_deque<fuchsia::logger::LogMessage> logged_messages_;
TestLogListenerSafe::OnLogMessageCallback on_log_message_;
};
} // namespace base
#endif // BASE_FUCHSIA_TEST_LOG_LISTENER_SAFE_H_