11use lightning:: util:: persist:: { KVStore , KVStoreSync } ;
22use lightning_persister:: fs_store:: FilesystemStore ;
3+ use std:: fs;
34use tokio:: runtime:: Runtime ;
5+ use uuid:: Uuid ;
46
57use 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
832fn 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