Skip to content

Commit 14f47e0

Browse files
committed
tests
1 parent 8023d4f commit 14f47e0

1 file changed

Lines changed: 108 additions & 2 deletions

File tree

svm-transaction/src/tests.rs

Lines changed: 108 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use {
1010
VersionedMessage,
1111
},
1212
solana_pubkey::Pubkey,
13-
solana_sdk_ids::system_program,
13+
solana_sdk_ids::{bpf_loader_upgradeable, system_program},
1414
solana_system_interface::instruction::SystemInstruction,
1515
std::collections::HashSet,
1616
};
@@ -23,6 +23,24 @@ fn test_get_durable_nonce() {
2323
account_keys: Vec<Pubkey>,
2424
instructions: Vec<CompiledInstruction>,
2525
loaded_addresses: Option<LoadedAddresses>,
26+
) -> SanitizedMessage {
27+
create_message_for_test_with_reserved_keys(
28+
num_signers,
29+
num_writable,
30+
account_keys,
31+
instructions,
32+
loaded_addresses,
33+
&HashSet::new(),
34+
)
35+
}
36+
37+
fn create_message_for_test_with_reserved_keys(
38+
num_signers: u8,
39+
num_writable: u8,
40+
account_keys: Vec<Pubkey>,
41+
instructions: Vec<CompiledInstruction>,
42+
loaded_addresses: Option<LoadedAddresses>,
43+
reserved_account_keys: &HashSet<Pubkey>,
2644
) -> SanitizedMessage {
2745
let header = MessageHeader {
2846
num_required_signatures: num_signers,
@@ -64,7 +82,7 @@ fn test_get_durable_nonce() {
6482
SanitizedMessage::try_new(
6583
SanitizedVersionedMessage::try_new(versioned_message).unwrap(),
6684
loader,
67-
&HashSet::new(),
85+
reserved_account_keys,
6886
)
6987
.unwrap()
7088
}
@@ -73,6 +91,7 @@ fn test_get_durable_nonce() {
7391
{
7492
let message = create_message_for_test(1, 1, vec![Pubkey::new_unique()], vec![], None);
7593
assert!(SVMMessage::get_durable_nonce(&message).is_none());
94+
assert!(SVMStaticMessage::get_durable_nonce_simd602(&message).is_none());
7695
}
7796

7897
// system program id instruction - invalid
@@ -85,6 +104,7 @@ fn test_get_durable_nonce() {
85104
None,
86105
);
87106
assert!(SVMMessage::get_durable_nonce(&message).is_none());
107+
assert!(SVMStaticMessage::get_durable_nonce_simd602(&message).is_none());
88108
}
89109

90110
// system program id instruction - not nonce
@@ -101,6 +121,7 @@ fn test_get_durable_nonce() {
101121
None,
102122
);
103123
assert!(SVMMessage::get_durable_nonce(&message).is_none());
124+
assert!(SVMStaticMessage::get_durable_nonce_simd602(&message).is_none());
104125
}
105126

106127
// system program id - nonce instruction (no accounts)
@@ -117,6 +138,7 @@ fn test_get_durable_nonce() {
117138
None,
118139
);
119140
assert!(SVMMessage::get_durable_nonce(&message).is_none());
141+
assert!(SVMStaticMessage::get_durable_nonce_simd602(&message).is_none());
120142
}
121143

122144
// system program id - nonce instruction (non-fee-payer, non-writable)
@@ -135,6 +157,7 @@ fn test_get_durable_nonce() {
135157
None,
136158
);
137159
assert!(SVMMessage::get_durable_nonce(&message).is_none());
160+
assert!(SVMStaticMessage::get_durable_nonce_simd602(&message).is_none());
138161
}
139162

140163
// system program id - nonce instruction fee-payer
@@ -152,6 +175,10 @@ fn test_get_durable_nonce() {
152175
None,
153176
);
154177
assert_eq!(SVMMessage::get_durable_nonce(&message), Some(&payer_nonce));
178+
assert_eq!(
179+
SVMStaticMessage::get_durable_nonce_simd602(&message),
180+
Some(&payer_nonce)
181+
);
155182
}
156183

