Skip to content

Commit ecef22b

Browse files
committed
fuzz: omit test features
1 parent f456c88 commit ecef22b

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

fuzz/fixture/src/feature_set.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
//! Runtime feature set.
22
3-
use {super::proto::FeatureSet as ProtoFeatureSet, solana_sdk::feature_set::FeatureSet};
3+
use {
4+
super::proto::FeatureSet as ProtoFeatureSet,
5+
solana_sdk::{feature_set::FeatureSet, pubkey::Pubkey},
6+
};
7+
8+
// Omit "test features" (they have the same u64 ID).
9+
pub static OMITTED_FEATURES: &[Pubkey] = &[
10+
solana_sdk::feature_set::disable_sbpf_v1_execution::id(),
11+
solana_sdk::feature_set::reenable_sbpf_v1_execution::id(),
12+
];
413

514
impl From<ProtoFeatureSet> for FeatureSet {
615
fn from(value: ProtoFeatureSet) -> Self {
716
let mut feature_set = Self::default();
8-
let inactive = std::mem::take(&mut feature_set.inactive);
17+
let mut inactive = std::mem::take(&mut feature_set.inactive);
18+
OMITTED_FEATURES.iter().for_each(|f| {
19+
inactive.remove(f);
20+
});
921

1022
value.features.iter().for_each(|int_id| {
1123
let discriminator = int_id.to_le_bytes();
@@ -26,9 +38,13 @@ impl From<FeatureSet> for ProtoFeatureSet {
2638
let features = value
2739
.active
2840
.keys()
29-
.map(|feature_id| {
41+
.filter_map(|feature_id| {
42+
if OMITTED_FEATURES.contains(feature_id) {
43+
return None;
44+
}
3045
let discriminator = &feature_id.to_bytes()[0..8];
31-
u64::from_le_bytes(discriminator.try_into().unwrap())
46+
let int_id = u64::from_le_bytes(discriminator.try_into().unwrap());
47+
Some(int_id)
3248
})
3349
.collect();
3450

harness/src/lib.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,21 @@ impl Default for Mollusk {
7979
solana_runtime::message_processor=debug,\
8080
solana_runtime::system_instruction_processor=trace",
8181
);
82+
#[cfg(feature = "fuzz")]
83+
let feature_set = {
84+
// Omit "test features" (they have the same u64 ID).
85+
let mut fs = FeatureSet::all_enabled();
86+
fs.active
87+
.remove(&solana_sdk::feature_set::disable_sbpf_v1_execution::id());
88+
fs.active
89+
.remove(&solana_sdk::feature_set::reenable_sbpf_v1_execution::id());
90+
fs
91+
};
92+
#[cfg(not(feature = "fuzz"))]
93+
let feature_set = FeatureSet::all_enabled();
8294
Self {
8395
compute_budget: ComputeBudget::default(),
84-
feature_set: FeatureSet::all_enabled(),
96+
feature_set,
8597
fee_structure: FeeStructure::default(),
8698
program_cache: ProgramCache::default(),
8799
sysvars: Sysvars::default(),

harness/tests/dump_fixture.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
use {
44
mollusk_svm::{result::Check, Mollusk},
55
mollusk_svm_fuzz_fixture::Fixture,
6-
solana_sdk::{account::AccountSharedData, pubkey::Pubkey, system_instruction, system_program},
6+
solana_sdk::{
7+
account::AccountSharedData, feature_set::FeatureSet, pubkey::Pubkey, system_instruction,
8+
system_program,
9+
},
710
std::path::Path,
811
};
912

@@ -59,6 +62,14 @@ fn clear() {
5962
}
6063
}
6164

65+
fn compare_feature_sets(from_fixture: &FeatureSet, from_mollusk: &FeatureSet) {
66+
assert_eq!(from_fixture.active.len(), from_mollusk.active.len());
67+
assert_eq!(from_fixture.inactive.len(), from_mollusk.inactive.len());
68+
for f in from_fixture.active.keys() {
69+
assert!(from_mollusk.active.get(&f).is_some());
70+
}
71+
}
72+
6273
#[test]
6374
fn test_dump() {
6475
clear();
@@ -100,7 +111,8 @@ fn test_dump() {
100111
let blob_fixture_path = find_fixture(&FileType::Blob).unwrap();
101112
let blob_fixture = Fixture::load_from_blob_file(&blob_fixture_path);
102113
assert_eq!(blob_fixture.input.compute_budget, mollusk.compute_budget);
103-
assert_eq!(blob_fixture.input.feature_set, mollusk.feature_set);
114+
// Feature set matches, but it can't guarantee sorting.
115+
compare_feature_sets(&blob_fixture.input.feature_set, &mollusk.feature_set);
104116
assert_eq!(blob_fixture.input.sysvars.clock, mollusk.sysvars.clock);
105117
assert_eq!(blob_fixture.input.sysvars.rent, mollusk.sysvars.rent);
106118
assert_eq!(blob_fixture.input.program_id, instruction.program_id);
@@ -115,7 +127,8 @@ fn test_dump() {
115127
let json_fixture_path = find_fixture(&FileType::Json).unwrap();
116128
let json_fixture = Fixture::load_from_json_file(&json_fixture_path);
117129
assert_eq!(json_fixture.input.compute_budget, mollusk.compute_budget);
118-
assert_eq!(json_fixture.input.feature_set, mollusk.feature_set);
130+
// Feature set matches, but it can't guarantee sorting.
131+
compare_feature_sets(&json_fixture.input.feature_set, &mollusk.feature_set);
119132
assert_eq!(json_fixture.input.sysvars.clock, mollusk.sysvars.clock);
120133
assert_eq!(json_fixture.input.sysvars.rent, mollusk.sysvars.rent);
121134
assert_eq!(json_fixture.input.program_id, instruction.program_id);

0 commit comments

Comments
 (0)