Mercurial > public > mercurial-scm > hg
comparison tests/hypothesishelpers.py @ 26842:0f76c64f5cc3
testing: add hypothesis fuzz testing
Hypothesis a library for adding fuzzing over a range of structure
data to your test suite: http://hypothesis.readthedocs.org/en/latest/
This adds the ability to build tests using Hypothesis within the Mercurial test
suite. New tests and fixes using this helpers comes in later changesets.
author | David R. MacIver <david@drmaciver.com> |
---|---|
date | Sat, 24 Oct 2015 12:46:03 +0100 |
parents | |
children | 84513a4fcc3a |
comparison
equal
deleted
inserted
replaced
26841:e16b1f86e9f6 | 26842:0f76c64f5cc3 |
---|---|
1 # Helper module to use the Hypothesis tool in tests | |
2 # | |
3 # Copyright 2015 David R. MacIver | |
4 # | |
5 # For details see http://hypothesis.readthedocs.org | |
6 | |
7 import os | |
8 import sys | |
9 import traceback | |
10 | |
11 from hypothesis.settings import set_hypothesis_home_dir | |
12 import hypothesis.strategies as st | |
13 from hypothesis import given, Settings | |
14 | |
15 # hypothesis store data regarding generate example and code | |
16 set_hypothesis_home_dir(os.path.join( | |
17 os.getenv('TESTTMP'), ".hypothesis" | |
18 )) | |
19 | |
20 def check(*args, **kwargs): | |
21 """decorator to make a function a hypothesis test | |
22 | |
23 Decorated function are run immediately (to be used doctest style)""" | |
24 def accept(f): | |
25 # Workaround for https://github.com/DRMacIver/hypothesis/issues/206 | |
26 # Fixed in version 1.13 (released 2015 october 29th) | |
27 f.__module__ = '__anon__' | |
28 try: | |
29 given(*args, settings=Settings(max_examples=2000), **kwargs)(f)() | |
30 except Exception: | |
31 traceback.print_exc(file=sys.stdout) | |
32 sys.exit(1) | |
33 return accept | |
34 | |
35 | |
36 def roundtrips(data, decode, encode): | |
37 """helper to tests function that must do proper encode/decode roundtripping | |
38 """ | |
39 @given(data) | |
40 def testroundtrips(value): | |
41 encoded = encode(value) | |
42 decoded = decode(encoded) | |
43 if decoded != value: | |
44 raise ValueError( | |
45 "Round trip failed: %s(%r) -> %s(%r) -> %r" % ( | |
46 encode.__name__, value, decode.__name__, encoded, | |
47 decoded | |
48 )) | |
49 try: | |
50 testroundtrips() | |
51 except Exception: | |
52 # heredoc swallow traceback, we work around it | |
53 traceback.print_exc(file=sys.stdout) | |
54 raise | |
55 print("Round trip OK") | |
56 | |
57 | |
58 # strategy for generating bytestring that might be an issue for Mercurial | |
59 bytestrings = ( | |
60 st.builds(lambda s, e: s.encode(e), st.text(), st.sampled_from([ | |
61 'utf-8', 'utf-16', | |
62 ]))) | st.binary() |