1use std::cell::RefCell;
2use std::rc::Rc;
3use fvm_std::prelude::{Vec, H256, Address};
4use fvm_std::types::LogLevel;
5use crate::mock_runtime::{RuntimeInner, Runtime, setup_runtime};
6
7
8pub struct MockRuntime {
9 inner: Rc<RefCell<RuntimeInner>>,
10}
11
12impl MockRuntime {
13 pub fn storage_write<K: AsRef<[u8]>, P: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, prefix: P, val: V) -> &Self {
14 let mut p = prefix.as_ref().to_vec();
15 let mut k = key.as_ref().to_vec();
16 p.append(&mut k);
17 self.inner.borrow_mut().storage.insert(p, val.as_ref().to_vec());
18 self
19 }
20
21 pub fn storage_read(&self, key: &[u8], prefix: &[u8]) -> Option<Vec<u8>> {
22 let mut p = prefix.as_ref().to_vec();
23 let mut k = key.as_ref().to_vec();
24 p.append(&mut k);
25 self.inner.borrow().storage.get(&p).map(|val| {
26 val.to_vec()
27 })
28 }
29
30 pub fn storage_delete(&self, key: &[u8], prefix: &[u8]) -> &Self {
31 let mut p = prefix.to_vec();
32 let mut s = key.to_vec();
33 p.append(&mut s);
34 self.inner.borrow_mut().storage.remove(&p);
35 self
36 }
37
38 pub fn block_time(&self, time: u64) -> &Self {
39 self.inner.borrow_mut().block_time = time;
40 self
41 }
42
43 pub fn block_height(&self, height: u64) -> &Self {
44 self.inner.borrow_mut().block_height = height;
45 self
46 }
47
48 pub fn self_address(&self, addr: &Address) -> &Self {
49 self.inner.borrow_mut().self_addr = addr.clone();
50 self
51 }
52
53 pub fn caller_address(&self, caller: &Address) -> &Self {
54 self.inner.borrow_mut().caller_addr = caller.clone();
55 self
56 }
57
58 pub fn origin_address(&self, origin: &Address) -> &Self {
59 self.inner.borrow_mut().origin_addr = origin.clone();
60 self
61 }
62
63 pub fn tx_hash(&self, tx_hash: &H256) -> &Self {
64 self.inner.borrow_mut().tx_hash = tx_hash.clone();
65 self
66 }
67
68 pub fn call_contracts<T: scale::Encode>(&self, call_rets: Vec<T>) -> &Self {
69 for c in call_rets {
70 self.inner.borrow_mut().call_return.insert(0, T::encode(&c))
71 }
72 self
73 }
74
75 pub fn call_contract<T: scale::Encode>(&self, call_ret: T) -> &Self {
76 self.inner.borrow_mut().call_return.insert(0, call_ret.encode());
77 self
78 }
79
80 pub fn input(&self, _dis: &[u8]) -> &Self {
81 self.inner.borrow_mut().input = _dis.to_vec();
82 self
83 }
84
85 pub fn ret(&self, msg: &[u8]) -> &Self {
86 self.inner.borrow_mut().ret = msg.to_vec();
87 self
88 }
89
90 pub fn get_log(&self, level: LogLevel) -> Vec<Vec<u8>> {
91 return self.inner.borrow().debug.get(&level.to_int()).expect("error level").to_vec();
92 }
93
94 pub fn get_event(&self) -> Vec<Vec<u8>> {
95 self.inner.borrow().log.to_vec()
96 }
97
98 pub fn get_ret(&self) -> Vec<u8> {
99 self.inner.borrow().ret.to_vec()
100 }
101}
102
103pub fn build_runtime() -> MockRuntime {
104 let inner = Rc::new(RefCell::new(RuntimeInner::default()));
105
106 let rt = Runtime { inner: inner.clone() };
107 setup_runtime(rt);
108
109 MockRuntime { inner }
110}