blob: 23fbd4c2c8e2f257e4f405ae7c9a93127bf383c4 [file] [log] [blame]
// Copyright 2018 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_DEVELOPER_DEBUG_ZXDB_SYMBOLS_MOCK_SYMBOL_DATA_PROVIDER_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_MOCK_SYMBOL_DATA_PROVIDER_H_
#include <map>
#include "src/developer/debug/shared/mock_memory.h"
#include "src/developer/debug/zxdb/symbols/symbol_data_provider.h"
#include "src/lib/fxl/memory/weak_ptr.h"
namespace zxdb {
// An implementation of SymbolDataProvider for testing.
class MockSymbolDataProvider : public SymbolDataProvider {
public:
// An insertion-time ordered list of (register, data) pairs of writes.
using RegisterWrites = std::vector<std::pair<debug::RegisterID, std::vector<uint8_t>>>;
// Holds a list of time-ordered (address, data) pairs of memory writes.
using MemoryWrites = std::vector<std::pair<uint64_t, std::vector<uint8_t>>>;
void set_arch(debug::Arch arch) { arch_ = arch; }
void set_entry_provider(fxl::RefPtr<SymbolDataProvider> ep) {
entry_data_provider_ = std::move(ep);
}
void set_ip(uint64_t ip) { ip_ = ip; }
void set_bp(uint64_t bp) { bp_ = bp; }
void set_cfa(uint64_t cfa) { cfa_ = cfa; }
void set_tls_segment(uint64_t address) { tls_segment_ = address; }
// Adds the given canned result for the given register. Set synchronous if the register contents
// should be synchronously available, false if it should require a callback to retrieve. If the
// uint64_t version is called, the register is assumed to be 64 bits.
//
// Any registers not set will be synchronously reported as unknown.
void AddRegisterValue(debug::RegisterID id, bool synchronous, uint64_t value);
void AddRegisterValue(debug::RegisterID id, bool synchronous, std::vector<uint8_t> value);
// Sets an expected memory value.
void AddMemory(uint64_t address, std::vector<uint8_t> data);
// Returns the list of all memory written by WriteRegister/WriteMemory calls as a series of (dest,
// data) pairs. The stored list will be cleared by this call.
RegisterWrites GetRegisterWrites() { return std::move(register_writes_); }
MemoryWrites GetMemoryWrites() { return std::move(memory_writes_); }
// SymbolDataProvider implementation.
debug::Arch GetArch() override { return arch_; }
fxl::RefPtr<SymbolDataProvider> GetEntryDataProvider() const override;
std::optional<containers::array_view<uint8_t>> GetRegister(debug::RegisterID id) override;
void GetRegisterAsync(debug::RegisterID id, GetRegisterCallback callback) override;
void WriteRegister(debug::RegisterID id, std::vector<uint8_t> data, WriteCallback cb) override;
std::optional<uint64_t> GetFrameBase() override;
void GetFrameBaseAsync(GetFrameBaseCallback callback) override;
std::optional<uint64_t> GetDebugAddressForContext(const SymbolContext&) const override;
void GetTLSSegment(const SymbolContext& symbol_context, GetTLSSegmentCallback cb) override;
uint64_t GetCanonicalFrameAddress() const override;
void GetMemoryAsync(uint64_t address, uint32_t size, GetMemoryCallback callback) override;
void WriteMemory(uint64_t address, std::vector<uint8_t> data, WriteCallback cb) override;
private:
FRIEND_MAKE_REF_COUNTED(MockSymbolDataProvider);
FRIEND_REF_COUNTED_THREAD_SAFE(MockSymbolDataProvider);
struct RegData {
RegData() = default;
RegData(bool sync, std::vector<uint8_t> v) : synchronous(sync), value(v) {}
bool synchronous = false;
std::vector<uint8_t> value;
};
MockSymbolDataProvider();
debug::Arch arch_ = debug::Arch::kArm64;
fxl::RefPtr<SymbolDataProvider> entry_data_provider_;
uint64_t ip_ = 0;
uint64_t bp_ = 0;
uint64_t cfa_ = 0;
uint64_t tls_segment_;
std::optional<std::tuple<uint8_t*, uint8_t*, uint8_t*>> tls_helpers_;
std::map<debug::RegisterID, RegData> regs_;
debug::MockMemory memory_;
RegisterWrites register_writes_; // Logs calls to WriteRegister().
MemoryWrites memory_writes_; // Logs calls to WriteMemory().
fxl::WeakPtrFactory<MockSymbolDataProvider> weak_factory_;
};
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_MOCK_SYMBOL_DATA_PROVIDER_H_