Move `test_rent_state_list_len` to SVM (#35287)

This commit is contained in:
Lucas Steuernagel 2024-02-22 18:37:09 -03:00 committed by GitHub
parent d9802027cb
commit 31a73ab731
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 123 additions and 59 deletions

View File

@ -104,13 +104,10 @@ use {
Result, SanitizedTransaction, Transaction, TransactionError,
TransactionVerificationMode,
},
transaction_context::{TransactionAccount, TransactionContext},
transaction_context::TransactionAccount,
},
solana_stake_program::stake_state::{self, StakeStateV2},
solana_svm::{
account_loader::load_accounts, transaction_account_state_info::TransactionAccountStateInfo,
transaction_error_metrics::TransactionErrorMetrics, transaction_results::DurableNonceFee,
},
solana_svm::transaction_results::DurableNonceFee,
solana_vote_program::{
vote_instruction,
vote_state::{
@ -10969,60 +10966,6 @@ fn test_rent_state_incinerator() {
}
}
#[test]
fn test_rent_state_list_len() {
let GenesisConfigInfo {
mut genesis_config,
mint_keypair,
..
} = create_genesis_config_with_leader(sol_to_lamports(100.), &Pubkey::new_unique(), 42);
genesis_config.rent = Rent::default();
let bank = Bank::new_for_tests(&genesis_config);
let recipient = Pubkey::new_unique();
let tx = system_transaction::transfer(
&mint_keypair,
&recipient,
sol_to_lamports(1.),
bank.last_blockhash(),
);
let num_accounts = tx.message().account_keys.len();
let sanitized_tx = SanitizedTransaction::try_from_legacy_transaction(tx).unwrap();
let mut error_counters = TransactionErrorMetrics::default();
let loaded_txs = load_accounts(
&bank,
&[sanitized_tx.clone()],
&[(Ok(()), None, Some(0))],
&mut error_counters,
&FeeStructure::default(),
None,
&HashMap::new(),
&LoadedProgramsForTxBatch::default(),
);
let compute_budget = bank.runtime_config.compute_budget.unwrap_or_else(|| {
ComputeBudget::new(u64::from(
compute_budget_processor::DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
))
});
let transaction_context = TransactionContext::new(
loaded_txs[0].0.as_ref().unwrap().accounts.clone(),
Rent::default(),
compute_budget.max_invoke_stack_height,
compute_budget.max_instruction_trace_length,
);
assert_eq!(
TransactionAccountStateInfo::new(
&bank.rent_collector.rent,
&transaction_context,
sanitized_tx.message()
)
.len(),
num_accounts,
);
}
#[test]
fn test_update_accounts_data_size() {
// Test: Subtraction saturates at 0

1
svm/tests/mod.rs Normal file
View File

@ -0,0 +1 @@
mod rent_state;

120
svm/tests/rent_state.rs Normal file
View File

@ -0,0 +1,120 @@
#![cfg(test)]
use {
solana_program_runtime::{
compute_budget::ComputeBudget, compute_budget_processor,
loaded_programs::LoadedProgramsForTxBatch,
},
solana_sdk::{
account::{AccountSharedData, WritableAccount},
feature_set::FeatureSet,
fee::FeeStructure,
hash::Hash,
native_loader,
native_token::sol_to_lamports,
pubkey::Pubkey,
rent::Rent,
rent_collector::RentCollector,
signature::{Keypair, Signer},
system_transaction,
transaction::SanitizedTransaction,
transaction_context::TransactionContext,
},
solana_svm::{
account_loader::load_accounts, transaction_account_state_info::TransactionAccountStateInfo,
transaction_error_metrics::TransactionErrorMetrics,
transaction_processor::TransactionProcessingCallback,
},
std::{collections::HashMap, sync::Arc},
};
#[derive(Default)]
struct MockBankCallback {
rent_collector: RentCollector,
feature_set: Arc<FeatureSet>,
account_shared_data: HashMap<Pubkey, AccountSharedData>,
}
impl TransactionProcessingCallback for MockBankCallback {
fn account_matches_owners(&self, _account: &Pubkey, _owners: &[Pubkey]) -> Option<usize> {
todo!()
}
fn get_account_shared_data(&self, pubkey: &Pubkey) -> Option<AccountSharedData> {
self.account_shared_data.get(pubkey).cloned()
}
fn get_last_blockhash_and_lamports_per_signature(&self) -> (Hash, u64) {
todo!()
}
fn get_rent_collector(&self) -> &RentCollector {
&self.rent_collector
}
fn get_feature_set(&self) -> Arc<FeatureSet> {
self.feature_set.clone()
}
}
#[test]
fn test_rent_state_list_len() {
let mint_keypair = Keypair::new();
let mut bank = MockBankCallback::default();
let recipient = Pubkey::new_unique();
let last_block_hash = Hash::new_unique();
let mut system_data = AccountSharedData::default();
system_data.set_executable(true);
system_data.set_owner(native_loader::id());
bank.account_shared_data
.insert(Pubkey::new_from_array([0u8; 32]), system_data);
let mut mint_data = AccountSharedData::default();
mint_data.set_lamports(2);
bank.account_shared_data
.insert(mint_keypair.pubkey(), mint_data);
bank.account_shared_data
.insert(recipient, AccountSharedData::default());
let tx = system_transaction::transfer(
&mint_keypair,
&recipient,
sol_to_lamports(1.),
last_block_hash,
);
let num_accounts = tx.message().account_keys.len();
let sanitized_tx = SanitizedTransaction::try_from_legacy_transaction(tx).unwrap();
let mut error_counters = TransactionErrorMetrics::default();
let loaded_txs = load_accounts(
&bank,
&[sanitized_tx.clone()],
&[(Ok(()), None, Some(0))],
&mut error_counters,
&FeeStructure::default(),
None,
&HashMap::new(),
&LoadedProgramsForTxBatch::default(),
);
let compute_budget = ComputeBudget::new(u64::from(
compute_budget_processor::DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
));
let transaction_context = TransactionContext::new(
loaded_txs[0].0.as_ref().unwrap().accounts.clone(),
Rent::default(),
compute_budget.max_invoke_stack_height,
compute_budget.max_instruction_trace_length,
);
assert_eq!(
TransactionAccountStateInfo::new(
&Rent::default(),
&transaction_context,
sanitized_tx.message()
)
.len(),
num_accounts,
);
}