##// END OF EJS Templates
testing: allow Hypothesis tests to disable extensions...
David R. MacIver -
r28279:c1fbc92d default
parent child Browse files
Show More
@@ -97,6 +97,8 b' safetext = st.text(st.characters('
97 lambda s: s.encode('utf-8')
97 lambda s: s.encode('utf-8')
98 )
98 )
99
99
100 extensions = st.sampled_from(('shelve', 'mq', 'blackbox',))
101
100 @contextmanager
102 @contextmanager
101 def acceptableerrors(*args):
103 def acceptableerrors(*args):
102 """Sometimes we know an operation we're about to perform might fail, and
104 """Sometimes we know an operation we're about to perform might fail, and
@@ -151,15 +153,15 b' class verifyingstatemachine(RuleBasedSta'
151 os.chdir(testtmp)
153 os.chdir(testtmp)
152 self.log = []
154 self.log = []
153 self.failed = False
155 self.failed = False
156 self.configperrepo = {}
157 self.all_extensions = set()
158 self.non_skippable_extensions = set()
154
159
155 self.mkdirp("repos")
160 self.mkdirp("repos")
156 self.cd("repos")
161 self.cd("repos")
157 self.mkdirp("repo1")
162 self.mkdirp("repo1")
158 self.cd("repo1")
163 self.cd("repo1")
159 self.hg("init")
164 self.hg("init")
160 self.extensions = {}
161 self.all_extensions = set()
162 self.non_skippable_extensions = set()
163
165
164 def teardown(self):
166 def teardown(self):
165 """On teardown we clean up after ourselves as usual, but we also
167 """On teardown we clean up after ourselves as usual, but we also
@@ -190,29 +192,32 b' class verifyingstatemachine(RuleBasedSta'
190 e = None
192 e = None
191 if not self.failed:
193 if not self.failed:
192 try:
194 try:
193 for ext in (
194 self.all_extensions - self.non_skippable_extensions
195 ):
196 try:
197 os.environ["SKIP_EXTENSION"] = ext
198 output = subprocess.check_output([
199 runtests, path, "--local",
200 ], stderr=subprocess.STDOUT)
201 assert "Ran 1 test" in output, output
202 finally:
203 del os.environ["SKIP_EXTENSION"]
204 output = subprocess.check_output([
195 output = subprocess.check_output([
205 runtests, path, "--local", "--pure"
196 runtests, path, "--local", "--pure"
206 ], stderr=subprocess.STDOUT)
197 ], stderr=subprocess.STDOUT)
207 assert "Ran 1 test" in output, output
198 assert "Ran 1 test" in output, output
199 for ext in (
200 self.all_extensions - self.non_skippable_extensions
201 ):
202 tf = os.path.join(testtmp, "test-generated-no-%s.t" % (
203 ext,
204 ))
205 with open(tf, 'w') as o:
206 for l in ttest.splitlines():
207 if l.startswith(" $ hg"):
208 l = l.replace(
209 "--config %s=" % (
210 extensionconfigkey(ext),), "")
211 o.write(l + os.linesep)
212 with open(tf, 'r') as r:
213 t = r.read()
214 assert ext not in t, t
215 output = subprocess.check_output([
216 runtests, tf, "--local",
217 ], stderr=subprocess.STDOUT)
218 assert "Ran 1 test" in output, output
208 except subprocess.CalledProcessError as e:
219 except subprocess.CalledProcessError as e:
209 note(e.output)
220 note(e.output)
210 finally:
211 os.unlink(path)
212 try:
213 os.unlink(path + ".err")
214 except OSError:
215 pass
216 if self.failed or e is not None:
221 if self.failed or e is not None:
217 with open(savefile, "wb") as o:
222 with open(savefile, "wb") as o:
218 o.write(ttest)
223 o.write(ttest)
@@ -244,7 +249,11 b' class verifyingstatemachine(RuleBasedSta'
244 self.log.append("$ cd -- %s" % (pipes.quote(path),))
249 self.log.append("$ cd -- %s" % (pipes.quote(path),))
245
250
246 def hg(self, *args):
251 def hg(self, *args):
247 self.command("hg", *args)
252 extra_flags = []
253 for key, value in self.config.items():
254 extra_flags.append("--config")
255 extra_flags.append("%s=%s" % (key, value))
256 self.command("hg", *(tuple(extra_flags) + args))
248
257
249 def command(self, *args):
258 def command(self, *args):
250 self.log.append("$ " + ' '.join(map(pipes.quote, args)))
259 self.log.append("$ " + ' '.join(map(pipes.quote, args)))
@@ -384,6 +393,10 b' class verifyingstatemachine(RuleBasedSta'
384 def currentrepo(self):
393 def currentrepo(self):
385 return os.path.basename(os.getcwd())
394 return os.path.basename(os.getcwd())
386
395
396 @property
397 def config(self):
398 return self.configperrepo.setdefault(self.currentrepo, {})
399
387 @rule(
400 @rule(
388 target=repos,
401 target=repos,
389 source=repos,
402 source=repos,
@@ -489,32 +502,20 b' class verifyingstatemachine(RuleBasedSta'
489
502
490 # Section: Extension management
503 # Section: Extension management
491 def hasextension(self, extension):
504 def hasextension(self, extension):
492 repo = self.currentrepo
505 return extensionconfigkey(extension) in self.config
493 return repo in self.extensions and extension in self.extensions[repo]
494
506
495 def commandused(self, extension):
507 def commandused(self, extension):
496 assert extension in self.all_extensions
508 assert extension in self.all_extensions
497 self.non_skippable_extensions.add(extension)
509 self.non_skippable_extensions.add(extension)
498
510
499 @rule(extension=st.sampled_from((
511 @rule(extension=extensions)
500 'shelve', 'mq', 'blackbox',
501 )))
502 def addextension(self, extension):
512 def addextension(self, extension):
503 self.all_extensions.add(extension)
513 self.all_extensions.add(extension)
504 extensions = self.extensions.setdefault(self.currentrepo, set())
514 self.config[extensionconfigkey(extension)] = ""
505 if extension in extensions:
515
506 return
516 @rule(extension=extensions)
507 extensions.add(extension)
517 def removeextension(self, extension):
508 if not os.path.exists(hgrc):
518 self.config.pop(extensionconfigkey(extension), None)
509 self.command("touch", hgrc)
510 with open(hgrc, 'a') as o:
511 line = "[extensions]\n%s=\n" % (extension,)
512 o.write(line)
513 for l in line.splitlines():
514 self.log.append((
515 '$ if test "$SKIP_EXTENSION" != "%s" ; '
516 'then echo %r >> %s; fi') % (
517 extension, l, hgrc,))
518
519
519 # Section: Commands from the shelve extension
520 # Section: Commands from the shelve extension
520 @rule()
521 @rule()
@@ -548,6 +549,9 b' class writeonlydatabase(ExampleDatabase)'
548 def close(self):
549 def close(self):
549 self.underlying.close()
550 self.underlying.close()
550
551
552 def extensionconfigkey(extension):
553 return "extensions." + extension
554
551 settings.register_profile(
555 settings.register_profile(
552 'default', settings(
556 'default', settings(
553 timeout=300,
557 timeout=300,
General Comments 0
You need to be logged in to leave comments. Login now