From 8f47808a348105cf3bcb05c2904557fc261be1a0 Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Thu, 3 Nov 2022 23:53:14 +0800 Subject: [PATCH] Refactor upgradeable loader test utility function (#28738) Refactor upgradeable loader test framework --- programs/bpf-loader-tests/tests/common.rs | 2 + .../tests/extend_program_ix.rs | 122 ++++++++++-------- 2 files changed, 70 insertions(+), 54 deletions(-) diff --git a/programs/bpf-loader-tests/tests/common.rs b/programs/bpf-loader-tests/tests/common.rs index 5b735b829c..85eaf19162 100644 --- a/programs/bpf-loader-tests/tests/common.rs +++ b/programs/bpf-loader-tests/tests/common.rs @@ -59,6 +59,7 @@ pub async fn add_upgradeable_loader_account( account_address: &Pubkey, account_state: &UpgradeableLoaderState, account_data_len: usize, + account_callback: impl Fn(&mut AccountSharedData), ) { let rent = context.banks_client.get_rent().await.unwrap(); let mut account = AccountSharedData::new( @@ -69,5 +70,6 @@ pub async fn add_upgradeable_loader_account( account .set_state(account_state) .expect("state failed to serialize into account data"); + account_callback(&mut account); context.set_account(account_address, &account); } diff --git a/programs/bpf-loader-tests/tests/extend_program_ix.rs b/programs/bpf-loader-tests/tests/extend_program_ix.rs index 7c928446e5..afac48a24e 100644 --- a/programs/bpf-loader-tests/tests/extend_program_ix.rs +++ b/programs/bpf-loader-tests/tests/extend_program_ix.rs @@ -3,8 +3,7 @@ use { common::{add_upgradeable_loader_account, assert_ix_error, setup_test_context}, solana_program_test::*, solana_sdk::{ - account::{AccountSharedData, ReadableAccount}, - account_utils::StateMut, + account::{AccountSharedData, ReadableAccount, WritableAccount}, bpf_loader_upgradeable::{extend_program, id, UpgradeableLoaderState}, instruction::InstructionError, pubkey::Pubkey, @@ -31,6 +30,7 @@ async fn test_extend_program() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; add_upgradeable_loader_account( @@ -41,6 +41,7 @@ async fn test_extend_program() { upgrade_authority_address: Some(Pubkey::new_unique()), }, program_data_len, + |_| {}, ) .await; @@ -84,6 +85,7 @@ async fn test_extend_program_not_upgradeable() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; add_upgradeable_loader_account( @@ -94,6 +96,7 @@ async fn test_extend_program_not_upgradeable() { upgrade_authority_address: None, }, 100, + |_| {}, ) .await; @@ -121,6 +124,7 @@ async fn test_extend_program_by_zero_bytes() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; add_upgradeable_loader_account( @@ -131,6 +135,7 @@ async fn test_extend_program_by_zero_bytes() { upgrade_authority_address: Some(Pubkey::new_unique()), }, 100, + |_| {}, ) .await; @@ -158,6 +163,7 @@ async fn test_extend_program_past_max_size() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; add_upgradeable_loader_account( @@ -168,6 +174,7 @@ async fn test_extend_program_past_max_size() { upgrade_authority_address: Some(Pubkey::new_unique()), }, MAX_PERMITTED_DATA_LENGTH as usize, + |_| {}, ) .await; @@ -196,6 +203,7 @@ async fn test_extend_program_with_invalid_payer() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; add_upgradeable_loader_account( @@ -206,6 +214,7 @@ async fn test_extend_program_with_invalid_payer() { upgrade_authority_address: Some(Pubkey::new_unique()), }, 100, + |_| {}, ) .await; @@ -293,6 +302,7 @@ async fn test_extend_program_without_payer() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; let program_data_len = 100; @@ -304,6 +314,7 @@ async fn test_extend_program_without_payer() { upgrade_authority_address: Some(Pubkey::new_unique()), }, program_data_len, + |_| {}, ) .await; @@ -364,6 +375,7 @@ async fn test_extend_program_with_invalid_system_program() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; let program_data_len = 100; @@ -375,6 +387,7 @@ async fn test_extend_program_with_invalid_system_program() { upgrade_authority_address: Some(Pubkey::new_unique()), }, program_data_len, + |_| {}, ) .await; @@ -415,6 +428,7 @@ async fn test_extend_program_with_mismatch_program_data() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; @@ -427,6 +441,7 @@ async fn test_extend_program_with_mismatch_program_data() { upgrade_authority_address: Some(Pubkey::new_unique()), }, 100, + |_| {}, ) .await; @@ -466,6 +481,7 @@ async fn test_extend_program_with_readonly_program_data() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; add_upgradeable_loader_account( @@ -476,6 +492,7 @@ async fn test_extend_program_with_readonly_program_data() { upgrade_authority_address: Some(Pubkey::new_unique()), }, 100, + |_| {}, ) .await; @@ -504,7 +521,6 @@ async fn test_extend_program_with_readonly_program_data() { #[tokio::test] async fn test_extend_program_with_invalid_program_data_state() { let mut context = setup_test_context().await; - let rent = context.banks_client.get_rent().await.unwrap(); let payer_address = context.payer.pubkey(); let program_address = Pubkey::new_unique(); @@ -516,18 +532,19 @@ async fn test_extend_program_with_invalid_program_data_state() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, + ) + .await; + add_upgradeable_loader_account( + &mut context, + &programdata_address, + &UpgradeableLoaderState::Buffer { + authority_address: Some(payer_address), + }, + 100, + |_| {}, ) .await; - - { - let mut account = AccountSharedData::new(rent.minimum_balance(100), 100, &id()); - account - .set_state(&UpgradeableLoaderState::Buffer { - authority_address: Some(payer_address), - }) - .expect("serialization failed"); - context.set_account(&programdata_address, &account); - } assert_ix_error( &mut context, @@ -542,7 +559,6 @@ async fn test_extend_program_with_invalid_program_data_state() { #[tokio::test] async fn test_extend_program_with_invalid_program_data_owner() { let mut context = setup_test_context().await; - let rent = context.banks_client.get_rent().await.unwrap(); let payer_address = context.payer.pubkey(); let program_address = Pubkey::new_unique(); @@ -554,20 +570,22 @@ async fn test_extend_program_with_invalid_program_data_owner() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; - { - let invalid_owner = Pubkey::new_unique(); - let mut account = AccountSharedData::new(rent.minimum_balance(100), 100, &invalid_owner); - account - .set_state(&UpgradeableLoaderState::ProgramData { - slot: 0, - upgrade_authority_address: Some(payer_address), - }) - .expect("serialization failed"); - context.set_account(&programdata_address, &account); - } + let invalid_owner = Pubkey::new_unique(); + add_upgradeable_loader_account( + &mut context, + &program_address, + &UpgradeableLoaderState::ProgramData { + slot: 0, + upgrade_authority_address: Some(payer_address), + }, + 100, + |account| account.set_owner(invalid_owner), + ) + .await; assert_ix_error( &mut context, @@ -593,6 +611,7 @@ async fn test_extend_program_with_readonly_program() { programdata_address, }, UpgradeableLoaderState::size_of_program(), + |_| {}, ) .await; add_upgradeable_loader_account( @@ -603,6 +622,7 @@ async fn test_extend_program_with_readonly_program() { upgrade_authority_address: Some(Pubkey::new_unique()), }, 100, + |_| {}, ) .await; @@ -631,28 +651,21 @@ async fn test_extend_program_with_readonly_program() { #[tokio::test] async fn test_extend_program_with_invalid_program_owner() { let mut context = setup_test_context().await; - let rent = context.banks_client.get_rent().await.unwrap(); let payer_address = context.payer.pubkey(); let program_address = Pubkey::new_unique(); let (programdata_address, _) = Pubkey::find_program_address(&[program_address.as_ref()], &id()); - - { - let invalid_owner = Pubkey::new_unique(); - let program_len = UpgradeableLoaderState::size_of_program(); - let mut account = AccountSharedData::new( - rent.minimum_balance(program_len), - program_len, - &invalid_owner, - ); - account - .set_state(&UpgradeableLoaderState::Program { - programdata_address, - }) - .expect("serialization failed"); - context.set_account(&program_address, &account); - } - + let invalid_owner = Pubkey::new_unique(); + add_upgradeable_loader_account( + &mut context, + &program_address, + &UpgradeableLoaderState::Program { + programdata_address, + }, + UpgradeableLoaderState::size_of_program(), + |account| account.set_owner(invalid_owner), + ) + .await; add_upgradeable_loader_account( &mut context, &programdata_address, @@ -661,6 +674,7 @@ async fn test_extend_program_with_invalid_program_owner() { upgrade_authority_address: Some(Pubkey::new_unique()), }, 100, + |_| {}, ) .await; @@ -677,21 +691,20 @@ async fn test_extend_program_with_invalid_program_owner() { #[tokio::test] async fn test_extend_program_with_invalid_program_state() { let mut context = setup_test_context().await; - let rent = context.banks_client.get_rent().await.unwrap(); let payer_address = context.payer.pubkey(); let program_address = Pubkey::new_unique(); let (programdata_address, _) = Pubkey::find_program_address(&[program_address.as_ref()], &id()); - - { - let mut account = AccountSharedData::new(rent.minimum_balance(100), 100, &id()); - account - .set_state(&UpgradeableLoaderState::Buffer { - authority_address: Some(payer_address), - }) - .expect("serialization failed"); - context.set_account(&program_address, &account); - } + add_upgradeable_loader_account( + &mut context, + &program_address, + &UpgradeableLoaderState::Buffer { + authority_address: Some(payer_address), + }, + 100, + |_| {}, + ) + .await; add_upgradeable_loader_account( &mut context, @@ -701,6 +714,7 @@ async fn test_extend_program_with_invalid_program_state() { upgrade_authority_address: Some(Pubkey::new_unique()), }, 100, + |_| {}, ) .await;