binman: Support missing compression tools

Handle missing compression tools by returning empty data and record
missing bintool.

Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Stefan Herbrechtsmeier 2022-08-19 16:25:31 +02:00 committed by Simon Glass
parent ec7d27d3a8
commit c3665a896e
3 changed files with 29 additions and 3 deletions

View File

@ -1118,7 +1118,11 @@ features to produce new behaviours.
self.uncomp_data = indata
if self.compress != 'none':
self.uncomp_size = len(indata)
data = self.comp_bintool.compress(indata)
if self.comp_bintool.is_present():
data = self.comp_bintool.compress(indata)
else:
self.record_missing_bintool(self.comp_bintool)
data = tools.get_bytes(0, 1024)
else:
data = indata
return data
@ -1133,8 +1137,12 @@ features to produce new behaviours.
Decompressed data
"""
if self.compress != 'none':
data = self.comp_bintool.decompress(indata)
self.uncomp_size = len(data)
if self.comp_bintool.is_present():
data = self.comp_bintool.decompress(indata)
self.uncomp_size = len(data)
else:
self.record_missing_bintool(self.comp_bintool)
data = tools.get_bytes(0, 1024)
else:
data = indata
self.uncomp_data = data

View File

@ -105,6 +105,15 @@ class TestEntry(unittest.TestCase):
self.assertTrue(isinstance(ent, Entry_blob))
self.assertEquals('missing', ent.etype)
def testDecompressData(self):
"""Test the DecompressData() method of the base class"""
base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
base.compress = 'lz4'
bintools = {}
base.comp_bintool = base.AddBintool(bintools, '_testing')
self.assertEquals(tools.get_bytes(0, 1024), base.CompressData(b'abc'))
self.assertEquals(tools.get_bytes(0, 1024), base.DecompressData(b'abc'))
if __name__ == "__main__":
unittest.main()

View File

@ -4422,6 +4422,15 @@ class TestFunctional(unittest.TestCase):
}
self.assertEqual(expected, props)
def testLz4Missing(self):
"""Test that binman still produces an image if lz4 is missing"""
with test_util.capture_sys_output() as (_, stderr):
self._DoTestFile('185_compress_section.dts',
force_missing_bintools='lz4')
err = stderr.getvalue()
self.assertRegex(err,
"Image 'main-section'.*missing bintools.*: lz4")
def testCompressExtra(self):
"""Test compression of a section with no fixed size"""
self._CheckLz4()