from io import BytesIO

from .chunker_test import cf
from ..chunker import Chunker
from ..crypto.low_level import blake2b_256
from ..constants import *  # NOQA
from ..helpers import hex_to_bin


def test_chunkpoints_unchanged():
    def twist(size):
        x = 1
        a = bytearray(size)
        for i in range(size):
            x = (x * 1103515245 + 12345) & 0x7FFFFFFF
            a[i] = x & 0xFF
        return a

    data = twist(100000)

    runs = []
    for winsize in (65, 129, HASH_WINDOW_SIZE, 7351):
        for minexp in (4, 6, 7, 11, 12):
            for maxexp in (15, 17):
                if minexp >= maxexp:
                    continue
                for maskbits in (4, 7, 10, 12):
                    for seed in (1849058162, 1234567653):
                        fh = BytesIO(data)
                        chunker = Chunker(seed, minexp, maxexp, maskbits, winsize)
                        chunks = [blake2b_256(b"", c) for c in cf(chunker.chunkify(fh, -1))]
                        runs.append(blake2b_256(b"", b"".join(chunks)))

    # The "correct" hash below matches the existing chunker behavior.
    # Future chunker optimisations must not change this, or existing repos will bloat.
    overall_hash = blake2b_256(b"", b"".join(runs))
    assert overall_hash == hex_to_bin("b559b0ac8df8daaa221201d018815114241ea5c6609d98913cd2246a702af4e3")
