1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2025-03-10 06:03:38 +00:00

fix ChunkerParams validator and tests

(cherry picked from commit 6d38530ff1)
This commit is contained in:
Thomas Waldmann 2023-04-12 01:15:46 +02:00 committed by Sasha Boginsky
parent d1ddd57eaf
commit 067e36bccc
2 changed files with 20 additions and 14 deletions

View file

@ -98,7 +98,7 @@ def ChunkerParams(s):
params = s.strip().split(',')
count = len(params)
if count == 0:
raise ValueError('no chunker params given')
raise argparse.ArgumentTypeError('no chunker params given')
algo = params[0].lower()
if algo == CH_FIXED and 2 <= count <= 3: # fixed, block_size[, header_size]
block_size = int(params[1])
@ -109,9 +109,11 @@ def ChunkerParams(s):
# or in-memory chunk management.
# choose the block (chunk) size wisely: if you have a lot of data and you cut
# it into very small chunks, you are asking for trouble!
raise ValueError('block_size must not be less than 64 Bytes')
raise argparse.ArgumentTypeError('block_size must not be less than 64 Bytes')
if block_size > MAX_DATA_SIZE or header_size > MAX_DATA_SIZE:
raise ValueError('block_size and header_size must not exceed MAX_DATA_SIZE [%d]' % MAX_DATA_SIZE)
raise argparse.ArgumentTypeError(
'block_size and header_size must not exceed MAX_DATA_SIZE [%d]' % MAX_DATA_SIZE
)
return algo, block_size, header_size
if algo == 'default' and count == 1: # default
return CHUNKER_PARAMS
@ -119,14 +121,18 @@ def ChunkerParams(s):
if algo == CH_BUZHASH and count == 5 or count == 4: # [buzhash, ]chunk_min, chunk_max, chunk_mask, window_size
chunk_min, chunk_max, chunk_mask, window_size = (int(p) for p in params[count - 4:])
if not (chunk_min <= chunk_mask <= chunk_max):
raise ValueError('required: chunk_min <= chunk_mask <= chunk_max')
raise argparse.ArgumentTypeError('required: chunk_min <= chunk_mask <= chunk_max')
if chunk_min < 6:
# see comment in 'fixed' algo check
raise ValueError('min. chunk size exponent must not be less than 6 (2^6 = 64B min. chunk size)')
raise argparse.ArgumentTypeError(
'min. chunk size exponent must not be less than 6 (2^6 = 64B min. chunk size)'
)
if chunk_max > 23:
raise ValueError('max. chunk size exponent must not be more than 23 (2^23 = 8MiB max. chunk size)')
raise argparse.ArgumentTypeError(
'max. chunk size exponent must not be more than 23 (2^23 = 8MiB max. chunk size)'
)
return CH_BUZHASH, chunk_min, chunk_max, chunk_mask, window_size
raise ValueError('invalid chunker params')
raise argparse.ArgumentTypeError('invalid chunker params')
def FilesCacheMode(s):

View file

@ -348,19 +348,19 @@ def test_chunkerparams():
assert ChunkerParams('fixed,4096') == ('fixed', 4096, 0)
assert ChunkerParams('fixed,4096,200') == ('fixed', 4096, 200)
# invalid values checking
with pytest.raises(ValueError):
with pytest.raises(ArgumentTypeError):
ChunkerParams('crap,1,2,3,4') # invalid algo
with pytest.raises(ValueError):
with pytest.raises(ArgumentTypeError):
ChunkerParams('buzhash,5,7,6,4095') # too small min. size
with pytest.raises(ValueError):
with pytest.raises(ArgumentTypeError):
ChunkerParams('buzhash,19,24,21,4095') # too big max. size
with pytest.raises(ValueError):
with pytest.raises(ArgumentTypeError):
ChunkerParams('buzhash,23,19,21,4095') # violates min <= mask <= max
with pytest.raises(ValueError):
with pytest.raises(ArgumentTypeError):
ChunkerParams('fixed,63') # too small block size
with pytest.raises(ValueError):
with pytest.raises(ArgumentTypeError):
ChunkerParams('fixed,%d,%d' % (MAX_DATA_SIZE + 1, 4096)) # too big block size
with pytest.raises(ValueError):
with pytest.raises(ArgumentTypeError):
ChunkerParams('fixed,%d,%d' % (4096, MAX_DATA_SIZE + 1)) # too big header size