Skip to content

Commit 55e1d3b

Browse files
authored
fix: consistent fixture file naming (#34)
1 parent 91e5c64 commit 55e1d3b

File tree

5 files changed

+73
-57
lines changed

5 files changed

+73
-57
lines changed

fuzz/fixture/src/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use {
1313
};
1414

1515
/// Instruction context fixture.
16+
#[derive(Clone, Debug, Default, PartialEq)]
1617
pub struct Context {
1718
/// The compute budget to use for the simulation.
1819
pub compute_budget: ComputeBudget,

fuzz/fixture/src/effects.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use {
66
};
77

88
/// Represents the effects of a single instruction.
9+
#[derive(Clone, Debug, Default, PartialEq)]
910
pub struct Effects {
1011
/// Compute units consumed by the instruction.
1112
pub compute_units_consumed: u64,

fuzz/fixture/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use {
2727

2828
/// A fixture for invoking a single instruction against a simulated SVM
2929
/// program runtime environment, for a given program.
30+
#[derive(Clone, Debug, Default, PartialEq)]
3031
pub struct Fixture {
3132
/// The fixture inputs.
3233
pub input: Context,
@@ -65,10 +66,11 @@ impl Fixture {
6566
/// Dumps the `Fixture` to a JSON file.
6667
/// The file name is a hash of the fixture with the `.json` extension.
6768
pub fn dump_to_json_file(self, dir_path: &str) {
69+
let blob = self.clone().encode();
6870
let json = serde_json::to_string_pretty(&ProtoFixture::from(self))
6971
.expect("Failed to serialize fixture to JSON");
7072

71-
let hash = solana_sdk::hash::hash(json.as_bytes());
73+
let hash = solana_sdk::hash::hash(&blob);
7274
let file_name = format!("instr-{}.json", bs58::encode(hash).into_string());
7375

7476
write_file(Path::new(dir_path), &file_name, json.as_bytes());

fuzz/fixture/src/sysvars.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use {
2020
};
2121

2222
/// A fixture of runtime sysvars.
23-
#[derive(Default)]
23+
#[derive(Debug, Default, PartialEq)]
2424
pub struct Sysvars {
2525
/// `Clock` sysvar.
2626
pub clock: Clock,
@@ -36,6 +36,19 @@ pub struct Sysvars {
3636
pub stake_history: StakeHistory,
3737
}
3838

39+
impl Clone for Sysvars {
40+
fn clone(&self) -> Self {
41+
Self {
42+
clock: self.clock.clone(),
43+
epoch_rewards: self.epoch_rewards.clone(),
44+
epoch_schedule: self.epoch_schedule.clone(),
45+
rent: self.rent.clone(),
46+
slot_hashes: SlotHashes::new(self.slot_hashes.slot_hashes()),
47+
stake_history: self.stake_history.clone(),
48+
}
49+
}
50+
}
51+
3952
// Clock sysvar.
4053
impl From<ProtoClock> for Clock {
4154
fn from(value: ProtoClock) -> Self {

harness/tests/dump_fixture.rs

Lines changed: 54 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
use {
44
mollusk_svm::{result::Check, Mollusk},
55
mollusk_svm_fuzz_fixture::Fixture,
6-
solana_sdk::{
7-
account::AccountSharedData, instruction::Instruction, pubkey::Pubkey, system_instruction,
8-
system_program,
9-
},
6+
solana_sdk::{account::AccountSharedData, pubkey::Pubkey, system_instruction, system_program},
107
std::path::Path,
118
};
129

@@ -62,7 +59,12 @@ fn clear() {
6259
}
6360
}
6461

65-
fn mollusk_test() -> (Mollusk, Instruction, [(Pubkey, AccountSharedData); 2]) {
62+
#[test]
63+
fn test_dump() {
64+
clear();
65+
std::env::set_var("EJECT_FUZZ_FIXTURES", EJECT_FUZZ_FIXTURES);
66+
std::env::set_var("EJECT_FUZZ_FIXTURES_JSON", EJECT_FUZZ_FIXTURES);
67+
6668
let sender = Pubkey::new_unique();
6769
let recipient = Pubkey::new_unique();
6870

@@ -72,7 +74,7 @@ fn mollusk_test() -> (Mollusk, Instruction, [(Pubkey, AccountSharedData); 2]) {
7274
let mollusk = Mollusk::default();
7375

7476
let instruction = system_instruction::transfer(&sender, &recipient, transfer_amount);
75-
let accounts = [
77+
let accounts = vec![
7678
(
7779
sender,
7880
AccountSharedData::new(base_lamports, 0, &system_program::id()),
@@ -94,54 +96,51 @@ fn mollusk_test() -> (Mollusk, Instruction, [(Pubkey, AccountSharedData); 2]) {
9496

9597
mollusk.process_and_validate_instruction(&instruction, &accounts, &checks);
9698

97-
(mollusk, instruction, accounts)
98-
}
99-
100-
#[test]
101-
fn test_dump() {
102-
clear();
103-
104-
// First try protobuf.
105-
{
106-
std::env::set_var("EJECT_FUZZ_FIXTURES", EJECT_FUZZ_FIXTURES);
107-
108-
let (mollusk, instruction, accounts) = mollusk_test();
109-
110-
let fixture_path = find_fixture(&FileType::Blob).unwrap();
111-
let fixture = Fixture::load_from_blob_file(&fixture_path);
112-
113-
assert_eq!(fixture.input.compute_budget, mollusk.compute_budget);
114-
assert_eq!(fixture.input.feature_set, mollusk.feature_set);
115-
assert_eq!(fixture.input.sysvars.clock, mollusk.sysvars.clock);
116-
assert_eq!(fixture.input.sysvars.rent, mollusk.sysvars.rent);
117-
assert_eq!(fixture.input.program_id, instruction.program_id);
118-
assert_eq!(fixture.input.instruction_accounts, instruction.accounts);
119-
assert_eq!(fixture.input.instruction_data, instruction.data);
120-
assert_eq!(fixture.input.accounts, accounts);
121-
122-
std::env::remove_var("EJECT_FUZZ_FIXTURES");
123-
}
124-
125-
// Now try JSON.
126-
{
127-
std::env::set_var("EJECT_FUZZ_FIXTURES_JSON", EJECT_FUZZ_FIXTURES);
128-
129-
let (mollusk, instruction, accounts) = mollusk_test();
130-
131-
let fixture_path = find_fixture(&FileType::Json).unwrap();
132-
let fixture = Fixture::load_from_json_file(&fixture_path);
133-
134-
assert_eq!(fixture.input.compute_budget, mollusk.compute_budget);
135-
assert_eq!(fixture.input.feature_set, mollusk.feature_set);
136-
assert_eq!(fixture.input.sysvars.clock, mollusk.sysvars.clock);
137-
assert_eq!(fixture.input.sysvars.rent, mollusk.sysvars.rent);
138-
assert_eq!(fixture.input.program_id, instruction.program_id);
139-
assert_eq!(fixture.input.instruction_accounts, instruction.accounts);
140-
assert_eq!(fixture.input.instruction_data, instruction.data);
141-
assert_eq!(fixture.input.accounts, accounts);
142-
143-
std::env::remove_var("EJECT_FUZZ_FIXTURES_JSON");
144-
}
145-
99+
// Validate the protobuf fixture matches the test environment.
100+
let blob_fixture_path = find_fixture(&FileType::Blob).unwrap();
101+
let blob_fixture = Fixture::load_from_blob_file(&blob_fixture_path);
102+
assert_eq!(blob_fixture.input.compute_budget, mollusk.compute_budget);
103+
assert_eq!(blob_fixture.input.feature_set, mollusk.feature_set);
104+
assert_eq!(blob_fixture.input.sysvars.clock, mollusk.sysvars.clock);
105+
assert_eq!(blob_fixture.input.sysvars.rent, mollusk.sysvars.rent);
106+
assert_eq!(blob_fixture.input.program_id, instruction.program_id);
107+
assert_eq!(
108+
blob_fixture.input.instruction_accounts,
109+
instruction.accounts
110+
);
111+
assert_eq!(blob_fixture.input.instruction_data, instruction.data);
112+
assert_eq!(blob_fixture.input.accounts, accounts);
113+
114+
// Validate the JSON fixture matches the test environment.
115+
let json_fixture_path = find_fixture(&FileType::Json).unwrap();
116+
let json_fixture = Fixture::load_from_json_file(&json_fixture_path);
117+
assert_eq!(json_fixture.input.compute_budget, mollusk.compute_budget);
118+
assert_eq!(json_fixture.input.feature_set, mollusk.feature_set);
119+
assert_eq!(json_fixture.input.sysvars.clock, mollusk.sysvars.clock);
120+
assert_eq!(json_fixture.input.sysvars.rent, mollusk.sysvars.rent);
121+
assert_eq!(json_fixture.input.program_id, instruction.program_id);
122+
assert_eq!(
123+
json_fixture.input.instruction_accounts,
124+
instruction.accounts
125+
);
126+
assert_eq!(json_fixture.input.instruction_data, instruction.data);
127+
assert_eq!(json_fixture.input.accounts, accounts);
128+
129+
// Ensure both files have the same name.
130+
assert_eq!(
131+
Path::new(&blob_fixture_path)
132+
.file_stem()
133+
.unwrap()
134+
.to_str()
135+
.unwrap(),
136+
Path::new(&json_fixture_path)
137+
.file_stem()
138+
.unwrap()
139+
.to_str()
140+
.unwrap()
141+
);
142+
143+
std::env::remove_var("EJECT_FUZZ_FIXTURES");
144+
std::env::remove_var("EJECT_FUZZ_FIXTURES_JSON");
146145
clear();
147146
}

0 commit comments

Comments
 (0)