##// END OF EJS Templates
bisect: avoid adding irrelevant revisions to bisect state...
bisect: avoid adding irrelevant revisions to bisect state When adding new revisions to the bisect state, it only makes sense to add information about revisions that are under consideration (i.e., those that are topologically between the known good and bad revisions). However, if the user passes in a revset (e.g., '!merge()' to exclude merge commits), hg will resolve the revset first and add all matching revisions to the bisect state (which in this case would likely be the majority of revisions in the repo). To avoid this, revisions should only be added to the bisect state if they are between the good and bad revisions (and therefore relevant to the bisection). -- Here are the results of some performance tests using the `mozilla-central` repo (since it is one of the largest freely-available hg repositories in the wild). These tests compare the performance of a locally-built `hg` before and after application of this series. Note that `--noupdate` is passed to avoid including update time (which should not vary across cases). Setup (run between each test): $ hg bisect --reset $ hg bisect --noupdate --bad 56c3ad4bde5c70714b784ccf15d099e0df0f5bde $ hg bisect --noupdate --good 57426696adaf08298af3027fa77486fee0633b13 Test using a revset that returns a very large number of revisions: $ time hg bisect --noupdate --skip '!merge()' > /dev/null Before: real 0m9.398s user 0m9.233s sys 0m0.120s After: real 0m1.513s user 0m1.425s sys 0m0.052s Test using a revset that is expensive to compute: $ time hg bisect --noupdate --skip 'desc("Bug")' > /dev/null Before: real 0m49.853s user 0m49.580s sys 0m0.243s After: real 0m4.120s user 0m4.036s sys 0m0.048s

File last commit:

r49730:6000f5b2 default
r50337:81623652 default
Show More
hypothesishelpers.py
79 lines | 2.1 KiB | text/x-python | PythonLexer
/ tests / hypothesishelpers.py
David R. MacIver
testing: add hypothesis fuzz testing...
r26842 # Helper module to use the Hypothesis tool in tests
#
# Copyright 2015 David R. MacIver
#
# For details see http://hypothesis.readthedocs.org
import os
import sys
import traceback
Yuya Nishihara
tests: adjust for code move in Hypothesis 2.0.0...
r27998 try:
# hypothesis 2.x
from hypothesis.configuration import set_hypothesis_home_dir
from hypothesis import settings
except ImportError:
# hypothesis 1.x
from hypothesis.settings import set_hypothesis_home_dir
from hypothesis import Settings as settings
David R. MacIver
testing: add hypothesis fuzz testing...
r26842 import hypothesis.strategies as st
Yuya Nishihara
tests: adjust for code move in Hypothesis 2.0.0...
r27998 from hypothesis import given
David R. MacIver
testing: add hypothesis fuzz testing...
r26842
# hypothesis store data regarding generate example and code
Augie Fackler
formatting: blacken the codebase...
r43346 set_hypothesis_home_dir(os.path.join(os.getenv('TESTTMP'), ".hypothesis"))
David R. MacIver
testing: add hypothesis fuzz testing...
r26842
def check(*args, **kwargs):
"""decorator to make a function a hypothesis test
Decorated function are run immediately (to be used doctest style)"""
Augie Fackler
formatting: blacken the codebase...
r43346
David R. MacIver
testing: add hypothesis fuzz testing...
r26842 def accept(f):
# Workaround for https://github.com/DRMacIver/hypothesis/issues/206
# Fixed in version 1.13 (released 2015 october 29th)
f.__module__ = '__anon__'
try:
Yuya Nishihara
tests: pass settings of hypothesis by with statement...
r27999 with settings(max_examples=2000):
given(*args, **kwargs)(f)()
David R. MacIver
testing: add hypothesis fuzz testing...
r26842 except Exception:
traceback.print_exc(file=sys.stdout)
sys.exit(1)
Augie Fackler
formatting: blacken the codebase...
r43346
David R. MacIver
testing: add hypothesis fuzz testing...
r26842 return accept
def roundtrips(data, decode, encode):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """helper to tests function that must do proper encode/decode roundtripping"""
Augie Fackler
formatting: blacken the codebase...
r43346
David R. MacIver
testing: add hypothesis fuzz testing...
r26842 @given(data)
def testroundtrips(value):
encoded = encode(value)
decoded = decode(encoded)
if decoded != value:
raise ValueError(
Augie Fackler
formatting: blacken the codebase...
r43346 "Round trip failed: %s(%r) -> %s(%r) -> %r"
% (encode.__name__, value, decode.__name__, encoded, decoded)
)
David R. MacIver
testing: add hypothesis fuzz testing...
r26842 try:
testroundtrips()
except Exception:
# heredoc swallow traceback, we work around it
traceback.print_exc(file=sys.stdout)
raise
print("Round trip OK")
# strategy for generating bytestring that might be an issue for Mercurial
bytestrings = (
Augie Fackler
formatting: blacken the codebase...
r43346 st.builds(
lambda s, e: s.encode(e),
st.text(),
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 st.sampled_from(
[
'utf-8',
'utf-16',
]
),
Augie Fackler
formatting: blacken the codebase...
r43346 )
) | st.binary()