Add tests for store_account_and_update_capitalization (#14008)

This commit is contained in:
Ryo Onodera 2020-12-09 00:46:28 +09:00 committed by GitHub
parent c494346887
commit 28b014ccf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 101 additions and 19 deletions

View File

@ -3693,14 +3693,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);
@ -5131,6 +5135,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();
@ -5270,11 +5352,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);
@ -6438,7 +6520,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());
@ -6448,7 +6530,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);
@ -6456,7 +6538,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())
@ -6560,8 +6642,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());
@ -6571,7 +6653,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);
@ -6579,7 +6661,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(
@ -10311,7 +10393,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,
@ -10673,7 +10755,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()),
);
@ -10682,7 +10764,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,