support for accounts tests loading accounts with excluded feature (#29142)
This commit is contained in:
parent
028d3379b0
commit
ea19fe9219
|
@ -1601,11 +1601,22 @@ mod tests {
|
|||
)
|
||||
}
|
||||
|
||||
/// get a feature set with all features activated
|
||||
/// with the optional except of 'exclude'
|
||||
fn all_features_except(exclude: Option<&[Pubkey]>) -> FeatureSet {
|
||||
let mut features = FeatureSet::all_enabled();
|
||||
if let Some(exclude) = exclude {
|
||||
features.active.retain(|k, _v| !exclude.contains(k));
|
||||
}
|
||||
features
|
||||
}
|
||||
|
||||
fn load_accounts_with_fee(
|
||||
tx: Transaction,
|
||||
ka: &[TransactionAccount],
|
||||
lamports_per_signature: u64,
|
||||
error_counters: &mut TransactionErrorMetrics,
|
||||
exclude_features: Option<&[Pubkey]>,
|
||||
) -> Vec<TransactionLoadResult> {
|
||||
load_accounts_with_fee_and_rent(
|
||||
tx,
|
||||
|
@ -1613,7 +1624,7 @@ mod tests {
|
|||
lamports_per_signature,
|
||||
&RentCollector::default(),
|
||||
error_counters,
|
||||
&FeatureSet::all_enabled(),
|
||||
&all_features_except(exclude_features),
|
||||
&FeeStructure::default(),
|
||||
)
|
||||
}
|
||||
|
@ -1623,7 +1634,16 @@ mod tests {
|
|||
ka: &[TransactionAccount],
|
||||
error_counters: &mut TransactionErrorMetrics,
|
||||
) -> Vec<TransactionLoadResult> {
|
||||
load_accounts_with_fee(tx, ka, 0, error_counters)
|
||||
load_accounts_with_fee(tx, ka, 0, error_counters, None)
|
||||
}
|
||||
|
||||
fn load_accounts_with_excluded_features(
|
||||
tx: Transaction,
|
||||
ka: &[TransactionAccount],
|
||||
error_counters: &mut TransactionErrorMetrics,
|
||||
exclude_features: Option<&[Pubkey]>,
|
||||
) -> Vec<TransactionLoadResult> {
|
||||
load_accounts_with_fee(tx, ka, 0, error_counters, exclude_features)
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -1772,8 +1792,13 @@ mod tests {
|
|||
);
|
||||
assert_eq!(fee, lamports_per_signature);
|
||||
|
||||
let loaded_accounts =
|
||||
load_accounts_with_fee(tx, &accounts, lamports_per_signature, &mut error_counters);
|
||||
let loaded_accounts = load_accounts_with_fee(
|
||||
tx,
|
||||
&accounts,
|
||||
lamports_per_signature,
|
||||
&mut error_counters,
|
||||
None,
|
||||
);
|
||||
|
||||
assert_eq!(error_counters.insufficient_funds, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -1853,7 +1878,7 @@ mod tests {
|
|||
lamports_per_signature,
|
||||
&rent_collector,
|
||||
&mut error_counters,
|
||||
&FeatureSet::all_enabled(),
|
||||
&all_features_except(None),
|
||||
&FeeStructure::default(),
|
||||
);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -1920,7 +1945,8 @@ mod tests {
|
|||
instructions,
|
||||
);
|
||||
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.account_not_found, 0);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2108,7 +2134,8 @@ mod tests {
|
|||
instructions,
|
||||
);
|
||||
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.account_not_found, 0);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2339,7 +2366,8 @@ mod tests {
|
|||
instructions,
|
||||
);
|
||||
let tx = Transaction::new(&[&keypair], message.clone(), Hash::default());
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2352,7 +2380,8 @@ mod tests {
|
|||
message.account_keys = vec![key0, key1, key2]; // revert key change
|
||||
message.header.num_readonly_unsigned_accounts = 2; // mark both executables as readonly
|
||||
let tx = Transaction::new(&[&keypair], message, Hash::default());
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2426,7 +2455,8 @@ mod tests {
|
|||
instructions,
|
||||
);
|
||||
let tx = Transaction::new(&[&keypair], message.clone(), Hash::default());
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2438,7 +2468,8 @@ mod tests {
|
|||
// Solution 1: include bpf_loader_upgradeable account
|
||||
message.account_keys = vec![key0, key1, bpf_loader_upgradeable::id()];
|
||||
let tx = Transaction::new(&[&keypair], message.clone(), Hash::default());
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2453,7 +2484,8 @@ mod tests {
|
|||
message.account_keys = vec![key0, key1, key2]; // revert key change
|
||||
message.header.num_readonly_unsigned_accounts = 2; // mark both executables as readonly
|
||||
let tx = Transaction::new(&[&keypair], message, Hash::default());
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2511,7 +2543,8 @@ mod tests {
|
|||
instructions,
|
||||
);
|
||||
let tx = Transaction::new(&[&keypair], message.clone(), Hash::default());
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2531,8 +2564,12 @@ mod tests {
|
|||
];
|
||||
message.account_keys = vec![key0, key1, bpf_loader_upgradeable::id()];
|
||||
let tx = Transaction::new(&[&keypair], message.clone(), Hash::default());
|
||||
let loaded_accounts =
|
||||
load_accounts(tx, &accounts_with_upgradeable_loader, &mut error_counters);
|
||||
let loaded_accounts = load_accounts_with_excluded_features(
|
||||
tx,
|
||||
&accounts_with_upgradeable_loader,
|
||||
&mut error_counters,
|
||||
None,
|
||||
);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
@ -2547,7 +2584,8 @@ mod tests {
|
|||
message.account_keys = vec![key0, key1, key2]; // revert key change
|
||||
message.header.num_readonly_unsigned_accounts = 2; // extend readonly set to include programdata
|
||||
let tx = Transaction::new(&[&keypair], message, Hash::default());
|
||||
let loaded_accounts = load_accounts(tx, &accounts, &mut error_counters);
|
||||
let loaded_accounts =
|
||||
load_accounts_with_excluded_features(tx, &accounts, &mut error_counters, None);
|
||||
|
||||
assert_eq!(error_counters.invalid_writable_account, 1);
|
||||
assert_eq!(loaded_accounts.len(), 1);
|
||||
|
|
Loading…
Reference in New Issue