| 46 | class TestCompression : public KuduTest {}; |
| 47 | |
| 48 | static void TestCompressionCodec(CompressionType compression) { |
| 49 | constexpr int kInputSize = 64; |
| 50 | |
| 51 | const CompressionCodec* codec; |
| 52 | uint8_t ibuffer[kInputSize]; |
| 53 | uint8_t ubuffer[kInputSize]; |
| 54 | size_t compressed; |
| 55 | |
| 56 | // Fill the test input buffer |
| 57 | memset(ibuffer, 'Z', kInputSize); |
| 58 | |
| 59 | // Get the specified compression codec |
| 60 | ASSERT_OK(GetCompressionCodec(compression, &codec)); |
| 61 | |
| 62 | // Allocate the compression buffer |
| 63 | size_t max_compressed = codec->MaxCompressedLength(kInputSize); |
| 64 | ASSERT_LT(max_compressed, (kInputSize * 2)); |
| 65 | unique_ptr<uint8_t[]> cbuffer(new uint8_t[max_compressed]); |
| 66 | |
| 67 | // Compress and uncompress |
| 68 | ASSERT_OK(codec->Compress(Slice(ibuffer, kInputSize), cbuffer.get(), &compressed)); |
| 69 | ASSERT_OK(codec->Uncompress(Slice(cbuffer.get(), compressed), ubuffer, kInputSize)); |
| 70 | ASSERT_EQ(0, memcmp(ibuffer, ubuffer, kInputSize)); |
| 71 | |
| 72 | // Compress slices and uncompress |
| 73 | vector<Slice> islices; |
| 74 | constexpr int kStep = 7; |
| 75 | for (int i = 0; i < kInputSize; i += kStep) |
| 76 | islices.emplace_back(ibuffer + i, std::min(kStep, kInputSize - i)); |
| 77 | ASSERT_OK(codec->Compress(islices, cbuffer.get(), &compressed)); |
| 78 | ASSERT_OK(codec->Uncompress(Slice(cbuffer.get(), compressed), ubuffer, kInputSize)); |
| 79 | ASSERT_EQ(0, memcmp(ibuffer, ubuffer, kInputSize)); |
| 80 | } |
| 81 | |
| 82 | static void Benchmark(Random random, CompressionType compression) { |
| 83 | constexpr int kMaterialCount = 16; |
no test coverage detected