Skip to content

Commit

Permalink
feat: improve StateStorage tests (#1211)
Browse files Browse the repository at this point in the history
  • Loading branch information
morph-dev authored Mar 13, 2024
1 parent 819f4b4 commit d0281da
Showing 1 changed file with 54 additions and 64 deletions.
118 changes: 54 additions & 64 deletions trin-state/src/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,100 +197,90 @@ impl StateStorage {
pub mod test {
use std::path::PathBuf;

use anyhow::{anyhow, Result};
use anyhow::Result;
use ethportal_api::utils::bytes::hex_decode;
use rstest::rstest;
use serde::Deserialize;
use tracing::info;
use trin_storage::test_utils::create_test_portal_storage_config_with_capacity;
use trin_utils::submodules::read_portal_spec_tests_file;

use super::*;

const STORAGE_CAPACITY_MB: u64 = 10;

#[test]
fn account_trie_node() -> Result<()> {
let (temp_dir, config) =
create_test_portal_storage_config_with_capacity(STORAGE_CAPACITY_MB)?;
let mut storage = StateStorage::new(config)?;

let key_yaml = read_yaml_file("account_trie_node_key.yaml")?;
let key = StateContentKey::deserialize(&key_yaml["content_key"])?;

let value_yaml = read_yaml_file("account_trie_node_with_proof.yaml")?;
let value = StateContentValue::deserialize(&value_yaml["content_value"])?;

let expected_stored_value = "0x04000000f8719d20a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a3002b851f84f018b02b4f32ee2f03d31ee3fbba046d5eb15d44b160805e80d05e2a47d434053e6c4b3ef9d1111773039e9586661a0d0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23";

storage.put(key.clone(), value.encode())?;

assert_eq!(
storage.get(&key).unwrap(),
Some(hex_decode(expected_stored_value)?)
);

drop(temp_dir);
Ok(())
struct ContentData {
key: StateContentKey,
store_value: Vec<u8>,
lookup_value: Vec<u8>,
}

#[test]
fn contract_storage_trie_node() -> Result<()> {
let (temp_dir, config) =
#[rstest]
#[case::account_trie_node("account_trie_node.yaml")]
#[case::contract_storage_trie_node("contract_storage_trie_node.yaml")]
#[case::contract_bytecode("contract_bytecode.yaml")]
fn put_get(#[case] file_name: &str) -> Result<()> {
let (_temp_dir, config) =
create_test_portal_storage_config_with_capacity(STORAGE_CAPACITY_MB)?;
let mut storage = StateStorage::new(config)?;

let key_yaml = read_yaml_file("contract_storage_trie_node_key.yaml")?;
let key = StateContentKey::deserialize(&key_yaml["content_key"])?;

let value_yaml = read_yaml_file("contract_storage_trie_node_with_proof.yaml")?;
let value = StateContentValue::deserialize(&value_yaml["content_value"])?;
for test_case in read_test_cases(file_name)? {
info!("Testing key: {}", test_case.key);

let expected_stored_value =
"0x04000000e09e20fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace12";
storage.put(test_case.key.clone(), test_case.store_value)?;

storage.put(key.clone(), value.encode())?;

assert_eq!(
storage.get(&key).unwrap(),
Some(hex_decode(expected_stored_value)?)
);
assert_eq!(storage.get(&test_case.key)?, Some(test_case.lookup_value));
}

drop(temp_dir);
Ok(())
}

#[test]
fn contract_bytecode() -> Result<()> {
let (temp_dir, config) =
#[rstest]
#[case::account_trie_node("account_trie_node.yaml")]
#[case::contract_storage_trie_node("contract_storage_trie_node.yaml")]
#[case::contract_bytecode("contract_bytecode.yaml")]
fn put_should_fail_for_lookup_value(#[case] file_name: &str) -> Result<()> {
let (_temp_dir, config) =
create_test_portal_storage_config_with_capacity(STORAGE_CAPACITY_MB)?;
let mut storage = StateStorage::new(config)?;

let key_yaml = read_yaml_file("contract_bytecode_key.yaml")?;
let key = StateContentKey::deserialize(&key_yaml["content_key"])?;

let value_yaml = read_yaml_file("contract_bytecode_with_proof.yaml")?;
let value = StateContentValue::deserialize(&value_yaml["content_value"])?;

let expected_stored_value = "0x040000006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029";

storage.put(key.clone(), value.encode())?;
for test_case in read_test_cases(file_name)? {
info!("Testing key: {}", test_case.key);

assert_eq!(
storage.get(&key).unwrap(),
Some(hex_decode(expected_stored_value)?)
);
let put_result = storage.put(test_case.key.clone(), test_case.lookup_value);
assert!(matches!(
put_result,
Err(ContentStoreError::InvalidData { .. })
));
}

drop(temp_dir);
Ok(())
}

fn read_yaml_file(filename: &str) -> Result<serde_yaml::Mapping> {
fn read_test_cases(filename: &str) -> Result<Vec<ContentData>> {
let file = read_portal_spec_tests_file(
PathBuf::from("tests/mainnet/state/serialization").join(filename),
PathBuf::from("tests/mainnet/state/validation").join(filename),
)?;
let value: serde_yaml::Value = serde_yaml::from_str(&file)?;
value
.as_mapping()
.map(Clone::clone)
.ok_or(anyhow!("Expected mapping at the root of a file"))

let mut result = vec![];

for value in value.as_sequence().unwrap() {
result.push(ContentData {
key: StateContentKey::deserialize(value.get("content_key").unwrap())?,
store_value: hex_decode(
value.get("content_value_offer").unwrap().as_str().unwrap(),
)?,
lookup_value: hex_decode(
value
.get("content_value_retrieval")
.unwrap()
.as_str()
.unwrap(),
)?,
});
}

Ok(result)
}
}

0 comments on commit d0281da

Please sign in to comment.