@@ -181,19 +181,12 @@ SUITE(compression_tests)
181181 bool compressible)
182182 {
183183 std::vector<uint8_t > input_buffer;
184- std::vector<uint8_t > cmp_buffer;
185- std::vector<uint8_t > dcmp_buffer;
186- operation_result r;
187- std::vector<size_t > chunk_sizes;
188- size_t csize;
189- size_t dsize;
190184 size_t i;
191- size_t nn;
192185
193186 VERIFY_ARE_EQUAL (compressor->algorithm (), decompressor->algorithm ());
194187
195188 input_buffer.reserve (buffer_size);
196- for (size_t i = 0 ; i < buffer_size; ++i)
189+ for (i = 0 ; i < buffer_size; ++i)
197190 {
198191 uint8_t element;
199192 if (compressible)
@@ -209,59 +202,52 @@ SUITE(compression_tests)
209202 }
210203
211204 // compress in chunks
212- csize = 0 ;
213- cmp_buffer.resize (buffer_size); // pessimistic (or not, for non-compressible data)
214- for (i = 0 ; i < buffer_size; i += chunk_size)
205+ std::vector<size_t > chunk_sizes;
206+ std::vector<uint8_t > cmp_buffer (buffer_size);
207+ size_t cmpsize = buffer_size;
208+ size_t csize = 0 ;
209+ operation_result r = {0 };
210+ operation_hint hint = operation_hint::has_more;
211+ for (i = 0 ; i < buffer_size || csize == cmpsize || !r.done ; i += r.input_bytes_processed )
215212 {
213+ if (i == buffer_size)
214+ {
215+ // the entire input buffer has been consumed by the compressor
216+ hint = operation_hint::is_last;
217+ }
218+ if (csize == cmpsize)
219+ {
220+ // extend the output buffer if there may be more compressed bytes to retrieve
221+ cmpsize += std::min (chunk_size, (size_t )200 );
222+ cmp_buffer.resize (cmpsize);
223+ }
216224 r = compressor
217225 ->compress (input_buffer.data () + i,
218226 std::min (chunk_size, buffer_size - i),
219227 cmp_buffer.data () + csize,
220- std::min (chunk_size, buffer_size - csize),
221- operation_hint::has_more )
228+ std::min (chunk_size, cmpsize - csize),
229+ hint )
222230 .get ();
223- VERIFY_ARE_EQUAL (r.input_bytes_processed , std::min (chunk_size, buffer_size - i));
224- VERIFY_ARE_EQUAL (r.done , false );
231+ VERIFY_IS_TRUE (r.input_bytes_processed == std::min (chunk_size, buffer_size - i) ||
232+ r.output_bytes_produced == std::min (chunk_size, cmpsize - csize));
233+ VERIFY_IS_TRUE (hint == operation_hint::is_last || !r.done );
225234 chunk_sizes.push_back (r.output_bytes_produced );
226235 csize += r.output_bytes_produced ;
227236 }
228- if (i >= buffer_size)
229- {
230- size_t cmpsize = buffer_size;
231- do
232- {
233- if (csize == cmpsize)
234- {
235- // extend the output buffer if there may be more compressed bytes to retrieve
236- cmpsize += std::min (chunk_size, (size_t )200 );
237- cmp_buffer.resize (cmpsize);
238- }
239- r = compressor
240- ->compress (NULL ,
241- 0 ,
242- cmp_buffer.data () + csize,
243- std::min (chunk_size, cmpsize - csize),
244- operation_hint::is_last)
245- .get ();
246- VERIFY_ARE_EQUAL (r.input_bytes_processed , 0 );
247- chunk_sizes.push_back (r.output_bytes_produced );
248- csize += r.output_bytes_produced ;
249- } while (csize == cmpsize);
250- VERIFY_ARE_EQUAL (r.done , true );
251-
252- // once more with no input, to assure no error and done
253- r = compressor->compress (NULL , 0 , NULL , 0 , operation_hint::is_last).get ();
254- VERIFY_ARE_EQUAL (r.input_bytes_processed , 0 );
255- VERIFY_ARE_EQUAL (r.output_bytes_produced , 0 );
256- VERIFY_ARE_EQUAL (r.done , true );
257- }
237+ VERIFY_ARE_EQUAL (r.done , true );
238+
239+ // once more with no input or output, to assure no error and done
240+ r = compressor->compress (NULL , 0 , NULL , 0 , operation_hint::is_last).get ();
241+ VERIFY_ARE_EQUAL (r.input_bytes_processed , 0 );
242+ VERIFY_ARE_EQUAL (r.output_bytes_produced , 0 );
243+ VERIFY_ARE_EQUAL (r.done , true );
258244
259245 cmp_buffer.resize (csize); // actual
260246
261247 // decompress in as-compressed chunks
262- nn = 0 ;
263- dsize = 0 ;
264- dcmp_buffer. resize (buffer_size) ;
248+ std::vector< uint8_t > dcmp_buffer (buffer_size) ;
249+ size_t dsize = 0 ;
250+ size_t nn = 0 ;
265251 for (std::vector<size_t >::iterator it = chunk_sizes.begin (); it != chunk_sizes.end (); ++it)
266252 {
267253 if (*it)
@@ -358,7 +344,8 @@ SUITE(compression_tests)
358344
359345 void compress_test (std::shared_ptr<compress_factory> cfactory, std::shared_ptr<decompress_factory> dfactory)
360346 {
361- size_t tuples[][2 ] = {{7999 , 8192 },
347+ size_t tuples[][2 ] = {{3 , 1024 },
348+ {7999 , 8192 },
362349 {8192 , 8192 },
363350 {16001 , 8192 },
364351 {16384 , 8192 },
0 commit comments