@@ -173,6 +173,16 @@ mod sealed {
173
173
( flags[ Self :: BYTE_OFFSET ] & ( Self :: REQUIRED_MASK | Self :: OPTIONAL_MASK ) ) != 0
174
174
}
175
175
176
+ /// Sets the feature's required (even) bit in the given flags.
177
+ #[ inline]
178
+ fn set_required_bit( flags: & mut Vec <u8 >) {
179
+ if flags. len( ) <= Self :: BYTE_OFFSET {
180
+ flags. resize( Self :: BYTE_OFFSET + 1 , 0u8 ) ;
181
+ }
182
+
183
+ flags[ Self :: BYTE_OFFSET ] |= Self :: REQUIRED_MASK ;
184
+ }
185
+
176
186
/// Sets the feature's optional (odd) bit in the given flags.
177
187
#[ inline]
178
188
fn set_optional_bit( flags: & mut Vec <u8 >) {
@@ -191,6 +201,10 @@ mod sealed {
191
201
flags[ Self :: BYTE_OFFSET ] &= !Self :: REQUIRED_MASK ;
192
202
flags[ Self :: BYTE_OFFSET ] &= !Self :: OPTIONAL_MASK ;
193
203
}
204
+
205
+ let last_non_zero_byte = flags. iter( ) . rposition( |& byte| byte != 0 ) ;
206
+ let size = if let Some ( offset) = last_non_zero_byte { offset + 1 } else { 0 } ;
207
+ flags. resize( size, 0u8 ) ;
194
208
}
195
209
}
196
210
@@ -219,6 +233,30 @@ mod sealed {
219
233
"Feature flags for `payment_secret`." ) ;
220
234
define_feature ! ( 17 , BasicMPP , [ InitContext , NodeContext ] ,
221
235
"Feature flags for `basic_mpp`." ) ;
236
+
237
+ #[ cfg( test) ]
238
+ define_context ! ( TestingContext {
239
+ required_features: [
240
+ // Byte 0
241
+ ,
242
+ // Byte 1
243
+ ,
244
+ // Byte 2
245
+ UnknownFeature ,
246
+ ] ,
247
+ optional_features: [
248
+ // Byte 0
249
+ ,
250
+ // Byte 1
251
+ ,
252
+ // Byte 2
253
+ ,
254
+ ] ,
255
+ } ) ;
256
+
257
+ #[ cfg( test) ]
258
+ define_feature ! ( 23 , UnknownFeature , [ TestingContext ] ,
259
+ "Feature flags for an unknown feature used in testing." ) ;
222
260
}
223
261
224
262
/// Tracks the set of features which a node implements, templated by the context in which it
@@ -375,23 +413,18 @@ impl<T: sealed::Context> Features<T> {
375
413
}
376
414
377
415
#[ cfg( test) ]
378
- pub ( crate ) fn set_require_unknown_bits ( & mut self ) {
379
- let newlen = cmp:: max ( 3 , self . flags . len ( ) ) ;
380
- self . flags . resize ( newlen, 0u8 ) ;
381
- self . flags [ 2 ] |= 0x40 ;
416
+ pub ( crate ) fn set_required_unknown_bits ( & mut self ) {
417
+ <sealed:: TestingContext as sealed:: UnknownFeature >:: set_required_bit ( & mut self . flags ) ;
382
418
}
383
419
384
420
#[ cfg( test) ]
385
- pub ( crate ) fn clear_require_unknown_bits ( & mut self ) {
386
- let newlen = cmp:: max ( 3 , self . flags . len ( ) ) ;
387
- self . flags . resize ( newlen, 0u8 ) ;
388
- self . flags [ 2 ] &= !0x40 ;
389
- if self . flags . len ( ) == 3 && self . flags [ 2 ] == 0 {
390
- self . flags . resize ( 2 , 0u8 ) ;
391
- }
392
- if self . flags . len ( ) == 2 && self . flags [ 1 ] == 0 {
393
- self . flags . resize ( 1 , 0u8 ) ;
394
- }
421
+ pub ( crate ) fn set_optional_unknown_bits ( & mut self ) {
422
+ <sealed:: TestingContext as sealed:: UnknownFeature >:: set_optional_bit ( & mut self . flags ) ;
423
+ }
424
+
425
+ #[ cfg( test) ]
426
+ pub ( crate ) fn clear_unknown_bits ( & mut self ) {
427
+ <sealed:: TestingContext as sealed:: UnknownFeature >:: clear_bits ( & mut self . flags ) ;
395
428
}
396
429
}
397
430
@@ -502,12 +535,22 @@ mod tests {
502
535
}
503
536
504
537
#[ test]
505
- fn sanity_test_unkown_bits_testing ( ) {
506
- let mut features = ChannelFeatures :: known ( ) ;
507
- features. set_require_unknown_bits ( ) ;
538
+ fn sanity_test_unknown_bits ( ) {
539
+ let mut features = ChannelFeatures :: empty ( ) ;
540
+ assert ! ( !features. requires_unknown_bits( ) ) ;
541
+ assert ! ( !features. supports_unknown_bits( ) ) ;
542
+
543
+ features. set_required_unknown_bits ( ) ;
508
544
assert ! ( features. requires_unknown_bits( ) ) ;
509
- features. clear_require_unknown_bits ( ) ;
545
+ assert ! ( features. supports_unknown_bits( ) ) ;
546
+
547
+ features. clear_unknown_bits ( ) ;
548
+ assert ! ( !features. requires_unknown_bits( ) ) ;
549
+ assert ! ( !features. supports_unknown_bits( ) ) ;
550
+
551
+ features. set_optional_unknown_bits ( ) ;
510
552
assert ! ( !features. requires_unknown_bits( ) ) ;
553
+ assert ! ( features. supports_unknown_bits( ) ) ;
511
554
}
512
555
513
556
#[ test]
0 commit comments