mirror of
https://github.com/facebook/sapling.git
synced 2024-10-12 17:58:27 +03:00
9dc21f8d0b
Summary: D13853115 adds `edenscm/` to `sys.path` and code still uses `import mercurial`. That has nasty problems if both `import mercurial` and `import edenscm.mercurial` are used, because Python would think `mercurial.foo` and `edenscm.mercurial.foo` are different modules so code like `try: ... except mercurial.error.Foo: ...`, or `isinstance(x, mercurial.foo.Bar)` would fail to handle the `edenscm.mercurial` version. There are also some module-level states (ex. `extensions._extensions`) that would cause trouble if they have multiple versions in a single process. Change imports to use the `edenscm` so ideally the `mercurial` is no longer imported at all. Add checks in extensions.py to catch unexpected extensions importing modules from the old (wrong) locations when running tests. Reviewed By: phillco Differential Revision: D13868981 fbshipit-source-id: f4e2513766957fd81d85407994f7521a08e4de48
105 lines
2.1 KiB
Python
105 lines
2.1 KiB
Python
# Randomized torture test generation for bdiff
|
|
|
|
from __future__ import absolute_import, print_function
|
|
|
|
import random
|
|
import sys
|
|
|
|
from edenscm.mercurial import mdiff
|
|
|
|
|
|
if sys.version_info.major >= 3:
|
|
xrange = range
|
|
|
|
|
|
def reducetest(a, b):
|
|
tries = 0
|
|
reductions = 0
|
|
print("reducing...")
|
|
while tries < 1000:
|
|
a2 = "\n".join(l for l in a.splitlines() if random.randint(0, 100) > 0) + "\n"
|
|
b2 = "\n".join(l for l in b.splitlines() if random.randint(0, 100) > 0) + "\n"
|
|
if a2 == a and b2 == b:
|
|
continue
|
|
if a2 == b2:
|
|
continue
|
|
tries += 1
|
|
|
|
try:
|
|
test1(a, b)
|
|
except Exception as inst:
|
|
reductions += 1
|
|
tries = 0
|
|
a = a2
|
|
b = b2
|
|
|
|
print("reduced:", reductions, len(a) + len(b), repr(a), repr(b))
|
|
try:
|
|
test1(a, b)
|
|
except Exception as inst:
|
|
print("failed:", inst)
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
def test1(a, b):
|
|
d = mdiff.textdiff(a, b)
|
|
if not d:
|
|
raise ValueError("empty")
|
|
c = mdiff.patches(a, [d])
|
|
if c != b:
|
|
raise ValueError("bad")
|
|
|
|
|
|
def testwrap(a, b):
|
|
try:
|
|
test1(a, b)
|
|
return
|
|
except Exception as inst:
|
|
print("exception:", inst)
|
|
reducetest(a, b)
|
|
|
|
|
|
def test(a, b):
|
|
testwrap(a, b)
|
|
testwrap(b, a)
|
|
|
|
|
|
def rndtest(size, noise):
|
|
a = []
|
|
src = " aaaaaaaabbbbccd"
|
|
for x in xrange(size):
|
|
a.append(src[random.randint(0, len(src) - 1)])
|
|
|
|
while True:
|
|
b = [c for c in a if random.randint(0, 99) > noise]
|
|
b2 = []
|
|
for c in b:
|
|
b2.append(c)
|
|
while random.randint(0, 99) < noise:
|
|
b2.append(src[random.randint(0, len(src) - 1)])
|
|
if b2 != a:
|
|
break
|
|
|
|
a = "\n".join(a) + "\n"
|
|
b = "\n".join(b2) + "\n"
|
|
|
|
test(a, b)
|
|
|
|
|
|
maxvol = 10000
|
|
startsize = 2
|
|
while True:
|
|
size = startsize
|
|
count = 0
|
|
while size < maxvol:
|
|
print(size)
|
|
volume = 0
|
|
while volume < maxvol:
|
|
rndtest(size, 2)
|
|
volume += size
|
|
count += 2
|
|
size *= 2
|
|
maxvol *= 4
|
|
startsize *= 4
|