Skip to content

Commit 0984227

Browse files
committed
more db coverage
1 parent b9839a0 commit 0984227

1 file changed

Lines changed: 171 additions & 63 deletions

File tree

  • packages/evm/core/src

packages/evm/core/src/db.rs

Lines changed: 171 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,21 @@ fn test_open_db() {
12861286
assert!(PersistentDB::new(PersistentDBOptions::new(tmp.path().to_path_buf())).is_ok());
12871287
}
12881288

1289+
#[test]
1290+
fn test_open_db_with_logger() {
1291+
let tmp = tempfile::Builder::new()
1292+
.prefix("evm.mdb")
1293+
.tempdir()
1294+
.unwrap();
1295+
1296+
assert!(
1297+
PersistentDB::new(
1298+
PersistentDBOptions::new(tmp.path().to_path_buf()).with_logger(Logger::new(None))
1299+
)
1300+
.is_ok()
1301+
);
1302+
}
1303+
12891304
#[test]
12901305
fn test_commit_changes() {
12911306
let path = tempfile::Builder::new()
@@ -1708,88 +1723,181 @@ fn test_read_accounts() {
17081723
assert_eq!(read, addresses.len());
17091724
}
17101725

1711-
#[test]
1712-
fn test_read_receipts() {
1713-
let path = tempfile::Builder::new()
1714-
.prefix("evm.mdb")
1715-
.tempdir()
1716-
.unwrap();
1726+
#[cfg(test)]
1727+
mod tests {
1728+
use crate::{
1729+
compression::CompressedBincode,
1730+
db::{
1731+
CommitKey, CommitReceipts, LegacyAddressWrapper, PendingCommit, PersistentDB,
1732+
PersistentDBOptions, StaticStringWrapper, StringWrapper,
1733+
},
1734+
legacy::{LegacyAccountAttributes, LegacyAddress},
1735+
receipt::TxReceipt,
1736+
};
1737+
use alloy_primitives::{B256, U256, address, b256};
1738+
use revm::{primitives::HashMap, state::AccountInfo};
17171739

1718-
let db =
1719-
PersistentDB::new(PersistentDBOptions::new(path.path().to_path_buf())).expect("database");
1740+
use heed::{BytesDecode, BytesEncode};
17201741

1721-
let target_block = 100;
1722-
let mut total_receipts = 0;
1742+
#[test]
1743+
fn test_legacy_address_wrapper() {
1744+
let legacy_address: LegacyAddress =
1745+
"DJmvhhiQFSrEQCq9FUxvcLcpcBjx7K3yLt".try_into().unwrap();
17231746

1724-
{
1725-
let mut wtxn = db.env.write_txn().unwrap();
1747+
let wrapper = LegacyAddressWrapper(legacy_address);
1748+
let serialized = <LegacyAddressWrapper as BytesEncode>::bytes_encode(&wrapper).expect("ok");
17261749

1727-
fn random_b256(seed: u64, offset: u64) -> B256 {
1728-
use std::collections::hash_map::DefaultHasher;
1729-
use std::hash::{Hash, Hasher};
1730-
let mut hasher = DefaultHasher::new();
1731-
seed.hash(&mut hasher);
1750+
let deserialized =
1751+
<LegacyAddressWrapper as BytesDecode>::bytes_decode(&serialized).expect("ok");
1752+
assert_eq!(legacy_address, deserialized.0);
1753+
}
17321754

1733-
B256::from(U256::from(hasher.finish() + offset))
1734-
}
1755+
#[test]
1756+
fn test_string_wrapper() {
1757+
let string = "test".to_owned();
17351758

1736-
for i in 0..target_block {
1737-
let block_number = (i + 1) as u64;
1759+
let wrapper = StringWrapper(string);
1760+
let serialized = <StringWrapper as BytesEncode>::bytes_encode(&wrapper).expect("ok");
1761+
let deserialized = <StringWrapper as BytesDecode>::bytes_decode(&serialized).expect("ok");
17381762

1739-
let receipts: HashMap<B256, TxReceipt> = [
1740-
(random_b256(block_number, 0), TxReceipt::default()),
1741-
(random_b256(block_number, 1), TxReceipt::default()),
1742-
(random_b256(block_number, 2), TxReceipt::default()),
1743-
(random_b256(block_number, 3), TxReceipt::default()),
1744-
]
1745-
.into_iter()
1746-
.collect();
1763+
assert_eq!("test", deserialized.0);
1764+
}
17471765

1748-
total_receipts += receipts.len();
1766+
#[test]
1767+
fn test_static_string_wrapper() {
1768+
let string = "test";
17491769

1750-
db.inner
1751-
.borrow_mut()
1752-
.commits
1753-
.put(
1754-
&mut wtxn,
1755-
&block_number,
1756-
&CompressedBincode(&CommitReceipts {
1757-
tx_receipts: receipts,
1758-
..Default::default()
1759-
}),
1760-
)
1761-
.unwrap();
1762-
}
1763-
wtxn.commit().unwrap();
1770+
let wrapper = StaticStringWrapper(string);
1771+
let serialized = <StaticStringWrapper as BytesEncode>::bytes_encode(&wrapper).expect("ok");
1772+
1773+
assert_eq!(serialized, &b"test"[..]);
17641774
}
17651775

1766-
const LIMIT: u64 = 7;
1767-
let mut offset = 0;
1776+
#[test]
1777+
fn test_commit_key() {
1778+
let key = CommitKey(0, 0, B256::ZERO);
1779+
let mut pending = PendingCommit::new(key);
1780+
1781+
let info = AccountInfo {
1782+
balance: U256::ONE,
1783+
nonce: 1,
1784+
code_hash: b256!("0000000000000000000000000000000000000000000000000000000000000001"),
1785+
account_id: None,
1786+
code: None,
1787+
};
17681788

1769-
let mut read_block_number = 0;
1770-
let mut read_receipts = 0;
1789+
let attributes = LegacyAccountAttributes {
1790+
legacy_nonce: Some(0),
1791+
second_public_key: Some("key".into()),
1792+
multi_signature: None,
1793+
};
17711794

1772-
loop {
1773-
let (next, items) = db.get_receipts(offset, LIMIT).unwrap();
1774-
for (block_number, receipts) in items {
1775-
read_block_number = block_number;
1776-
read_receipts += receipts.len();
1777-
}
1795+
pending.import_account(
1796+
address!("0000000000000000000000000000000000000001"),
1797+
info,
1798+
Some(attributes),
1799+
);
17781800

1779-
if next.is_none() {
1780-
break;
1801+
let info = AccountInfo {
1802+
balance: U256::ZERO,
1803+
nonce: 0,
1804+
code_hash: B256::ZERO,
1805+
account_id: None,
1806+
code: None,
1807+
};
1808+
pending.import_account(
1809+
address!("0000000000000000000000000000000000000002"),
1810+
info,
1811+
None,
1812+
);
1813+
1814+
assert_eq!(pending.transitions.transitions.len(), 2);
1815+
assert_eq!(pending.legacy_attributes.len(), 1);
1816+
}
1817+
1818+
#[test]
1819+
fn test_read_receipts() {
1820+
let path = tempfile::Builder::new()
1821+
.prefix("evm.mdb")
1822+
.tempdir()
1823+
.unwrap();
1824+
1825+
let db = PersistentDB::new(PersistentDBOptions::new(path.path().to_path_buf()))
1826+
.expect("database");
1827+
1828+
let target_block = 100;
1829+
let mut total_receipts = 0;
1830+
1831+
{
1832+
let mut wtxn = db.env.write_txn().unwrap();
1833+
1834+
fn random_b256(seed: u64, offset: u64) -> B256 {
1835+
use std::collections::hash_map::DefaultHasher;
1836+
use std::hash::{Hash, Hasher};
1837+
let mut hasher = DefaultHasher::new();
1838+
seed.hash(&mut hasher);
1839+
1840+
B256::from(U256::from(hasher.finish() + offset))
1841+
}
1842+
1843+
for i in 0..target_block {
1844+
let block_number = (i + 1) as u64;
1845+
1846+
let receipts: HashMap<B256, TxReceipt> = [
1847+
(random_b256(block_number, 0), TxReceipt::default()),
1848+
(random_b256(block_number, 1), TxReceipt::default()),
1849+
(random_b256(block_number, 2), TxReceipt::default()),
1850+
(random_b256(block_number, 3), TxReceipt::default()),
1851+
]
1852+
.into_iter()
1853+
.collect();
1854+
1855+
total_receipts += receipts.len();
1856+
1857+
db.inner
1858+
.borrow_mut()
1859+
.commits
1860+
.put(
1861+
&mut wtxn,
1862+
&block_number,
1863+
&CompressedBincode(&CommitReceipts {
1864+
tx_receipts: receipts,
1865+
..Default::default()
1866+
}),
1867+
)
1868+
.unwrap();
1869+
}
1870+
wtxn.commit().unwrap();
17811871
}
17821872

1783-
match next {
1784-
Some(next) => {
1785-
offset = next;
1873+
const LIMIT: u64 = 7;
1874+
let mut offset = 0;
1875+
1876+
let mut read_block_number = 0;
1877+
let mut read_receipts = 0;
1878+
1879+
loop {
1880+
let (next, items) = db.get_receipts(offset, LIMIT).unwrap();
1881+
for (block_number, receipts) in items {
1882+
read_block_number = block_number;
1883+
read_receipts += receipts.len();
17861884
}
1787-
None => {
1885+
1886+
if next.is_none() {
17881887
break;
17891888
}
1889+
1890+
match next {
1891+
Some(next) => {
1892+
offset = next;
1893+
}
1894+
None => {
1895+
break;
1896+
}
1897+
}
17901898
}
1791-
}
17921899

1793-
assert_eq!(read_block_number, target_block);
1794-
assert_eq!(read_receipts, total_receipts);
1900+
assert_eq!(read_block_number, target_block);
1901+
assert_eq!(read_receipts, total_receipts);
1902+
}
17951903
}

0 commit comments

Comments
 (0)