annotate tests/test-verify-repo-operations.py @ 28258:fc7ee50a0d65

testing: allow Hypothesis to enable extensions This adds support for testing extensions, including both tests that extensions don't change behaviour and test for specific commands. We use the precondition system to determine what commands are available to us. If we never use any commands enabled by an extension then that extension is *skippable* and should not have changed the behaviour of the test. We thus rerun the test with an environment variable which is designed to turn off the extension.
author David R. MacIver <david@drmaciver.com>
date Wed, 24 Feb 2016 13:11:30 +0000
parents 7ff725db2fdf
children 7829d0ba7459
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
10 import sys
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
11
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
12 # 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
13 # Running 'pip install hypothesis pytz' will achieve that.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
14 # 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
15 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
16 from hypothesis.extra.datetime import datetimes
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
17 except ImportError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
18 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
19 sys.exit(80)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
20
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
21 # 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
22 # 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
23 # fix this problem.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
24 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
25 import enum
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
26 assert enum # Silence pyflakes
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
27 except ImportError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
28 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
29 sys.exit(80)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
30
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
31 import binascii
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
32 from contextlib import contextmanager
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
33 import errno
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
34 import pipes
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
35 import shutil
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
36 import silenttestrunner
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
37 import subprocess
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
38
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
39 from hypothesis.errors import HypothesisException
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
40 from hypothesis.stateful import (
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
41 rule, RuleBasedStateMachine, Bundle, precondition)
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
42 from hypothesis import settings, note, strategies as st
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
43 from hypothesis.configuration import set_hypothesis_home_dir
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 testdir = os.path.abspath(os.environ["TESTDIR"])
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
46
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
47 # 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
48 # 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
49 # 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
50 # but is useful to have for development.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
51 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
52
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
53 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
54 testtmp = os.environ["TESTTMP"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
55 assert os.path.isdir(testtmp)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
56
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
57 generatedtests = os.path.join(testdir, "hypothesis-generated")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
58
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
59 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
60 os.makedirs(generatedtests)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
61 except OSError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
62 pass
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 # 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
65 # 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
66 # 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
67 # 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
68 # name.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
69 file_index = 0
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
70 while True:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
71 file_index += 1
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
72 savefile = os.path.join(generatedtests, "test-generated-%d.t" % (
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
73 file_index,
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 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
76 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
77 break
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
78 except OSError as e:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
79 if e.errno != errno.EEXIST:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
80 raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
81 assert os.path.exists(savefile)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
82
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
83 hgrc = os.path.join(".hg", "hgrc")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
84
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
85 filecharacters = (
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
86 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
87 "[]^_`;=@{}~ !#$%&'()+,-"
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
88 )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
89
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
90 files = st.text(filecharacters, min_size=1).map(lambda x: x.strip()).filter(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
91 bool).map(lambda s: s.encode('ascii'))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
92
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
93 safetext = st.text(st.characters(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
94 min_codepoint=1, max_codepoint=127,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
95 blacklist_categories=('Cc', 'Cs')), min_size=1).map(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
96 lambda s: s.encode('utf-8')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
97 )
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 @contextmanager
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
100 def acceptableerrors(*args):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
101 """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
102 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
103 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
104 substrings of the error message Mercurial emits."""
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
105 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
106 yield
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
107 except subprocess.CalledProcessError as e:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
108 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
109 note(e.output)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
110 raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
111
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
112 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
113 lambda s: s.encode('ascii')
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
114 )
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
115
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
116 class verifyingstatemachine(RuleBasedStateMachine):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
117 """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
118 using Hypothesis's RuleBasedStateMachine.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
119
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
120 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
121 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
122 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
123 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
124
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
125 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
126 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
127 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
128 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
129 .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
130 exhibit that failure.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
131
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
132 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
133 Hypothesis documentation at
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
134 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
135 details."""
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
136
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
137 # 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
138 # 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
139 repos = Bundle('repos')
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
140 paths = Bundle('paths')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
141 contents = Bundle('contents')
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
142 branches = Bundle('branches')
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
143 committimes = Bundle('committimes')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
144
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
145 def __init__(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
146 super(verifyingstatemachine, self).__init__()
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
147 self.repodir = os.path.join(testtmp, "repos")
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
148 if os.path.exists(self.repodir):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
149 shutil.rmtree(self.repodir)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
150 os.chdir(testtmp)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
151 self.log = []
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
152 self.failed = False
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
153
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
154 self.mkdirp("repos")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
155 self.cd("repos")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
156 self.mkdirp("repo1")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
157 self.cd("repo1")
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
158 self.hg("init")
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
159 self.extensions = {}
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
160 self.all_extensions = set()
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
161 self.non_skippable_extensions = set()
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
162
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
163 def teardown(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
164 """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
165 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
166 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
167
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
168 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
169 each passes the same test."""
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
170 super(verifyingstatemachine, self).teardown()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
171 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
172 shutil.rmtree(self.repodir)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
173 except OSError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
174 pass
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
175 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
176 os.chdir(testtmp)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
177 path = os.path.join(testtmp, "test-generated.t")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
178 with open(path, 'w') as o:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
179 o.write(ttest + os.linesep)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
180 with open(os.devnull, "w") as devnull:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
181 rewriter = subprocess.Popen(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
182 [runtests, "--local", "-i", path], stdin=subprocess.PIPE,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
183 stdout=devnull, stderr=devnull,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
184 )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
185 rewriter.communicate("yes")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
186 with open(path, 'r') as i:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
187 ttest = i.read()
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 e = None
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
190 if not self.failed:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
191 try:
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
192 for ext in (
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
193 self.all_extensions - self.non_skippable_extensions
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
194 ):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
195 try:
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
196 os.environ["SKIP_EXTENSION"] = ext
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
197 output = subprocess.check_output([
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
198 runtests, path, "--local",
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
199 ], stderr=subprocess.STDOUT)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
200 assert "Ran 1 test" in output, output
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
201 finally:
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
202 del os.environ["SKIP_EXTENSION"]
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
203 output = subprocess.check_output([
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
204 runtests, path, "--local", "--pure"
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
205 ], stderr=subprocess.STDOUT)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
206 assert "Ran 1 test" in output, output
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
207 except subprocess.CalledProcessError as e:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
208 note(e.output)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
209 finally:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
210 os.unlink(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
211 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
212 os.unlink(path + ".err")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
213 except OSError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
214 pass
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
215 if self.failed or e is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
216 with open(savefile, "wb") as o:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
217 o.write(ttest)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
218 if e is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
219 raise e
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
220
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
221 def execute_step(self, step):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
222 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
223 return super(verifyingstatemachine, self).execute_step(step)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
224 except (HypothesisException, KeyboardInterrupt):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
225 raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
226 except Exception:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
227 self.failed = True
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
228 raise
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
229
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
230 # Section: Basic commands.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
231 def mkdirp(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
232 if os.path.exists(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
233 return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
234 self.log.append(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
235 "$ mkdir -p -- %s" % (pipes.quote(os.path.relpath(path)),))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
236 os.makedirs(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
237
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
238 def cd(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
239 path = os.path.relpath(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
240 if path == ".":
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
241 return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
242 os.chdir(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
243 self.log.append("$ cd -- %s" % (pipes.quote(path),))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
244
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
245 def hg(self, *args):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
246 self.command("hg", *args)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
247
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
248 def command(self, *args):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
249 self.log.append("$ " + ' '.join(map(pipes.quote, args)))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
250 subprocess.check_output(args, stderr=subprocess.STDOUT)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
251
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
252 # Section: Set up basic data
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
253 # 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
254 # to use later.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
255 @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
256 target=paths,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
257 source=st.lists(files, min_size=1).map(lambda l: os.path.join(*l)))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
258 def genpath(self, source):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
259 return source
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
260
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
261 @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
262 target=committimes,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
263 when=datetimes(min_year=1970, max_year=2038) | st.none())
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
264 def gentime(self, when):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
265 return when
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
266
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
267 @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
268 target=contents,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
269 content=st.one_of(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
270 st.binary(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
271 st.text().map(lambda x: x.encode('utf-8'))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
272 ))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
273 def gencontent(self, content):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
274 return content
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
275
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
276 @rule(
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
277 target=branches,
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
278 name=safetext,
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
279 )
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
280 def genbranch(self, name):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
281 return name
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
282
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
283 @rule(target=paths, source=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
284 def lowerpath(self, source):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
285 return source.lower()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
286
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
287 @rule(target=paths, source=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
288 def upperpath(self, source):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
289 return source.upper()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
290
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
291 # Section: Basic path operations
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
292 @rule(path=paths, content=contents)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
293 def writecontent(self, path, content):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
294 self.unadded_changes = True
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
295 if os.path.isdir(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
296 return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
297 parent = os.path.dirname(path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
298 if parent:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
299 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
300 self.mkdirp(parent)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
301 except OSError:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
302 # 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
303 # 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
304 # 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
305 # 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
306 return
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
307 with open(path, 'wb') as o:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
308 o.write(content)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
309 self.log.append((
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
310 "$ python -c 'import binascii; "
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
311 "print(binascii.unhexlify(\"%s\"))' > %s") % (
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
312 binascii.hexlify(content),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
313 pipes.quote(path),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
314 ))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
315
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
316 @rule(path=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
317 def addpath(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
318 if os.path.exists(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
319 self.hg("add", "--", path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
320
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
321 @rule(path=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
322 def forgetpath(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
323 if os.path.exists(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
324 with acceptableerrors(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
325 "file is already untracked",
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
326 ):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
327 self.hg("forget", "--", path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
328
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
329 @rule(s=st.none() | st.integers(0, 100))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
330 def addremove(self, s):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
331 args = ["addremove"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
332 if s is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
333 args.extend(["-s", str(s)])
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
334 self.hg(*args)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
335
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
336 @rule(path=paths)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
337 def removepath(self, path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
338 if os.path.exists(path):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
339 with acceptableerrors(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
340 'file is untracked',
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
341 'file has been marked for add',
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
342 'file is modified',
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
343 ):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
344 self.hg("remove", "--", path)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
345
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
346 @rule(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
347 message=safetext,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
348 amend=st.booleans(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
349 when=committimes,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
350 addremove=st.booleans(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
351 secret=st.booleans(),
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
352 close_branch=st.booleans(),
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 def maybecommit(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
355 self, message, amend, when, addremove, secret, close_branch
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
356 ):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
357 command = ["commit"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
358 errors = ["nothing changed"]
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
359 if amend:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
360 errors.append("cannot amend public changesets")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
361 command.append("--amend")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
362 command.append("-m" + pipes.quote(message))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
363 if secret:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
364 command.append("--secret")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
365 if close_branch:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
366 command.append("--close-branch")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
367 errors.append("can only close branch heads")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
368 if addremove:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
369 command.append("--addremove")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
370 if when is not None:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
371 if when.year == 1970:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
372 errors.append('negative date value')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
373 if when.year == 2038:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
374 errors.append('exceeds 32 bits')
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
375 command.append("--date=%s" % (
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
376 when.strftime('%Y-%m-%d %H:%M:%S %z'),))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
377
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
378 with acceptableerrors(*errors):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
379 self.hg(*command)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
380
28257
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
381 # Section: Repository management
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
382 @property
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
383 def currentrepo(self):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
384 return os.path.basename(os.getcwd())
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
385
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
386 @rule(
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
387 target=repos,
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
388 source=repos,
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
389 name=reponames,
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
390 )
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
391 def clone(self, source, name):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
392 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
393 self.cd("..")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
394 self.hg("clone", source, name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
395 self.cd(name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
396 return name
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
397
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
398 @rule(
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
399 target=repos,
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
400 name=reponames,
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
401 )
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
402 def fresh(self, name):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
403 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
404 self.cd("..")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
405 self.mkdirp(name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
406 self.cd(name)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
407 self.hg("init")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
408 return name
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
409
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
410 @rule(name=repos)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
411 def switch(self, name):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
412 self.cd(os.path.join("..", name))
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
413 assert self.currentrepo == name
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
414 assert os.path.exists(".hg")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
415
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
416 @rule(target=repos)
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
417 def origin(self):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
418 return "repo1"
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
419
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
420 @rule()
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
421 def pull(self, repo=repos):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
422 with acceptableerrors(
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
423 "repository default not found",
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
424 "repository is unrelated",
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
425 ):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
426 self.hg("pull")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
427
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
428 @rule(newbranch=st.booleans())
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
429 def push(self, newbranch):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
430 with acceptableerrors(
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
431 "default repository not configured",
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
432 "no changes found",
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
433 ):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
434 if newbranch:
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
435 self.hg("push", "--new-branch")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
436 else:
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
437 with acceptableerrors(
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
438 "creates new branches"
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
439 ):
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
440 self.hg("push")
7ff725db2fdf testing: test multiple repositories with Hypothesis
David R. MacIver <david@drmaciver.com>
parents: 28256
diff changeset
441
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
442 # Section: Simple side effect free "check" operations
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
443 @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
444 def log(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
445 self.hg("log")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
446
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
447 @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
448 def verify(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
449 self.hg("verify")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
450
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
451 @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
452 def diff(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
453 self.hg("diff", "--nodates")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
454
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
455 @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
456 def status(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
457 self.hg("status")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
458
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
459 @rule()
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
460 def export(self):
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
461 self.hg("export")
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
462
28256
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
463 # Section: Branch management
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
464 @rule()
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
465 def checkbranch(self):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
466 self.hg("branch")
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
467
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
468 @rule(branch=branches)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
469 def switchbranch(self, branch):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
470 with acceptableerrors(
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
471 '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
472 'cannot be used in a name',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
473 '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
474 'is reserved',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
475 ):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
476 self.hg("branch", "--", branch)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
477
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
478 @rule(branch=branches, clean=st.booleans())
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
479 def update(self, branch, clean):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
480 with acceptableerrors(
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
481 'unknown revision',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
482 'parse error',
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
483 ):
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
484 if clean:
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
485 self.hg("update", "-C", "--", branch)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
486 else:
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
487 self.hg("update", "--", branch)
55325bdf6c13 testing: expand Hypothesis tests with branch commands
David R. MacIver <david@drmaciver.com>
parents: 28255
diff changeset
488
28258
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
489 # Section: Extension management
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
490 def hasextension(self, extension):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
491 repo = self.currentrepo
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
492 return repo in self.extensions and extension in self.extensions[repo]
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
493
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
494 def commandused(self, extension):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
495 assert extension in self.all_extensions
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
496 self.non_skippable_extensions.add(extension)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
497
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
498 @rule(extension=st.sampled_from((
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
499 'shelve', 'mq', 'blackbox',
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
500 )))
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
501 def addextension(self, extension):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
502 self.all_extensions.add(extension)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
503 extensions = self.extensions.setdefault(self.currentrepo, set())
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
504 if extension in extensions:
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
505 return
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
506 extensions.add(extension)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
507 if not os.path.exists(hgrc):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
508 self.command("touch", hgrc)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
509 with open(hgrc, 'a') as o:
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
510 line = "[extensions]\n%s=\n" % (extension,)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
511 o.write(line)
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
512 for l in line.splitlines():
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
513 self.log.append((
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
514 '$ if test "$SKIP_EXTENSION" != "%s" ; '
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
515 'then echo %r >> %s; fi') % (
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
516 extension, l, hgrc,))
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
517
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
518 # Section: Commands from the shelve extension
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
519 @rule()
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
520 @precondition(lambda self: self.hasextension("shelve"))
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
521 def shelve(self):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
522 self.commandused("shelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
523 with acceptableerrors("nothing changed"):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
524 self.hg("shelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
525
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
526 @rule()
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
527 @precondition(lambda self: self.hasextension("shelve"))
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
528 def unshelve(self):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
529 self.commandused("shelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
530 with acceptableerrors("no shelved changes to apply"):
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
531 self.hg("unshelve")
fc7ee50a0d65 testing: allow Hypothesis to enable extensions
David R. MacIver <david@drmaciver.com>
parents: 28257
diff changeset
532
28255
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
533 settings.register_profile(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
534 'default', settings(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
535 timeout=300,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
536 stateful_step_count=50,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
537 max_examples=10,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
538 )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
539 )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
540
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
541 settings.register_profile(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
542 'fast', settings(
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
543 timeout=10,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
544 stateful_step_count=20,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
545 max_examples=5,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
546 min_satisfying_examples=1,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
547 max_shrinks=0,
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
548 )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
549 )
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
550
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
551 settings.load_profile(os.getenv('HYPOTHESIS_PROFILE', 'default'))
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
552
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
553 verifyingtest = verifyingstatemachine.TestCase
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
554
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
555 verifyingtest.settings = settings.default
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
556
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
557 if __name__ == '__main__':
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
558 try:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
559 silenttestrunner.main(__name__)
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
560 finally:
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
561 # 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
562 # 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
563 # the file for doing so that we owned.
f75f7d39cca3 testing: generate tests operations using Hypothesis
David R. MacIver <david@drmaciver.com>
parents:
diff changeset
564 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
565 os.unlink(savefile)