blob: 5a1a32490ff09aa8c39d550288c35453c874fecf [file] [log] [blame]
// Copyright 2025 The Fuchsia 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 SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_TESTING_MOCK_ENGINE_FIDL_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_TESTING_MOCK_ENGINE_FIDL_H_
#include <fidl/fuchsia.hardware.display.engine/cpp/driver/wire.h>
#include <lib/fdf/cpp/arena.h>
#include <lib/fit/function.h>
#include <zircon/compiler.h>
#include <cstddef>
#include <mutex>
#include <vector>
namespace display_coordinator::testing {
// Strict mock for the FIDL-generated display Engine protocol.
//
// This is a very rare case where strict mocking is warranted. The code under
// test is an adapter that maps C++ calls 1:1 to FIDL calls. So, the API
// contract being tested is expressed in terms of individual function calls.
class MockEngineFidl final : public fdf::WireServer<fuchsia_hardware_display_engine::Engine> {
public:
// Expectation containers for fuchsia.hardware.display.engine/Engine:
using CompleteCoordinatorConnectionChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineCompleteCoordinatorConnectionRequest* request,
fdf::Arena& arena, CompleteCoordinatorConnectionCompleter::Sync& completer)>;
using UnsetListenerChecker =
fit::function<void(fdf::Arena& arena, UnsetListenerCompleter::Sync& completer)>;
using ImportBufferCollectionChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineImportBufferCollectionRequest* request,
fdf::Arena& arena, ImportBufferCollectionCompleter::Sync& completer)>;
using ReleaseBufferCollectionChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineReleaseBufferCollectionRequest* request,
fdf::Arena& arena, ReleaseBufferCollectionCompleter::Sync& completer)>;
using ImportImageChecker =
fit::function<void(fuchsia_hardware_display_engine::wire::EngineImportImageRequest* request,
fdf::Arena& arena, ImportImageCompleter::Sync& completer)>;
using ImportImageForCaptureChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineImportImageForCaptureRequest* request,
fdf::Arena& arena, ImportImageForCaptureCompleter::Sync& completer)>;
using ReleaseImageChecker =
fit::function<void(fuchsia_hardware_display_engine::wire::EngineReleaseImageRequest* request,
fdf::Arena& arena)>;
using CheckConfigurationChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineCheckConfigurationRequest* request,
fdf::Arena& arena, CheckConfigurationCompleter::Sync& completer)>;
using ApplyConfigurationChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineApplyConfigurationRequest* request,
fdf::Arena& arena, ApplyConfigurationCompleter::Sync& completer)>;
using SetBufferCollectionConstraintsChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineSetBufferCollectionConstraintsRequest* request,
fdf::Arena& arena, SetBufferCollectionConstraintsCompleter::Sync& completer)>;
using SetDisplayPowerModeChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineSetDisplayPowerModeRequest* request,
fdf::Arena& arena, SetDisplayPowerModeCompleter::Sync& completer)>;
using SetMinimumRgbChecker =
fit::function<void(fuchsia_hardware_display_engine::wire::EngineSetMinimumRgbRequest* request,
fdf::Arena& arena, SetMinimumRgbCompleter::Sync& completer)>;
using StartCaptureChecker =
fit::function<void(fuchsia_hardware_display_engine::wire::EngineStartCaptureRequest* request,
fdf::Arena& arena, StartCaptureCompleter::Sync& completer)>;
using ReleaseCaptureChecker = fit::function<void(
fuchsia_hardware_display_engine::wire::EngineReleaseCaptureRequest* request,
fdf::Arena& arena, ReleaseCaptureCompleter::Sync& completer)>;
MockEngineFidl();
MockEngineFidl(const MockEngineFidl&) = delete;
MockEngineFidl& operator=(const MockEngineFidl&) = delete;
~MockEngineFidl();
// Expectations for fuchsia.hardware.display.engine/Engine:
void ExpectCompleteCoordinatorConnection(CompleteCoordinatorConnectionChecker checker);
void ExpectUnsetListener(UnsetListenerChecker checker);
void ExpectImportBufferCollection(ImportBufferCollectionChecker checker);
void ExpectReleaseBufferCollection(ReleaseBufferCollectionChecker checker);
void ExpectImportImage(ImportImageChecker checker);
void ExpectImportImageForCapture(ImportImageForCaptureChecker checker);
void ExpectReleaseImage(ReleaseImageChecker checker);
void ExpectCheckConfiguration(CheckConfigurationChecker checker);
void ExpectApplyConfiguration(ApplyConfigurationChecker checker);
void ExpectSetBufferCollectionConstraints(SetBufferCollectionConstraintsChecker checker);
void ExpectSetDisplayPowerMode(SetDisplayPowerModeChecker checker);
void ExpectSetMinimumRgb(SetMinimumRgbChecker checker);
void ExpectStartCapture(StartCaptureChecker checker);
void ExpectReleaseCapture(ReleaseCaptureChecker checker);
// Must be called at least once during an instance's lifetime.
//
// Tests are recommended to call this in a TearDown() method, or at the end of
// the test case implementation.
void CheckAllCallsReplayed();
// `fdf::WireServer<fuchsia_hardware_display_engine::Engine>`:
void CompleteCoordinatorConnection(
fuchsia_hardware_display_engine::wire::EngineCompleteCoordinatorConnectionRequest* request,
fdf::Arena& arena, CompleteCoordinatorConnectionCompleter::Sync& completer) override;
void UnsetListener(fdf::Arena& arena, UnsetListenerCompleter::Sync& completer) override;
void ImportBufferCollection(
fuchsia_hardware_display_engine::wire::EngineImportBufferCollectionRequest* request,
fdf::Arena& arena, ImportBufferCollectionCompleter::Sync& completer) override;
void ReleaseBufferCollection(
fuchsia_hardware_display_engine::wire::EngineReleaseBufferCollectionRequest* request,
fdf::Arena& arena, ReleaseBufferCollectionCompleter::Sync& completer) override;
void ImportImage(fuchsia_hardware_display_engine::wire::EngineImportImageRequest* request,
fdf::Arena& arena, ImportImageCompleter::Sync& completer) override;
void ImportImageForCapture(
fuchsia_hardware_display_engine::wire::EngineImportImageForCaptureRequest* request,
fdf::Arena& arena, ImportImageForCaptureCompleter::Sync& completer) override;
void ReleaseImage(fuchsia_hardware_display_engine::wire::EngineReleaseImageRequest* request,
fdf::Arena& arena, ReleaseImageCompleter::Sync& completer) override;
void CheckConfiguration(
fuchsia_hardware_display_engine::wire::EngineCheckConfigurationRequest* request,
fdf::Arena& arena, CheckConfigurationCompleter::Sync& completer) override;
void ApplyConfiguration(
fuchsia_hardware_display_engine::wire::EngineApplyConfigurationRequest* request,
fdf::Arena& arena, ApplyConfigurationCompleter::Sync& completer) override;
void SetBufferCollectionConstraints(
fuchsia_hardware_display_engine::wire::EngineSetBufferCollectionConstraintsRequest* request,
fdf::Arena& arena, SetBufferCollectionConstraintsCompleter::Sync& completer) override;
void SetDisplayPowerMode(
fuchsia_hardware_display_engine::wire::EngineSetDisplayPowerModeRequest* request,
fdf::Arena& arena, SetDisplayPowerModeCompleter::Sync& completer) override;
void SetMinimumRgb(fuchsia_hardware_display_engine::wire::EngineSetMinimumRgbRequest* request,
fdf::Arena& arena, SetMinimumRgbCompleter::Sync& completer) override;
void StartCapture(fuchsia_hardware_display_engine::wire::EngineStartCaptureRequest* request,
fdf::Arena& arena, StartCaptureCompleter::Sync& completer) override;
void ReleaseCapture(fuchsia_hardware_display_engine::wire::EngineReleaseCaptureRequest* request,
fdf::Arena& arena, ReleaseCaptureCompleter::Sync& completer) override;
void handle_unknown_method(
fidl::UnknownMethodMetadata<fuchsia_hardware_display_engine::Engine> metadata,
fidl::UnknownMethodCompleter::Sync& completer) override;
private:
struct Expectation;
std::mutex mutex_;
std::vector<Expectation> expectations_ __TA_GUARDED(mutex_);
size_t call_index_ __TA_GUARDED(mutex_) = 0;
bool check_all_calls_replayed_called_ __TA_GUARDED(mutex_) = false;
};
} // namespace display_coordinator::testing
#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_TESTING_MOCK_ENGINE_FIDL_H_