@@ -142,6 +142,85 @@ TEST(CacheChange, FragmentManagement)
142142 }
143143}
144144
145+ TEST (CacheChange, calculate_required_fragmented_payload_size)
146+ {
147+ struct TestCase
148+ {
149+ uint32_t payload_size;
150+ uint16_t fragment_size;
151+ bool expected_result;
152+ uint32_t expected_min_required_size;
153+ };
154+
155+ const std::vector<TestCase> test_cases =
156+ {
157+ // No fragmentation
158+ {100u , 0u , true , 100u },
159+ {50u , 100u , true , 50u },
160+ // Minimum fragment size
161+ {100u , 1u , false , 0u },
162+ {100u , 2u , false , 0u },
163+ {100u , 3u , false , 0u },
164+ // Fragmentation cases
165+ {100u , 20u , true , 100u },
166+ {101u , 20u , true , 104u },
167+ {102u , 20u , true , 104u },
168+ {103u , 20u , true , 104u },
169+ {50004u , 50003u , true , 50008u },
170+ {50003u , 50002u , true , 50008u },
171+ {50002u , 50001u , true , 50008u },
172+ {50001u , 50000u , true , 50004u },
173+ // Typical UDP max fragment size
174+ {1234567u , 64000u , true , 1234567u },
175+ {1234568u , 64000u , true , 1234568u },
176+ {1234569u , 64000u , true , 1234569u },
177+ {1234570u , 64000u , true , 1234570u },
178+ // Edge cases
179+ {5u , 4u , true , 8u },
180+ {6u , 4u , true , 8u },
181+ {7u , 4u , true , 8u },
182+ {8u , 4u , true , 8u },
183+ {
184+ std::numeric_limits<uint32_t >::max () - 4u - 3u ,
185+ std::numeric_limits<uint16_t >::max (),
186+ true ,
187+ std::numeric_limits<uint32_t >::max () - 4u - 3u
188+ },
189+ {
190+ std::numeric_limits<uint32_t >::max () - 4u - 3u ,
191+ 4u ,
192+ true ,
193+ std::numeric_limits<uint32_t >::max () - 4u - 3u
194+ }
195+ };
196+
197+ for (const auto & test_case : test_cases)
198+ {
199+ uint32_t min_required_size = 0 ;
200+ bool result = CacheChange_t::calculate_required_fragmented_payload_size (
201+ test_case.payload_size ,
202+ test_case.fragment_size ,
203+ min_required_size);
204+ EXPECT_EQ (result, test_case.expected_result )
205+ << " Failed for payload_size=" << test_case.payload_size
206+ << " , fragment_size=" << test_case.fragment_size ;
207+ if (result)
208+ {
209+ EXPECT_EQ (min_required_size, test_case.expected_min_required_size )
210+ << " Failed for payload_size=" << test_case.payload_size
211+ << " , fragment_size=" << test_case.fragment_size ;
212+ }
213+ }
214+
215+ // Oversized payload
216+ constexpr uint32_t MAX_PAYLOAD_SIZE = std::numeric_limits<uint32_t >::max () - 4u - 3u ;
217+ for (uint32_t payload_size = std::numeric_limits<uint32_t >::max (); payload_size > MAX_PAYLOAD_SIZE; --payload_size)
218+ {
219+ uint32_t min_required_size = 0 ;
220+ EXPECT_FALSE (CacheChange_t::calculate_required_fragmented_payload_size (payload_size, 20 , min_required_size));
221+ }
222+ }
223+
145224int main (
146225 int argc,
147226 char ** argv)
0 commit comments