// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_DBUS_MISSIVE_MISSIVE_CLIENT_TEST_OBSERVER_H_
#define CHROMEOS_DBUS_MISSIVE_MISSIVE_CLIENT_TEST_OBSERVER_H_
#include <optional>
#include <tuple>
#include "base/functional/callback_forward.h"
#include "base/test/test_future.h"
#include "chromeos/dbus/missive/missive_client.h"
#include "components/reporting/proto/synced/record.pb.h"
#include "components/reporting/proto/synced/record_constants.pb.h"
namespace chromeos {
using RecordFilterCb =
base::RepeatingCallback<bool(const ::reporting::Record& record)>;
// Test helper class that observe |FakeMissiveClient| events.
class MissiveClientTestObserver
: public MissiveClient::TestInterface::Observer {
public:
// If |destination| is specified, the observer will capture only enqueued
// records with the specified |destination|, otherwise, all records will be
// captured.
explicit MissiveClientTestObserver(
std::optional<::reporting::Destination> destination = std::nullopt);
// The observer will capture only enqueued records that satisfy the condition
// specified by |observed_record_cb|.
explicit MissiveClientTestObserver(RecordFilterCb record_filter_cb);
MissiveClientTestObserver(const MissiveClientTestObserver&) = delete;
MissiveClientTestObserver operator=(const MissiveClientTestObserver&) =
delete;
~MissiveClientTestObserver() override;
void OnRecordEnqueued(::reporting::Priority priority,
const ::reporting::Record& record) override;
// Wait for next |::reporting::Record| to be enqueued, remove it, and return
// it along with the corresponding |::reporting::Priority|. Returns
// immediately if a record is present in the queue. Times out if a
// record does not arrive after a period of time.
std::tuple<::reporting::Priority, ::reporting::Record>
GetNextEnqueuedRecord();
// Returns true immediately if there any records in the queue. Return false
// otherwise. Does not wait for new records to arrive, i.e., does not run the
// run loop. Keep in mind that the internally stored record is cleared after a
// call to `GetNextEnqueuedRecord`; That is, this method always returns false
// immediately after a call to `GetNextEnqueuedRecord`.
//
// To properly test whether new enqueued records have arrived, call
// ::content::RunAllTasksUntilIdle() first to ensure the task enqueuing the
// record to missive is finished:
//
// ::content::RunAllTasksUntilIdle();
// EXPECT_FALSE(observer.HasNewEnqueuedRecords());
bool HasNewEnqueuedRecord();
private:
base::test::TestFuture<::reporting::Priority, ::reporting::Record>
enqueued_record_;
RecordFilterCb record_filter_cb_;
};
} // namespace chromeos
#endif // CHROMEOS_DBUS_MISSIVE_MISSIVE_CLIENT_TEST_OBSERVER_H_