1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 #include "gtest/gtest.h"
5 #include "rgw/rgw_compression.h"
7 struct MockGetDataCB
: public RGWGetDataCB
{
8 int handle_data(bufferlist
& bl
, off_t bl_ofs
, off_t bl_len
) override
{
13 using range_t
= std::pair
<off_t
, off_t
>;
15 // call filter->fixup_range() and return the range as a pair. this makes it easy
16 // to fit on a single line for ASSERT_EQ()
17 range_t
fixup_range(RGWGetObj_Decompress
*filter
, off_t ofs
, off_t end
)
19 filter
->fixup_range(ofs
, end
);
24 TEST(Decompress
, FixupRangePartial
)
26 RGWCompressionInfo cs_info
;
28 // array of blocks with original len=8, compressed to len=6
29 auto& blocks
= cs_info
.blocks
;
30 blocks
.emplace_back(compression_block
{0, 0, 6});
31 blocks
.emplace_back(compression_block
{8, 6, 6});
32 blocks
.emplace_back(compression_block
{16, 12, 6});
33 blocks
.emplace_back(compression_block
{24, 18, 6});
35 const bool partial
= true;
36 RGWGetObj_Decompress
decompress(g_ceph_context
, &cs_info
, partial
, &cb
);
38 // test translation from logical ranges to compressed ranges
39 ASSERT_EQ(range_t(0, 5), fixup_range(&decompress
, 0, 1));
40 ASSERT_EQ(range_t(0, 5), fixup_range(&decompress
, 1, 7));
41 ASSERT_EQ(range_t(0, 11), fixup_range(&decompress
, 7, 8));
42 ASSERT_EQ(range_t(0, 11), fixup_range(&decompress
, 0, 9));
43 ASSERT_EQ(range_t(0, 11), fixup_range(&decompress
, 7, 9));
44 ASSERT_EQ(range_t(6, 11), fixup_range(&decompress
, 8, 9));
45 ASSERT_EQ(range_t(6, 17), fixup_range(&decompress
, 8, 16));
46 ASSERT_EQ(range_t(6, 17), fixup_range(&decompress
, 8, 17));
47 ASSERT_EQ(range_t(12, 23), fixup_range(&decompress
, 16, 24));
48 ASSERT_EQ(range_t(12, 23), fixup_range(&decompress
, 16, 999));
49 ASSERT_EQ(range_t(18, 23), fixup_range(&decompress
, 998, 999));