Skip to content

Commit 4996ae7

Browse files
authored
Merge pull request #10 from embassy-rs/ci-extra
ci: test with more features, run fuzzers.
2 parents 6c1c3c3 + b051c2d commit 4996ae7

File tree

4 files changed

+61
-26
lines changed

4 files changed

+61
-26
lines changed

ci.sh

+29-4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,37 @@
22

33
set -euxo pipefail
44

5+
cargo install cargo-fuzz
6+
57
export RUSTFLAGS=-Dwarnings
68

79
cargo fmt --check
8-
cargo test --release
9-
cargo test --release --features crc
10-
cargo clippy
11-
cargo clippy --features crc
10+
11+
FEATURESET=(
12+
ekv/page-size-256,ekv/max-page-count-64,ekv/max-value-size-128,ekv/scratch-page-count-4,ekv/align-1
13+
ekv/page-size-256,ekv/max-page-count-256,ekv/max-value-size-1024,ekv/scratch-page-count-8,ekv/align-2
14+
ekv/page-size-1024,ekv/max-page-count-16,ekv/max-value-size-16,ekv/scratch-page-count-0
15+
ekv/page-size-128,ekv/max-page-count-32,ekv/max-value-size-16,ekv/scratch-page-count-0
16+
ekv/page-size-128,ekv/max-page-count-32,ekv/max-value-size-16,ekv/scratch-page-count-0,ekv/crc
17+
)
18+
19+
for FEATURES in ${FEATURESET[@]}; do
20+
cargo test --release --features $FEATURES
21+
cargo clippy --features $FEATURES
22+
23+
# Run `file` fuzzer
24+
cargo fuzz run --sanitizer none -j$(nproc) file --features $FEATURES -- -max_total_time=30
25+
26+
# Run `ops` fuzzer
27+
cargo fuzz run --sanitizer none -j$(nproc) ops --features $FEATURES -- -max_total_time=30
28+
29+
# Run `read` fuzzer. Seed it with a flash image with stuff in it.
30+
cargo run --release --example smoke --features $FEATURES
31+
rm -rf fuzz/corpus/read
32+
mkdir -p fuzz/corpus/read
33+
mv out.bin fuzz/corpus/read
34+
cargo fuzz run --sanitizer none -j$(nproc) read --features $FEATURES -- -max_total_time=30
35+
done
36+
1237
(cd examples/nrf; cargo fmt --check; cargo build --release --features defmt)
1338
(cd examples/rp2040; cargo fmt --check; cargo build --release)

fuzz/fuzz_targets/file.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use ekv::flash::MemFlash;
88
use ekv::page::PageReader;
99
use libfuzzer_sys::arbitrary::Arbitrary;
1010
use libfuzzer_sys::fuzz_target;
11+
use log::info;
1112

1213
const MAX_LEN: usize = 1024;
1314

