@@ -32,6 +32,7 @@ use crate::util::config::UserConfig;
32
32
use crate :: util:: enforcing_trait_impls:: { EnforcingSigner , EnforcementState } ;
33
33
use crate :: util:: logger:: { Logger , Level , Record } ;
34
34
use crate :: util:: ser:: { Readable , ReadableArgs , Writer , Writeable } ;
35
+ use crate :: util:: persist:: KVStore ;
35
36
36
37
use bitcoin:: EcdsaSighashType ;
37
38
use bitcoin:: blockdata:: constants:: ChainHash ;
@@ -56,7 +57,7 @@ use crate::prelude::*;
56
57
use core:: cell:: RefCell ;
57
58
use core:: ops:: DerefMut ;
58
59
use core:: time:: Duration ;
59
- use crate :: sync:: { Mutex , Arc } ;
60
+ use crate :: sync:: { Mutex , Arc , RwLock } ;
60
61
use core:: sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ;
61
62
use core:: mem;
62
63
use bitcoin:: bech32:: u5;
@@ -316,6 +317,96 @@ impl<Signer: sign::WriteableEcdsaChannelSigner> chainmonitor::Persist<Signer> fo
316
317
}
317
318
}
318
319
320
+ pub ( crate ) struct TestStore {
321
+ persisted_bytes : RwLock < HashMap < String , HashMap < String , Arc < RwLock < Vec < u8 > > > > > > ,
322
+ did_persist : Arc < AtomicBool > ,
323
+ }
324
+
325
+ impl TestStore {
326
+ pub fn new ( ) -> Self {
327
+ let persisted_bytes = RwLock :: new ( HashMap :: new ( ) ) ;
328
+ let did_persist = Arc :: new ( AtomicBool :: new ( false ) ) ;
329
+ Self { persisted_bytes, did_persist }
330
+ }
331
+
332
+ pub fn get_persisted_bytes ( & self , namespace : & str , key : & str ) -> Option < Vec < u8 > > {
333
+ if let Some ( outer_ref) = self . persisted_bytes . read ( ) . unwrap ( ) . get ( namespace) {
334
+ if let Some ( inner_ref) = outer_ref. get ( key) {
335
+ let locked = inner_ref. read ( ) . unwrap ( ) ;
336
+ return Some ( ( * locked) . clone ( ) ) ;
337
+ }
338
+ }
339
+ None
340
+ }
341
+
342
+ pub fn get_and_clear_did_persist ( & self ) -> bool {
343
+ self . did_persist . swap ( false , Ordering :: Relaxed )
344
+ }
345
+ }
346
+
347
+ impl KVStore for TestStore {
348
+ type Reader = TestReader ;
349
+
350
+ fn read ( & self , namespace : & str , key : & str ) -> io:: Result < Self :: Reader > {
351
+ if let Some ( outer_ref) = self . persisted_bytes . read ( ) . unwrap ( ) . get ( namespace) {
352
+ if let Some ( inner_ref) = outer_ref. get ( key) {
353
+ Ok ( TestReader :: new ( Arc :: clone ( inner_ref) ) )
354
+ } else {
355
+ Err ( io:: Error :: new ( io:: ErrorKind :: NotFound , "Key not found" ) )
356
+ }
357
+ } else {
358
+ Err ( io:: Error :: new ( io:: ErrorKind :: NotFound , "Namespace not found" ) )
359
+ }
360
+ }
361
+
362
+ fn write ( & self , namespace : & str , key : & str , buf : & [ u8 ] ) -> io:: Result < ( ) > {
363
+ let mut guard = self . persisted_bytes . write ( ) . unwrap ( ) ;
364
+ let outer_e = guard. entry ( namespace. to_string ( ) ) . or_insert ( HashMap :: new ( ) ) ;
365
+ let inner_e = outer_e. entry ( key. to_string ( ) ) . or_insert ( Arc :: new ( RwLock :: new ( Vec :: new ( ) ) ) ) ;
366
+
367
+ let mut guard = inner_e. write ( ) . unwrap ( ) ;
368
+ guard. write_all ( buf) ?;
369
+ self . did_persist . store ( true , Ordering :: SeqCst ) ;
370
+ Ok ( ( ) )
371
+ }
372
+
373
+ fn remove ( & self , namespace : & str , key : & str ) -> io:: Result < ( ) > {
374
+ match self . persisted_bytes . write ( ) . unwrap ( ) . entry ( namespace. to_string ( ) ) {
375
+ hash_map:: Entry :: Occupied ( mut e) => {
376
+ self . did_persist . store ( true , Ordering :: SeqCst ) ;
377
+ e. get_mut ( ) . remove ( & key. to_string ( ) ) ;
378
+ Ok ( ( ) )
379
+ }
380
+ hash_map:: Entry :: Vacant ( _) => Ok ( ( ) ) ,
381
+ }
382
+ }
383
+
384
+ fn list ( & self , namespace : & str ) -> io:: Result < Vec < String > > {
385
+ match self . persisted_bytes . write ( ) . unwrap ( ) . entry ( namespace. to_string ( ) ) {
386
+ hash_map:: Entry :: Occupied ( e) => Ok ( e. get ( ) . keys ( ) . cloned ( ) . collect ( ) ) ,
387
+ hash_map:: Entry :: Vacant ( _) => Ok ( Vec :: new ( ) ) ,
388
+ }
389
+ }
390
+ }
391
+
392
+ pub struct TestReader {
393
+ entry_ref : Arc < RwLock < Vec < u8 > > > ,
394
+ }
395
+
396
+ impl TestReader {
397
+ pub fn new ( entry_ref : Arc < RwLock < Vec < u8 > > > ) -> Self {
398
+ Self { entry_ref }
399
+ }
400
+ }
401
+
402
+ impl io:: Read for TestReader {
403
+ fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
404
+ let bytes = self . entry_ref . read ( ) . unwrap ( ) . clone ( ) ;
405
+ let mut reader = io:: Cursor :: new ( bytes) ;
406
+ reader. read ( buf)
407
+ }
408
+ }
409
+
319
410
pub struct TestBroadcaster {
320
411
pub txn_broadcasted : Mutex < Vec < Transaction > > ,
321
412
pub blocks : Arc < Mutex < Vec < ( Block , u32 ) > > > ,
0 commit comments