Skip to content

Commit 8d4f612

Browse files
committed
Add snappy decompression
1 parent 94da877 commit 8d4f612

10 files changed

Lines changed: 211 additions & 354 deletions

File tree

dissect/util/compression/snappy.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# References:
2+
# - https://github.com/google/snappy/blob/main/format_description.txt
3+
from __future__ import annotations
4+
5+
import io
6+
import struct
7+
from typing import BinaryIO
8+
9+
_H = struct.Struct("<H")
10+
_I = struct.Struct("<I")
11+
12+
13+
def varint(src: BinaryIO) -> int:
14+
result = 0
15+
shift = 0
16+
17+
while byte := src.read(1):
18+
value = byte[0]
19+
if value < 0x80:
20+
return result | (value << shift)
21+
result |= (value & 0x7F) << shift
22+
shift += 7
23+
24+
raise EOFError("Unexpected EOF while reading varint")
25+
26+
27+
def decompress(src: bytes | BinaryIO) -> bytes:
28+
"""Snappy decompress from a file-like object or bytes.
29+
30+
Decompresses until the stored uncompressed length in the preamble.
31+
32+
Args:
33+
src: File-like object or bytes to decompress.
34+
35+
Returns:
36+
The decompressed data.
37+
"""
38+
if not hasattr(src, "read"):
39+
src = io.BytesIO(src)
40+
41+
dst = bytearray()
42+
43+
uncompressed_length = varint(src)
44+
45+
while len(dst) < uncompressed_length:
46+
tag = src.read(1)[0]
47+
tag_type = tag & 0b11
48+
49+
match tag_type:
50+
case 0:
51+
# Literal
52+
length = tag >> 2
53+
if length < 60:
54+
length += 1
55+
else:
56+
length = int.from_bytes(src.read(length - 59), "little") + 1
57+
58+
dst.extend(src.read(length))
59+
60+
case 1 | 2 | 3:
61+
# Copy with 1, 2 or 4 byte offset
62+
if tag_type == 1:
63+
length = ((tag >> 2) & 0b111) + 4
64+
offset = ((tag & 0b11100000) << 8) | src.read(1)[0]
65+
elif tag_type == 2:
66+
length = (tag >> 2) + 1
67+
offset = _H.unpack(src.read(2))[0]
68+
else:
69+
length = (tag >> 2) + 1
70+
offset = _I.unpack(src.read(4))[0]
71+
72+
remaining = length
73+
while remaining > 0:
74+
match = min(remaining, offset)
75+
dst += dst[-offset : (-offset + match) or None]
76+
remaining -= match
77+
78+
return bytes(dst)

tests/compression/test_lz4.py

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from pytest_benchmark.fixture import BenchmarkFixture
1212

1313

