tests/test-verify-repo-operations.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 22 Jun 2020 13:32:20 +0200
changeset 45059 79f6f9fa18c1
parent 43076 2372284d9457
child 45942 89a2afe31e82
permissions -rw-r--r--
documentation: add some internals documentation about bid merge This is an important algorithm that was only documented on the wiki so far. Some update to the algorithm (and associated doc) is to expected in the future since the bid merge algorithm is bug-ridden when it comes to file deletion comes to play. Differential Revision: https://phab.mercurial-scm.org/D8711
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     1
from __future__ import print_function, absolute_import
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     2
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     3
"""Fuzz testing for operations against a Mercurial repository
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     4
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     5
This uses Hypothesis's stateful testing to generate random repository
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     6
operations and test Mercurial using them, both to see if there are any
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     7
unexpected errors and to compare different versions of it."""
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     8
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
     9
import os
28499
8b90367c4cf3 tests: make test-verify-repo-operations.py not run by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 28279
diff changeset
    10
import subprocess
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    11
import sys
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    12
28499
8b90367c4cf3 tests: make test-verify-repo-operations.py not run by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 28279
diff changeset
    13
# Only run if slow tests are allowed
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    14
if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'], 'slow']):
28499
8b90367c4cf3 tests: make test-verify-repo-operations.py not run by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 28279
diff changeset
    15
    sys.exit(80)
8b90367c4cf3 tests: make test-verify-repo-operations.py not run by default
Martin von Zweigbergk <martinvonz@google.com>
parents: 28279
diff changeset
    16
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    17
# These tests require Hypothesis and pytz to be installed.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    18
# Running 'pip install hypothesis pytz' will achieve that.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    19
# Note: This won't work if you're running Python < 2.7.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    20
try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    21
    from hypothesis.extra.datetime import datetimes
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    22
except ImportError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    23
    sys.stderr.write("skipped: hypothesis or pytz not installed" + os.linesep)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    24
    sys.exit(80)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    25
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    26
# If you are running an old version of pip you may find that the enum34
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    27
# backport is not installed automatically. If so 'pip install enum34' will
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    28
# fix this problem.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    29
try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    30
    import enum
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    31
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    32
    assert enum  # Silence pyflakes
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    33
except ImportError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    34
    sys.stderr.write("skipped: enum34 not installed" + os.linesep)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    35
    sys.exit(80)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    36
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    37
import binascii
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    38
from contextlib import contextmanager
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    39
import errno
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    40
import pipes
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    41
import shutil
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    42
import silenttestrunner
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    43
import subprocess
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    44
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    45
from hypothesis.errors import HypothesisException
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
    46
from hypothesis.stateful import (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    47
    rule,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    48
    RuleBasedStateMachine,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    49
    Bundle,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    50
    precondition,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    51
)
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    52
from hypothesis import settings, note, strategies as st
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    53
from hypothesis.configuration import set_hypothesis_home_dir
28259
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
    54
from hypothesis.database import ExampleDatabase
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    55
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    56
testdir = os.path.abspath(os.environ["TESTDIR"])
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    57
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    58
# We store Hypothesis examples here rather in the temporary test directory
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    59
# so that when rerunning a failing test this always results in refinding the
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    60
# previous failure. This directory is in .hgignore and should not be checked in
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    61
# but is useful to have for development.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    62
set_hypothesis_home_dir(os.path.join(testdir, ".hypothesis"))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    63
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    64
runtests = os.path.join(os.environ["RUNTESTDIR"], "run-tests.py")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    65
testtmp = os.environ["TESTTMP"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    66
assert os.path.isdir(testtmp)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    67
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    68
generatedtests = os.path.join(testdir, "hypothesis-generated")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    69
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    70
try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    71
    os.makedirs(generatedtests)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    72
except OSError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    73
    pass
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    74
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    75
# We write out generated .t files to a file in order to ease debugging and to
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    76
# give a starting point for turning failures Hypothesis finds into normal
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    77
# tests. In order to ensure that multiple copies of this test can be run in
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    78
# parallel we use atomic file create to ensure that we always get a unique
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    79
# name.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    80
file_index = 0
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    81
while True:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    82
    file_index += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    83
    savefile = os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    84
        generatedtests, "test-generated-%d.t" % (file_index,)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
    85
    )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    86
    try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    87
        os.close(os.open(savefile, os.O_CREAT | os.O_EXCL | os.O_WRONLY))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    88
        break
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    89
    except OSError as e:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    90
        if e.errno != errno.EEXIST:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    91
            raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    92
