35 import shutil |
35 import shutil |
36 import silenttestrunner |
36 import silenttestrunner |
37 import subprocess |
37 import subprocess |
38 |
38 |
39 from hypothesis.errors import HypothesisException |
39 from hypothesis.errors import HypothesisException |
40 from hypothesis.stateful import rule, RuleBasedStateMachine, Bundle |
40 from hypothesis.stateful import ( |
|
41 rule, RuleBasedStateMachine, Bundle, precondition) |
41 from hypothesis import settings, note, strategies as st |
42 from hypothesis import settings, note, strategies as st |
42 from hypothesis.configuration import set_hypothesis_home_dir |
43 from hypothesis.configuration import set_hypothesis_home_dir |
43 |
44 |
44 testdir = os.path.abspath(os.environ["TESTDIR"]) |
45 testdir = os.path.abspath(os.environ["TESTDIR"]) |
45 |
46 |
153 self.mkdirp("repos") |
154 self.mkdirp("repos") |
154 self.cd("repos") |
155 self.cd("repos") |
155 self.mkdirp("repo1") |
156 self.mkdirp("repo1") |
156 self.cd("repo1") |
157 self.cd("repo1") |
157 self.hg("init") |
158 self.hg("init") |
|
159 self.extensions = {} |
|
160 self.all_extensions = set() |
|
161 self.non_skippable_extensions = set() |
158 |
162 |
159 def teardown(self): |
163 def teardown(self): |
160 """On teardown we clean up after ourselves as usual, but we also |
164 """On teardown we clean up after ourselves as usual, but we also |
161 do some additional testing: We generate a .t file based on our test |
165 do some additional testing: We generate a .t file based on our test |
162 run using run-test.py -i to get the correct output. |
166 run using run-test.py -i to get the correct output. |
183 ttest = i.read() |
187 ttest = i.read() |
184 |
188 |
185 e = None |
189 e = None |
186 if not self.failed: |
190 if not self.failed: |
187 try: |
191 try: |
|
192 for ext in ( |
|
193 self.all_extensions - self.non_skippable_extensions |
|
194 ): |
|
195 try: |
|
196 os.environ["SKIP_EXTENSION"] = ext |
|
197 output = subprocess.check_output([ |
|
198 runtests, path, "--local", |
|
199 ], stderr=subprocess.STDOUT) |
|
200 assert "Ran 1 test" in output, output |
|
201 finally: |
|
202 del os.environ["SKIP_EXTENSION"] |
188 output = subprocess.check_output([ |
203 output = subprocess.check_output([ |
189 runtests, path, "--local", "--pure" |
204 runtests, path, "--local", "--pure" |
190 ], stderr=subprocess.STDOUT) |
205 ], stderr=subprocess.STDOUT) |
191 assert "Ran 1 test" in output, output |
206 assert "Ran 1 test" in output, output |
192 except subprocess.CalledProcessError as e: |
207 except subprocess.CalledProcessError as e: |
469 if clean: |
484 if clean: |
470 self.hg("update", "-C", "--", branch) |
485 self.hg("update", "-C", "--", branch) |
471 else: |
486 else: |
472 self.hg("update", "--", branch) |
487 self.hg("update", "--", branch) |
473 |
488 |
|
489 # Section: Extension management |
|
490 def hasextension(self, extension): |
|
491 repo = self.currentrepo |
|
492 return repo in self.extensions and extension in self.extensions[repo] |
|
493 |
|
494 def commandused(self, extension): |
|
495 assert extension in self.all_extensions |
|
496 self.non_skippable_extensions.add(extension) |
|
497 |
|
498 @rule(extension=st.sampled_from(( |
|
499 'shelve', 'mq', 'blackbox', |
|
500 ))) |
|
501 def addextension(self, extension): |
|
502 self.all_extensions.add(extension) |
|
503 extensions = self.extensions.setdefault(self.currentrepo, set()) |
|
504 if extension in extensions: |
|
505 return |
|
506 extensions.add(extension) |
|
507 if not os.path.exists(hgrc): |
|
508 self.command("touch", hgrc) |
|
509 with open(hgrc, 'a') as o: |
|
510 line = "[extensions]\n%s=\n" % (extension,) |
|
511 o.write(line) |
|
512 for l in line.splitlines(): |
|
513 self.log.append(( |
|
514 '$ if test "$SKIP_EXTENSION" != "%s" ; ' |
|
515 'then echo %r >> %s; fi') % ( |
|
516 extension, l, hgrc,)) |
|
517 |
|
518 # Section: Commands from the shelve extension |
|
519 @rule() |
|
520 @precondition(lambda self: self.hasextension("shelve")) |
|
521 def shelve(self): |
|
522 self.commandused("shelve") |
|
523 with acceptableerrors("nothing changed"): |
|
524 self.hg("shelve") |
|
525 |
|
526 @rule() |
|
527 @precondition(lambda self: self.hasextension("shelve")) |
|
528 def unshelve(self): |
|
529 self.commandused("shelve") |
|
530 with acceptableerrors("no shelved changes to apply"): |
|
531 self.hg("unshelve") |
|
532 |
474 settings.register_profile( |
533 settings.register_profile( |
475 'default', settings( |
534 'default', settings( |
476 timeout=300, |
535 timeout=300, |
477 stateful_step_count=50, |
536 stateful_step_count=50, |
478 max_examples=10, |
537 max_examples=10, |