Skip to content

Commit

Permalink
Adds test_loader_v3_to_v4_migration.
Browse files Browse the repository at this point in the history
  • Loading branch information
Lichtso committed Jan 29, 2025
1 parent 6c660cb commit 83bc3ba
Showing 1 changed file with 88 additions and 0 deletions.
88 changes: 88 additions & 0 deletions runtime/src/bank/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13381,6 +13381,94 @@ fn test_deploy_last_epoch_slot() {
assert_eq!(result_with_feature_enabled, Ok(()));
}

#[test]
fn test_loader_v3_to_v4_migration() {
solana_logger::setup();

// Bank Setup
let (mut genesis_config, _mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
activate_feature(
&mut genesis_config,
solana_feature_set::enable_loader_v4::id(),
);
let mut bank = Bank::new_for_tests(&genesis_config);
bank.activate_feature(&feature_set::remove_accounts_executable_flag_checks::id());
let (bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 1);

// deploy a program
let mut file = File::open("../programs/bpf_loader/test_elfs/out/noop_aligned.so").unwrap();
let mut elf = Vec::new();
file.read_to_end(&mut elf).unwrap();

let program_keypair = Keypair::new();
let (programdata_address, _) = Pubkey::find_program_address(
&[program_keypair.pubkey().as_ref()],
&bpf_loader_upgradeable::id(),
);
let payer_keypair = Keypair::new();
let upgrade_authority_keypair = Keypair::new();
let migration_authority_keypair = &upgrade_authority_keypair;

let min_program_balance =
bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program());
let mut program_account = AccountSharedData::new(
min_program_balance,
UpgradeableLoaderState::size_of_program(),
&bpf_loader_upgradeable::id(),
);
program_account
.set_state(&UpgradeableLoaderState::Program {
programdata_address: programdata_address,
})
.unwrap();
bank.store_account(&program_keypair.pubkey(), &program_account);

let min_programdata_balance = bank.get_minimum_balance_for_rent_exemption(
UpgradeableLoaderState::size_of_programdata(elf.len()),
);
let mut programdata_account = AccountSharedData::new(
min_programdata_balance,
UpgradeableLoaderState::size_of_programdata(elf.len()),
&bpf_loader_upgradeable::id(),
);
programdata_account
.set_state(&UpgradeableLoaderState::ProgramData {
slot: 0,
upgrade_authority_address: Some(upgrade_authority_keypair.pubkey()),
})
.unwrap();
programdata_account
.data_as_mut_slice()
.get_mut(UpgradeableLoaderState::size_of_programdata_metadata()..)
.unwrap()
.copy_from_slice(&elf);
bank.store_account(&programdata_address, &programdata_account);

let fee_calculator = genesis_config.fee_rate_governor.create_fee_calculator();
let payer_balance = min_program_balance
.saturating_add(min_programdata_balance)
.saturating_add(LAMPORTS_PER_SOL)
.saturating_add(fee_calculator.lamports_per_signature);
bank.store_account(
&payer_keypair.pubkey(),
&AccountSharedData::new(payer_balance, 0, &system_program::id()),
);

let message = Message::new(
&[bpf_loader_upgradeable::migrate(
&programdata_address,
&program_keypair.pubkey(),
&migration_authority_keypair.pubkey(),
)],
Some(&payer_keypair.pubkey()),
);
let signers = &[&payer_keypair, &migration_authority_keypair];
let transaction = Transaction::new(signers, message.clone(), bank.last_blockhash());
let ret = bank.process_transaction(&transaction);
assert!(ret.is_ok(), "ret: {:?}", ret);
}

#[test]
fn test_blockhash_last_valid_block_height() {
let genesis_config = GenesisConfig::default();
Expand Down

0 comments on commit 83bc3ba

Please sign in to comment.