Skip to content

Commit 217a027

Browse files
committed
f: fuzz review comments
1 parent 29e2861 commit 217a027

File tree

3 files changed

+48
-17
lines changed

3 files changed

+48
-17
lines changed

fuzz/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ lightning-rapid-gossip-sync = { path = "../lightning-rapid-gossip-sync" }
2525
lightning-persister = { path = "../lightning-persister", features = ["tokio"]}
2626
bech32 = "0.11.0"
2727
bitcoin = { version = "0.32.2", features = ["secp-lowmemory"] }
28-
tokio = { version = "1.35.*", default-features = false, features = ["rt-multi-thread"] }
28+
tokio = { version = "~1.35", default-features = false, features = ["rt-multi-thread"] }
29+
uuid = { version = "1.3", features = ["v4"] }
2930

3031
afl = { version = "0.12", optional = true }
3132
honggfuzz = { version = "0.5", optional = true, default-features = false }

fuzz/src/bin/fs_store_target.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ fn run_test_cases() {
6868
use lightning_fuzz::utils::test_logger::StringBuffer;
6969

7070
use std::sync::{atomic, Arc};
71-
// {
72-
// let data: Vec<u8> = vec![0];
73-
// fs_store_run(data.as_ptr(), data.len());
74-
// }
71+
{
72+
let data: Vec<u8> = vec![0];
73+
fs_store_run(data.as_ptr(), data.len());
74+
}
7575
let mut threads = Vec::new();
7676
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
7777
if let Ok(tests) = fs::read_dir("test_cases/fs_store") {

fuzz/src/fs_store.rs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,40 @@
11
use lightning::util::persist::{KVStore, KVStoreSync};
22
use lightning_persister::fs_store::FilesystemStore;
3+
use std::fs;
34
use tokio::runtime::Runtime;
5+
use uuid::Uuid;
46

57
use crate::utils::test_logger;
68

9+
struct TempFilesystemStore {
10+
temp_path: std::path::PathBuf,
11+
inner: FilesystemStore,
12+
}
13+
14+
impl TempFilesystemStore {
15+
fn new() -> Self {
16+
let mut temp_path = std::env::temp_dir();
17+
let random_folder_name = format!("fs_store_fuzz_{}", Uuid::new_v4());
18+
temp_path.push(random_folder_name);
19+
20+
let inner = FilesystemStore::new(temp_path.clone());
21+
TempFilesystemStore { inner, temp_path }
22+
}
23+
}
24+
25+
impl Drop for TempFilesystemStore {
26+
fn drop(&mut self) {
27+
_ = fs::remove_dir_all(&self.temp_path)
28+
}
29+
}
30+
731
/// Actual fuzz test, method signature and name are fixed
832
fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
933
let rt = Runtime::new().unwrap();
1034
rt.block_on(do_test_internal(data, out));
1135
}
1236

13-
async fn do_test_internal<Out: test_logger::Output>(data: &[u8], out: Out) {
37+
async fn do_test_internal<Out: test_logger::Output>(data: &[u8], _out: Out) {
1438
let mut read_pos = 0;
1539
macro_rules! get_slice {
1640
($len: expr) => {{
@@ -23,16 +47,15 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], out: Out) {
2347
}};
2448
}
2549

26-
let mut temp_path = std::env::temp_dir();
27-
temp_path.push("fs_store_fuzz");
28-
let fs_store: FilesystemStore = FilesystemStore::new(temp_path);
50+
let temp_fs_store = TempFilesystemStore::new();
51+
let fs_store = &temp_fs_store.inner;
2952

3053
let primary_namespace = "primary";
3154
let secondary_namespace = "secondary";
3255
let key = "key";
3356

3457
// Remove the key in case something was left over from a previous run.
35-
_ = KVStoreSync::remove(&fs_store, primary_namespace, secondary_namespace, key, false);
58+
_ = KVStoreSync::remove(fs_store, primary_namespace, secondary_namespace, key, false);
3659

3760
let mut next_data_value = 0u64;
3861
let mut get_next_data_value = || {
@@ -53,7 +76,7 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], out: Out) {
5376
let data_value = get_next_data_value();
5477

5578
KVStoreSync::write(
56-
&fs_store,
79+
fs_store,
5780
primary_namespace,
5881
secondary_namespace,
5982
key,
@@ -65,17 +88,25 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], out: Out) {
6588
},
6689
// Sync remove
6790
0x01 => {
68-
KVStoreSync::remove(&fs_store, primary_namespace, secondary_namespace, key, false)
91+
KVStoreSync::remove(fs_store, primary_namespace, secondary_namespace, key, false)
6992
.unwrap();
7093

7194
current_data = None;
7295
},
73-
// Async write
96+
// Sync list
7497
0x02 => {
98+
KVStoreSync::list(fs_store, primary_namespace, secondary_namespace).unwrap();
99+
},
100+
// Sync read
101+
0x03 => {
102+
_ = KVStoreSync::read(fs_store, primary_namespace, secondary_namespace, key);
103+
},
104+
// Async write
105+
0x04 => {
75106
let data_value = get_next_data_value();
76107

77108
let fut = KVStore::write(
78-
&fs_store,
109+
fs_store,
79110
primary_namespace,
80111
secondary_namespace,
81112
key,
@@ -111,11 +142,10 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], out: Out) {
111142
// If no more writes are pending, we can reliably see if the data is consistent.
112143
if futures.is_empty() {
113144
let data_value =
114-
KVStoreSync::read(&fs_store, primary_namespace, secondary_namespace, key).ok();
145+
KVStoreSync::read(fs_store, primary_namespace, secondary_namespace, key).ok();
115146
assert_eq!(data_value, current_data);
116147

117-
let list =
118-
KVStoreSync::list(&fs_store, primary_namespace, secondary_namespace).unwrap();
148+
let list = KVStoreSync::list(fs_store, primary_namespace, secondary_namespace).unwrap();
119149
assert_eq!(list.is_empty(), current_data.is_none());
120150

121151
assert_eq!(0, fs_store.state_size());

0 commit comments

Comments
 (0)