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()