blob: 175611f66691fcbb18fbe4ace8e3229f83a9e7f5 [file] [log] [blame]
// Copyright 2022 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_STORAGE_TESTING_FAKE_PAVER_H_
#define SRC_STORAGE_TESTING_FAKE_PAVER_H_
#include <fidl/fuchsia.device/cpp/wire.h>
#include <fidl/fuchsia.paver/cpp/wire.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async/dispatcher.h>
#include <lib/fidl-async/cpp/bind.h>
#include <lib/sync/completion.h>
#include <lib/zircon-internal/thread_annotations.h>
#include <threads.h>
#include <zircon/errors.h>
#include <zircon/time.h>
#include <algorithm>
#include <memory>
#include <vector>
#include <fbl/auto_lock.h>
#include <fbl/mutex.h>
#include <zxtest/zxtest.h>
namespace paver_test {
enum class Command {
kUnknown,
kInitializeAbr,
kQueryCurrentConfiguration,
kQueryActiveConfiguration,
kQueryConfigurationLastSetActive,
kQueryConfigurationStatus,
kSetConfigurationActive,
kSetConfigurationUnbootable,
kSetConfigurationHealthy,
kReadAsset,
kWriteAsset,
kWriteFirmware,
kWriteVolumes,
kWriteBootloader,
kWriteDataFile,
kWipeVolume,
kInitPartitionTables,
kWipePartitionTables,
kDataSinkFlush,
kBootManagerFlush,
};
struct AbrSlotData {
bool unbootable;
bool active;
};
struct AbrData {
AbrSlotData slot_a;
AbrSlotData slot_b;
};
constexpr AbrData kInitAbrData = {
.slot_a =
{
.unbootable = false,
.active = false,
},
.slot_b =
{
.unbootable = false,
.active = false,
},
};
class FakePaver : public fidl::WireServer<fuchsia_paver::Paver>,
public fidl::WireServer<fuchsia_paver::BootManager>,
public fidl::WireServer<fuchsia_paver::DynamicDataSink> {
public:
zx_status_t Connect(async_dispatcher_t* dispatcher,
fidl::ServerEnd<fuchsia_paver::Paver> request);
void FindDataSink(FindDataSinkRequestView request,
FindDataSinkCompleter::Sync& _completer) override;
void UseBlockDevice(UseBlockDeviceRequestView request,
UseBlockDeviceCompleter::Sync& _completer) override;
void FindBootManager(FindBootManagerRequestView request,
FindBootManagerCompleter::Sync& _completer) override;
void QueryCurrentConfiguration(QueryCurrentConfigurationRequestView request,
QueryCurrentConfigurationCompleter::Sync& completer) override;
void FindSysconfig(FindSysconfigRequestView request,
FindSysconfigCompleter::Sync& _completer) override;
void QueryActiveConfiguration(QueryActiveConfigurationRequestView request,
QueryActiveConfigurationCompleter::Sync& completer) override;
void QueryConfigurationLastSetActive(
QueryConfigurationLastSetActiveRequestView request,
QueryConfigurationLastSetActiveCompleter::Sync& completer) override;
void QueryConfigurationStatus(QueryConfigurationStatusRequestView request,
QueryConfigurationStatusCompleter::Sync& completer) override;
void SetConfigurationActive(SetConfigurationActiveRequestView request,
SetConfigurationActiveCompleter::Sync& completer) override;
void SetConfigurationUnbootable(SetConfigurationUnbootableRequestView request,
SetConfigurationUnbootableCompleter::Sync& completer) override;
void SetConfigurationHealthy(SetConfigurationHealthyRequestView request,
SetConfigurationHealthyCompleter::Sync& completer) override;
void Flush(
fidl::WireServer<fuchsia_paver::DynamicDataSink>::FlushRequestView request,
fidl::WireServer<fuchsia_paver::DynamicDataSink>::FlushCompleter::Sync& completer) override;
void Flush(
fidl::WireServer<fuchsia_paver::BootManager>::FlushRequestView request,
fidl::WireServer<fuchsia_paver::BootManager>::FlushCompleter::Sync& completer) override;
void ReadAsset(ReadAssetRequestView request, ReadAssetCompleter::Sync& completer) override;
void WriteAsset(WriteAssetRequestView request, WriteAssetCompleter::Sync& completer) override;
void WriteOpaqueVolume(WriteOpaqueVolumeRequestView request,
WriteOpaqueVolumeCompleter::Sync& completer) override;
void WriteFirmware(WriteFirmwareRequestView request,
WriteFirmwareCompleter::Sync& completer) override;
void ReadFirmware(ReadFirmwareRequestView request,
ReadFirmwareCompleter::Sync& completer) override;
void WriteVolumes(WriteVolumesRequestView request,
WriteVolumesCompleter::Sync& completer) override;
void WriteBootloader(WriteBootloaderRequestView request,
WriteBootloaderCompleter::Sync& completer) override;
void WriteDataFile(WriteDataFileRequestView request,
WriteDataFileCompleter::Sync& completer) override;
void WipeVolume(WipeVolumeRequestView request, WipeVolumeCompleter::Sync& completer) override;
void InitializePartitionTables(InitializePartitionTablesRequestView request,
InitializePartitionTablesCompleter::Sync& completer) override;
void WipePartitionTables(WipePartitionTablesRequestView request,
WipePartitionTablesCompleter::Sync& completer) override;
void WaitForWritten(size_t size);
const std::vector<Command> GetCommandTrace();
std::string last_firmware_type() const;
fuchsia_paver::wire::Configuration last_firmware_config() const;
fuchsia_paver::wire::Configuration last_asset_config() const;
fuchsia_paver::wire::Asset last_asset() const;
const std::string& data_file_path() const;
void set_expected_payload_size(size_t size) { expected_payload_size_ = size; }
void set_supported_firmware_type(std::string type);
void set_abr_supported(bool supported) { abr_supported_ = supported; }
void set_wait_for_start_signal(bool wait) { wait_for_start_signal_ = wait; }
void set_expected_device(std::string expected);
const AbrData abr_data();
private:
std::atomic<bool> wait_for_start_signal_ = false;
sync_completion_t start_signal_;
sync_completion_t done_signal_;
std::atomic<size_t> signal_size_;
mutable fbl::Mutex lock_;
std::string last_firmware_type_ TA_GUARDED(lock_);
fuchsia_paver::wire::Asset last_asset_ TA_GUARDED(lock_);
fuchsia_paver::wire::Configuration last_firmware_config_ TA_GUARDED(lock_);
fuchsia_paver::wire::Configuration last_asset_config_ TA_GUARDED(lock_);
std::string data_file_path_ TA_GUARDED(lock_);
std::atomic<size_t> expected_payload_size_ = 0;
std::string expected_block_device_ TA_GUARDED(lock_);
std::string supported_firmware_type_ TA_GUARDED(lock_);
std::atomic<bool> abr_supported_ = false;
AbrData abr_data_ TA_GUARDED(lock_) = kInitAbrData;
std::atomic<async_dispatcher_t*> dispatcher_ = nullptr;
std::vector<Command> command_trace_ TA_GUARDED(lock_);
void AppendCommand(Command cmd) TA_REQ(lock_) { command_trace_.push_back(cmd); }
};
} // namespace paver_test
#endif // SRC_STORAGE_TESTING_FAKE_PAVER_H_