@@ -3,7 +3,10 @@ use lightning::ln::functional_test_utils::{
33 connect_block, create_announced_chan_between_nodes, create_chanmon_cfgs, create_dummy_block,
44 create_network, create_node_cfgs, create_node_chanmgrs, send_payment,
55} ;
6- use lightning:: util:: persist:: { read_channel_monitors, KVStore , KVSTORE_NAMESPACE_KEY_MAX_LEN } ;
6+ use lightning:: util:: persist:: {
7+ migrate_kv_store_data, read_channel_monitors, KVStore , MigratableKVStore ,
8+ KVSTORE_NAMESPACE_KEY_ALPHABET , KVSTORE_NAMESPACE_KEY_MAX_LEN ,
9+ } ;
710use lightning:: util:: test_utils;
811use lightning:: { check_added_monitors, check_closed_broadcast, check_closed_event} ;
912
@@ -59,6 +62,41 @@ pub(crate) fn do_read_write_remove_list_persist<K: KVStore + RefUnwindSafe>(kv_s
5962 assert_eq ! ( listed_keys. len( ) , 0 ) ;
6063}
6164
65+ pub ( crate ) fn do_test_data_migration < S : MigratableKVStore , T : MigratableKVStore > (
66+ source_store : & mut S , target_store : & mut T ,
67+ ) {
68+ // We fill the source with some bogus keys.
69+ let dummy_data = [ 42u8 ; 32 ] ;
70+ let num_primary_namespaces = 2 ;
71+ let num_secondary_namespaces = 2 ;
72+ let num_keys = 3 ;
73+ for i in 0 ..num_primary_namespaces {
74+ let primary_namespace =
75+ format ! ( "testspace{}" , KVSTORE_NAMESPACE_KEY_ALPHABET . chars( ) . nth( i) . unwrap( ) ) ;
76+ for j in 0 ..num_secondary_namespaces {
77+ let secondary_namespace =
78+ format ! ( "testsubspace{}" , KVSTORE_NAMESPACE_KEY_ALPHABET . chars( ) . nth( j) . unwrap( ) ) ;
79+ for k in 0 ..num_keys {
80+ let key =
81+ format ! ( "testkey{}" , KVSTORE_NAMESPACE_KEY_ALPHABET . chars( ) . nth( k) . unwrap( ) ) ;
82+ source_store
83+ . write ( & primary_namespace, & secondary_namespace, & key, & dummy_data)
84+ . unwrap ( ) ;
85+ }
86+ }
87+ }
88+ let total_num_entries = num_primary_namespaces * num_secondary_namespaces * num_keys;
89+ let all_keys = source_store. list_all_keys ( ) . unwrap ( ) ;
90+ assert_eq ! ( all_keys. len( ) , total_num_entries) ;
91+
92+ migrate_kv_store_data ( source_store, target_store) . unwrap ( ) ;
93+
94+ assert_eq ! ( target_store. list_all_keys( ) . unwrap( ) . len( ) , total_num_entries) ;
95+ for ( p, s, k) in & all_keys {
96+ assert_eq ! ( target_store. read( p, s, k) . unwrap( ) , dummy_data) ;
97+ }
98+ }
99+
62100// Integration-test the given KVStore implementation. Test relaying a few payments and check that
63101// the persisted data is updated the appropriate number of times.
64102pub ( crate ) fn do_test_store < K : KVStore > ( store_0 : & K , store_1 : & K ) {
0 commit comments