binman: Show a helpful error when a DT property is missing

At present a Python exception is raised which does not show the node
information. Add a more helpful exception in this case.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2019-07-20 12:23:37 -06:00
parent 9f297b09c0
commit d9dad10e3c
2 changed files with 41 additions and 3 deletions

View File

@ -362,6 +362,23 @@ class Node:
value = tools.GetBytes(0, len)
self.props[prop_name] = Prop(self, None, prop_name, value)
def _CheckProp(self, prop_name):
"""Check if a property is present
Args:
prop_name: Name of property
Returns:
self
Raises:
ValueError if the property is missing
"""
if prop_name not in self.props:
raise ValueError("Fdt '%s', node '%s': Missing property '%s'" %
(self._fdt._fname, self.path, prop_name))
return self
def SetInt(self, prop_name, val):
"""Update an integer property int the device tree.
@ -374,7 +391,7 @@ class Node:
prop_name: Name of property
val: Value to set
"""
self.props[prop_name].SetInt(val)
self._CheckProp(prop_name).props[prop_name].SetInt(val)
def SetData(self, prop_name, val):
"""Set the data value of a property
@ -386,7 +403,7 @@ class Node:
prop_name: Name of property to set
val: Data value to set
"""
self.props[prop_name].SetData(val)
self._CheckProp(prop_name).props[prop_name].SetData(val)
def SetString(self, prop_name, val):
"""Set the string value of a property
@ -400,7 +417,7 @@ class Node:
"""
if sys.version_info[0] >= 3: # pragma: no cover
val = bytes(val, 'utf-8')
self.props[prop_name].SetData(val + b'\0')
self._CheckProp(prop_name).props[prop_name].SetData(val + b'\0')
def AddString(self, prop_name, val):
"""Add a new string property to a node

View File

@ -421,6 +421,27 @@ class TestProp(unittest.TestCase):
self.dtb.Sync(auto_resize=True)
self.assertTrue(dtb2.GetContents() != self.dtb.GetContents())
def testMissingSetInt(self):
"""Test handling of a missing property with SetInt"""
with self.assertRaises(ValueError) as e:
self.node.SetInt('one', 1)
self.assertIn("node '/spl-test': Missing property 'one'",
str(e.exception))
def testMissingSetData(self):
"""Test handling of a missing property with SetData"""
with self.assertRaises(ValueError) as e:
self.node.SetData('one', b'data')
self.assertIn("node '/spl-test': Missing property 'one'",
str(e.exception))
def testMissingSetString(self):
"""Test handling of a missing property with SetString"""
with self.assertRaises(ValueError) as e:
self.node.SetString('one', 1)
self.assertIn("node '/spl-test': Missing property 'one'",
str(e.exception))
class TestFdtUtil(unittest.TestCase):
"""Tests for the fdt_util module