annotate tests/test-verify-repo-operations.py @ 28259:7829d0ba7459

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