view contrib/python-zstandard/tests/test_data_structures_fuzzing.py @ 50329:3dbc7b1ecaba stable

typing: correct the signature of error.CommandError There's a place in `mercurial.dispatch._parse()` that passes None if a parse error happens before the command can be parsed out, and casting the error to bytes works fine because the command and message fields are apparently ignored. Likewise, TortoiseHg similarly passes None for the same reason.
author Matt Harbison <matt_harbison@yahoo.com>
date Fri, 24 Mar 2023 02:22:12 -0400
parents 5e84a96d865b
children
line wrap: on
line source

import io
import os
import sys
import unittest

try:
    import hypothesis
    import hypothesis.strategies as strategies
except ImportError:
    raise unittest.SkipTest("hypothesis not available")

import zstandard as zstd

from .common import (
    make_cffi,
    TestCase,
)


s_windowlog = strategies.integers(
    min_value=zstd.WINDOWLOG_MIN, max_value=zstd.WINDOWLOG_MAX
)
s_chainlog = strategies.integers(
    min_value=zstd.CHAINLOG_MIN, max_value=zstd.CHAINLOG_MAX
)
s_hashlog = strategies.integers(
    min_value=zstd.HASHLOG_MIN, max_value=zstd.HASHLOG_MAX
)
s_searchlog = strategies.integers(
    min_value=zstd.SEARCHLOG_MIN, max_value=zstd.SEARCHLOG_MAX
)
s_minmatch = strategies.integers(
    min_value=zstd.MINMATCH_MIN, max_value=zstd.MINMATCH_MAX
)
s_targetlength = strategies.integers(
    min_value=zstd.TARGETLENGTH_MIN, max_value=zstd.TARGETLENGTH_MAX
)
s_strategy = strategies.sampled_from(
    (
        zstd.STRATEGY_FAST,
        zstd.STRATEGY_DFAST,
        zstd.STRATEGY_GREEDY,
        zstd.STRATEGY_LAZY,
        zstd.STRATEGY_LAZY2,
        zstd.STRATEGY_BTLAZY2,
        zstd.STRATEGY_BTOPT,
        zstd.STRATEGY_BTULTRA,
        zstd.STRATEGY_BTULTRA2,
    )
)


@make_cffi
@unittest.skipUnless("ZSTD_SLOW_TESTS" in os.environ, "ZSTD_SLOW_TESTS not set")
class TestCompressionParametersHypothesis(TestCase):
    @hypothesis.given(
        s_windowlog,
        s_chainlog,
        s_hashlog,
        s_searchlog,
        s_minmatch,
        s_targetlength,
        s_strategy,
    )
    def test_valid_init(
        self,
        windowlog,
        chainlog,
        hashlog,
        searchlog,
        minmatch,
        targetlength,
        strategy,
    ):
        zstd.ZstdCompressionParameters(
            window_log=windowlog,
            chain_log=chainlog,
            hash_log=hashlog,
            search_log=searchlog,
            min_match=minmatch,
            target_length=targetlength,
            strategy=strategy,
        )

    @hypothesis.given(
        s_windowlog,
        s_chainlog,
        s_hashlog,
        s_searchlog,
        s_minmatch,
        s_targetlength,
        s_strategy,
    )
    def test_estimated_compression_context_size(
        self,
        windowlog,
        chainlog,
        hashlog,
        searchlog,
        minmatch,
        targetlength,
        strategy,
    ):
        if minmatch == zstd.MINMATCH_MIN and strategy in (
            zstd.STRATEGY_FAST,
            zstd.STRATEGY_GREEDY,
        ):
            minmatch += 1
        elif minmatch == zstd.MINMATCH_MAX and strategy != zstd.STRATEGY_FAST:
            minmatch -= 1

        p = zstd.ZstdCompressionParameters(
            window_log=windowlog,
            chain_log=chainlog,
            hash_log=hashlog,
            search_log=searchlog,
            min_match=minmatch,
            target_length=targetlength,
            strategy=strategy,
        )
        size = p.estimated_compression_context_size()