blob: 4af135888b54d89b70ff7f3105b0928656d26f68 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_COMPUTE_PRESSURE_COMPUTE_PRESSURE_TEST_SUPPORT_H_
#define CONTENT_BROWSER_COMPUTE_PRESSURE_COMPUTE_PRESSURE_TEST_SUPPORT_H_
#include <initializer_list>
#include <ostream>
#include <utility>
#include "base/sequence_checker.h"
#include "base/synchronization/lock.h"
#include "base/test/bind.h"
#include "base/thread_annotations.h"
#include "content/browser/compute_pressure/compute_pressure_sample.h"
#include "content/browser/compute_pressure/cpu_probe.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "third_party/blink/public/mojom/compute_pressure/compute_pressure.mojom.h"
namespace content {
// googletest integration with ComputePressureSample.
bool operator==(const ComputePressureSample& lhs,
const ComputePressureSample& rhs) noexcept;
std::ostream& operator<<(std::ostream& os, const ComputePressureSample& sample);
// googletest integration with CpuCoreSpeedInfo.
struct CpuCoreSpeedInfo;
std::ostream& operator<<(std::ostream& os, const CpuCoreSpeedInfo& info);
// Synchronous proxy to a blink::mojom::ComputePressureHost.
class ComputePressureHostSync {
public:
// The caller must ensure that `manager` outlives the newly created instance.
explicit ComputePressureHostSync(blink::mojom::ComputePressureHost* host);
~ComputePressureHostSync();
ComputePressureHostSync(const ComputePressureHostSync&) = delete;
ComputePressureHostSync& operator=(const ComputePressureHostSync&) = delete;
blink::mojom::ComputePressureStatus AddObserver(
const blink::mojom::ComputePressureQuantization& quantization,
mojo::PendingRemote<blink::mojom::ComputePressureObserver> observer);
private:
// The reference is immutable, so accessing it is thread-safe. The referenced
// blink::mojom::ComputePressureHost implementation is called synchronously,
// so it's acceptable to rely on its own thread-safety checks.
blink::mojom::ComputePressureHost& host_;
};
// Test double for ComputePressureObserver that records all updates.
class FakeComputePressureObserver
: public blink::mojom::ComputePressureObserver {
public:
FakeComputePressureObserver();
~FakeComputePressureObserver() override;
FakeComputePressureObserver(const FakeComputePressureObserver&) = delete;
FakeComputePressureObserver& operator=(const FakeComputePressureObserver&) =
delete;
// blink::mojom::ComputePressureObserver implementation.
void OnUpdate(blink::mojom::ComputePressureStatePtr state) override;
std::vector<blink::mojom::ComputePressureState>& updates() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return updates_;
}
void SetNextUpdateCallback(base::OnceClosure callback);
void WaitForUpdate();
static void WaitForUpdates(
std::initializer_list<FakeComputePressureObserver*> observers);
mojo::PendingRemote<blink::mojom::ComputePressureObserver>
BindNewPipeAndPassRemote();
private:
SEQUENCE_CHECKER(sequence_checker_);
std::vector<blink::mojom::ComputePressureState> updates_
GUARDED_BY_CONTEXT(sequence_checker_);
// Used to implement WaitForUpdate().
base::OnceClosure update_callback_ GUARDED_BY_CONTEXT(sequence_checker_);
mojo::Receiver<blink::mojom::ComputePressureObserver> receiver_
GUARDED_BY_CONTEXT(sequence_checker_);
};
// Test double for CpuProbe that always returns a predetermined value.
class FakeCpuProbe : public CpuProbe {
public:
// Value returned by LastSample() if SetLastSample() is not called.
static constexpr ComputePressureSample kInitialSample = {
.cpu_utilization = 0.42,
.cpu_speed = 0.84};
FakeCpuProbe();
~FakeCpuProbe() override;
// CpuProbe implementation.
void Update() override;
ComputePressureSample LastSample() override;
// Can be called from any thread.
void SetLastSample(ComputePressureSample sample);
private:
// Bound to the sequence for Update() and LastSample().
SEQUENCE_CHECKER(sequence_checker_);
base::Lock lock_;
ComputePressureSample last_sample_ GUARDED_BY_CONTEXT(lock_);
};
} // namespace content
#endif // CONTENT_BROWSER_COMPUTE_PRESSURE_COMPUTE_PRESSURE_TEST_SUPPORT_H_