Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 5828711

Browse files
committed
address review comments
1 parent 8d0d713 commit 5828711

File tree

3 files changed

+79
-31
lines changed

3 files changed

+79
-31
lines changed

program-runtime/src/invoke_context.rs

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use {
55
compute_budget::ComputeBudget,
66
executor_cache::TransactionExecutorCache,
77
ic_logger_msg, ic_msg,
8+
loaded_programs::LoadedProgram,
89
log_collector::LogCollector,
910
pre_account::PreAccount,
1011
stable_log,
@@ -882,7 +883,8 @@ macro_rules! with_mock_invoke_context_and_builtin_programs {
882883
$invoke_context:ident,
883884
$transaction_context:ident,
884885
$transaction_accounts:expr,
885-
$builtin_programs:expr
886+
$builtin_programs:expr,
887+
$loaded_programs:expr
886888
) => {
887889
use {
888890
solana_sdk::{
@@ -922,14 +924,18 @@ macro_rules! with_mock_invoke_context_and_builtin_programs {
922924
}
923925
}
924926
});
927+
let mut executor_cache = TransactionExecutorCache::default();
928+
$loaded_programs.iter().for_each(|(pubkey, program)| {
929+
executor_cache.set(*pubkey, program.clone(), true, false, 0)
930+
});
925931
let mut $invoke_context = InvokeContext::new(
926932
&mut $transaction_context,
927933
Rent::default(),
928934
$builtin_programs,
929935
&sysvar_cache,
930936
Some(LogCollector::new_ref()),
931937
compute_budget,
932-
Rc::new(RefCell::new(TransactionExecutorCache::default())),
938+
Rc::new(RefCell::new(executor_cache)),
933939
Arc::new(FeatureSet::all_enabled()),
934940
Hash::default(),
935941
0,
@@ -944,32 +950,59 @@ macro_rules! with_mock_invoke_context {
944950
$invoke_context:ident,
945951
$transaction_context:ident,
946952
$transaction_accounts:expr,
947-
$builtin_programs:expr
953+
$builtin_programs:expr,
954+
$loaded_programs:expr
948955
) => {
949956
use $crate::with_mock_invoke_context_and_builtin_programs;
950957
with_mock_invoke_context_and_builtin_programs!(
951958
$invoke_context,
952959
$transaction_context,
953960
$transaction_accounts,
954-
$builtin_programs
961+
$builtin_programs,
962+
$loaded_programs
963+
);
964+
};
965+
966+
(
967+
$invoke_context:ident,
968+
$transaction_context:ident,
969+
$transaction_accounts:expr,
970+
$builtin_programs:expr
971+
) => {
972+
use $crate::{
973+
loaded_programs::LoadedProgram, with_mock_invoke_context_and_builtin_programs,
974+
};
975+
let loaded_programs: Vec<(Pubkey, Arc<LoadedProgram>)> = vec![];
976+
with_mock_invoke_context_and_builtin_programs!(
977+
$invoke_context,
978+
$transaction_context,
979+
$transaction_accounts,
980+
$builtin_programs,
981+
&loaded_programs
955982
);
956983
};
957984

958985
($invoke_context:ident, $transaction_context:ident, $transaction_accounts:expr) => {
959986
use $crate::{
960-
builtin_program::BuiltinPrograms, with_mock_invoke_context_and_builtin_programs,
987+
builtin_program::BuiltinPrograms, loaded_programs::LoadedProgram,
988+
with_mock_invoke_context_and_builtin_programs,
961989
};
962990
let builtin_programs = BuiltinPrograms::default();
991+
let loaded_programs: Vec<(Pubkey, Arc<LoadedProgram>)> = vec![];
963992
with_mock_invoke_context_and_builtin_programs!(
964993
$invoke_context,
965994
$transaction_context,
966995
$transaction_accounts,
967-
&builtin_programs
996+
&builtin_programs,
997+
&loaded_programs
968998
);
969999
};
9701000
}
9711001

972-
pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut InvokeContext)>(
1002+
pub fn mock_process_instruction_with_loaded_programs<
1003+
F: FnMut(&mut InvokeContext),
1004+
G: FnMut(&mut InvokeContext),
1005+
>(
9731006
loader_id: &Pubkey,
9741007
mut program_indices: Vec<IndexOfAccount>,
9751008
instruction_data: &[u8],
@@ -979,6 +1012,7 @@ pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut Invo
9791012
process_instruction: ProcessInstructionWithContext,
9801013
mut pre_adjustments: F,
9811014
mut post_adjustments: G,
1015+
loaded_programs: &[(Pubkey, Arc<LoadedProgram>)],
9821016
) -> Vec<AccountSharedData> {
9831017
let mut instruction_accounts: Vec<InstructionAccount> =
9841018
Vec::with_capacity(instruction_account_metas.len());
@@ -1012,7 +1046,8 @@ pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut Invo
10121046
invoke_context,
10131047
transaction_context,
10141048
transaction_accounts,
1015-
&builtin_programs
1049+
&builtin_programs,
1050+
loaded_programs
10161051
);
10171052
pre_adjustments(&mut invoke_context);
10181053
let result = invoke_context.process_instruction(
@@ -1029,6 +1064,30 @@ pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut Invo
10291064
transaction_accounts
10301065
}
10311066

1067+
pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut InvokeContext)>(
1068+
loader_id: &Pubkey,
1069+
program_indices: Vec<IndexOfAccount>,
1070+
instruction_data: &[u8],
1071+
transaction_accounts: Vec<TransactionAccount>,
1072+
instruction_account_metas: Vec<AccountMeta>,
1073+
expected_result: Result<(), InstructionError>,
1074+
process_instruction: ProcessInstructionWithContext,
1075+
pre_adjustments: F,
1076+
post_adjustments: G,
1077+
) -> Vec<AccountSharedData> {
1078+
mock_process_instruction_with_loaded_programs(
1079+
loader_id,
1080+
program_indices,
1081+
instruction_data,
1082+
transaction_accounts,
1083+
instruction_account_metas,
1084+
expected_result,
1085+
process_instruction,
1086+
pre_adjustments,
1087+
post_adjustments,
1088+
&[],
1089+
)
1090+
}
10321091
#[cfg(test)]
10331092
mod tests {
10341093
use {

programs/bpf_loader/src/lib.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,7 +1666,9 @@ mod tests {
16661666
super::*,
16671667
rand::Rng,
16681668
solana_program_runtime::{
1669-
invoke_context::mock_process_instruction, with_mock_invoke_context,
1669+
invoke_context::mock_process_instruction,
1670+
invoke_context::mock_process_instruction_with_loaded_programs,
1671+
with_mock_invoke_context,
16701672
},
16711673
solana_rbpf::{
16721674
verifier::{Verifier, VerifierError},
@@ -1730,21 +1732,17 @@ mod tests {
17301732
expected_result: Result<(), InstructionError>,
17311733
loaded_programs: &[(Pubkey, Arc<LoadedProgram>)],
17321734
) -> Vec<AccountSharedData> {
1733-
mock_process_instruction(
1735+
mock_process_instruction_with_loaded_programs(
17341736
loader_id,
17351737
program_indices.to_vec(),
17361738
instruction_data,
17371739
transaction_accounts,
17381740
instruction_accounts,
17391741
expected_result,
17401742
super::process_instruction,
1741-
|invoke_context| {
1742-
let mut cache = invoke_context.tx_executor_cache.borrow_mut();
1743-
loaded_programs.iter().for_each(|(pubkey, program)| {
1744-
cache.set(*pubkey, program.clone(), true, false, 0)
1745-
});
1746-
},
17471743
|_invoke_context| {},
1744+
|_invoke_context| {},
1745+
loaded_programs,
17481746
)
17491747
}
17501748

@@ -1996,7 +1994,7 @@ mod tests {
19961994
);
19971995

19981996
// Case: limited budget
1999-
mock_process_instruction(
1997+
mock_process_instruction_with_loaded_programs(
20001998
&loader_id,
20011999
vec![0],
20022000
&[],
@@ -2006,10 +2004,9 @@ mod tests {
20062004
super::process_instruction,
20072005
|invoke_context| {
20082006
invoke_context.mock_set_remaining(0);
2009-
let mut cache = invoke_context.tx_executor_cache.borrow_mut();
2010-
cache.set(program_id, loaded_program.clone(), true, false, 0);
20112007
},
20122008
|_invoke_context| {},
2009+
&[(program_id, loaded_program.clone())],
20132010
);
20142011

20152012
// Case: Account not a program

runtime/src/bank/tests.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use {
3636
compute_budget::{self, ComputeBudget, MAX_COMPUTE_UNIT_LIMIT},
3737
declare_process_instruction,
3838
executor_cache::TransactionExecutorCache,
39-
invoke_context::mock_process_instruction,
39+
invoke_context::mock_process_instruction_with_loaded_programs,
4040
loaded_programs::{LoadedProgram, LoadedProgramType},
4141
prioritization_fee::{PrioritizationFeeDetails, PrioritizationFeeType},
4242
timings::ExecuteTimings,
@@ -7717,7 +7717,7 @@ fn test_bpf_loader_upgradeable_deploy_with_max_len() {
77177717
.expect("Failed to load the program");
77187718

77197719
// Invoke deployed program
7720-
mock_process_instruction(
7720+
mock_process_instruction_with_loaded_programs(
77217721
&bpf_loader_upgradeable::id(),
77227722
vec![0, 1],
77237723
&[],
@@ -7728,17 +7728,9 @@ fn test_bpf_loader_upgradeable_deploy_with_max_len() {
77287728
Vec::new(),
77297729
Ok(()),
77307730
solana_bpf_loader_program::process_instruction,
7731-
|invoke_context| {
7732-
let mut cache = invoke_context.tx_executor_cache.borrow_mut();
7733-
cache.set(
7734-
program_keypair.pubkey(),
7735-
loaded_program.clone(),
7736-
true,
7737-
false,
7738-
0,
7739-
);
7740-
},
77417731
|_invoke_context| {},
7732+
|_invoke_context| {},
7733+
&[(program_keypair.pubkey(), loaded_program)],
77427734
);
77437735

77447736
// Test initialized program account

0 commit comments

Comments
 (0)