@@ -138,10 +138,48 @@ pub struct RxMessage<'a, Handle: Copy> {
138138impl < ' a , Handle : Copy > RxMessage < ' a , Handle > {
139139 #[ inline]
140140 pub fn for_each < F : FnMut ( datagram:: Header < Handle > , & mut [ u8 ] ) > ( self , mut on_packet : F ) {
141- debug_assert_ne ! ( self . segment_size, 0 ) ;
141+ // `chunks_mut` doesn't know what to do with zero-sized segments so return early
142+ if self . segment_size == 0 {
143+ return ;
144+ }
142145
143146 for segment in self . payload . chunks_mut ( self . segment_size ) {
144147 on_packet ( self . header , segment) ;
145148 }
146149 }
147150}
151+
152+ #[ cfg( test) ]
153+ mod tests {
154+ use super :: * ;
155+ use bolero:: check;
156+
157+ #[ test]
158+ #[ cfg_attr( kani, kani:: proof, kani:: unwind( 17 ) , kani:: solver( cadical) ) ]
159+ fn rx_message_test ( ) {
160+ let path = bolero:: gen :: < path:: RemoteAddress > ( ) ;
161+ let ecn = bolero:: gen ( ) ;
162+ let segment_size = bolero:: gen ( ) ;
163+ let max_payload_len = if cfg ! ( kani) { 16 } else { u16:: MAX as usize } ;
164+ let payload_len = 0 ..=max_payload_len;
165+
166+ check ! ( )
167+ . with_generator ( ( path, ecn, segment_size, payload_len) )
168+ . cloned ( )
169+ . for_each ( |( path, ecn, segment_size, payload_len) | {
170+ let mut payload = vec ! [ 0u8 ; payload_len] ;
171+ let rx_message = RxMessage {
172+ header : datagram:: Header { path, ecn } ,
173+ segment_size,
174+ payload : & mut payload,
175+ } ;
176+
177+ rx_message. for_each ( |header, segment| {
178+ assert_eq ! ( header. path, path) ;
179+ assert_eq ! ( header. ecn, ecn) ;
180+ assert ! ( segment. len( ) <= payload_len) ;
181+ assert ! ( segment. len( ) <= segment_size) ;
182+ } )
183+ } )
184+ }
185+ }
0 commit comments