157184
// system program id - nonce instruction w/ trailing bytes fee-payer
@@ -171,6 +198,10 @@ fn test_get_durable_nonce() {
171198
None,
172199
);
173200
assert_eq!(SVMMessage::get_durable_nonce(&message), Some(&payer_nonce));
201+
assert_eq!(
202+
SVMStaticMessage::get_durable_nonce_simd602(&message),
203+
Some(&payer_nonce)
204+
);
174205
}
175206

176207
// system program id - nonce instruction (non-fee-payer)
@@ -189,6 +220,10 @@ fn test_get_durable_nonce() {
189220
None,
190221
);
191222
assert_eq!(SVMMessage::get_durable_nonce(&message), Some(&nonce));
223+
assert_eq!(
224+
SVMStaticMessage::get_durable_nonce_simd602(&message),
225+
Some(&nonce)
226+
);
192227
}
193228

194229
// system program id - nonce instruction (non-fee-payer, multiple accounts)
@@ -208,6 +243,10 @@ fn test_get_durable_nonce() {
208243
None,
209244
);
210245
assert_eq!(SVMMessage::get_durable_nonce(&message), Some(&nonce));
246+
assert_eq!(
247+
SVMStaticMessage::get_durable_nonce_simd602(&message),
248+
Some(&nonce)
249+
);
211250
}
212251

213252
// system program id - nonce instruction (non-fee-payer, loaded account)
@@ -229,6 +268,73 @@ fn test_get_durable_nonce() {
229268
}),
230269
);
231270
assert_eq!(SVMMessage::get_durable_nonce(&message), None);
271+
assert_eq!(SVMStaticMessage::get_durable_nonce_simd602(&message), None);
272+
}
273+
274+
// system program id - nonce instruction (nonce is program id, write-demoted)
275+
{
276+
let payer = Pubkey::new_unique();
277+
let nonce = Pubkey::new_unique();
278+
let message = create_message_for_test(
279+
1,
280+
2,
281+
vec![payer, nonce, system_program::id()],
282+
vec![
283+
CompiledInstruction::new(2, &SystemInstruction::AdvanceNonceAccount, vec![1]),
284+
CompiledInstruction::new_from_raw_parts(1, vec![], vec![]),
285+
],
286+
None,
287+
);
288+
assert!(SVMMessage::get_durable_nonce(&message).is_none());
289+
assert!(SVMStaticMessage::get_durable_nonce_simd602(&message).is_none());
290+
}
291+
292+
// system program id - nonce instruction (nonce is program id, upgradeable loader present)
293+
// pre-simd602 relies on write demotion, which the loader disables; simd602 rejects outright
294+
{
295+
let payer = Pubkey::new_unique();
296+
let nonce = Pubkey::new_unique();
297+
let message = create_message_for_test(
298+
1,
299+
2,
300+
vec![
301+
payer,
302+
nonce,
303+
system_program::id(),
304+
bpf_loader_upgradeable::id(),
305+
],
306+
vec![
307+
CompiledInstruction::new(2, &SystemInstruction::AdvanceNonceAccount, vec![1]),
308+
CompiledInstruction::new_from_raw_parts(1, vec![], vec![]),
309+
],
310+
None,
311+
);
312+
assert_eq!(SVMMessage::get_durable_nonce(&message), Some(&nonce));
313+
assert!(SVMStaticMessage::get_durable_nonce_simd602(&message).is_none());
314+
}
315+
316+
// system program id - nonce instruction (nonce is reserved key)
317+
// pre-simd602 applies reserved key demotion; simd602 does not
318+
{
319+
let payer = Pubkey::new_unique();
320+
let nonce = Pubkey::new_unique();
321+
let message = create_message_for_test_with_reserved_keys(
322+
1,
323+
2,
324+
vec![payer, nonce, system_program::id()],
325+
vec![CompiledInstruction::new(
326+
2,
327+
&SystemInstruction::AdvanceNonceAccount,
328+
vec![1],
329+
)],
330+
None,
331+
&HashSet::from([nonce]),
332+
);
333+
assert!(SVMMessage::get_durable_nonce(&message).is_none());
334+
assert_eq!(
335+
SVMStaticMessage::get_durable_nonce_simd602(&message),
336+
Some(&nonce)
337+
);
232338
}
233339
}
234340

0 commit comments

Comments
 (0)