11use alloc:: string:: ToString ;
22use core:: num:: NonZeroUsize ;
33
4- use super :: CompressionTable ;
4+ use super :: { CompressionTable , CompressionTableEntryState } ;
55use crate :: wire:: { CompressionTableEntry , CompressionTableKind , WireError } ;
66
77fn max ( value : usize ) -> Option < NonZeroUsize > {
@@ -117,6 +117,27 @@ fn stale_ack_is_ignored() {
117117 assert_eq ! ( table. latest_pending_generation( ) , Some ( generation) ) ;
118118}
119119
120+ #[ test]
121+ fn ack_clears_entries_not_present_in_acknowledged_generation ( ) {
122+ let mut table = CompressionTable :: new ( max ( 2 ) ) ;
123+ table. entries . push ( CompressionTableEntryState {
124+ id : 1 ,
125+ literal : "/user/a" . to_string ( ) ,
126+ hit_count : 2 ,
127+ advertised_generation : Some ( 1 ) ,
128+ acknowledged_generation : Some ( 1 ) ,
129+ } ) ;
130+ table. entries . push ( CompressionTableEntryState :: new ( 2 , "/user/b" . to_string ( ) ) ) ;
131+ table. entries [ 1 ] . hit_count = 1 ;
132+ table. entries [ 1 ] . advertised_generation = Some ( 2 ) ;
133+ table. latest_pending_generation = Some ( 2 ) ;
134+
135+ assert ! ( table. acknowledge( 2 ) ) ;
136+
137+ assert_eq ! ( table. encode( "/user/a" ) . as_literal( ) , Some ( "/user/a" ) ) ;
138+ assert_eq ! ( table. encode( "/user/b" ) . as_table_ref( ) , Some ( 2 ) ) ;
139+ }
140+
120141#[ test]
121142fn inbound_advertisement_resolves_entry_ids ( ) {
122143 let mut table = CompressionTable :: new ( max ( 4 ) ) ;
@@ -129,15 +150,15 @@ fn inbound_advertisement_resolves_entry_ids() {
129150}
130151
131152#[ test]
132- fn inbound_advertisement_rejects_entries_over_configured_max ( ) {
153+ fn inbound_advertisement_accepts_entries_over_local_advertisement_bound ( ) {
133154 let mut table = CompressionTable :: new ( max ( 1 ) ) ;
134155 let entries =
135156 [ CompressionTableEntry :: new ( 9 , "/user/a" . to_string ( ) ) , CompressionTableEntry :: new ( 10 , "/user/b" . to_string ( ) ) ] ;
136157
137- let err = table. apply_advertisement ( 7 , & entries) . unwrap_err ( ) ;
158+ assert_eq ! ( table. apply_advertisement( 7 , & entries) , Ok ( true ) ) ;
138159
139- assert_eq ! ( err , WireError :: InvalidFormat ) ;
140- assert ! ( table. is_empty ( ) ) ;
160+ assert_eq ! ( table . resolve ( 9 ) , Some ( "/user/a" ) ) ;
161+ assert_eq ! ( table. resolve ( 10 ) , Some ( "/user/b" ) ) ;
141162}
142163
143164#[ test]
0 commit comments