1
0
mirror of https://gitlab.com/bzip2/bzip2.git synced 2025-07-30 07:23:05 +03:00
Files
bzip2/tests/quick_test.py
Micah Snyder 2a22f41879 Tests: Remodel test suite; Add large test suite
Remodel test suite using Python unittests.

Add more thorough test cases for original "quick" test suite.
Add in automatic Valgrind testing for the "quick" test suite on Linux if
Valgrind was detected at build-time.

Add larger suite of assorted .bz2 test files as git submodule.

Updates to the Compiling documentation.

Increased the minimum Meson version to 0.56 because this commit uses the
`fs` module that was introduced in 0.56.

Added Python 3's `pytest` as a required module for running the tests
when using Meson.
2022-07-17 04:40:54 +00:00

132 lines
5.0 KiB
Python

#!/usr/bin/env python3
'''
basic compression/decompression tests.
'''
__copyright__ = 'Copyright (C) 2022 Micah Snyder'
from hashlib import md5
import os
from pathlib import Path
import testcase
TRY_VALGRIND = True
path_source = Path(os.getenv('PATH_SOURCE'))
def generate_test_function(*args):
'''
Generate a test with the given args.
'''
def foo(self):
self.run_test(*args)
return foo
class TC(testcase.TestCase):
def tearDown(self):
super().tearDown()
self.verify_valgrind_log()
def run_test(self, sample: Path, block_size: int = 0):
'''
Verify correct behavior when bzip2 tries to decompress the given file.
Note: block_size is only used for the compression test.
'''
if sample.suffix == '.ref':
# Try to decompress, with the expectation that it will fail, gracefully:
# - First with default settings
# - Second time using `--small` mode
# Compress. We can keep the OG file.
cmd = [str(TC.bzip2), '--compress', str(block_size), '--keep', '--stdout', str(sample)]
(ec, out, err) = self.execute(cmd, try_valgrind=TRY_VALGRIND)
# Check that bzip2 thinks it succeeded.
assert ec == 0
# Write it to a temp file
tempfile_path = TC.path_tmp / (sample.name + '.bz2')
print(f'Writing compressed {sample.name} file to disk as {tempfile_path.name}...')
with tempfile_path.open('wb') as tmpfile:
tmpfile.write(out)
# Decompress the compresed tempfile. No point keeping it.
cmd = [str(TC.bzip2), '--decompress', '--stdout', str(tempfile_path)]
(ec, out, err) = self.execute(cmd, try_valgrind=TRY_VALGRIND)
# Check that bzip2 thinks it succeeded.
assert ec == 0
# Calculate hash of decompressed file.
out_hash = md5(out).hexdigest()
# Verify that the MD5 of the original reference file matches MD5 of
# the compressed & decompressed file.
with sample.open('rb') as reffile:
# Calcualte hash of reference file.
refcontents = reffile.read()
ref_hash = md5(refcontents).hexdigest()
print(f'Checking that {tempfile_path.name} matches {sample.name} when decompressed...')
assert out_hash == ref_hash, \
'decompression output and reference file differ:\n' + \
TC.hex_compare(out, refcontents)
elif sample.suffix == '.bz2':
# Try to decompress, with the expectation that it will succeed and
# that the decompressed file's MD5 matches the reference file.
#
# Then, compress the result again, and decompress it again, verifying
# once more that the (second) decompressed file's MD5 matches the reference file.
# Verify that the MD5 of the original reference file matches MD5 of
# the decompressed file.
reffile_path = sample.parent / (sample.stem + '.ref')
with reffile_path.open('rb') as reffile:
# Calcualte hash of reference file.
refcontents = reffile.read()
ref_hash = md5(refcontents).hexdigest()
# Decompress. We can keep the OG file.
cmd = [str(TC.bzip2), '--decompress', '--keep', '--stdout', str(sample)]
(ec, out, err) = self.execute(cmd, try_valgrind=TRY_VALGRIND)
# Check that bzip2 thinks it succeeded.
assert ec == 0
# Calculate hash of decompressed file.
out_hash = md5(out).hexdigest()
# Verify that the decompressed file matches the MD5 of the original reference file.
print(f'Checking that {sample.name} matches {reffile_path.name} when decompressed...')
assert out_hash == ref_hash, \
'decompression output and reference file differ:\n' + \
TC.hex_compare(out, refcontents)
# loop through directories in 'bzip2/tests/input/quick'...
#
# For each of those directories, run a test on the files within that have
# the '.bad' or '.bz2' suffix.
testfiles_path = path_source / 'tests' / 'input' / 'quick'
if testfiles_path.is_dir:
for sample in testfiles_path.glob('**/*'):
if sample.suffix == '.ref':
for block_size in [-1, -2, -3]:
# Generate a test function for the sample.
bug_validation_test = generate_test_function(sample, block_size)
# Add the test function to the test class.
setattr(TC, f'test_comp_decomp_{sample.name}_{abs(block_size)}', bug_validation_test)
elif sample.suffix == '.bz2':
# Generate a test function for the sample.
bug_validation_test = generate_test_function(sample)
# Add the test function to the test class.
setattr(TC, f'test_decomp_only_{sample.name}', bug_validation_test)