author | Matt Harbison <matt_harbison@yahoo.com> |
Wed, 01 Mar 2023 13:11:51 -0500 | |
changeset 50378 | ebf1a07539b9 |
parent 48875 | 6000f5b25c9b |
permissions | -rw-r--r-- |
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
1 |
# Helper module to use the Hypothesis tool in tests |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
2 |
# |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
3 |
# Copyright 2015 David R. MacIver |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
4 |
# |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
5 |
# For details see http://hypothesis.readthedocs.org |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
6 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
7 |
import os |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
8 |
import sys |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
9 |
import traceback |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
10 |
|
27998
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
11 |
try: |
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
12 |
# hypothesis 2.x |
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
13 |
from hypothesis.configuration import set_hypothesis_home_dir |
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
14 |
from hypothesis import settings |
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
15 |
except ImportError: |
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
16 |
# hypothesis 1.x |
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
17 |
from hypothesis.settings import set_hypothesis_home_dir |
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
18 |
from hypothesis import Settings as settings |
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
19 |
import hypothesis.strategies as st |
27998
84513a4fcc3a
tests: adjust for code move in Hypothesis 2.0.0
Yuya Nishihara <yuya@tcha.org>
parents:
26842
diff
changeset
|
20 |
from hypothesis import given |
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
21 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
22 |
# hypothesis store data regarding generate example and code |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
23 |
set_hypothesis_home_dir(os.path.join(os.getenv('TESTTMP'), ".hypothesis")) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
24 |
|
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
25 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
26 |
def check(*args, **kwargs): |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
27 |
"""decorator to make a function a hypothesis test |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
28 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
29 |
Decorated function are run immediately (to be used doctest style)""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
30 |
|
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
31 |
def accept(f): |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
32 |
# Workaround for https://github.com/DRMacIver/hypothesis/issues/206 |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
33 |
# Fixed in version 1.13 (released 2015 october 29th) |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
34 |
f.__module__ = '__anon__' |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
35 |
try: |
27999
b30b40804a3f
tests: pass settings of hypothesis by with statement
Yuya Nishihara <yuya@tcha.org>
parents:
27998
diff
changeset
|
36 |
with settings(max_examples=2000): |
b30b40804a3f
tests: pass settings of hypothesis by with statement
Yuya Nishihara <yuya@tcha.org>
parents:
27998
diff
changeset
|
37 |
given(*args, **kwargs)(f)() |
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
38 |
except Exception: |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
39 |
traceback.print_exc(file=sys.stdout) |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
40 |
sys.exit(1) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
41 |
|
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
42 |
return accept |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
43 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
44 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
45 |
def roundtrips(data, decode, encode): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43076
diff
changeset
|
46 |
"""helper to tests function that must do proper encode/decode roundtripping""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
47 |
|
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
48 |
@given(data) |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
49 |
def testroundtrips(value): |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
50 |
encoded = encode(value) |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
51 |
decoded = decode(encoded) |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
52 |
if decoded != value: |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
53 |
raise ValueError( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
54 |
"Round trip failed: %s(%r) -> %s(%r) -> %r" |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
55 |
% (encode.__name__, value, decode.__name__, encoded, decoded) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
56 |
) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
57 |
|
26842
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
58 |
try: |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
59 |
testroundtrips() |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
60 |
except Exception: |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
61 |
# heredoc swallow traceback, we work around it |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
62 |
traceback.print_exc(file=sys.stdout) |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
63 |
raise |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
64 |
print("Round trip OK") |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
65 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
66 |
|
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
67 |
# strategy for generating bytestring that might be an issue for Mercurial |
0f76c64f5cc3
testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents:
diff
changeset
|
68 |
bytestrings = ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
69 |
st.builds( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
70 |
lambda s, e: s.encode(e), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
71 |
st.text(), |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43076
diff
changeset
|
72 |
st.sampled_from( |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43076
diff
changeset
|
73 |
[ |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43076
diff
changeset
|
74 |
'utf-8', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43076
diff
changeset
|
75 |
'utf-16', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43076
diff
changeset
|
76 |
] |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43076
diff
changeset
|
77 |
), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
78 |
) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
28728
diff
changeset
|
79 |
) | st.binary() |