5
5
compute_budget:: ComputeBudget ,
6
6
executor_cache:: TransactionExecutorCache ,
7
7
ic_logger_msg, ic_msg,
8
+ loaded_programs:: LoadedProgram ,
8
9
log_collector:: LogCollector ,
9
10
pre_account:: PreAccount ,
10
11
stable_log,
@@ -882,7 +883,8 @@ macro_rules! with_mock_invoke_context_and_builtin_programs {
882
883
$invoke_context: ident,
883
884
$transaction_context: ident,
884
885
$transaction_accounts: expr,
885
- $builtin_programs: expr
886
+ $builtin_programs: expr,
887
+ $loaded_programs: expr
886
888
) => {
887
889
use {
888
890
solana_sdk:: {
@@ -922,14 +924,18 @@ macro_rules! with_mock_invoke_context_and_builtin_programs {
922
924
}
923
925
}
924
926
} ) ;
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
+ } ) ;
925
931
let mut $invoke_context = InvokeContext :: new(
926
932
& mut $transaction_context,
927
933
Rent :: default ( ) ,
928
934
$builtin_programs,
929
935
& sysvar_cache,
930
936
Some ( LogCollector :: new_ref( ) ) ,
931
937
compute_budget,
932
- Rc :: new( RefCell :: new( TransactionExecutorCache :: default ( ) ) ) ,
938
+ Rc :: new( RefCell :: new( executor_cache ) ) ,
933
939
Arc :: new( FeatureSet :: all_enabled( ) ) ,
934
940
Hash :: default ( ) ,
935
941
0 ,
@@ -944,32 +950,59 @@ macro_rules! with_mock_invoke_context {
944
950
$invoke_context: ident,
945
951
$transaction_context: ident,
946
952
$transaction_accounts: expr,
947
- $builtin_programs: expr
953
+ $builtin_programs: expr,
954
+ $loaded_programs: expr
948
955
) => {
949
956
use $crate:: with_mock_invoke_context_and_builtin_programs;
950
957
with_mock_invoke_context_and_builtin_programs!(
951
958
$invoke_context,
952
959
$transaction_context,
953
960
$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
955
982
) ;
956
983
} ;
957
984
958
985
( $invoke_context: ident, $transaction_context: ident, $transaction_accounts: expr) => {
959
986
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,
961
989
} ;
962
990
let builtin_programs = BuiltinPrograms :: default ( ) ;
991
+ let loaded_programs: Vec <( Pubkey , Arc <LoadedProgram >) > = vec![ ] ;
963
992
with_mock_invoke_context_and_builtin_programs!(
964
993
$invoke_context,
965
994
$transaction_context,
966
995
$transaction_accounts,
967
- & builtin_programs
996
+ & builtin_programs,
997
+ & loaded_programs
968
998
) ;
969
999
} ;
970
1000
}
971
1001
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
+ > (
973
1006
loader_id : & Pubkey ,
974
1007
mut program_indices : Vec < IndexOfAccount > ,
975
1008
instruction_data : & [ u8 ] ,
@@ -979,6 +1012,7 @@ pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut Invo
979
1012
process_instruction : ProcessInstructionWithContext ,
980
1013
mut pre_adjustments : F ,
981
1014
mut post_adjustments : G ,
1015
+ loaded_programs : & [ ( Pubkey , Arc < LoadedProgram > ) ] ,
982
1016
) -> Vec < AccountSharedData > {
983
1017
let mut instruction_accounts: Vec < InstructionAccount > =
984
1018
Vec :: with_capacity ( instruction_account_metas. len ( ) ) ;
@@ -1012,7 +1046,8 @@ pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut Invo
1012
1046
invoke_context,
1013
1047
transaction_context,
1014
1048
transaction_accounts,
1015
- & builtin_programs
1049
+ & builtin_programs,
1050
+ loaded_programs
1016
1051
) ;
1017
1052
pre_adjustments ( & mut invoke_context) ;
1018
1053
let result = invoke_context. process_instruction (
@@ -1029,6 +1064,30 @@ pub fn mock_process_instruction<F: FnMut(&mut InvokeContext), G: FnMut(&mut Invo
1029
1064
transaction_accounts
1030
1065
}
1031
1066
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
+ }
1032
1091
#[ cfg( test) ]
1033
1092
mod tests {
1034
1093
use {
0 commit comments