harden bank tests (#34821)

* harden bank tests by specifying exact genesis config wrt the fee rate and rent

* rename to clarify test function, add comments
This commit is contained in:
Tao Zhu 2024-01-22 13:38:56 -06:00 committed by GitHub
parent 9db4e84e72
commit a5c470d2fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 69 additions and 33 deletions

View File

@ -71,7 +71,7 @@ use {
feature_set::{self, FeatureSet},
fee::FeeStructure,
fee_calculator::FeeRateGovernor,
genesis_config::{create_genesis_config, ClusterType, GenesisConfig},
genesis_config::{ClusterType, GenesisConfig},
hash::{hash, Hash},
incinerator,
instruction::{AccountMeta, CompiledInstruction, Instruction, InstructionError},
@ -170,6 +170,28 @@ fn new_bank_from_parent_with_bank_forks(
.clone_without_scheduler()
}
fn create_genesis_config_no_tx_fee_no_rent(lamports: u64) -> (GenesisConfig, Keypair) {
// genesis_util creates config with no tx fee and no rent
let genesis_config_info = solana_runtime::genesis_utils::create_genesis_config(lamports);
(
genesis_config_info.genesis_config,
genesis_config_info.mint_keypair,
)
}
fn create_genesis_config_no_tx_fee(lamports: u64) -> (GenesisConfig, Keypair) {
// genesis_config creates config with default fee rate and default rent
// override to set fee rate to zero.
let (mut genesis_config, mint_keypair) =
solana_sdk::genesis_config::create_genesis_config(lamports);
genesis_config.fee_rate_governor = FeeRateGovernor::new(0, 0);
(genesis_config, mint_keypair)
}
fn create_genesis_config(lamports: u64) -> (GenesisConfig, Keypair) {
solana_sdk::genesis_config::create_genesis_config(lamports)
}
#[test]
fn test_race_register_tick_freeze() {
solana_logger::setup();
@ -428,7 +450,7 @@ fn test_credit_debit_rent_no_side_effect_on_hash() {
for set_exempt_rent_epoch_max in [false, true] {
solana_logger::setup();
let (mut genesis_config, _mint_keypair) = create_genesis_config(10);
let (mut genesis_config, _mint_keypair) = create_genesis_config_no_tx_fee(10);
genesis_config.rent = rent_with_exemption_threshold(21.0);
@ -2128,7 +2150,7 @@ fn test_purge_empty_accounts() {
// so we have to stop at various points and restart to actively test.
for pass in 0..3 {
solana_logger::setup();
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.));
let amount = genesis_config.rent.minimum_balance(0);
let (mut bank, bank_forks) =
Bank::new_for_tests(&genesis_config).wrap_with_bank_forks_for_tests();
@ -2238,7 +2260,7 @@ fn test_two_payments_to_one_party() {
#[test]
fn test_one_source_two_tx_one_batch() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.));
let key1 = solana_sdk::pubkey::new_rand();
let key2 = solana_sdk::pubkey::new_rand();
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
@ -2268,7 +2290,7 @@ fn test_one_source_two_tx_one_batch() {
#[test]
fn test_one_tx_two_out_atomic_fail() {
let amount = sol_to_lamports(1.);
let (genesis_config, mint_keypair) = create_genesis_config(amount);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(amount);
let key1 = solana_sdk::pubkey::new_rand();
let key2 = solana_sdk::pubkey::new_rand();
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
@ -2289,7 +2311,7 @@ fn test_one_tx_two_out_atomic_fail() {
#[test]
fn test_one_tx_two_out_atomic_pass() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.));
let key1 = solana_sdk::pubkey::new_rand();
let key2 = solana_sdk::pubkey::new_rand();
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
@ -2360,7 +2382,7 @@ fn test_account_not_found() {
#[test]
fn test_insufficient_funds() {
let mint_amount = sol_to_lamports(1.);
let (genesis_config, mint_keypair) = create_genesis_config(mint_amount);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(mint_amount);
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let pubkey = solana_sdk::pubkey::new_rand();
let amount = genesis_config.rent.minimum_balance(0);
@ -2643,20 +2665,20 @@ fn test_bank_tx_compute_unit_fee() {
} = create_genesis_config_with_leader(mint, &leader, 3);
genesis_config.fee_rate_governor = FeeRateGovernor::new(4, 0); // something divisible by 2
let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let expected_fee_paid = calculate_test_fee(
&SanitizedMessage::try_from(Message::new(&[], Some(&Pubkey::new_unique()))).unwrap(),
genesis_config
.fee_rate_governor
.create_fee_calculator()
.lamports_per_signature,
&FeeStructure::default(),
&bank.fee_structure,
);
let (expected_fee_collected, expected_fee_burned) =
genesis_config.fee_rate_governor.burn(expected_fee_paid);
let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let capitalization = bank.capitalization();
let tx = system_transaction::transfer(
@ -2773,9 +2795,14 @@ fn test_bank_blockhash_fee_structure() {
let tx = system_transaction::transfer(&mint_keypair, &key, 1, cheap_blockhash);
assert_eq!(bank.process_transaction(&tx), Ok(()));
assert_eq!(bank.get_balance(&key), 1);
let cheap_fee = calculate_test_fee(
&SanitizedMessage::try_from(Message::new(&[], Some(&Pubkey::new_unique()))).unwrap(),
cheap_lamports_per_signature,
&bank.fee_structure,
);
assert_eq!(
bank.get_balance(&mint_keypair.pubkey()),
initial_mint_balance - 1 - cheap_lamports_per_signature
initial_mint_balance - 1 - cheap_fee
);
// Send a transfer using expensive_blockhash
@ -2784,9 +2811,14 @@ fn test_bank_blockhash_fee_structure() {
let tx = system_transaction::transfer(&mint_keypair, &key, 1, expensive_blockhash);
assert_eq!(bank.process_transaction(&tx), Ok(()));
assert_eq!(bank.get_balance(&key), 1);
let expensive_fee = calculate_test_fee(
&SanitizedMessage::try_from(Message::new(&[], Some(&Pubkey::new_unique()))).unwrap(),
expensive_lamports_per_signature,
&bank.fee_structure,
);
assert_eq!(
bank.get_balance(&mint_keypair.pubkey()),
initial_mint_balance - 1 - expensive_lamports_per_signature
initial_mint_balance - 1 - expensive_fee
);
}
@ -2828,7 +2860,7 @@ fn test_bank_blockhash_compute_unit_fee_structure() {
let cheap_fee = calculate_test_fee(
&SanitizedMessage::try_from(Message::new(&[], Some(&Pubkey::new_unique()))).unwrap(),
cheap_lamports_per_signature,
&FeeStructure::default(),
&bank.fee_structure,
);
assert_eq!(
bank.get_balance(&mint_keypair.pubkey()),
@ -2844,7 +2876,7 @@ fn test_bank_blockhash_compute_unit_fee_structure() {
let expensive_fee = calculate_test_fee(
&SanitizedMessage::try_from(Message::new(&[], Some(&Pubkey::new_unique()))).unwrap(),
expensive_lamports_per_signature,
&FeeStructure::default(),
&bank.fee_structure,
);
assert_eq!(
bank.get_balance(&mint_keypair.pubkey()),
@ -2955,7 +2987,7 @@ fn test_filter_program_errors_and_collect_compute_unit_fee() {
.fee_rate_governor
.create_fee_calculator()
.lamports_per_signature,
&FeeStructure::default(),
&bank.fee_structure,
) * 2
)
.0
@ -2966,7 +2998,8 @@ fn test_filter_program_errors_and_collect_compute_unit_fee() {
#[test]
fn test_debits_before_credits() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(2.));
let (genesis_config, mint_keypair) =
create_genesis_config_no_tx_fee_no_rent(sol_to_lamports(2.));
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let keypair = Keypair::new();
let tx0 = system_transaction::transfer(
@ -3204,7 +3237,7 @@ fn test_bank_invalid_account_index() {
#[test]
fn test_bank_pay_to_self() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.));
let key1 = Keypair::new();
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let amount = genesis_config.rent.minimum_balance(0);
@ -3297,11 +3330,12 @@ fn test_bank_parent_already_processed() {
/// Verifies that last ids and accounts are correctly referenced from parent
#[test]
fn test_bank_parent_account_spend() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.0));
let key1 = Keypair::new();
let key2 = Keypair::new();
let (parent, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let amount = genesis_config.rent.minimum_balance(0);
println!("==== amount {}", amount);
let tx =
system_transaction::transfer(&mint_keypair, &key1.pubkey(), amount, genesis_config.hash());
@ -3314,7 +3348,8 @@ fn test_bank_parent_account_spend() {
#[test]
fn test_bank_hash_internal_state() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
let (genesis_config, mint_keypair) =
create_genesis_config_no_tx_fee_no_rent(sol_to_lamports(1.));
let (bank0, _) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let (bank1, bank_forks_1) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let amount = genesis_config.rent.minimum_balance(0);
@ -3345,7 +3380,8 @@ fn test_bank_hash_internal_state() {
fn test_bank_hash_internal_state_verify() {
for pass in 0..3 {
solana_logger::setup();
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
let (genesis_config, mint_keypair) =
create_genesis_config_no_tx_fee_no_rent(sol_to_lamports(1.));
let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let amount = genesis_config.rent.minimum_balance(0);
@ -3538,7 +3574,7 @@ fn test_bank_hash_internal_state_squash() {
#[test]
fn test_bank_squash() {
solana_logger::setup();
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(2.));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(2.));
let key1 = Keypair::new();
let key2 = Keypair::new();
let (parent, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
@ -4544,7 +4580,7 @@ fn test_status_cache_ancestors() {
#[test]
fn test_add_builtin() {
let (genesis_config, mint_keypair) = create_genesis_config(500);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
let mut bank = Bank::new_for_tests(&genesis_config);
fn mock_vote_program_id() -> Pubkey {
@ -5968,7 +6004,7 @@ fn test_pre_post_transaction_balances() {
#[test]
fn test_transaction_with_duplicate_accounts_in_instruction() {
let (genesis_config, mint_keypair) = create_genesis_config(500);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
let mock_program_id = Pubkey::from([2u8; 32]);
let bank =
@ -6025,7 +6061,7 @@ fn test_transaction_with_duplicate_accounts_in_instruction() {
#[test]
fn test_transaction_with_program_ids_passed_to_programs() {
let (genesis_config, mint_keypair) = create_genesis_config(500);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
let mock_program_id = Pubkey::from([2u8; 32]);
let bank =
@ -6061,7 +6097,7 @@ fn test_transaction_with_program_ids_passed_to_programs() {
#[test]
fn test_account_ids_after_program_ids() {
solana_logger::setup();
let (genesis_config, mint_keypair) = create_genesis_config(500);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let from_pubkey = solana_sdk::pubkey::new_rand();
@ -6100,7 +6136,7 @@ fn test_account_ids_after_program_ids() {
#[test]
fn test_incinerator() {
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000_000_000);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(1_000_000_000_000);
let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
// Move to the first normal slot so normal rent behaviour applies
@ -6241,7 +6277,7 @@ fn test_program_id_as_payer() {
#[test]
fn test_ref_account_key_after_program_id() {
let (genesis_config, mint_keypair) = create_genesis_config(500);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let from_pubkey = solana_sdk::pubkey::new_rand();
@ -7145,7 +7181,7 @@ fn test_bank_load_program() {
#[test]
fn test_bpf_loader_upgradeable_deploy_with_max_len() {
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000_000);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(1_000_000_000);
let mut bank = Bank::new_for_tests(&genesis_config);
bank.feature_set = Arc::new(FeatureSet::all_enabled());
let (bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
@ -10190,7 +10226,7 @@ fn test_calculate_fee_secp256k1() {
#[test]
fn test_an_empty_instruction_without_program() {
let (genesis_config, mint_keypair) = create_genesis_config(1);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(1);
let destination = solana_sdk::pubkey::new_rand();
let mut ix = system_instruction::transfer(&mint_keypair.pubkey(), &destination, 0);
ix.program_id = native_loader::id(); // Empty executable account chain
@ -13004,7 +13040,7 @@ fn test_store_vote_accounts_partitioned_empty() {
#[test]
fn test_system_instruction_allocate() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.0));
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let bank_client = BankClient::new_shared(bank);
let data_len = 2;
@ -13062,7 +13098,7 @@ where
let len2 = 456;
// create initial bank and fund the alice account
let (genesis_config, mint_keypair) = create_genesis_config(mint_lamports);
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(mint_lamports);
let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let bank_client = BankClient::new_shared(bank.clone());
bank_client
@ -13131,7 +13167,7 @@ fn test_create_zero_lamport_without_clean() {
#[test]
fn test_system_instruction_assign_with_seed() {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.0));
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let bank_client = BankClient::new_shared(bank);
@ -13166,7 +13202,7 @@ fn test_system_instruction_assign_with_seed() {
#[test]
fn test_system_instruction_unsigned_transaction() {
let (genesis_config, alice_keypair) = create_genesis_config(sol_to_lamports(1.0));
let (genesis_config, alice_keypair) = create_genesis_config_no_tx_fee(sol_to_lamports(1.0));
let alice_pubkey = alice_keypair.pubkey();
let mallory_keypair = Keypair::new();
let mallory_pubkey = mallory_keypair.pubkey();