assert os.path.exists(savefile)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    93
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    94
hgrc = os.path.join(".hg", "hgrc")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    95
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    96
filecharacters = (
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    97
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    98
    "[]^_`;=@{}~ !#$%&'()+,-"
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
    99
)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   100
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   101
files = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   102
    st.text(filecharacters, min_size=1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   103
    .map(lambda x: x.strip())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   104
    .filter(bool)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   105
    .map(lambda s: s.encode('ascii'))
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   106
)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   107
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   108
safetext = st.text(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   109
    st.characters(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   110
        min_codepoint=1, max_codepoint=127, blacklist_categories=('Cc', 'Cs')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   111
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   112
    min_size=1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   113
).map(lambda s: s.encode('utf-8'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   114
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   115
extensions = st.sampled_from(('shelve', 'mq', 'blackbox',))
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   116
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   117
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   118
@contextmanager
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   119
def acceptableerrors(*args):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   120
    """Sometimes we know an operation we're about to perform might fail, and
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   121
    we're OK with some of the failures. In those cases this may be used as a
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   122
    context manager and will swallow expected failures, as identified by
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   123
    substrings of the error message Mercurial emits."""
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   124
    try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   125
        yield
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   126
    except subprocess.CalledProcessError as e:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   127
        if not any(a in e.output for a in args):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   128
            note(e.output)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   129
            raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   130
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   131
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   132
reponames = st.text("abcdefghijklmnopqrstuvwxyz01234556789", min_size=1).map(
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   133
    lambda s: s.encode('ascii')
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   134
)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   135
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   136
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   137
class verifyingstatemachine(RuleBasedStateMachine):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   138
    """This defines the set of acceptable operations on a Mercurial repository
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   139
    using Hypothesis's RuleBasedStateMachine.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   140
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   141
    The general concept is that we manage multiple repositories inside a
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   142
    repos/ directory in our temporary test location. Some of these are freshly
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   143
    inited, some are clones of the others. Our current working directory is
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   144
    always inside one of these repositories while the tests are running.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   145
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   146
    Hypothesis then performs a series of operations against these repositories,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   147
    including hg commands, generating contents and editing the .hgrc file.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   148
    If these operations fail in unexpected ways or behave differently in
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   149
    different configurations of Mercurial, the test will fail and a minimized
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   150
    .t test file will be written to the hypothesis-generated directory to
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   151
    exhibit that failure.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   152
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   153
    Operations are defined as methods with @rule() decorators. See the
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   154
    Hypothesis documentation at
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   155
    http://hypothesis.readthedocs.org/en/release/stateful.html for more
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   156
    details."""
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   157
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   158
    # A bundle is a reusable collection of previously generated data which may
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   159
    # be provided as arguments to future operations.
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   160
    repos = Bundle('repos')
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   161
    paths = Bundle('paths')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   162
    contents = Bundle('contents')
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   163
    branches = Bundle('branches')
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   164
    committimes = Bundle('committimes')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   165
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   166
    def __init__(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   167
        super(verifyingstatemachine, self).__init__()
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   168
        self.repodir = os.path.join(testtmp, "repos")
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   169
        if os.path.exists(self.repodir):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   170
            shutil.rmtree(self.repodir)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   171
        os.chdir(testtmp)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   172
        self.log = []
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   173
        self.failed = False
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   174
        self.configperrepo = {}
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   175
        self.all_extensions = set()
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   176
        self.non_skippable_extensions = set()
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   177
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   178
        self.mkdirp("repos")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   179
        self.cd("repos")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   180
        self.mkdirp("repo1")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   181
        self.cd("repo1")
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   182
        self.hg("init")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   183
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   184
    def teardown(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   185
        """On teardown we clean up after ourselves as usual, but we also
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   186
        do some additional testing: We generate a .t file based on our test
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   187
        run using run-test.py -i to get the correct output.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   188
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   189
        We then test it in a number of other configurations, verifying that
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   190
        each passes the same test."""
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   191
        super(verifyingstatemachine, self).teardown()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   192
        try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   193
            shutil.rmtree(self.repodir)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   194
        except OSError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   195
            pass
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   196
        ttest = os.linesep.join("  " + l for l in self.log)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   197
        os.chdir(testtmp)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   198
        path = os.path.join(testtmp, "test-generated.t")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   199
        with open(path, 'w') as o:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   200
            o.write(ttest + os.linesep)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   201
        with open(os.devnull, "w") as devnull:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   202
            rewriter = subprocess.Popen(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   203
                [runtests, "--local", "-i", path],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   204
                stdin=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   205
                stdout=devnull,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   206
                stderr=devnull,
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   207
            )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   208
            rewriter.communicate("yes")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   209
            with open(path, 'r') as i:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   210
                ttest = i.read()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   211
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   212
        e = None
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   213
        if not self.failed:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   214
            try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   215
                output = subprocess.check_output(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   216
                    [runtests, path, "--local", "--pure"],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   217
                    stderr=subprocess.STDOUT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   218
                )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   219
                assert "Ran 1 test" in output, output
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   220
                for ext in self.all_extensions - self.non_skippable_extensions:
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   221
                    tf = os.path.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   222
                        testtmp, "test-generated-no-%s.t" % (ext,)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   223
                    )
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   224
                    with open(tf, 'w') as o:
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   225
                        for l in ttest.splitlines():
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   226
                            if l.startswith("  $ hg"):
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   227
                                l = l.replace(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   228
                                    "--config %s=" % (extensionconfigkey(ext),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   229
                                    "",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   230
                                )
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   231
                            o.write(l + os.linesep)
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   232
                    with open(tf, 'r') as r:
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   233
                        t = r.read()
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   234
                        assert ext not in t, t
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   235
                    output = subprocess.check_output(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   236
                        [runtests, tf, "--local",], stderr=subprocess.STDOUT
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   237
                    )
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   238
                    assert "Ran 1 test" in output, output
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   239
            except subprocess.CalledProcessError as e:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   240
                note(e.output)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   241
        if self.failed or e is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   242
            with open(savefile, "wb") as o:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   243
                o.write(ttest)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   244
        if e is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   245
            raise e
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   246
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   247
    def execute_step(self, step):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   248
        try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   249
            return super(verifyingstatemachine, self).execute_step(step)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   250
        except (HypothesisException, KeyboardInterrupt):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   251
            raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   252
        except Exception:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   253
            self.failed = True
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   254
            raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   256
    # Section: Basic commands.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   257
    def mkdirp(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   258
        if os.path.exists(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   259
            return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   260
        self.log.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   261
            "$ mkdir -p -- %s" % (pipes.quote(os.path.relpath(path)),)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   262
        )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   263
        os.makedirs(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   264
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   265
    def cd(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   266
        path = os.path.relpath(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   267
        if path == ".":
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   268
            return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   269
        os.chdir(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   270
        self.log.append("$ cd -- %s" % (pipes.quote(path),))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   271
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   272
    def hg(self, *args):
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   273
        extra_flags = []
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   274
        for key, value in self.config.items():
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   275
            extra_flags.append("--config")
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   276
            extra_flags.append("%s=%s" % (key, value))
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   277
        self.command("hg", *(tuple(extra_flags) + args))
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   278
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   279
    def command(self, *args):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   280
        self.log.append("$ " + ' '.join(map(pipes.quote, args)))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   281
        subprocess.check_output(args, stderr=subprocess.STDOUT)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   282
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   283
    # Section: Set up basic data
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   284
    # This section has no side effects but generates data that we will want
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   285
    # to use later.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   286
    @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   287
        target=paths,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   288
        source=st.lists(files, min_size=1).map(lambda l: os.path.join(*l)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   289
    )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   290
    def genpath(self, source):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   291
        return source
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   292
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   293
    @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   294
        target=committimes,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   295
        when=datetimes(min_year=1970, max_year=2038) | st.none(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   296
    )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   297
    def gentime(self, when):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   298
        return when
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   299
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   300
    @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   301
        target=contents,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   302
        content=st.one_of(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   303
            st.binary(), st.text().map(lambda x: x.encode('utf-8'))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   304
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   305
    )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   306
    def gencontent(self, content):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   307
        return content
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   308
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   309
    @rule(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   310
        target=branches, name=safetext,
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   311
    )
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   312
    def genbranch(self, name):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   313
        return name
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   314
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   315
    @rule(target=paths, source=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   316
    def lowerpath(self, source):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   317
        return source.lower()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   318
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   319
    @rule(target=paths, source=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   320
    def upperpath(self, source):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   321
        return source.upper()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   322
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   323
    # Section: Basic path operations
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   324
    @rule(path=paths, content=contents)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   325
    def writecontent(self, path, content):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   326
        self.unadded_changes = True
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   327
        if os.path.isdir(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   328
            return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   329
        parent = os.path.dirname(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   330
        if parent:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   331
            try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   332
                self.mkdirp(parent)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   333
            except OSError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   334
                # It may be the case that there is a regular file that has
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   335
                # previously been created that has the same name as an ancestor
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   336
                # of the current path. This will cause mkdirp to fail with this
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   337
                # error. We just turn this into a no-op in that case.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   338
                return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   339
        with open(path, 'wb') as o:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   340
            o.write(content)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   341
        self.log.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   342
            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   343
                "$ python -c 'import binascii; "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   344
                "print(binascii.unhexlify(\"%s\"))' > %s"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   345
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   346
            % (binascii.hexlify(content), pipes.quote(path),)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   347
        )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   348
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   349
    @rule(path=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   350
    def addpath(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   351
        if os.path.exists(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   352
            self.hg("add", "--", path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   353
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   354
    @rule(path=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   355
    def forgetpath(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   356
        if os.path.exists(path):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   357
            with acceptableerrors("file is already untracked",):
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   358
                self.hg("forget", "--", path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   359
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   360
    @rule(s=st.none() | st.integers(0, 100))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   361
    def addremove(self, s):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   362
        args = ["addremove"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   363
        if s is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   364
            args.extend(["-s", str(s)])
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   365
        self.hg(*args)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   366
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   367
    @rule(path=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   368
    def removepath(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   369
        if os.path.exists(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   370
            with acceptableerrors(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   371
                'file is untracked',
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   372
                'file has been marked for add',
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   373
                'file is modified',
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   374
            ):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   375
                self.hg("remove", "--", path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   376
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   377
    @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   378
        message=safetext,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   379
        amend=st.booleans(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   380
        when=committimes,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   381
        addremove=st.booleans(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   382
        secret=st.booleans(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   383
        close_branch=st.booleans(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   384
    )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   385
    def maybecommit(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   386
        self, message, amend, when, addremove, secret, close_branch
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   387
    ):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   388
        command = ["commit"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   389
        errors = ["nothing changed"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   390
        if amend:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   391
            errors.append("cannot amend public changesets")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   392
            command.append("--amend")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   393
        command.append("-m" + pipes.quote(message))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   394
        if secret:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   395
            command.append("--secret")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   396
        if close_branch:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   397
            command.append("--close-branch")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   398
            errors.append("can only close branch heads")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   399
        if addremove:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   400
            command.append("--addremove")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   401
        if when is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   402
            if when.year == 1970:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   403
                errors.append('negative date value')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   404
            if when.year == 2038:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   405
                errors.append('exceeds 32 bits')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   406
            command.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   407
                "--date=%s" % (when.strftime('%Y-%m-%d %H:%M:%S %z'),)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   408
            )
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   409
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   410
        with acceptableerrors(*errors):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   411
            self.hg(*command)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   412
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   413
    # Section: Repository management
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   414
    @property
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   415
    def currentrepo(self):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   416
        return os.path.basename(os.getcwd())
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   417
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   418
    @property
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   419
    def config(self):
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   420
        return self.configperrepo.setdefault(self.currentrepo, {})
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   421
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   422
    @rule(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   423
        target=repos, source=repos, name=reponames,
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   424
    )
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   425
    def clone(self, source, name):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   426
        if not os.path.exists(os.path.join("..", name)):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   427
            self.cd("..")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   428
            self.hg("clone", source, name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   429
            self.cd(name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   430
        return name
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   431
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   432
    @rule(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   433
        target=repos, name=reponames,
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   434
    )
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   435
    def fresh(self, name):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   436
        if not os.path.exists(os.path.join("..", name)):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   437
            self.cd("..")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   438
            self.mkdirp(name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   439
            self.cd(name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   440
            self.hg("init")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   441
        return name
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   442
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   443
    @rule(name=repos)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   444
    def switch(self, name):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   445
        self.cd(os.path.join("..", name))
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   446
        assert self.currentrepo == name
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   447
        assert os.path.exists(".hg")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   448
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   449
    @rule(target=repos)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   450
    def origin(self):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   451
        return "repo1"
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   452
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   453
    @rule()
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   454
    def pull(self, repo=repos):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   455
        with acceptableerrors(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   456
            "repository default not found", "repository is unrelated",
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   457
        ):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   458
            self.hg("pull")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   459
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   460
    @rule(newbranch=st.booleans())
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   461
    def push(self, newbranch):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   462
        with acceptableerrors(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   463
            "default repository not configured", "no changes found",
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   464
        ):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   465
            if newbranch:
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   466
                self.hg("push", "--new-branch")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   467
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   468
                with acceptableerrors("creates new branches"):
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   469
                    self.hg("push")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
   470
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   471
    # Section: Simple side effect free "check" operations
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   472
    @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   473
    def log(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   474
        self.hg("log")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   475
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   476
    @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   477
    def verify(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   478
        self.hg("verify")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   479
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   480
    @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   481
    def diff(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   482
        self.hg("diff", "--nodates")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   483
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   484
    @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   485
    def status(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   486
        self.hg("status")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   487
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   488
    @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   489
    def export(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   490
        self.hg("export")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   491
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   492
    # Section: Branch management
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   493
    @rule()
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   494
    def checkbranch(self):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   495
        self.hg("branch")
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   496
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   497
    @rule(branch=branches)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   498
    def switchbranch(self, branch):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   499
        with acceptableerrors(
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   500
            'cannot use an integer as a name',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   501
            'cannot be used in a name',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   502
            'a branch of the same name already exists',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   503
            'is reserved',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   504
        ):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   505
            self.hg("branch", "--", branch)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   506
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   507
    @rule(branch=branches, clean=st.booleans())
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   508
    def update(self, branch, clean):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   509
        with acceptableerrors(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   510
            'unknown revision', 'parse error',
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   511
        ):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   512
            if clean:
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   513
                self.hg("update", "-C", "--", branch)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   514
            else:
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   515
                self.hg("update", "--", branch)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
   516
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   517
    # Section: Extension management
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   518
    def hasextension(self, extension):
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   519
        return extensionconfigkey(extension) in self.config
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   520
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   521
    def commandused(self, extension):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   522
        assert extension in self.all_extensions
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   523
        self.non_skippable_extensions.add(extension)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   524
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   525
    @rule(extension=extensions)
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   526
    def addextension(self, extension):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   527
        self.all_extensions.add(extension)
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   528
        self.config[extensionconfigkey(extension)] = ""
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   529
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   530
    @rule(extension=extensions)
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   531
    def removeextension(self, extension):
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   532
        self.config.pop(extensionconfigkey(extension), None)
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   533
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   534
    # Section: Commands from the shelve extension
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   535
    @rule()
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   536
    @precondition(lambda self: self.hasextension("shelve"))
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   537
    def shelve(self):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   538
        self.commandused("shelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   539
        with acceptableerrors("nothing changed"):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   540
            self.hg("shelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   541
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   542
    @rule()
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   543
    @precondition(lambda self: self.hasextension("shelve"))
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   544
    def unshelve(self):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   545
        self.commandused("shelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   546
        with acceptableerrors("no shelved changes to apply"):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   547
            self.hg("unshelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
   548
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   549
28259
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   550
class writeonlydatabase(ExampleDatabase):
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   551
    def __init__(self, underlying):
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   552
        super(ExampleDatabase, self).__init__()
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   553
        self.underlying = underlying
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   554
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   555
    def fetch(self, key):
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   556
        return ()
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   557
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   558
    def save(self, key, value):
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   559
        self.underlying.save(key, value)
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   560
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   561
    def delete(self, key, value):
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   562
        self.underlying.delete(key, value)
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   563
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   564
    def close(self):
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   565
        self.underlying.close()
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   566
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   567
28279
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   568
def extensionconfigkey(extension):
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   569
    return "extensions." + extension
c1fbc92d6238 testing: allow Hypothesis tests to disable extensions
David R. MacIver <david@drmaciver.com>
parents: 28259
diff changeset
   570
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   571
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   572
settings.register_profile(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   573
    'default', settings(timeout=300, stateful_step_count=50, max_examples=10,)
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   574
)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   575
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   576
settings.register_profile(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   577
    'fast',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   578
    settings(
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   579
        timeout=10,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   580
        stateful_step_count=20,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   581
        max_examples=5,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   582
        min_satisfying_examples=1,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   583
        max_shrinks=0,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   584
    ),
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   585
)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   586
28259
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   587
settings.register_profile(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   588
    'continuous',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   589
    settings(
28259
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   590
        timeout=-1,
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   591
        stateful_step_count=1000,
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   592
        max_examples=10 ** 8,
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   593
        max_iterations=10 ** 8,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   594
        database=writeonlydatabase(settings.default.database),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 28499
diff changeset
   595
    ),
28259
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   596
)
7829d0ba7459 testing: add a 'continuous' profile
David R. MacIver <david@drmaciver.com>
parents: 28258
diff changeset
   597
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   598
settings.load_profile(os.getenv('HYPOTHESIS_PROFILE', 'default'))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   599
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   600
verifyingtest = verifyingstatemachine.TestCase
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   601
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   602
verifyingtest.settings = settings.default
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   603
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   604
if __name__ == '__main__':
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   605
    try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   606
        silenttestrunner.main(__name__)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   607
    finally:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   608
        # So as to prevent proliferation of useless test files, if we never
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   609
        # actually wrote a failing test we clean up after ourselves and delete
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   610
        # the file for doing so that we owned.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   611
        if os.path.exists(savefile) and os.path.getsize(savefile) == 0:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
   612
            os.unlink(savefile)