mirror of
https://github.com/facebook/sapling.git
synced 2024-12-29 08:02:24 +03:00
ab3a7cb21f
Summary: In preparation for merging fb-mercurial sources to the Eden repository, move everything from the top-level directory into an `eden/scm` subdirectory.
115 lines
2.5 KiB
Python
115 lines
2.5 KiB
Python
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
|
#
|
|
# This software may be used and distributed according to the terms of the
|
|
# GNU General Public License version 2.
|
|
|
|
# Copyright Matt Mackall <mpm@selenic.com> and others
|
|
#
|
|
# This software may be used and distributed according to the terms of the
|
|
# GNU General Public License version 2 or any later version.
|
|
|
|
# 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
|