From 820aa7e0eafb29f53453f560f08ea545b58cbf94 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 17:45:23 +0000 Subject: [PATCH] Add tests for store_account_and_update_capitalization (#14008) (#14016) (cherry picked from commit 28b014ccf489b5460d8a158412f648f4d36c6ad8) Co-authored-by: Ryo Onodera --- runtime/src/bank.rs | 120 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 19 deletions(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index c51a1b1742..4e709e5608 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -3695,14 +3695,18 @@ impl Bank { } #[cfg(test)] - fn add_account_and_update_capitalization(&self, pubkey: &Pubkey, new_account: &Account) { + fn store_account_and_update_capitalization(&self, pubkey: &Pubkey, new_account: &Account) { if let Some(old_account) = self.get_account(&pubkey) { - if new_account.lamports > old_account.lamports { - self.capitalization - .fetch_add(new_account.lamports - old_account.lamports, Relaxed); - } else { - self.capitalization - .fetch_sub(old_account.lamports - new_account.lamports, Relaxed); + match new_account.lamports.cmp(&old_account.lamports) { + std::cmp::Ordering::Greater => { + self.capitalization + .fetch_add(new_account.lamports - old_account.lamports, Relaxed); + } + std::cmp::Ordering::Less => { + self.capitalization + .fetch_sub(old_account.lamports - new_account.lamports, Relaxed); + } + std::cmp::Ordering::Equal => {} } } else { self.capitalization.fetch_add(new_account.lamports, Relaxed); @@ -5133,6 +5137,84 @@ pub(crate) mod tests { bank } + fn assert_capitalization_diff(bank: &Bank, updater: impl Fn(), asserter: impl Fn(u64, u64)) { + let old = bank.capitalization(); + updater(); + let new = bank.capitalization(); + asserter(old, new); + assert_eq!(bank.capitalization(), bank.calculate_capitalization()); + } + + #[test] + fn test_store_account_and_update_capitalization_missing() { + let (genesis_config, _mint_keypair) = create_genesis_config(0); + let bank = Bank::new(&genesis_config); + let pubkey = solana_sdk::pubkey::new_rand(); + + let some_lamports = 400; + let account = Account::new(some_lamports, 0, &system_program::id()); + + assert_capitalization_diff( + &bank, + || bank.store_account_and_update_capitalization(&pubkey, &account), + |old, new| assert_eq!(old + some_lamports, new), + ); + assert_eq!(account, bank.get_account(&pubkey).unwrap()); + } + + #[test] + fn test_store_account_and_update_capitalization_increased() { + let old_lamports = 400; + let (genesis_config, mint_keypair) = create_genesis_config(old_lamports); + let bank = Bank::new(&genesis_config); + let pubkey = mint_keypair.pubkey(); + + let new_lamports = 500; + let account = Account::new(new_lamports, 0, &system_program::id()); + + assert_capitalization_diff( + &bank, + || bank.store_account_and_update_capitalization(&pubkey, &account), + |old, new| assert_eq!(old + 100, new), + ); + assert_eq!(account, bank.get_account(&pubkey).unwrap()); + } + + #[test] + fn test_store_account_and_update_capitalization_decreased() { + let old_lamports = 400; + let (genesis_config, mint_keypair) = create_genesis_config(old_lamports); + let bank = Bank::new(&genesis_config); + let pubkey = mint_keypair.pubkey(); + + let new_lamports = 100; + let account = Account::new(new_lamports, 0, &system_program::id()); + + assert_capitalization_diff( + &bank, + || bank.store_account_and_update_capitalization(&pubkey, &account), + |old, new| assert_eq!(old - 300, new), + ); + assert_eq!(account, bank.get_account(&pubkey).unwrap()); + } + + #[test] + fn test_store_account_and_update_capitalization_unchanged() { + let lamports = 400; + let (genesis_config, mint_keypair) = create_genesis_config(lamports); + let bank = Bank::new(&genesis_config); + let pubkey = mint_keypair.pubkey(); + + let account = Account::new(lamports, 1, &system_program::id()); + + assert_capitalization_diff( + &bank, + || bank.store_account_and_update_capitalization(&pubkey, &account), + |old, new| assert_eq!(old, new), + ); + assert_eq!(account, bank.get_account(&pubkey).unwrap()); + } + #[test] fn test_rent_distribution() { solana_logger::setup(); @@ -5272,11 +5354,11 @@ pub(crate) mod tests { let payer = Keypair::new(); let payer_account = Account::new(400, 0, &system_program::id()); - bank.add_account_and_update_capitalization(&payer.pubkey(), &payer_account); + bank.store_account_and_update_capitalization(&payer.pubkey(), &payer_account); let payee = Keypair::new(); let payee_account = Account::new(70, 1, &system_program::id()); - bank.add_account_and_update_capitalization(&payee.pubkey(), &payee_account); + bank.store_account_and_update_capitalization(&payee.pubkey(), &payee_account); let bootstrap_validator_initial_balance = bank.get_balance(&bootstrap_validator_pubkey); @@ -6440,7 +6522,7 @@ pub(crate) mod tests { crate::stakes::tests::create_staked_node_accounts(1_0000); // set up accounts - bank.add_account_and_update_capitalization(&stake_id, &stake_account); + bank.store_account_and_update_capitalization(&stake_id, &stake_account); // generate some rewards let mut vote_state = Some(VoteState::from(&vote_account).unwrap()); @@ -6450,7 +6532,7 @@ pub(crate) mod tests { } let versioned = VoteStateVersions::Current(Box::new(vote_state.take().unwrap())); VoteState::to(&versioned, &mut vote_account).unwrap(); - bank.add_account_and_update_capitalization(&vote_id, &vote_account); + bank.store_account_and_update_capitalization(&vote_id, &vote_account); match versioned { VoteStateVersions::Current(v) => { vote_state = Some(*v); @@ -6458,7 +6540,7 @@ pub(crate) mod tests { _ => panic!("Has to be of type Current"), }; } - bank.add_account_and_update_capitalization(&vote_id, &vote_account); + bank.store_account_and_update_capitalization(&vote_id, &vote_account); let validator_points: u128 = bank .stake_delegation_accounts(&mut null_tracer()) @@ -6562,8 +6644,8 @@ pub(crate) mod tests { let (stake_id2, stake_account2) = crate::stakes::tests::create_stake_account(456, &vote_id); // set up accounts - bank.add_account_and_update_capitalization(&stake_id1, &stake_account1); - bank.add_account_and_update_capitalization(&stake_id2, &stake_account2); + bank.store_account_and_update_capitalization(&stake_id1, &stake_account1); + bank.store_account_and_update_capitalization(&stake_id2, &stake_account2); // generate some rewards let mut vote_state = Some(VoteState::from(&vote_account).unwrap()); @@ -6573,7 +6655,7 @@ pub(crate) mod tests { } let versioned = VoteStateVersions::Current(Box::new(vote_state.take().unwrap())); VoteState::to(&versioned, &mut vote_account).unwrap(); - bank.add_account_and_update_capitalization(&vote_id, &vote_account); + bank.store_account_and_update_capitalization(&vote_id, &vote_account); match versioned { VoteStateVersions::Current(v) => { vote_state = Some(*v); @@ -6581,7 +6663,7 @@ pub(crate) mod tests { _ => panic!("Has to be of type Current"), }; } - bank.add_account_and_update_capitalization(&vote_id, &vote_account); + bank.store_account_and_update_capitalization(&vote_id, &vote_account); // put a child bank in epoch 1, which calls update_rewards()... let bank1 = Bank::new_from_parent( @@ -10310,7 +10392,7 @@ pub(crate) mod tests { let mut bank = Bank::new(&genesis_config); // Setup a simulated account - bank.add_account_and_update_capitalization( + bank.store_account_and_update_capitalization( &inline_spl_token_v2_0::id(), &Account { lamports: 100, @@ -10672,7 +10754,7 @@ pub(crate) mod tests { let zero_lamport_pubkey = solana_sdk::pubkey::new_rand(); - bank1.add_account_and_update_capitalization( + bank1.store_account_and_update_capitalization( &zero_lamport_pubkey, &Account::new(0, 0, &Pubkey::default()), ); @@ -10681,7 +10763,7 @@ pub(crate) mod tests { // not cleaned up after clean is called, so that the bank hash still exists // when we call rehash() later in this test. let large_account_pubkey = solana_sdk::pubkey::new_rand(); - bank1.add_account_and_update_capitalization( + bank1.store_account_and_update_capitalization( &large_account_pubkey, &Account::new( 1000,