view contrib/bdiff-torture.py @ 50342:c54e9bb5737e stable

sslutil: set context security level for legacy tls testing (issue6760) Current versions of OpenSSL do not allow the use of TLS <1.2 when the library's security level is >=1 (1 being the default on most distributions). Setting the security level in addition to the minimum protocol is therefore necessary for the legacy protocol tests. This is done here ONLY when testing, when: - explicitly setting the cipher string, or - using the "--insecure" flag, or - using the "devel.serverexactprotocol" testing option. See: https://github.com/openssl/openssl/blob/master/NEWS.md#major-changes-between-openssl-30-and-openssl-310-14-mar-2023
author pacien <pacien.trangirard@pacien.net>
date Wed, 12 Apr 2023 17:28:39 +0200
parents 6000f5b25c9b
children
line wrap: on
line source

# Randomized torture test generation for bdiff

import random
import sys

from mercurial import (
    mdiff,
    pycompat,
)


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:
            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 pycompat.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