view tests/hypothesishelpers.py @ 34107:4f60720cf0df

blackbox: fix rotation with chg The added test will show: $ $PYTHON showsize.py .hg/blackbox* .hg/blackbox.log: < 500 .hg/blackbox.log.1: < 500 .hg/blackbox.log.2: < 500 .hg/blackbox.log.3: < 500 .hg/blackbox.log.4: < 500 .hg/blackbox.log.5: >= 500 with previous code. The issue is caused by blackbox caching file objects *by path*, and the rotation size check could run on a wrong file object (i.e. it should check "blackbox.log", but `filehandles["blackbox.log"]` contains a file object that has been renamed to "blackbox.log.5"). This patch removes the "filehandlers" global cache added by 45313f5a3a8c to solve the issue. I think the original patch was trying to make different ui objects use a same file object if their blackbox.log path is the same. In theory it could also be problematic in the rotation case. Anyway, that should become unnecessary after D650. Differential Revision: https://phab.mercurial-scm.org/D648
author Jun Wu <quark@fb.com>
date Wed, 06 Sep 2017 19:27:30 -0700
parents 8699c89f3ae9
children 2372284d9457
line wrap: on
line source

# Helper module to use the Hypothesis tool in tests
#
# Copyright 2015 David R. MacIver
#
# For details see http://hypothesis.readthedocs.org

from __future__ import absolute_import, print_function
import os
import sys
import traceback

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
import hypothesis.strategies as st
from hypothesis import given

# hypothesis store data regarding generate example and code
set_hypothesis_home_dir(os.path.join(
    os.getenv('TESTTMP'), ".hypothesis"
))

def check(*args, **kwargs):
    """decorator to make a function a hypothesis test

    Decorated function are run immediately (to be used doctest style)"""
    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:
            with settings(max_examples=2000):
                given(*args, **kwargs)(f)()
        except Exception:
            traceback.print_exc(file=sys.stdout)
            sys.exit(1)
    return accept


def roundtrips(data, decode, encode):
    """helper to tests function that must do proper encode/decode roundtripping
    """
    @given(data)
    def testroundtrips(value):
        encoded = encode(value)
        decoded = decode(encoded)
        if decoded != value:
            raise ValueError(
                "Round trip failed: %s(%r) -> %s(%r) -> %r" % (
                    encode.__name__, value, decode.__name__, encoded,
                    decoded
                ))
    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 = (
    st.builds(lambda s, e: s.encode(e), st.text(), st.sampled_from([
        'utf-8', 'utf-16',
    ]))) | st.binary()