@@ -173,6 +173,16 @@ mod sealed {
173173 ( flags[ Self :: BYTE_OFFSET ] & ( Self :: REQUIRED_MASK | Self :: OPTIONAL_MASK ) ) != 0
174174 }
175175
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+
176186 /// Sets the feature's optional (odd) bit in the given flags.
177187 #[ inline]
178188 fn set_optional_bit( flags: & mut Vec <u8 >) {
@@ -191,6 +201,10 @@ mod sealed {
191201 flags[ Self :: BYTE_OFFSET ] &= !Self :: REQUIRED_MASK ;
192202 flags[ Self :: BYTE_OFFSET ] &= !Self :: OPTIONAL_MASK ;
193203 }
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 ) ;
194208 }
195209 }
196210
@@ -219,6 +233,30 @@ mod sealed {
219233 "Feature flags for `payment_secret`." ) ;
220234 define_feature ! ( 17 , BasicMPP , [ InitContext , NodeContext ] ,
221235 "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." ) ;
222260}
223261
224262/// 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> {
375413 }
376414
377415 #[ 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 ) ;
382418 }
383419
384420 #[ 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 ) ;
395428 }
396429}
397430
@@ -502,12 +535,22 @@ mod tests {
502535 }
503536
504537 #[ 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 ( ) ;
508544 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 ( ) ;
510552 assert ! ( !features. requires_unknown_bits( ) ) ;
553+ assert ! ( features. supports_unknown_bits( ) ) ;
511554 }
512555
513556 #[ test]
0 commit comments