test_add_builtin_account* works with write cache (#29030)
This commit is contained in:
parent
87a3130226
commit
6852d5768a
|
@ -15079,114 +15079,162 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_add_builtin_account() {
|
||||
let (mut genesis_config, _mint_keypair) = create_genesis_config(100_000);
|
||||
activate_all_features(&mut genesis_config);
|
||||
for pass in 0..5 {
|
||||
let (mut genesis_config, _mint_keypair) = create_genesis_config(100_000);
|
||||
activate_all_features(&mut genesis_config);
|
||||
|
||||
let slot = 123;
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
let slot = 123;
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
|
||||
let bank = Arc::new(Bank::new_from_parent(
|
||||
&Arc::new(Bank::new_for_tests(&genesis_config)),
|
||||
&Pubkey::default(),
|
||||
slot,
|
||||
));
|
||||
assert_eq!(bank.get_account_modified_slot(&program_id), None);
|
||||
let bank = Arc::new(Bank::new_from_parent(
|
||||
&Arc::new(Bank::new_for_tests(&genesis_config)),
|
||||
&Pubkey::default(),
|
||||
slot,
|
||||
));
|
||||
add_root_and_flush_write_cache(&bank.parent().unwrap());
|
||||
assert_eq!(bank.get_account_modified_slot(&program_id), None);
|
||||
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program", &program_id, false),
|
||||
|old, new| {
|
||||
assert_eq!(old + 1, new);
|
||||
true
|
||||
},
|
||||
);
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program", &program_id, false),
|
||||
|old, new| {
|
||||
assert_eq!(old + 1, new);
|
||||
pass == 0
|
||||
},
|
||||
);
|
||||
if pass == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
|
||||
assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
|
||||
|
||||
let bank = Arc::new(new_from_parent(&bank));
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program", &program_id, false),
|
||||
|old, new| {
|
||||
assert_eq!(old, new);
|
||||
true
|
||||
},
|
||||
);
|
||||
let bank = Arc::new(new_from_parent(&bank));
|
||||
add_root_and_flush_write_cache(&bank.parent().unwrap());
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program", &program_id, false),
|
||||
|old, new| {
|
||||
assert_eq!(old, new);
|
||||
pass == 1
|
||||
},
|
||||
);
|
||||
if pass == 1 {
|
||||
continue;
|
||||
}
|
||||
|
||||
assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
|
||||
assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
|
||||
|
||||
let bank = Arc::new(new_from_parent(&bank));
|
||||
// When replacing builtin_program, name must change to disambiguate from repeated
|
||||
// invocations.
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program v2", &program_id, true),
|
||||
|old, new| {
|
||||
assert_eq!(old, new);
|
||||
true
|
||||
},
|
||||
);
|
||||
let bank = Arc::new(new_from_parent(&bank));
|
||||
add_root_and_flush_write_cache(&bank.parent().unwrap());
|
||||
// When replacing builtin_program, name must change to disambiguate from repeated
|
||||
// invocations.
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program v2", &program_id, true),
|
||||
|old, new| {
|
||||
assert_eq!(old, new);
|
||||
pass == 2
|
||||
},
|
||||
);
|
||||
if pass == 2 {
|
||||
continue;
|
||||
}
|
||||
|
||||
assert_eq!(
|
||||
bank.get_account_modified_slot(&program_id).unwrap().1,
|
||||
bank.slot()
|
||||
);
|
||||
assert_eq!(
|
||||
bank.get_account_modified_slot(&program_id).unwrap().1,
|
||||
bank.slot()
|
||||
);
|
||||
|
||||
let bank = Arc::new(new_from_parent(&bank));
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program v2", &program_id, true),
|
||||
|old, new| {
|
||||
assert_eq!(old, new);
|
||||
true
|
||||
},
|
||||
);
|
||||
let bank = Arc::new(new_from_parent(&bank));
|
||||
add_root_and_flush_write_cache(&bank.parent().unwrap());
|
||||
assert_capitalization_diff(
|
||||
&bank,
|
||||
|| bank.add_builtin_account("mock_program v2", &program_id, true),
|
||||
|old, new| {
|
||||
assert_eq!(old, new);
|
||||
pass == 3
|
||||
},
|
||||
);
|
||||
if pass == 3 {
|
||||
continue;
|
||||
}
|
||||
|
||||
// replacing with same name shouldn't update account
|
||||
assert_eq!(
|
||||
bank.get_account_modified_slot(&program_id).unwrap().1,
|
||||
bank.parent_slot()
|
||||
);
|
||||
// replacing with same name shouldn't update account
|
||||
assert_eq!(
|
||||
bank.get_account_modified_slot(&program_id).unwrap().1,
|
||||
bank.parent_slot()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// useful to adapt tests written prior to introduction of the write cache
|
||||
/// to use the write cache
|
||||
fn add_root_and_flush_write_cache(bank: &Bank) {
|
||||
bank.rc.accounts.add_root(bank.slot());
|
||||
bank.flush_accounts_cache_slot_for_tests()
|
||||
if bank.rc.accounts.accounts_db.caching_enabled {
|
||||
bank.rc.accounts.add_root(bank.slot());
|
||||
bank.flush_accounts_cache_slot_for_tests()
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_builtin_account_inherited_cap_while_replacing() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100_000);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
for pass in 0..4 {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100_000);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
|
||||
bank.add_builtin_account("mock_program", &program_id, false);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
bank.add_builtin_account("mock_program", &program_id, false);
|
||||
if pass == 0 {
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
continue;
|
||||
}
|
||||
|
||||
// someone mess with program_id's balance
|
||||
bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
|
||||
assert_ne!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
bank.deposit(&program_id, 10).unwrap();
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
// someone mess with program_id's balance
|
||||
bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
|
||||
if pass == 1 {
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_ne!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
continue;
|
||||
}
|
||||
bank.deposit(&program_id, 10).unwrap();
|
||||
if pass == 2 {
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
continue;
|
||||
}
|
||||
|
||||
bank.add_builtin_account("mock_program v2", &program_id, true);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
bank.add_builtin_account("mock_program v2", &program_id, true);
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_builtin_account_squatted_while_not_replacing() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100_000);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
for pass in 0..3 {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100_000);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
|
||||
// someone managed to squat at program_id!
|
||||
bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
|
||||
assert_ne!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
bank.deposit(&program_id, 10).unwrap();
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
// someone managed to squat at program_id!
|
||||
bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
|
||||
if pass == 0 {
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_ne!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
continue;
|
||||
}
|
||||
bank.deposit(&program_id, 10).unwrap();
|
||||
if pass == 1 {
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
continue;
|
||||
}
|
||||
|
||||
bank.add_builtin_account("mock_program", &program_id, false);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
bank.add_builtin_account("mock_program", &program_id, false);
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -15307,18 +15355,34 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_add_precompiled_account_squatted_while_not_replacing() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100_000);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
for pass in 0..3 {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100_000);
|
||||
let bank = Bank::new_for_tests_with_config(
|
||||
&genesis_config,
|
||||
bank_test_config_caching_enabled(),
|
||||
);
|
||||
let program_id = solana_sdk::pubkey::new_rand();
|
||||
|
||||
// someone managed to squat at program_id!
|
||||
bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
|
||||
assert_ne!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
bank.deposit(&program_id, 10).unwrap();
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
// someone managed to squat at program_id!
|
||||
bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
|
||||
if pass == 0 {
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
|
||||
bank.add_precompiled_account(&program_id);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
assert_ne!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
continue;
|
||||
}
|
||||
bank.deposit(&program_id, 10).unwrap();
|
||||
if pass == 1 {
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
continue;
|
||||
}
|
||||
|
||||
bank.add_precompiled_account(&program_id);
|
||||
add_root_and_flush_write_cache(&bank);
|
||||
|
||||
assert_eq!(bank.capitalization(), bank.calculate_capitalization(true));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
Loading…
Reference in New Issue