fvm_mock/
mock_env.rs

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}