Skip to content

Commit

Permalink
Merge pull request #4150 from Flamefire/fix-checksum-check
Browse files Browse the repository at this point in the history
Improve error when checksum dict has no entry for a file
  • Loading branch information
boegel authored Sep 9, 2023
2 parents f1cd377 + f60d2c6 commit 241868e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
12 changes: 5 additions & 7 deletions easybuild/tools/filetools.py
Original file line number Diff line number Diff line change
Expand Up @@ -1264,14 +1264,11 @@ def verify_checksum(path, checksums):

for checksum in checksums:
if isinstance(checksum, dict):
if filename in checksum:
try:
# Set this to a string-type checksum
checksum = checksum[filename]
elif build_option('enforce_checksums'):
raise EasyBuildError("Missing checksum for %s", filename)
else:
# Set to None and allow to fail elsewhere
checksum = None
except KeyError:
raise EasyBuildError("Missing checksum for %s in %s", filename, checksum)

if isinstance(checksum, string_type):
# if no checksum type is specified, it is assumed to be MD5 (32 characters) or SHA256 (64 characters)
Expand Down Expand Up @@ -1301,7 +1298,8 @@ def verify_checksum(path, checksums):
# no matching checksums
return False
else:
raise EasyBuildError("Invalid checksum spec '%s', should be a string (MD5) or 2-tuple (type, value).",
raise EasyBuildError("Invalid checksum spec '%s': should be a string (MD5 or SHA256), "
"2-tuple (type, value), or tuple of alternative checksum specs.",
checksum)

actual_checksum = compute_checksum(path, typ)
Expand Down
10 changes: 10 additions & 0 deletions test/framework/filetools.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,14 @@ def test_checksums(self):
alt_checksums = ('7167b64b1ca062b9674ffef46f9325db7167b64b1ca062b9674ffef46f9325db', broken_checksums['sha256'])
self.assertFalse(ft.verify_checksum(fp, alt_checksums))

# Check dictionary
alt_checksums = (known_checksums['sha256'],)
self.assertTrue(ft.verify_checksum(fp, {os.path.basename(fp): known_checksums['sha256']}))
faulty_dict = {'wrong-name': known_checksums['sha256']}
self.assertErrorRegex(EasyBuildError,
"Missing checksum for " + os.path.basename(fp) + " in .*wrong-name.*",
ft.verify_checksum, fp, faulty_dict)

# check whether missing checksums are enforced
build_options = {
'enforce_checksums': True,
Expand All @@ -363,6 +371,8 @@ def test_checksums(self):
for checksum in [known_checksums[x] for x in ('md5', 'sha256')]:
dict_checksum = {os.path.basename(fp): checksum, 'foo': 'baa'}
self.assertTrue(ft.verify_checksum(fp, dict_checksum))
del dict_checksum[os.path.basename(fp)]
self.assertErrorRegex(EasyBuildError, "Missing checksum for", ft.verify_checksum, fp, dict_checksum)

def test_common_path_prefix(self):
"""Test get common path prefix for a list of paths."""
Expand Down

0 comments on commit 241868e

Please sign in to comment.