Add commonly-used SPL programs as a convenience to the user

This commit is contained in:
Michael Vines 2020-11-25 11:23:15 -08:00 committed by mergify[bot]
parent 4ef2da0ff0
commit 0e2578a0b8
4 changed files with 70 additions and 36 deletions

View File

@ -1,29 +1,30 @@
//! The solana-program-test provides a BanksClient-based test framework BPF programs //! The solana-program-test provides a BanksClient-based test framework BPF programs
use async_trait::async_trait; use {
use chrono_humanize::{Accuracy, HumanTime, Tense}; async_trait::async_trait,
use log::*; chrono_humanize::{Accuracy, HumanTime, Tense},
use solana_banks_client::start_client; log::*,
use solana_banks_server::banks_server::start_local_server; solana_banks_client::start_client,
use solana_program::{ solana_banks_server::banks_server::start_local_server,
solana_program::{
account_info::AccountInfo, entrypoint::ProgramResult, fee_calculator::FeeCalculator, account_info::AccountInfo, entrypoint::ProgramResult, fee_calculator::FeeCalculator,
hash::Hash, instruction::Instruction, instruction::InstructionError, message::Message, hash::Hash, instruction::Instruction, instruction::InstructionError, message::Message,
native_token::sol_to_lamports, program_error::ProgramError, program_stubs, pubkey::Pubkey, native_token::sol_to_lamports, program_error::ProgramError, program_stubs, pubkey::Pubkey,
rent::Rent, rent::Rent,
}; },
use solana_runtime::{ solana_runtime::{
bank::{Bank, Builtin}, bank::{Bank, Builtin},
bank_forks::BankForks, bank_forks::BankForks,
genesis_utils::create_genesis_config_with_leader, genesis_utils::create_genesis_config_with_leader,
}; },
use solana_sdk::{ solana_sdk::{
account::Account, account::Account,
keyed_account::KeyedAccount, keyed_account::KeyedAccount,
process_instruction::BpfComputeBudget, process_instruction::BpfComputeBudget,
process_instruction::{InvokeContext, MockInvokeContext, ProcessInstructionWithContext}, process_instruction::{InvokeContext, MockInvokeContext, ProcessInstructionWithContext},
signature::{Keypair, Signer}, signature::{Keypair, Signer},
}; },
use std::{ std::{
cell::RefCell, cell::RefCell,
collections::HashMap, collections::HashMap,
convert::TryFrom, convert::TryFrom,
@ -33,10 +34,11 @@ use std::{
rc::Rc, rc::Rc,
sync::{Arc, RwLock}, sync::{Arc, RwLock},
time::{Duration, Instant}, time::{Duration, Instant},
},
}; };
// Export types so test clients can limit their solana crate dependencies // Export types so test clients can limit their solana crate dependencies
pub use solana_banks_client::{BanksClient, BanksClientExt}; pub use solana_banks_client::BanksClient;
#[macro_use] #[macro_use]
extern crate solana_bpf_loader_program; extern crate solana_bpf_loader_program;
@ -356,6 +358,24 @@ fn read_file<P: AsRef<Path>>(path: P) -> Vec<u8> {
file_data file_data
} }
mod spl_token {
solana_sdk::declare_id!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
}
mod spl_memo {
solana_sdk::declare_id!("Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo");
}
mod spl_associated_token_account {
solana_sdk::declare_id!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
}
static SPL_PROGRAMS: &[(Pubkey, &[u8])] = &[
(spl_token::ID, include_bytes!("programs/spl_token-2.0.6.so")),
(spl_memo::ID, include_bytes!("programs/spl_memo-1.0.0.so")),
(
spl_associated_token_account::ID,
include_bytes!("programs/spl_associated-token-account-1.0.1.so"),
),
];
pub struct ProgramTest { pub struct ProgramTest {
accounts: Vec<(Pubkey, Account)>, accounts: Vec<(Pubkey, Account)>,
builtins: Vec<Builtin>, builtins: Vec<Builtin>,
@ -593,9 +613,23 @@ impl ProgramTest {
bank.add_builtin(&loader.0, loader.1, loader.2); bank.add_builtin(&loader.0, loader.1, loader.2);
} }
// Add commonly-used SPL programs as a convenience to the user
for (program_id, elf) in SPL_PROGRAMS.iter() {
bank.store_account(
program_id,
&Account {
lamports: Rent::default().minimum_balance(elf.len()).min(1),
data: elf.to_vec(),
owner: solana_program::bpf_loader::id(),
executable: true,
rent_epoch: 0,
},
)
}
// User-supplied additional builtins // User-supplied additional builtins
for builtin in self.builtins { for builtin in self.builtins {
bank.add_builtin( bank.replace_builtin(
&builtin.name, &builtin.name,
builtin.id, builtin.id,
builtin.process_instruction_with_context, builtin.process_instruction_with_context,
@ -604,7 +638,7 @@ impl ProgramTest {
for (address, account) in self.accounts { for (address, account) in self.accounts {
if bank.get_account(&address).is_some() { if bank.get_account(&address).is_some() {
panic!("An account at {} already exists", address); info!("Overriding account at {}", address);
} }
bank.store_account(&address, &account); bank.store_account(&address, &account);
} }

Binary file not shown.

Binary file not shown.