@@ -60,13 +61,14 @@ async fn fuzz_inner(ops: Input, dump: bool) {
6061
let mut trunc_offs: usize = 0;
6162

6263
for op in ops.ops {
64+
info!("========== OP: {:?}", op);
6365
match op {
6466
Op::Append { len } => {
6567
if len > MAX_LEN {
6668
continue;
6769
}
6870

69-
if (m.used_pages() + 3) * PAGE_SIZE + len >= MAX_PAGE_COUNT * PAGE_SIZE {
71+
if (m.used_pages() + 4) * PAGE_SIZE + len >= MAX_PAGE_COUNT * PAGE_SIZE {
7072
continue;
7173
}
7274

@@ -127,7 +129,7 @@ async fn fuzz_inner(ops: Input, dump: bool) {
127129
}
128130

129131
// Linear search
130-
loop {
132+
while !found {
131133
let mut got_id = [0u8; 4];
132134
match s.reader().read(&mut m, &mut got_id).await {
133135
Ok(()) => {}

src/file.rs

+27-20
Original file line numberDiff line numberDiff line change
@@ -1587,6 +1587,9 @@ mod tests {
15871587
use crate::flash::MemFlash;
15881588
use crate::types::RawPageID;
15891589

1590+
/// Big amount of data that it's reasonable to write to a file.
1591+
const BIG_DATA_SIZE: usize = PAGE_SIZE * MAX_PAGE_COUNT / 2;
1592+
15901593
fn page(p: RawPageID) -> PageID {
15911594
PageID::from_raw(p).unwrap()
15921595
}
@@ -1627,7 +1630,7 @@ mod tests {
16271630
m.format().await.unwrap();
16281631
m.mount(&mut pr).await.unwrap();
16291632

1630-
let data = dummy_data(23456);
1633+
let data = dummy_data(BIG_DATA_SIZE);
16311634

16321635
let mut w = m.write(&mut pr, 0).await.unwrap();
16331636
w.write(&mut m, &data).await.unwrap();
@@ -2652,7 +2655,7 @@ mod tests {
26522655
m.mount(&mut pr).await.unwrap();
26532656

26542657
let mut w = m.write(&mut pr, 1).await.unwrap();
2655-
w.write(&mut m, &[0x00; 4348]).await.unwrap();
2658+
w.write(&mut m, &[0x00; BIG_DATA_SIZE]).await.unwrap();
26562659
w.record_end();
26572660
m.commit(&mut w).await.unwrap();
26582661

@@ -2671,29 +2674,31 @@ mod tests {
26712674
m.format().await.unwrap();
26722675
m.mount(&mut pr).await.unwrap();
26732676

2677+
const N: usize = BIG_DATA_SIZE / 2;
2678+
26742679
let mut w = m.write(&mut pr, 1).await.unwrap();
2675-
w.write(&mut m, &[0x00; 4348]).await.unwrap();
2680+
w.write(&mut m, &[0x00; N]).await.unwrap();
26762681
w.record_end();
2677-
w.write(&mut m, &[0x00; 4348]).await.unwrap();
2682+
w.write(&mut m, &[0x00; N]).await.unwrap();
26782683
w.record_end();
26792684
m.commit(&mut w).await.unwrap();
26802685

26812686
let mut buf = [0u8; 1];
26822687
// Seek left
26832688
let mut s = FileSearcher::new(m.read(&mut pr, 1));
26842689
assert_eq!(s.start(&mut m).await.unwrap(), true);
2685-
assert_eq!(s.reader().offset(&mut m), 4348);
2690+
assert_eq!(s.reader().offset(&mut m), N);
26862691
s.reader().read(&mut m, &mut buf).await.unwrap();
26872692
assert_eq!(s.seek(&mut m, SeekDirection::Left).await.unwrap(), false);
26882693
assert_eq!(s.reader().offset(&mut m), 0);
26892694

26902695
// Seek right
26912696
let mut s = FileSearcher::new(m.read(&mut pr, 1));
26922697
assert_eq!(s.start(&mut m).await.unwrap(), true);
2693-
assert_eq!(s.reader().offset(&mut m), 4348);
2698+
assert_eq!(s.reader().offset(&mut m), N);
26942699
s.reader().read(&mut m, &mut buf).await.unwrap();
26952700
assert_eq!(s.seek(&mut m, SeekDirection::Right).await.unwrap(), false);
2696-
assert_eq!(s.reader().offset(&mut m), 4348);
2701+
assert_eq!(s.reader().offset(&mut m), N);
26972702
}
26982703

26992704
#[test_log::test(tokio::test)]
@@ -2704,56 +2709,58 @@ mod tests {
27042709
m.format().await.unwrap();
27052710
m.mount(&mut pr).await.unwrap();
27062711

2712+
const N: usize = BIG_DATA_SIZE / 3;
2713+
27072714
let mut w = m.write(&mut pr, 1).await.unwrap();
2708-
w.write(&mut m, &[0x00; 4348]).await.unwrap();
2715+
w.write(&mut m, &[0x00; N]).await.unwrap();
27092716
w.record_end();
2710-
w.write(&mut m, &[0x00; 4348]).await.unwrap();
2717+
w.write(&mut m, &[0x00; N]).await.unwrap();
27112718
w.record_end();
2712-
w.write(&mut m, &[0x00; 4348]).await.unwrap();
2719+
w.write(&mut m, &[0x00; N]).await.unwrap();
27132720
w.record_end();
27142721
m.commit(&mut w).await.unwrap();
27152722

27162723
let mut buf = [0u8; 1];
27172724
// Seek left
27182725
let mut s = FileSearcher::new(m.read(&mut pr, 1));
27192726
assert_eq!(s.start(&mut m).await.unwrap(), true);
2720-
assert_eq!(s.reader().offset(&mut m), 8696);
2727+
assert_eq!(s.reader().offset(&mut m), N * 2);
27212728
s.reader().read(&mut m, &mut buf).await.unwrap();
27222729
assert_eq!(s.seek(&mut m, SeekDirection::Left).await.unwrap(), true);
2723-
assert_eq!(s.reader().offset(&mut m), 4348);
2730+
assert_eq!(s.reader().offset(&mut m), N);
27242731
s.reader().read(&mut m, &mut buf).await.unwrap();
27252732
assert_eq!(s.seek(&mut m, SeekDirection::Left).await.unwrap(), false);
27262733
assert_eq!(s.reader().offset(&mut m), 0);
27272734

27282735
// Seek less left
27292736
let mut s = FileSearcher::new(m.read(&mut pr, 1));
27302737
assert_eq!(s.start(&mut m).await.unwrap(), true);
2731-
assert_eq!(s.reader().offset(&mut m), 8696);
2738+
assert_eq!(s.reader().offset(&mut m), N * 2);
27322739
s.reader().read(&mut m, &mut buf).await.unwrap();
27332740
assert_eq!(s.seek(&mut m, SeekDirection::Left).await.unwrap(), true);
2734-
assert_eq!(s.reader().offset(&mut m), 4348);
2741+
assert_eq!(s.reader().offset(&mut m), N);
27352742
s.reader().read(&mut m, &mut buf).await.unwrap();
27362743
assert_eq!(s.seek(&mut m, SeekDirection::Left).await.unwrap(), false);
27372744
assert_eq!(s.reader().offset(&mut m), 0);
27382745

27392746
// Seek middle
27402747
let mut s = FileSearcher::new(m.read(&mut pr, 1));
27412748
assert_eq!(s.start(&mut m).await.unwrap(), true);
2742-
assert_eq!(s.reader().offset(&mut m), 8696);
2749+
assert_eq!(s.reader().offset(&mut m), N * 2);
27432750
s.reader().read(&mut m, &mut buf).await.unwrap();
27442751
assert_eq!(s.seek(&mut m, SeekDirection::Left).await.unwrap(), true);
2745-
assert_eq!(s.reader().offset(&mut m), 4348);
2752+
assert_eq!(s.reader().offset(&mut m), N);
27462753
s.reader().read(&mut m, &mut buf).await.unwrap();
27472754
assert_eq!(s.seek(&mut m, SeekDirection::Right).await.unwrap(), false);
2748-
assert_eq!(s.reader().offset(&mut m), 4348);
2755+
assert_eq!(s.reader().offset(&mut m), N);
27492756

27502757
// Seek right
27512758
let mut s = FileSearcher::new(m.read(&mut pr, 1));
27522759
assert_eq!(s.start(&mut m).await.unwrap(), true);
2753-
assert_eq!(s.reader().offset(&mut m), 8696);
2760+
assert_eq!(s.reader().offset(&mut m), N * 2);
27542761
s.reader().read(&mut m, &mut buf).await.unwrap();
27552762
assert_eq!(s.seek(&mut m, SeekDirection::Right).await.unwrap(), false);
2756-
assert_eq!(s.reader().offset(&mut m), 8696);
2763+
assert_eq!(s.reader().offset(&mut m), N * 2);
27572764
}
27582765

27592766
#[test_log::test(tokio::test)]
@@ -2814,7 +2821,7 @@ mod tests {
28142821
m.format().await.unwrap();
28152822
m.mount(&mut pr).await.unwrap();
28162823

2817-
let count: u32 = 20000 / 4;
2824+
let count: u32 = (BIG_DATA_SIZE / 4).try_into().unwrap();
28182825

28192826
let mut w = m.write(&mut pr, 1).await.unwrap();
28202827
for i in 1..=count {

src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#![allow(async_fn_in_trait)]
66
#![allow(clippy::large_enum_variant)]
77
#![allow(clippy::new_without_default)]
8+
#![allow(clippy::modulo_one)] // needed when ALIGN=1
89
// the `_test` feature makes public more stuff, causing bogus warnings.
910
#![cfg_attr(not(feature = "_test"), warn(missing_docs))]
1011

0 commit comments

Comments
 (0)