| 175 | // Check the streaming decompressor against one-shot compression |
| 176 | |
| 177 | void CheckStreamingDecompressor(Codec* codec, const std::vector<uint8_t>& data) { |
| 178 | // Create compressed data |
| 179 | int64_t max_compressed_len = codec->MaxCompressedLen(data.size(), data.data()); |
| 180 | std::vector<uint8_t> compressed(max_compressed_len); |
| 181 | int64_t compressed_size; |
| 182 | ASSERT_OK_AND_ASSIGN( |
| 183 | compressed_size, |
| 184 | codec->Compress(data.size(), data.data(), max_compressed_len, compressed.data())); |
| 185 | compressed.resize(compressed_size); |
| 186 | |
| 187 | // Run streaming decompression |
| 188 | std::shared_ptr<Decompressor> decompressor; |
| 189 | ASSERT_OK_AND_ASSIGN(decompressor, codec->MakeDecompressor()); |
| 190 | |
| 191 | std::vector<uint8_t> decompressed; |
| 192 | int64_t decompressed_size = 0; |
| 193 | const uint8_t* input = compressed.data(); |
| 194 | int64_t remaining = compressed.size(); |
| 195 | |
| 196 | decompressed.resize(10); |
| 197 | while (!decompressor->IsFinished()) { |
| 198 | // Feed a small amount each time |
| 199 | int64_t input_len = std::min(remaining, static_cast<int64_t>(23)); |
| 200 | int64_t output_len = decompressed.size() - decompressed_size; |
| 201 | uint8_t* output = decompressed.data() + decompressed_size; |
| 202 | ASSERT_OK_AND_ASSIGN(auto result, |
| 203 | decompressor->Decompress(input_len, input, output_len, output)); |
| 204 | ASSERT_LE(result.bytes_read, input_len); |
| 205 | ASSERT_LE(result.bytes_written, output_len); |
| 206 | ASSERT_TRUE(result.need_more_output || result.bytes_written > 0 || |
| 207 | result.bytes_read > 0) |
| 208 | << "Decompression not progressing anymore"; |
| 209 | if (result.need_more_output) { |
| 210 | decompressed.resize(decompressed.capacity() * 2); |
| 211 | } |
| 212 | decompressed_size += result.bytes_written; |
| 213 | input += result.bytes_read; |
| 214 | remaining -= result.bytes_read; |
| 215 | } |
| 216 | ASSERT_TRUE(decompressor->IsFinished()); |
| 217 | ASSERT_EQ(remaining, 0); |
| 218 | |
| 219 | // Check the decompressed data |
| 220 | decompressed.resize(decompressed_size); |
| 221 | ASSERT_EQ(data.size(), decompressed_size); |
| 222 | ASSERT_EQ(data, decompressed); |
| 223 | } |
| 224 | |
| 225 | // Check the streaming compressor and decompressor together |
| 226 |
no test coverage detected