test_add_instruction_processor_for_existing_unrelated_accounts works with write cache (#29031)
This commit is contained in:
parent
0475c2f0af
commit
911a8d2a4a
|
@ -12888,75 +12888,90 @@ pub(crate) mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_add_instruction_processor_for_existing_unrelated_accounts() {
|
fn test_add_instruction_processor_for_existing_unrelated_accounts() {
|
||||||
let mut bank = create_simple_test_bank(500);
|
for pass in 0..5 {
|
||||||
|
let mut bank = create_simple_test_bank(500);
|
||||||
|
|
||||||
fn mock_ix_processor(
|
fn mock_ix_processor(
|
||||||
_first_instruction_account: IndexOfAccount,
|
_first_instruction_account: IndexOfAccount,
|
||||||
_invoke_context: &mut InvokeContext,
|
_invoke_context: &mut InvokeContext,
|
||||||
) -> std::result::Result<(), InstructionError> {
|
) -> std::result::Result<(), InstructionError> {
|
||||||
Err(InstructionError::Custom(42))
|
Err(InstructionError::Custom(42))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Non-builtin loader accounts can not be used for instruction processing
|
// Non-builtin loader accounts can not be used for instruction processing
|
||||||
{
|
{
|
||||||
let stakes = bank.stakes_cache.stakes();
|
let stakes = bank.stakes_cache.stakes();
|
||||||
assert!(stakes.vote_accounts().as_ref().is_empty());
|
assert!(stakes.vote_accounts().as_ref().is_empty());
|
||||||
}
|
}
|
||||||
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
|
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
|
||||||
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
if pass == 0 {
|
||||||
|
add_root_and_flush_write_cache(&bank);
|
||||||
|
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let ((vote_id, vote_account), (stake_id, stake_account)) =
|
let ((vote_id, vote_account), (stake_id, stake_account)) =
|
||||||
crate::stakes::tests::create_staked_node_accounts(1_0000);
|
crate::stakes::tests::create_staked_node_accounts(1_0000);
|
||||||
bank.capitalization
|
bank.capitalization
|
||||||
.fetch_add(vote_account.lamports() + stake_account.lamports(), Relaxed);
|
.fetch_add(vote_account.lamports() + stake_account.lamports(), Relaxed);
|
||||||
bank.store_account(&vote_id, &vote_account);
|
bank.store_account(&vote_id, &vote_account);
|
||||||
bank.store_account(&stake_id, &stake_account);
|
bank.store_account(&stake_id, &stake_account);
|
||||||
{
|
{
|
||||||
let stakes = bank.stakes_cache.stakes();
|
let stakes = bank.stakes_cache.stakes();
|
||||||
assert!(!stakes.vote_accounts().as_ref().is_empty());
|
assert!(!stakes.vote_accounts().as_ref().is_empty());
|
||||||
}
|
}
|
||||||
assert!(!bank.stakes_cache.stakes().stake_delegations().is_empty());
|
assert!(!bank.stakes_cache.stakes().stake_delegations().is_empty());
|
||||||
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
if pass == 1 {
|
||||||
|
add_root_and_flush_write_cache(&bank);
|
||||||
|
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
bank.add_builtin("mock_program1", &vote_id, mock_ix_processor);
|
bank.add_builtin("mock_program1", &vote_id, mock_ix_processor);
|
||||||
bank.add_builtin("mock_program2", &stake_id, mock_ix_processor);
|
bank.add_builtin("mock_program2", &stake_id, mock_ix_processor);
|
||||||
{
|
{
|
||||||
let stakes = bank.stakes_cache.stakes();
|
let stakes = bank.stakes_cache.stakes();
|
||||||
assert!(stakes.vote_accounts().as_ref().is_empty());
|
assert!(stakes.vote_accounts().as_ref().is_empty());
|
||||||
}
|
}
|
||||||
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
|
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
|
||||||
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
if pass == 2 {
|
||||||
assert_eq!(
|
add_root_and_flush_write_cache(&bank);
|
||||||
"mock_program1",
|
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
||||||
String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
|
continue;
|
||||||
);
|
}
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
"mock_program2",
|
"mock_program1",
|
||||||
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
|
String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
"mock_program2",
|
||||||
|
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
|
||||||
|
);
|
||||||
|
|
||||||
// Re-adding builtin programs should be no-op
|
// Re-adding builtin programs should be no-op
|
||||||
bank.update_accounts_hash_for_tests();
|
bank.update_accounts_hash_for_tests();
|
||||||
let old_hash = bank.get_accounts_hash();
|
let old_hash = bank.get_accounts_hash();
|
||||||
bank.add_builtin("mock_program1", &vote_id, mock_ix_processor);
|
bank.add_builtin("mock_program1", &vote_id, mock_ix_processor);
|
||||||
bank.add_builtin("mock_program2", &stake_id, mock_ix_processor);
|
bank.add_builtin("mock_program2", &stake_id, mock_ix_processor);
|
||||||
bank.update_accounts_hash_for_tests();
|
add_root_and_flush_write_cache(&bank);
|
||||||
let new_hash = bank.get_accounts_hash();
|
bank.update_accounts_hash_for_tests();
|
||||||
assert_eq!(old_hash, new_hash);
|
let new_hash = bank.get_accounts_hash();
|
||||||
{
|
assert_eq!(old_hash, new_hash);
|
||||||
let stakes = bank.stakes_cache.stakes();
|
{
|
||||||
assert!(stakes.vote_accounts().as_ref().is_empty());
|
let stakes = bank.stakes_cache.stakes();
|
||||||
|
assert!(stakes.vote_accounts().as_ref().is_empty());
|
||||||
|
}
|
||||||
|
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
|
||||||
|
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
||||||
|
assert_eq!(
|
||||||
|
"mock_program1",
|
||||||
|
String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
"mock_program2",
|
||||||
|
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
|
|
||||||
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
|
|
||||||
assert_eq!(
|
|
||||||
"mock_program1",
|
|
||||||
String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
"mock_program2",
|
|
||||||
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
|
|
Loading…
Reference in New Issue