Changes test_serialize_parameters() to use an explicit InvokeContext. (#21205)
This commit is contained in:
parent
c56fb0f014
commit
a4a9b8f6a4
|
@ -316,11 +316,13 @@ pub fn deserialize_parameters_aligned(
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use solana_program_runtime::invoke_context::{prepare_mock_invoke_context, ThisInvokeContext};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
account::{Account, AccountSharedData},
|
account::{Account, AccountSharedData},
|
||||||
account_info::AccountInfo,
|
account_info::AccountInfo,
|
||||||
bpf_loader,
|
bpf_loader,
|
||||||
entrypoint::deserialize,
|
entrypoint::deserialize,
|
||||||
|
process_instruction::InvokeContext,
|
||||||
};
|
};
|
||||||
use std::{
|
use std::{
|
||||||
cell::RefCell,
|
cell::RefCell,
|
||||||
|
@ -334,97 +336,137 @@ mod tests {
|
||||||
let program_id = solana_sdk::pubkey::new_rand();
|
let program_id = solana_sdk::pubkey::new_rand();
|
||||||
let dup_key = solana_sdk::pubkey::new_rand();
|
let dup_key = solana_sdk::pubkey::new_rand();
|
||||||
let dup_key2 = solana_sdk::pubkey::new_rand();
|
let dup_key2 = solana_sdk::pubkey::new_rand();
|
||||||
let keys = vec![
|
let keyed_accounts = [
|
||||||
dup_key,
|
(
|
||||||
dup_key,
|
false,
|
||||||
solana_sdk::pubkey::new_rand(),
|
false,
|
||||||
solana_sdk::pubkey::new_rand(),
|
program_id,
|
||||||
dup_key2,
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
dup_key2,
|
lamports: 0,
|
||||||
solana_sdk::pubkey::new_rand(),
|
data: vec![],
|
||||||
solana_sdk::pubkey::new_rand(),
|
owner: bpf_loader::id(),
|
||||||
|
executable: true,
|
||||||
|
rent_epoch: 0,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
dup_key,
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 1,
|
||||||
|
data: vec![1u8, 2, 3, 4, 5],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: false,
|
||||||
|
rent_epoch: 100,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
dup_key,
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 1,
|
||||||
|
data: vec![1u8, 2, 3, 4, 5],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: false,
|
||||||
|
rent_epoch: 100,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
solana_sdk::pubkey::new_rand(),
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 2,
|
||||||
|
data: vec![11u8, 12, 13, 14, 15, 16, 17, 18, 19],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: true,
|
||||||
|
rent_epoch: 200,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
solana_sdk::pubkey::new_rand(),
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 3,
|
||||||
|
data: vec![],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: false,
|
||||||
|
rent_epoch: 3100,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
dup_key2,
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 4,
|
||||||
|
data: vec![1u8, 2, 3, 4, 5],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: false,
|
||||||
|
rent_epoch: 100,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
dup_key2,
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 4,
|
||||||
|
data: vec![1u8, 2, 3, 4, 5],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: false,
|
||||||
|
rent_epoch: 100,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
solana_sdk::pubkey::new_rand(),
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 5,
|
||||||
|
data: vec![11u8, 12, 13, 14, 15, 16, 17, 18, 19],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: true,
|
||||||
|
rent_epoch: 200,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
solana_sdk::pubkey::new_rand(),
|
||||||
|
Rc::new(RefCell::new(AccountSharedData::from(Account {
|
||||||
|
lamports: 6,
|
||||||
|
data: vec![],
|
||||||
|
owner: bpf_loader::id(),
|
||||||
|
executable: false,
|
||||||
|
rent_epoch: 3100,
|
||||||
|
}))),
|
||||||
|
),
|
||||||
];
|
];
|
||||||
let accounts = [
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 1,
|
|
||||||
data: vec![1u8, 2, 3, 4, 5],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: false,
|
|
||||||
rent_epoch: 100,
|
|
||||||
})),
|
|
||||||
// dup
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 1,
|
|
||||||
data: vec![1u8, 2, 3, 4, 5],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: false,
|
|
||||||
rent_epoch: 100,
|
|
||||||
})),
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 2,
|
|
||||||
data: vec![11u8, 12, 13, 14, 15, 16, 17, 18, 19],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: true,
|
|
||||||
rent_epoch: 200,
|
|
||||||
})),
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 3,
|
|
||||||
data: vec![],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: false,
|
|
||||||
rent_epoch: 3100,
|
|
||||||
})),
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 4,
|
|
||||||
data: vec![1u8, 2, 3, 4, 5],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: false,
|
|
||||||
rent_epoch: 100,
|
|
||||||
})),
|
|
||||||
// dup
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 4,
|
|
||||||
data: vec![1u8, 2, 3, 4, 5],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: false,
|
|
||||||
rent_epoch: 100,
|
|
||||||
})),
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 5,
|
|
||||||
data: vec![11u8, 12, 13, 14, 15, 16, 17, 18, 19],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: true,
|
|
||||||
rent_epoch: 200,
|
|
||||||
})),
|
|
||||||
RefCell::new(AccountSharedData::from(Account {
|
|
||||||
lamports: 6,
|
|
||||||
data: vec![],
|
|
||||||
owner: bpf_loader::id(),
|
|
||||||
executable: false,
|
|
||||||
rent_epoch: 3100,
|
|
||||||
})),
|
|
||||||
];
|
|
||||||
|
|
||||||
let keyed_accounts: Vec<_> = keys
|
|
||||||
.iter()
|
|
||||||
.zip(&accounts)
|
|
||||||
.enumerate()
|
|
||||||
.map(|(i, (key, account))| {
|
|
||||||
if i <= accounts.len() / 2 {
|
|
||||||
KeyedAccount::new_readonly(key, false, account)
|
|
||||||
} else {
|
|
||||||
KeyedAccount::new(key, false, account)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
let instruction_data = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
let instruction_data = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
||||||
|
let program_indices = [0];
|
||||||
|
let preparation =
|
||||||
|
prepare_mock_invoke_context(&program_indices, &instruction_data, &keyed_accounts);
|
||||||
|
let mut invoke_context = ThisInvokeContext::new_mock(&preparation.accounts, &[]);
|
||||||
|
invoke_context
|
||||||
|
.push(
|
||||||
|
&preparation.message,
|
||||||
|
&preparation.message.instructions[0],
|
||||||
|
&program_indices,
|
||||||
|
Some(&preparation.account_indices),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
// check serialize_parameters_aligned
|
// check serialize_parameters_aligned
|
||||||
|
|
||||||
|
let ser_keyed_accounts = invoke_context.get_keyed_accounts().unwrap();
|
||||||
let (mut serialized, account_lengths) = serialize_parameters(
|
let (mut serialized, account_lengths) = serialize_parameters(
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
&program_id,
|
&program_id,
|
||||||
&keyed_accounts,
|
&ser_keyed_accounts[1..],
|
||||||
&instruction_data,
|
&instruction_data,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -438,8 +480,8 @@ mod tests {
|
||||||
(&de_instruction_data[0] as *const u8).align_offset(align_of::<u128>()),
|
(&de_instruction_data[0] as *const u8).align_offset(align_of::<u128>()),
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
for ((account, account_info), key) in accounts.iter().zip(de_accounts).zip(keys.clone()) {
|
for ((_, _, key, account), account_info) in keyed_accounts.iter().skip(1).zip(de_accounts) {
|
||||||
assert_eq!(key, *account_info.key);
|
assert_eq!(key, account_info.key);
|
||||||
let account = account.borrow();
|
let account = account.borrow();
|
||||||
assert_eq!(account.lamports(), account_info.lamports());
|
assert_eq!(account.lamports(), account_info.lamports());
|
||||||
assert_eq!(account.data(), &account_info.data.borrow()[..]);
|
assert_eq!(account.data(), &account_info.data.borrow()[..]);
|
||||||
|
@ -461,31 +503,18 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let de_accounts = accounts.clone();
|
let de_keyed_accounts = invoke_context.get_keyed_accounts().unwrap();
|
||||||
let de_keyed_accounts: Vec<_> = keys
|
|
||||||
.iter()
|
|
||||||
.zip(&de_accounts)
|
|
||||||
.enumerate()
|
|
||||||
.map(|(i, (key, account))| {
|
|
||||||
if i <= accounts.len() / 2 {
|
|
||||||
KeyedAccount::new_readonly(key, false, account)
|
|
||||||
} else {
|
|
||||||
KeyedAccount::new(key, false, account)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
deserialize_parameters(
|
deserialize_parameters(
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
&de_keyed_accounts,
|
&de_keyed_accounts[1..],
|
||||||
serialized.as_slice(),
|
serialized.as_slice(),
|
||||||
&account_lengths,
|
&account_lengths,
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
for ((account, de_keyed_account), key) in
|
for ((_, _, key, account), de_keyed_account) in keyed_accounts.iter().zip(de_keyed_accounts)
|
||||||
accounts.iter().zip(de_keyed_accounts).zip(keys.clone())
|
|
||||||
{
|
{
|
||||||
assert_eq!(key, *de_keyed_account.unsigned_key());
|
assert_eq!(key, de_keyed_account.unsigned_key());
|
||||||
let account = account.borrow();
|
let account = account.borrow();
|
||||||
assert_eq!(account.executable(), de_keyed_account.executable().unwrap());
|
assert_eq!(account.executable(), de_keyed_account.executable().unwrap());
|
||||||
assert_eq!(account.rent_epoch(), de_keyed_account.rent_epoch().unwrap());
|
assert_eq!(account.rent_epoch(), de_keyed_account.rent_epoch().unwrap());
|
||||||
|
@ -493,10 +522,11 @@ mod tests {
|
||||||
|
|
||||||
// check serialize_parameters_unaligned
|
// check serialize_parameters_unaligned
|
||||||
|
|
||||||
|
let ser_keyed_accounts = invoke_context.get_keyed_accounts().unwrap();
|
||||||
let (mut serialized, account_lengths) = serialize_parameters(
|
let (mut serialized, account_lengths) = serialize_parameters(
|
||||||
&bpf_loader_deprecated::id(),
|
&bpf_loader_deprecated::id(),
|
||||||
&program_id,
|
&program_id,
|
||||||
&keyed_accounts,
|
&ser_keyed_accounts[1..],
|
||||||
&instruction_data,
|
&instruction_data,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -505,8 +535,8 @@ mod tests {
|
||||||
unsafe { deserialize_unaligned(&mut serialized.as_slice_mut()[0] as *mut u8) };
|
unsafe { deserialize_unaligned(&mut serialized.as_slice_mut()[0] as *mut u8) };
|
||||||
assert_eq!(&program_id, de_program_id);
|
assert_eq!(&program_id, de_program_id);
|
||||||
assert_eq!(instruction_data, de_instruction_data);
|
assert_eq!(instruction_data, de_instruction_data);
|
||||||
for ((account, account_info), key) in accounts.iter().zip(de_accounts).zip(keys.clone()) {
|
for ((_, _, key, account), account_info) in keyed_accounts.iter().skip(1).zip(de_accounts) {
|
||||||
assert_eq!(key, *account_info.key);
|
assert_eq!(key, account_info.key);
|
||||||
let account = account.borrow();
|
let account = account.borrow();
|
||||||
assert_eq!(account.lamports(), account_info.lamports());
|
assert_eq!(account.lamports(), account_info.lamports());
|
||||||
assert_eq!(account.data(), &account_info.data.borrow()[..]);
|
assert_eq!(account.data(), &account_info.data.borrow()[..]);
|
||||||
|
@ -515,31 +545,18 @@ mod tests {
|
||||||
assert_eq!(account.rent_epoch(), account_info.rent_epoch);
|
assert_eq!(account.rent_epoch(), account_info.rent_epoch);
|
||||||
}
|
}
|
||||||
|
|
||||||
let de_accounts = accounts.clone();
|
let de_keyed_accounts = invoke_context.get_keyed_accounts().unwrap();
|
||||||
let de_keyed_accounts: Vec<_> = keys
|
|
||||||
.iter()
|
|
||||||
.zip(&de_accounts)
|
|
||||||
.enumerate()
|
|
||||||
.map(|(i, (key, account))| {
|
|
||||||
if i < accounts.len() / 2 {
|
|
||||||
KeyedAccount::new_readonly(key, false, account)
|
|
||||||
} else {
|
|
||||||
KeyedAccount::new(key, false, account)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
deserialize_parameters(
|
deserialize_parameters(
|
||||||
&bpf_loader_deprecated::id(),
|
&bpf_loader_deprecated::id(),
|
||||||
&de_keyed_accounts,
|
&de_keyed_accounts[1..],
|
||||||
serialized.as_slice(),
|
serialized.as_slice(),
|
||||||
&account_lengths,
|
&account_lengths,
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
for ((account, de_keyed_account), key) in
|
for ((_, _, key, account), de_keyed_account) in keyed_accounts.iter().zip(de_keyed_accounts)
|
||||||
accounts.iter().zip(de_keyed_accounts).zip(keys.clone())
|
|
||||||
{
|
{
|
||||||
assert_eq!(key, *de_keyed_account.unsigned_key());
|
assert_eq!(key, de_keyed_account.unsigned_key());
|
||||||
let account = account.borrow();
|
let account = account.borrow();
|
||||||
assert_eq!(account.lamports(), de_keyed_account.lamports().unwrap());
|
assert_eq!(account.lamports(), de_keyed_account.lamports().unwrap());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
Loading…
Reference in New Issue