* Add address lookup table program (#21616)
* Add address lookup table program
* feedback
(cherry picked from commit 9b41ddd9ba
)
# Conflicts:
# runtime/Cargo.toml
* resolve conflicts
Co-authored-by: Justin Starry <justin@solana.com>
This commit is contained in:
103
programs/address-lookup-table-tests/tests/common.rs
Normal file
103
programs/address-lookup-table-tests/tests/common.rs
Normal file
@@ -0,0 +1,103 @@
|
||||
#![allow(dead_code)]
|
||||
use {
|
||||
solana_address_lookup_table_program::{
|
||||
id,
|
||||
processor::process_instruction,
|
||||
state::{AddressLookupTable, LookupTableMeta},
|
||||
},
|
||||
solana_program_test::*,
|
||||
solana_sdk::{
|
||||
account::AccountSharedData,
|
||||
clock::Slot,
|
||||
hash::Hash,
|
||||
instruction::Instruction,
|
||||
instruction::InstructionError,
|
||||
pubkey::Pubkey,
|
||||
signature::{Keypair, Signer},
|
||||
slot_hashes::SlotHashes,
|
||||
transaction::{Transaction, TransactionError},
|
||||
},
|
||||
std::borrow::Cow,
|
||||
};
|
||||
|
||||
pub async fn setup_test_context() -> ProgramTestContext {
|
||||
let program_test = ProgramTest::new("", id(), Some(process_instruction));
|
||||
program_test.start_with_context().await
|
||||
}
|
||||
|
||||
pub async fn assert_ix_error(
|
||||
context: &mut ProgramTestContext,
|
||||
ix: Instruction,
|
||||
authority_keypair: Option<&Keypair>,
|
||||
expected_err: InstructionError,
|
||||
) {
|
||||
let client = &mut context.banks_client;
|
||||
let payer = &context.payer;
|
||||
let recent_blockhash = context.last_blockhash;
|
||||
|
||||
let mut signers = vec![payer];
|
||||
if let Some(authority) = authority_keypair {
|
||||
signers.push(authority);
|
||||
}
|
||||
|
||||
let transaction = Transaction::new_signed_with_payer(
|
||||
&[ix],
|
||||
Some(&payer.pubkey()),
|
||||
&signers,
|
||||
recent_blockhash,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
client
|
||||
.process_transaction(transaction)
|
||||
.await
|
||||
.unwrap_err()
|
||||
.unwrap(),
|
||||
TransactionError::InstructionError(0, expected_err),
|
||||
);
|
||||
}
|
||||
|
||||
pub fn new_address_lookup_table(
|
||||
authority: Option<Pubkey>,
|
||||
num_addresses: usize,
|
||||
) -> AddressLookupTable<'static> {
|
||||
let mut addresses = Vec::with_capacity(num_addresses);
|
||||
addresses.resize_with(num_addresses, Pubkey::new_unique);
|
||||
AddressLookupTable {
|
||||
meta: LookupTableMeta {
|
||||
authority,
|
||||
..LookupTableMeta::default()
|
||||
},
|
||||
addresses: Cow::Owned(addresses),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn add_lookup_table_account(
|
||||
context: &mut ProgramTestContext,
|
||||
account_address: Pubkey,
|
||||
address_lookup_table: AddressLookupTable<'static>,
|
||||
) -> AccountSharedData {
|
||||
let mut data = Vec::new();
|
||||
address_lookup_table.serialize_for_tests(&mut data).unwrap();
|
||||
|
||||
let rent = context.banks_client.get_rent().await.unwrap();
|
||||
let rent_exempt_balance = rent.minimum_balance(data.len());
|
||||
|
||||
let mut account = AccountSharedData::new(
|
||||
rent_exempt_balance,
|
||||
data.len(),
|
||||
&solana_address_lookup_table_program::id(),
|
||||
);
|
||||
account.set_data(data);
|
||||
context.set_account(&account_address, &account);
|
||||
|
||||
account
|
||||
}
|
||||
|
||||
pub fn overwrite_slot_hashes_with_slots(context: &mut ProgramTestContext, slots: &[Slot]) {
|
||||
let mut slot_hashes = SlotHashes::default();
|
||||
for slot in slots {
|
||||
slot_hashes.add(*slot, Hash::new_unique());
|
||||
}
|
||||
context.set_sysvar(&slot_hashes);
|
||||
}
|
Reference in New Issue
Block a user