use super::*;
use crate::state::programs::GTestProgram;
impl ExtManager {
pub(crate) fn read_state_bytes(
&mut self,
payload: Vec<u8>,
program_id: ActorId,
) -> Result<Vec<u8>> {
ProgramsStorageManager::has_program(program_id)
.then_some(())
.ok_or(TestError::ActorNotFound(program_id))?;
if ProgramsStorageManager::is_mock_program(program_id) {
ProgramsStorageManager::modify_program(program_id, |program| {
let Some(GTestProgram::Mock { handlers, .. }) = program else {
unreachable!("checked upper, that it's the case for a mock program");
};
handlers
.state()
.map_err(|e| TestError::ReadStateError(e.to_string()))
})
} else {
let allocations = ProgramsStorageManager::allocations(program_id);
let code_id = ProgramsStorageManager::access_primary_program(program_id, |program| {
let Some(Program::Active(ActiveProgram { code_id, .. })) = program else {
unreachable!("checked upper, that it's the case for an active program");
};
*code_id
});
debug_assert!(code_id != CUSTOM_WASM_PROGRAM_CODE_ID);
let code_metadata = self
.code_metadata(code_id)
.cloned()
.expect("internal error: code metadata not found for existing active program");
let instrumented_code = self
.instrumented_code(code_id)
.cloned()
.expect("internal error: instrumented code not found for existing active program");
core_processor::informational::execute_for_reply::<Ext<LazyPagesNative>, _>(
String::from("state"),
instrumented_code,
code_metadata,
allocations,
Some((program_id, Default::default())),
payload,
MAX_USER_GAS_LIMIT,
self.blocks_manager.get(),
)
.map_err(TestError::ReadStateError)
}
}
pub(crate) fn read_memory_pages(&self, program_id: ActorId) -> BTreeMap<GearPage, PageBuf> {
ProgramsStorageManager::program_pages(program_id)
}
}