14-
@pytest.mark.parametrize(
14+
PARAMS = (
1515
("data", "digest"),
1616
[
1717
pytest.param(
@@ -41,37 +41,14 @@
4141
),
4242
],
4343
)
44-
def test_lz4_decompress(lz4: ModuleType, data: str, digest: str) -> None:
45-
assert hashlib.sha256(lz4.decompress(bytes.fromhex(data))).hexdigest() == digest
4644

4745

48-
@pytest.mark.benchmark
49-
def test_benchmark_lz4_decompress(lz4: ModuleType, benchmark: BenchmarkFixture) -> None:
50-
buf = bytes.fromhex("ff0c4c5a3420636f6d7072657373696f6e207465737420737472696e671b00db507472696e67")
51-
assert benchmark(lz4.decompress, buf) == b"LZ4 compression test string" * 10
46+
@pytest.mark.parametrize(*PARAMS)
47+
def test_lz4_decompress(lz4: ModuleType, data: str, digest: str) -> None:
48+
assert hashlib.sha256(lz4.decompress(bytes.fromhex(data))).hexdigest() == digest
5249

5350

5451
@pytest.mark.benchmark
55-
def test_benchmark_large_lz4_decompress(lz4: ModuleType, benchmark: BenchmarkFixture) -> None:
56-
buf = bytes.fromhex(
57-
"ffffa94c6f72656d20697073756d20646f6c6f722073697420616d657420636f"
58-
"6e73656374657475722061646970697363696e6720656c69742e205175697371"
59-
"75652066617563696275732065782073617069656e2076697461652070656c6c"
60-
"656e7465737175652073656d20706c6163657261742e20496e20696420637572"
61-
"737573206d69207072657469756d2074656c6c7573206475697320636f6e7661"
62-
"6c6c69732e2054656d707573206c656f2065752061656e65616e207365642064"
63-
"69616d2075726e612074656d706f722e2050756c76696e617220766976616d75"
64-
"73206672696e67696c6c61206c61637573206e6563206d657475732062696265"
65-
"6e64756d20656765737461732e20496163756c6973206d61737361206e69736c"
66-
"206d616c657375616461206c6163696e696120696e7465676572206e756e6320"
67-
"706f73756572652e2055742068656e6472657269742073656d7065722076656c"
68-
"20636c61737320617074656e742074616369746920736f63696f7371752e2041"
69-
"64206c69746f726120746f727175656e742070657220636f6e75626961206e6f"
70-
"7374726120696e636570746f732068696d656e61656f732e0a0ab701ffffffff"
71-
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
72-
"ffffffffffffffffffffffffffffffffff4550656f732e0a"
73-
)
74-
assert (
75-
hashlib.sha256(benchmark(lz4.decompress, buf)).hexdigest()
76-
== "73d3dd96ca2e2f0144a117019256d770ee7c6febeaee09b24956c723ae22b529"
77-
)
52+
@pytest.mark.parametrize(*PARAMS)
53+
def test_benchmark_lz4_decompress(lz4: ModuleType, data: str, digest: str, benchmark: BenchmarkFixture) -> None:
54+
assert hashlib.sha256(benchmark(lz4.decompress, bytes.fromhex(data))).hexdigest() == digest

tests/compression/test_lzbitmap.py

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from pytest_benchmark.fixture import BenchmarkFixture
1212

1313

14-
@pytest.mark.parametrize(
14+
PARAMS = (
1515
("data", "digest"),
1616
[
1717
pytest.param(
@@ -49,41 +49,14 @@
4949
),
5050
],
5151
)
52-
def test_lzbitmap_decompress(data: str, digest: str) -> None:
53-
assert hashlib.sha256(lzbitmap.decompress(bytes.fromhex(data))).hexdigest() == digest
5452

5553

56-
@pytest.mark.benchmark
57-
def test_benchmark_lzbitmap_decompress(benchmark: BenchmarkFixture) -> None:
58-
buf = bytes.fromhex(
59-
"5a424d092d0000a0000018000018000018000061616161616161617835ef"
60-
"340f0000f10f00000000000000000000000000060000000000",
61-
)
62-
assert benchmark(lzbitmap.decompress, buf) == b"a" * 158 + b"xa"
54+
@pytest.mark.parametrize(*PARAMS)
55+
def test_lzbitmap_decompress(data: str, digest: str) -> None:
56+
assert hashlib.sha256(lzbitmap.decompress(bytes.fromhex(data))).hexdigest() == digest
6357

6458

6559
@pytest.mark.benchmark
66-
def test_benchmark_large_lzbitmap_decompress(benchmark: BenchmarkFixture) -> None:
67-
buf = bytes.fromhex(
68-
"5a424d09d80100df36002301005001007601004c6f72656d20697073756d"
69-
"20646f6c6f722073742061657420636e7365636574757220616469706973"
70-
"696e67656c69742e517573716566617563627520657820736170656e7661"
71-
"6570656c6c6e6573656d6c61637261496e20696475727573206d69707269"
72-
"74656c757364206f76616c7354656d7075206c656f7561656e6561646469"
73-
"6d206e2074656d706f72506c6e7276697675736672696c61206c636e636d"
74-
"657473626962656e64756d67657461732e496c696d6173206e6c6d616c75"
75-
"64616c696e616e746567726e6e63707365722e5574206864726572697473"
76-
"6d7072766c637373207074656e74747469736f6f73712e41646c696f7261"
77-
"6f7175657465727562696f74726370746f686d6f732e0a0a4c0d2c341b41"
78-
"3e26113c5f6e805b6b7c65529d967ec4b310edb922ca7b1deca5faf4434a"
79-
"fbfa52fb8272b2ffb7016f7fcbc1b9f1373af99e3eb4e94fa9b3bafe39d3"
80-
"6959add6f36b55eecdb59d2ec3d1d029fc0055a9cbed016111718114103f"
81-
"480147110116011040f125f3ffffffffffffffffffffffffffffffffffff"
82-
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
83-
"ffffffffffffffff1f002cf68f57d9c576d73bfd7cd3d756000006000000"
84-
"0000",
85-
)
86-
assert (
87-
hashlib.sha256(benchmark(lzbitmap.decompress, buf)).hexdigest()
88-
== "73d3dd96ca2e2f0144a117019256d770ee7c6febeaee09b24956c723ae22b529"
89-
)
60+
@pytest.mark.parametrize(*PARAMS)
61+
def test_benchmark_lzbitmap_decompress(data: str, digest: str, benchmark: BenchmarkFixture) -> None:
62+
assert hashlib.sha256(benchmark(lzbitmap.decompress, bytes.fromhex(data))).hexdigest() == digest

tests/compression/test_lzfse.py

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from pytest_benchmark.fixture import BenchmarkFixture
1212

1313

14-
@pytest.mark.parametrize(
14+
PARAMS = (
1515
("data", "digest"),
1616
[
1717
pytest.param(
@@ -40,36 +40,14 @@
4040
),
4141
],
4242
)
43-
def test_lzfse_decompress(data: str, digest: str) -> None:
44-
assert hashlib.sha256(lzfse.decompress(bytes.fromhex(data))).hexdigest() == digest
4543

4644

47-
@pytest.mark.benchmark
48-
def test_benchmark_lzfse_decompress(benchmark: BenchmarkFixture) -> None:
49-
buf = bytes.fromhex("6276786e2c01000013000000c803616263f0fff005e163060000000000000062767824")
50-
assert benchmark(lzfse.decompress, buf) == b"abc" * 100
45+
@pytest.mark.parametrize(*PARAMS)
46+
def test_lzfse_decompress(data: str, digest: str) -> None:
47+
assert hashlib.sha256(lzfse.decompress(bytes.fromhex(data))).hexdigest() == digest
5148

5249

5350
@pytest.mark.benchmark
54-
def test_benchmark_large_lzfse_decompress(benchmark: BenchmarkFixture) -> None:
55-
buf = bytes.fromhex(
56-
"62767832df360000a401200e000d0030b92c8bef56220070a50000003984"
57-
"70085f00b0000000383e59c0f1090000005fc027710c0000fc031c1f03c7"
58-
"700cc70000000000000000006c00003600000000005f07000000e7000000"
59-
"00100060418004120000e06338f9061e8067629dacdf013e836fe041f807"
60-
"be80fd14fc0e3fc29f704700000000000000000000000000000000000000"
61-
"000000000000000000000000000000000000101288d24318d9f446277ac6"
62-
"885a4b5dea360854e4c4616262d667f9f1ff53187e598fe2f5ddf7b768f4"
63-
"bcc1f6441b9e55e0d1be84b4b91544337f11c4d0d615068c79817f5d19f2"
64-
"09c83975cf9669b7f3d1024d9cc795e8ac449090696a7660585fac1a891c"
65-
"40557bb46c1b62a35ab2608d574e82ba9f3956d0f811370c78d69b24240f"
66-
"fd80ec4eccb6dc1e7f1c6f2f276a71e9c73183844c3dce83088eeed6c77c"
67-
"3e35316f414db430fcd2e22d0c07998d601addd5907f852df080386fe69e"
68-
"b78675198704b4bf5361caaf482e9333c6de0d46fbf87b4387fc6ac57116"
69-
"0300000000000000000066b7fffffff3fffa3ff7ff1fd2273e1f85c5f04f"
70-
"0f4945ab8462767824"
71-
)
72-
assert (
73-
hashlib.sha256(benchmark(lzfse.decompress, buf)).hexdigest()
74-
== "73d3dd96ca2e2f0144a117019256d770ee7c6febeaee09b24956c723ae22b529"
75-
)
51+
@pytest.mark.parametrize(*PARAMS)
52+
def test_benchmark_lzfse_decompress(data: str, digest: str, benchmark: BenchmarkFixture) -> None:
53+
assert hashlib.sha256(benchmark(lzfse.decompress, bytes.fromhex(data))).hexdigest() == digest

tests/compression/test_lznt1.py

Lines changed: 7 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from pytest_benchmark.fixture import BenchmarkFixture
1212

1313

14-
@pytest.mark.parametrize(
14+
PARAMS = (
1515
("data", "digest"),
1616
[
1717
pytest.param(
@@ -130,131 +130,14 @@
130130
),
131131
],
132132
)
133-
def test_lznt1_decompress(data: str, digest: str) -> None:
134-
assert hashlib.sha256(lznt1.decompress(bytes.fromhex(data)).rstrip(b"\x00")).hexdigest() == digest
135133

136134

137-
@pytest.mark.benchmark
138-
def test_benchmark_lznt1_decompress(benchmark: BenchmarkFixture) -> None:
139-
buf = bytes.fromhex(
140-
"38b08846232000204720410010a24701a045204400084501507900c045200524"
141-
"138805b4024a44ef0358028c091601484500be009e000401189000"
142-
)
143-
assert benchmark(lznt1.decompress, buf) == (
144-
b"F# F# G A A G F# E D D E F# F# E E F# F# G A A "
145-
b"G F# E D D E F# E D D E E F# D E F# G F# D E F# "
146-
b"G F# E D E A F# F# G A A G F# E D D E F# E D D\x00"
147-
)
135+
@pytest.mark.parametrize(*PARAMS)
136+
def test_lznt1_decompress(data: str, digest: str) -> None:
137+
assert hashlib.sha256(lznt1.decompress(bytes.fromhex(data)).rstrip(b"\x00")).hexdigest() == digest
148138

149139

150140
@pytest.mark.benchmark
151-
def test_benchmark_large_lznt1_decompress(benchmark: BenchmarkFixture) -> None:
152-
buf = bytes.fromhex(
153-
"36b3004c6f72656d2069700073756d20646f6c6f00722073697420616d006574"
154-
"20636f6e736500637465747572206100646970697363696e006720656c69742e"
155-
"2000517569737175652000666175636962757300206578207361706900656e20"
156-
"7669746165002070656c6c656e740a65024a7300c6706c616308657261007649"
157-
"6e206940642063757273006e6d8069207072657469007f36740032001164005a"
158-
"017c7661006c6c69732e205465046d7000166c656f206500752061656e65616e"
159-
"002073656420646961006d2075726e6120740100226f722e2050756c2076696e"
160-
"617200837661126d0034667200b2696c6c0c6120007d000f6e6563200300db00"
161-
"09626962656e64810075656765737461803310496163750038206d6100737361"
162-
"206e69736c8100056c6573756164021f40696e69612069006967006572206e75"
163-
"6e632000706f73756572652e202055742068802672651672009e007670801076"
164-
"656c0820636c802520617074018084207461636974694020736f63696f808a2e"
165-
"902041642080a56f72805fa46f7200a66e74809a72017d84756200356e6f7374"
166-
"800d00696e636570746f73002068696d656e6165e06f732e0a0a7fdbbf6dbf6d"
167-
"fbbf6dbf6d758176c17b80cbbf6d7fdbb3c0e47fdb7320bf6dbf6d20bf6dce73"
168-
"bf6dbf6dbf6d7175bf6dbf6def9fa49fa49fa49fa46cc0979fa49fa43c76699f"
169-
"a49fa49fa49fa47373f99fa420749fa49fa47fdb7fdb7fdbff7fdb7fdb7fdb7f"
170-
"db7fdb7fdbbf6de0757fbf6dbf6dbf6dbf6dbf6dbf6d2f8965fe742f896f1b2f"
171-
"892f892f89b0352f89f7df362f892f89702f89d0052f892f89ff2f892f89118d"
172-
"2f892f892f89df362f89ffdf362f89df369fa49fa49fa49fa49fa4ff9fa49fa4"
173-
"2f899fa49fa49fa46f1b6f1bf9bf6d6d20df369fa49fa49fa49fa4fb9fa49fa4"
174-
"69f0519fa42f899fa40fc03f0fc00fc0b0150fc00fc00fc02e207f0fc00fc0e0"
175-
"940fc00fc00fc00fc067ff0fc0001d0fc00fc0bf6d0fc00fc0f097ff2f89c0bd"
176-
"0fc00fc081039fa40fc00fc0ff7fdb4f524f524f524f524f52e0134f52df4f52"
177-
"4f524f524f527fdb73df36df36cfb01a4f524f527fdb6e647fdb7fdbfb7fdb7f"
178-
"db6edf36df36df36df36df363fdf369fa490c8df36df36eaf635b30073206475"
179-
"69732063006f6e76616c6c6973002e2054656d70757300206c656f2065752000"
180-
"61656e65616e2073006564206469616d204075726e61207400886f00722e2050"
181-
"756c7669006e61722076697661026d00686672696e6769806c6c61206c616300"
182-
"1e806e6563206d6574001200626962656e64756d802065676573746100ce0649"
183-
"004200e0206d6173734061206e69736c000a6c206573756164023e696e406961"
184-
"20696e7400307200206e756e6320706f0073756572652e205508742068004d72"
185-
"6572692274009a6d70650082656c0820636c004b2061707400656e7420746163"
186-
"6900746920736f63696f007371752e20416420206c69746f7200bf6f729c7175"
187-
"01230138007d75620035106e6f7374800d696e63006570746f73206869006d65"
188-
"6e61656f732e000a0a4c6f72656d20086970730060646f6c6f68722073803c61"
189-
"006d819c7308656374007272206164206970697363808120653100352e205180"
190-
"ad8034206620617563696200836578802073617069656e009900746165207065"
191-
"6c6c9500446500506581642070009c00657261742e20496e0020696420637572"
192-
"7301801b6d692070726574fa69803f74001980087fdbbf6dbf6d9f008ebf6dbf"
193-
"6dbf6d7fdb73207fdbfdbf6d73407fdf36bf6dbf6dbf6dbf6df9bf6d6163bf6d"
194-
"bf6d9fa49fa4a00c7f9fa49fa49fa49fa49fa49fa49fa467799fa476699fa49f"
195-
"a47fdb7fdb737e207fdb7fdb7fdb7fdbe1d67fdb74fd40cb7281d37fdbbf6dbf"
196-
"6dbf6dbf6de7bf6dbf6ddf367320bf6dbf6d2f89ffd0722f892f896f1b2f892f"
197-
"892f892f89ff2f892f892f892f892f896f1b2f892f89f92f8974756f1b6f1b6f"
198-
"1b6f1b6f1bff6f1b9fa49fa49fa49fa49fa49fa49fa4ff9fa49fa49fa4df36bf"
199-
"6d9fa49fa4df36ff9fa49fa49fa49fa44f529fa44f52507aff2f899fa49fa40f"
200-
"c00fc00fc00fc0e232ff106d2f894f520fc00fc00fc00fc00fc0bf0fc00fc04f"
201-
"52bf6d0fc00fc065df36ff40bc0fc02f890fc02f894f527fdba034ff10177fdb"
202-
"7fdb7fdb7fdb7fdb7fdb7fdbcfd0cb7fdb2f897fdb73737fdb7fdbcf7fdb0fc0"
203-
"7fdb9fa465743156df365fdf36df36df36df367fdb6d40f36cde6cf019bf6dbf"
204-
"6dbf6d70eff6b0040f2f89eff6eff67adb1fb3007375616461206c610063696e"
205-
"696120696e007465676572206e75006e6320706f7375650072652e2055742068"
206-
"00656e647265726974202073656d7000847665006c20636c6173732000617074"
207-
"656e742074010084746920736f6369006f7371752e20416400206c69746f7261"
208-
"20190008717501460170636f6e84756200d46e6f7374003600696e636570746f"
209-
"73002068696d656e6165006f732e0a0a4c6f7200656d20697073756d0020646f"
210-
"6c6f722073410079616d657420003e7300656374657475722040616469706973"
211-
"00b967042065006a2e2051756901007a65206661756369006275732065782073"
212-
"00617069656e207669007461652070656c6c4d008865022500c9207000f96500"
213-
"7261742e20496e208069642063757273801b006d692070726574696d803f7400"
214-
"19800864002d013e7600616c6c69732e2054030083000b6c656f206575802061"
215-
"656e65616e808d0064206469616d20750c726e007b00116f722e200050756c76"
216-
"696e617211804176616d001a667269606e67696c6c82bb80076e18656320806d"
217-
"80046269624700b4803a80c2737461803349486163750038206d00b56120206e"
218-
"69736c00056c65fb7fdbbf6d6ebf6dbf6dbf6dbf6d7fdbff7fdbbf6dbf6dbf6d"
219-
"bf6dbf6dbf6dbf6df9bf6d7373bf6d9fa49fa49fa49fa46f9fa49fa49fa49fa4"
220-
"209fa49fa476fe699fa49fa49fa47fdb7fdb40337fdb3f7fdb7fdbe0d37fdb40"
221-
"677fdb7320df7fdbbf6d6f1bbf6d6f1b63a051bf6d7e20bf6dbf6d2f894f522f"
222-
"892f8969bf2f89101b2f892f896f1b2f89202f89ff2f892f892f8960972f892f"
223-
"892f892f89be202f892f892f892f892f89652f89ff4f529fa49fa49fa49fa49f"
224-
"a4df369fa4fb9fa49fa4746f1bbf6d9fa49fa4df36e79fa4df364f526d708032"
225-
"6f1b6f1bff6f1b6f1b6f1b6f1bbf6d80790fc00fc0ff0fc04f520fc00fc00fc0"
226-
"0fc00fc0df36ffdf36df36df36df36bf6d0fc00fc06f1b6c73650fc00fc0200f"
227-
"c00fc067f76f1b6f1b6f1b6edf36df36df36df36ffdf36df36df36df36df367f"
228-
"dbbf6d7fdbff7fdb7fdbbf6d2f89806bdf366f1b7fdbfe736f1b7fdbbf6dbf6d"
229-
"bf6dbf6dbf6d3fbf6dbf6deff6f161bf6db86d0bb300732e0a0a4c6f7265006d"
230-
"20697073756d2000646f6c6f72207369007420616d65742063006f6e73656374"
231-
"6574007572206164697069007363696e6720656c0069742e2051756973007175"
232-
"6520666175630069627573206578200073617069656e20760069746165207065"
233-
"6ca06c656e7465024a7300c680706c6163657261007600496e20696420637504"
234-
"727300376d6920707268657469007f74003200116403005a017c76616c6c6973"
235-
"402e2054656d7000166c00656f206575206165006e65616e2073656400206469"
236-
"616d207572106e61207400226f722e002050756c76696e612272008376616d00"
237-
"346672c100b2696c6c6120007d000f306e65632000db000962691062656e6480"
238-
"3a65676508737461803349616375010038206d6173736120106e69736c00056c"
239-
"657308756164021f696e69610420690069676572206e00756e6320706f737500"
240-
"6572652e2055742062688026726572009e00767081801076656c20636c802510"
241-
"206170748084207461006369746920736f6304696f808a2e204164204980a56f"
242-
"72805f6f7200a66e4a74809a72017d756200356e086f7374800d696e63650070"
243-
"746f732068696de0656e61656f7fdb804fbf6dffbf6dbf6dbf6dbf6d7fdb7fdb"
244-
"407dbf6dfbbf6dbf6d20bf6dbf6dbf6d2069bf6d7fbf6dbf6d81759fa49fa4c0"
245-
"48409a6dfe209fa49fa49fa49fa49fa49fa49fa4efe0b49fa49fa494a4001f00"
246-
"3f043f04ff3f043f043f043f043f043f041f021f01ff1f011f011f011f011f01"
247-
"1f011f011f01ff1f011f011f011f011f011f011f011f01ff1f011f011f011f01"
248-
"1f011f011f011f01ff1f011f011f011f011f011f011f011f01ff1f011f011f01"
249-
"1f011f011f011f011f01ff1f011f011f011f011f011f011f011f01ff1f011f01"
250-
"1f011f011f011f011f011f01ff1f011f011f011f011f011f011f011f01ff1f01"
251-
"1f011f011f011f011f011f011f01ff1f011f011f011f011f011f011f011f01ff"
252-
"1f011f011f011f011f011f011f011f01ff1f011f011f011f011f011f011f011f"
253-
"01ff1f011f011f011f011f011f011f011f017f1f011f011f011f011f011f011b"
254-
"0103b00200fc0f03b00200fc0f03b00200fc0f03b00200fc0f03b00200fc0f03"
255-
"b00200fc0f03b00200fc0f03b00200fc0f03b00200fc0f03b00200fc0f03b002"
256-
"00fc0f03b00200fc0f0000000000000000000000000000000000000000000000"
257-
)
258-
assert hashlib.sha256(benchmark(lznt1.decompress, buf).rstrip(b"\x00")).hexdigest() == (
259-
"73d3dd96ca2e2f0144a117019256d770ee7c6febeaee09b24956c723ae22b529"
260-
)
141+
@pytest.mark.parametrize(*PARAMS)
142+
def test_benchmark_lznt1_decompress(data: str, digest: str, benchmark: BenchmarkFixture) -> None:
143+
assert hashlib.sha256(benchmark(lznt1.decompress, bytes.fromhex(data)).rstrip(b"\x00")).hexdigest() == digest

0 commit comments

Comments
 (0)