@@ -181,19 +181,12 @@ SUITE(compression_tests)
181
181
bool compressible)
182
182
{
183
183
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;
190
184
size_t i;
191
- size_t nn;
192
185
193
186
VERIFY_ARE_EQUAL (compressor->algorithm (), decompressor->algorithm ());
194
187
195
188
input_buffer.reserve (buffer_size);
196
- for (size_t i = 0 ; i < buffer_size; ++i)
189
+ for (i = 0 ; i < buffer_size; ++i)
197
190
{
198
191
uint8_t element;
199
192
if (compressible)
@@ -209,59 +202,52 @@ SUITE(compression_tests)
209
202
}
210
203
211
204
// 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 )
215
212
{
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
+ }
216
224
r = compressor
217
225
->compress (input_buffer.data () + i,
218
226
std::min (chunk_size, buffer_size - i),
219
227
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 )
222
230
.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 );
225
234
chunk_sizes.push_back (r.output_bytes_produced );
226
235
csize += r.output_bytes_produced ;
227
236
}
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 );
258
244
259
245
cmp_buffer.resize (csize); // actual
260
246
261
247
// 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 ;
265
251
for (std::vector<size_t >::iterator it = chunk_sizes.begin (); it != chunk_sizes.end (); ++it)
266
252
{
267
253
if (*it)
@@ -358,7 +344,8 @@ SUITE(compression_tests)
358
344
359
345
void compress_test (std::shared_ptr<compress_factory> cfactory, std::shared_ptr<decompress_factory> dfactory)
360
346
{
361
- size_t tuples[][2 ] = {{7999 , 8192 },
347
+ size_t tuples[][2 ] = {{3 , 1024 },
348
+ {7999 , 8192 },
362
349
{8192 , 8192 },
363
350
{16001 , 8192 },
364
351
{16384 , 8192 },
0 commit comments