6
6
// accordance with one or both of these licenses.
7
7
8
8
use lightning:: ln:: functional_test_utils:: {
9
- check_closed_event , connect_block, create_announced_chan_between_nodes, create_chanmon_cfgs,
10
- create_dummy_block , create_network, create_node_cfgs, create_node_chanmgrs, send_payment,
9
+ connect_block, create_announced_chan_between_nodes, create_chanmon_cfgs, create_dummy_block ,
10
+ create_network, create_node_cfgs, create_node_chanmgrs, send_payment, TestChanMonCfg ,
11
11
} ;
12
12
use lightning:: util:: persist:: {
13
13
KVStore , MonitorName , MonitorUpdatingPersister ,
@@ -16,14 +16,23 @@ use lightning::util::persist::{
16
16
17
17
use lightning:: events:: ClosureReason ;
18
18
use lightning:: util:: test_utils;
19
- use lightning:: { check_added_monitors, check_closed_broadcast} ;
19
+ use lightning:: { check_added_monitors, check_closed_broadcast, check_closed_event } ;
20
20
21
21
use rand:: distributions:: Alphanumeric ;
22
22
use rand:: { thread_rng, Rng } ;
23
23
24
24
use std:: panic:: RefUnwindSafe ;
25
25
use std:: path:: PathBuf ;
26
26
27
+ type TestMonitorUpdatePersister < ' a , K > = MonitorUpdatingPersister <
28
+ & ' a K ,
29
+ & ' a test_utils:: TestLogger ,
30
+ & ' a test_utils:: TestKeysInterface ,
31
+ & ' a test_utils:: TestKeysInterface ,
32
+ & ' a test_utils:: TestBroadcaster ,
33
+ & ' a test_utils:: TestFeeEstimator ,
34
+ > ;
35
+
27
36
const EXPECTED_UPDATES_PER_PAYMENT : u64 = 5 ;
28
37
29
38
pub ( crate ) fn random_storage_path ( ) -> PathBuf {
@@ -83,6 +92,35 @@ pub(crate) fn do_read_write_remove_list_persist<K: KVStore + RefUnwindSafe>(kv_s
83
92
assert_eq ! ( listed_keys. len( ) , 0 ) ;
84
93
}
85
94
95
+ pub ( crate ) fn create_persister < ' a , K : KVStore > (
96
+ store : & ' a K , chanmon_cfg : & ' a TestChanMonCfg , max_pending_updates : u64 ,
97
+ ) -> TestMonitorUpdatePersister < ' a , K > {
98
+ let persister: TestMonitorUpdatePersister < ' a , K > = MonitorUpdatingPersister :: new (
99
+ store,
100
+ & chanmon_cfg. logger ,
101
+ max_pending_updates,
102
+ & chanmon_cfg. keys_manager ,
103
+ & chanmon_cfg. keys_manager ,
104
+ & chanmon_cfg. tx_broadcaster ,
105
+ & chanmon_cfg. fee_estimator ,
106
+ ) ;
107
+ return persister;
108
+ }
109
+
110
+ pub ( crate ) fn create_chain_monitor < ' a , K : KVStore > (
111
+ chanmon_cfg : & ' a TestChanMonCfg , persister : & ' a TestMonitorUpdatePersister < ' a , K > ,
112
+ ) -> test_utils:: TestChainMonitor < ' a > {
113
+ let chain_mon = test_utils:: TestChainMonitor :: new (
114
+ Some ( & chanmon_cfg. chain_source ) ,
115
+ & chanmon_cfg. tx_broadcaster ,
116
+ & chanmon_cfg. logger ,
117
+ & chanmon_cfg. fee_estimator ,
118
+ persister,
119
+ & chanmon_cfg. keys_manager ,
120
+ ) ;
121
+ return chain_mon;
122
+ }
123
+
86
124
// Integration-test the given KVStore implementation. Test relaying a few payments and check that
87
125
// the persisted data is updated the appropriate number of times.
88
126
pub ( crate ) fn do_test_store < K : KVStore > ( store_0 : & K , store_1 : & K ) {
@@ -93,46 +131,13 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
93
131
94
132
let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
95
133
96
- let persister_0 = MonitorUpdatingPersister :: new (
97
- store_0,
98
- & chanmon_cfgs[ 0 ] . logger ,
99
- persister_0_max_pending_updates,
100
- & chanmon_cfgs[ 0 ] . keys_manager ,
101
- & chanmon_cfgs[ 0 ] . keys_manager ,
102
- & chanmon_cfgs[ 0 ] . tx_broadcaster ,
103
- & chanmon_cfgs[ 0 ] . fee_estimator ,
104
- ) ;
134
+ let persister_0 = create_persister ( store_0, & chanmon_cfgs[ 0 ] , persister_0_max_pending_updates) ;
135
+ let persister_1 = create_persister ( store_1, & chanmon_cfgs[ 1 ] , persister_1_max_pending_updates) ;
105
136
106
- let persister_1 = MonitorUpdatingPersister :: new (
107
- store_1,
108
- & chanmon_cfgs[ 1 ] . logger ,
109
- persister_1_max_pending_updates,
110
- & chanmon_cfgs[ 1 ] . keys_manager ,
111
- & chanmon_cfgs[ 1 ] . keys_manager ,
112
- & chanmon_cfgs[ 1 ] . tx_broadcaster ,
113
- & chanmon_cfgs[ 1 ] . fee_estimator ,
114
- ) ;
137
+ let chain_mon_0 = create_chain_monitor ( & chanmon_cfgs[ 0 ] , & persister_0) ;
138
+ let chain_mon_1 = create_chain_monitor ( & chanmon_cfgs[ 1 ] , & persister_1) ;
115
139
116
140
let mut node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
117
-
118
- let chain_mon_0 = test_utils:: TestChainMonitor :: new (
119
- Some ( & chanmon_cfgs[ 0 ] . chain_source ) ,
120
- & chanmon_cfgs[ 0 ] . tx_broadcaster ,
121
- & chanmon_cfgs[ 0 ] . logger ,
122
- & chanmon_cfgs[ 0 ] . fee_estimator ,
123
- & persister_0,
124
- & chanmon_cfgs[ 0 ] . keys_manager ,
125
- ) ;
126
-
127
- let chain_mon_1 = test_utils:: TestChainMonitor :: new (
128
- Some ( & chanmon_cfgs[ 1 ] . chain_source ) ,
129
- & chanmon_cfgs[ 1 ] . tx_broadcaster ,
130
- & chanmon_cfgs[ 1 ] . logger ,
131
- & chanmon_cfgs[ 1 ] . fee_estimator ,
132
- & persister_1,
133
- & chanmon_cfgs[ 1 ] . keys_manager ,
134
- ) ;
135
-
136
141
node_cfgs[ 0 ] . chain_monitor = chain_mon_0;
137
142
node_cfgs[ 1 ] . chain_monitor = chain_mon_1;
138
143
let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
@@ -155,14 +160,15 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
155
160
assert_eq!( mon. get_latest_update_id( ) , $expected_update_id) ;
156
161
157
162
let monitor_name = MonitorName :: from( mon. get_funding_txo( ) . 0 ) ;
163
+ let store_0_updates = store_0
164
+ . list(
165
+ CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE ,
166
+ monitor_name. as_str( ) ,
167
+ )
168
+ . unwrap( )
169
+ . len( ) as u64 ;
158
170
assert_eq!(
159
- store_0
160
- . list(
161
- CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE ,
162
- monitor_name. as_str( )
163
- )
164
- . unwrap( )
165
- . len( ) as u64 ,
171
+ store_0_updates,
166
172
mon. get_latest_update_id( ) % persister_0_max_pending_updates,
167
173
"Wrong number of updates stored in persister 0" ,
168
174
) ;
@@ -173,14 +179,15 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
173
179
assert_eq!( mon. get_latest_update_id( ) , $expected_update_id) ;
174
180
175
181
let monitor_name = MonitorName :: from( mon. get_funding_txo( ) . 0 ) ;
182
+ let store_1_updates = store_1
183
+ . list(
184
+ CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE ,
185
+ monitor_name. as_str( ) ,
186
+ )
187
+ . unwrap( )
188
+ . len( ) as u64 ;
176
189
assert_eq!(
177
- store_1
178
- . list(
179
- CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE ,
180
- monitor_name. as_str( )
181
- )
182
- . unwrap( )
183
- . len( ) as u64 ,
190
+ store_1_updates,
184
191
mon. get_latest_update_id( ) % persister_1_max_pending_updates,
185
192
"Wrong number of updates stored in persister 1" ,
186
193
) ;
@@ -193,9 +200,11 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
193
200
check_persisted_data ! ( 0 ) ;
194
201
195
202
// Send a few payments and make sure the monitors are updated to the latest.
196
- send_payment ( & nodes[ 0 ] , & vec ! [ & nodes[ 1 ] ] [ ..] , 8_000_000 ) ;
203
+ let expected_route = & [ & nodes[ 1 ] ] [ ..] ;
204
+ send_payment ( & nodes[ 0 ] , expected_route, 8_000_000 ) ;
197
205
check_persisted_data ! ( EXPECTED_UPDATES_PER_PAYMENT ) ;
198
- send_payment ( & nodes[ 1 ] , & vec ! [ & nodes[ 0 ] ] [ ..] , 4_000_000 ) ;
206
+ let expected_route = & [ & nodes[ 0 ] ] [ ..] ;
207
+ send_payment ( & nodes[ 1 ] , expected_route, 4_000_000 ) ;
199
208
check_persisted_data ! ( 2 * EXPECTED_UPDATES_PER_PAYMENT ) ;
200
209
201
210
// Send a few more payments to try all the alignments of max pending updates with
@@ -210,7 +219,8 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
210
219
sender = 0 ;
211
220
receiver = 1 ;
212
221
}
213
- send_payment ( & nodes[ sender] , & vec ! [ & nodes[ receiver] ] [ ..] , 21_000 ) ;
222
+ let expected_route = & [ & nodes[ receiver] ] [ ..] ;
223
+ send_payment ( & nodes[ sender] , expected_route, 21_000 ) ;
214
224
check_persisted_data ! ( i * EXPECTED_UPDATES_PER_PAYMENT ) ;
215
225
}
216
226
@@ -223,7 +233,7 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
223
233
nodes[ 0 ] . node . force_close_broadcasting_latest_txn ( & chan_id, & node_id_1, err_msg) . unwrap ( ) ;
224
234
225
235
let reason = ClosureReason :: HolderForceClosed { broadcasted_latest_txn : Some ( true ) } ;
226
- check_closed_event ( & nodes[ 0 ] , 1 , reason, false , & [ node_id_1] , 100000 ) ;
236
+ check_closed_event ! ( nodes[ 0 ] , 1 , reason, false , [ node_id_1] , 100000 ) ;
227
237
check_closed_broadcast ! ( nodes[ 0 ] , true ) ;
228
238
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
229
239
@@ -236,7 +246,7 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
236
246
check_closed_broadcast ! ( nodes[ 1 ] , true ) ;
237
247
let reason = ClosureReason :: CommitmentTxConfirmed ;
238
248
let node_id_0 = nodes[ 0 ] . node . get_our_node_id ( ) ;
239
- check_closed_event ( & nodes[ 1 ] , 1 , reason, false , & [ node_id_0] , 100000 ) ;
249
+ check_closed_event ! ( nodes[ 1 ] , 1 , reason, false , [ node_id_0] , 100000 ) ;
240
250
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
241
251
242
252
// Make sure everything is persisted as expected after close.
0 commit comments