comparison contrib/python-zstandard/tests/test_compressor_fuzzing.py @ 37495:b1fb341d8a61

zstandard: vendor python-zstandard 0.9.0 This was just released. It features a number of goodies. More info at https://gregoryszorc.com/blog/2018/04/09/release-of-python-zstandard-0.9/. The clang-format ignore list was updated to reflect the new source of files. The project contains a vendored copy of zstandard 1.3.4. The old version was 1.1.3. One of the changes between those versions is that zstandard is now dual licensed BSD + GPLv2 and the patent rights grant has been removed. Good riddance. The API should be backwards compatible. So no changes in core should be needed. However, there were a number of changes in the library that we'll want to adapt to. Those will be addressed in subsequent commits. Differential Revision: https://phab.mercurial-scm.org/D3198
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 09 Apr 2018 10:13:29 -0700
parents e0dc40530c5a
children 73fef626dae3
comparison
equal deleted inserted replaced
37494:1ce7a55b09d1 37495:b1fb341d8a61
1 import io 1 import io
2 import os 2 import os
3 3 import unittest
4 try:
5 import unittest2 as unittest
6 except ImportError:
7 import unittest
8 4
9 try: 5 try:
10 import hypothesis 6 import hypothesis
11 import hypothesis.strategies as strategies 7 import hypothesis.strategies as strategies
12 except ImportError: 8 except ImportError:
13 raise unittest.SkipTest('hypothesis not available') 9 raise unittest.SkipTest('hypothesis not available')
14 10
15 import zstd 11 import zstandard as zstd
16 12
17 from . common import ( 13 from . common import (
18 make_cffi, 14 make_cffi,
19 random_input_data, 15 random_input_data,
20 ) 16 )
21 17
22 18
23 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set') 19 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set')
24 @make_cffi 20 @make_cffi
25 class TestCompressor_write_to_fuzzing(unittest.TestCase): 21 class TestCompressor_stream_reader_fuzzing(unittest.TestCase):
22 @hypothesis.given(original=strategies.sampled_from(random_input_data()),
23 level=strategies.integers(min_value=1, max_value=5),
24 source_read_size=strategies.integers(1, 16384),
25 read_sizes=strategies.data())
26 def test_stream_source_read_variance(self, original, level, source_read_size,
27 read_sizes):
28 refctx = zstd.ZstdCompressor(level=level)
29 ref_frame = refctx.compress(original)
30
31 cctx = zstd.ZstdCompressor(level=level)
32 with cctx.stream_reader(io.BytesIO(original), size=len(original),
33 read_size=source_read_size) as reader:
34 chunks = []
35 while True:
36 read_size = read_sizes.draw(strategies.integers(1, 16384))
37 chunk = reader.read(read_size)
38
39 if not chunk:
40 break
41 chunks.append(chunk)
42
43 self.assertEqual(b''.join(chunks), ref_frame)
44
45 @hypothesis.given(original=strategies.sampled_from(random_input_data()),
46 level=strategies.integers(min_value=1, max_value=5),
47 source_read_size=strategies.integers(1, 16384),
48 read_sizes=strategies.data())
49 def test_buffer_source_read_variance(self, original, level, source_read_size,
50 read_sizes):
51
52 refctx = zstd.ZstdCompressor(level=level)
53 ref_frame = refctx.compress(original)
54
55 cctx = zstd.ZstdCompressor(level=level)
56 with cctx.stream_reader(original, size=len(original),
57 read_size=source_read_size) as reader:
58 chunks = []
59 while True:
60 read_size = read_sizes.draw(strategies.integers(1, 16384))
61 chunk = reader.read(read_size)
62 if not chunk:
63 break
64 chunks.append(chunk)
65
66 self.assertEqual(b''.join(chunks), ref_frame)
67
68
69 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set')
70 @make_cffi
71 class TestCompressor_stream_writer_fuzzing(unittest.TestCase):
26 @hypothesis.given(original=strategies.sampled_from(random_input_data()), 72 @hypothesis.given(original=strategies.sampled_from(random_input_data()),
27 level=strategies.integers(min_value=1, max_value=5), 73 level=strategies.integers(min_value=1, max_value=5),
28 write_size=strategies.integers(min_value=1, max_value=1048576)) 74 write_size=strategies.integers(min_value=1, max_value=1048576))
29 def test_write_size_variance(self, original, level, write_size): 75 def test_write_size_variance(self, original, level, write_size):
30 refctx = zstd.ZstdCompressor(level=level) 76 refctx = zstd.ZstdCompressor(level=level)
31 ref_frame = refctx.compress(original) 77 ref_frame = refctx.compress(original)
32 78
33 cctx = zstd.ZstdCompressor(level=level) 79 cctx = zstd.ZstdCompressor(level=level)
34 b = io.BytesIO() 80 b = io.BytesIO()
35 with cctx.write_to(b, size=len(original), write_size=write_size) as compressor: 81 with cctx.stream_writer(b, size=len(original), write_size=write_size) as compressor:
36 compressor.write(original) 82 compressor.write(original)
37 83
38 self.assertEqual(b.getvalue(), ref_frame) 84 self.assertEqual(b.getvalue(), ref_frame)
39 85
40 86
60 106
61 107
62 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set') 108 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set')
63 @make_cffi 109 @make_cffi
64 class TestCompressor_compressobj_fuzzing(unittest.TestCase): 110 class TestCompressor_compressobj_fuzzing(unittest.TestCase):
111 @hypothesis.settings(
112 suppress_health_check=[hypothesis.HealthCheck.large_base_example])
65 @hypothesis.given(original=strategies.sampled_from(random_input_data()), 113 @hypothesis.given(original=strategies.sampled_from(random_input_data()),
66 level=strategies.integers(min_value=1, max_value=5), 114 level=strategies.integers(min_value=1, max_value=5),
67 chunk_sizes=strategies.streaming( 115 chunk_sizes=strategies.data())
68 strategies.integers(min_value=1, max_value=4096)))
69 def test_random_input_sizes(self, original, level, chunk_sizes): 116 def test_random_input_sizes(self, original, level, chunk_sizes):
70 chunk_sizes = iter(chunk_sizes)
71
72 refctx = zstd.ZstdCompressor(level=level) 117 refctx = zstd.ZstdCompressor(level=level)
73 ref_frame = refctx.compress(original) 118 ref_frame = refctx.compress(original)
74 119
75 cctx = zstd.ZstdCompressor(level=level) 120 cctx = zstd.ZstdCompressor(level=level)
76 cobj = cctx.compressobj(size=len(original)) 121 cobj = cctx.compressobj(size=len(original))
77 122
78 chunks = [] 123 chunks = []
79 i = 0 124 i = 0
80 while True: 125 while True:
81 chunk_size = next(chunk_sizes) 126 chunk_size = chunk_sizes.draw(strategies.integers(1, 4096))
82 source = original[i:i + chunk_size] 127 source = original[i:i + chunk_size]
83 if not source: 128 if not source:
84 break 129 break
85 130
86 chunks.append(cobj.compress(source)) 131 chunks.append(cobj.compress(source))
91 self.assertEqual(b''.join(chunks), ref_frame) 136 self.assertEqual(b''.join(chunks), ref_frame)
92 137
93 138
94 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set') 139 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set')
95 @make_cffi 140 @make_cffi
96 class TestCompressor_read_from_fuzzing(unittest.TestCase): 141 class TestCompressor_read_to_iter_fuzzing(unittest.TestCase):
97 @hypothesis.given(original=strategies.sampled_from(random_input_data()), 142 @hypothesis.given(original=strategies.sampled_from(random_input_data()),
98 level=strategies.integers(min_value=1, max_value=5), 143 level=strategies.integers(min_value=1, max_value=5),
99 read_size=strategies.integers(min_value=1, max_value=4096), 144 read_size=strategies.integers(min_value=1, max_value=4096),
100 write_size=strategies.integers(min_value=1, max_value=4096)) 145 write_size=strategies.integers(min_value=1, max_value=4096))
101 def test_read_write_size_variance(self, original, level, read_size, write_size): 146 def test_read_write_size_variance(self, original, level, read_size, write_size):
103 ref_frame = refcctx.compress(original) 148 ref_frame = refcctx.compress(original)
104 149
105 source = io.BytesIO(original) 150 source = io.BytesIO(original)
106 151
107 cctx = zstd.ZstdCompressor(level=level) 152 cctx = zstd.ZstdCompressor(level=level)
108 chunks = list(cctx.read_from(source, size=len(original), read_size=read_size, 153 chunks = list(cctx.read_to_iter(source, size=len(original),
109 write_size=write_size)) 154 read_size=read_size,
155 write_size=write_size))
110 156
111 self.assertEqual(b''.join(chunks), ref_frame) 157 self.assertEqual(b''.join(chunks), ref_frame)
112 158
113 159
114 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set') 160 @unittest.skipUnless('ZSTD_SLOW_TESTS' in os.environ, 'ZSTD_SLOW_TESTS not set')
123 # Use a content dictionary because it is cheap to create. 169 # Use a content dictionary because it is cheap to create.
124 if use_dict: 170 if use_dict:
125 kwargs['dict_data'] = zstd.ZstdCompressionDict(original[0]) 171 kwargs['dict_data'] = zstd.ZstdCompressionDict(original[0])
126 172
127 cctx = zstd.ZstdCompressor(level=1, 173 cctx = zstd.ZstdCompressor(level=1,
128 write_content_size=True,
129 write_checksum=True, 174 write_checksum=True,
130 **kwargs) 175 **kwargs)
131 176
132 result = cctx.multi_compress_to_buffer(original, threads=-1) 177 result = cctx.multi_compress_to_buffer(original, threads=-1)
133 178