entry_test.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # SPDX-License-Identifier: GPL-2.0+
  2. # Copyright (c) 2016 Google, Inc
  3. # Written by Simon Glass <sjg@chromium.org>
  4. #
  5. # Test for the Entry class
  6. import collections
  7. import importlib
  8. import os
  9. import sys
  10. import unittest
  11. from binman import entry
  12. from binman.etype.blob import Entry_blob
  13. from dtoc import fdt
  14. from dtoc import fdt_util
  15. from u_boot_pylib import tools
  16. class TestEntry(unittest.TestCase):
  17. def setUp(self):
  18. tools.prepare_output_dir(None)
  19. def tearDown(self):
  20. tools.finalise_output_dir()
  21. def GetNode(self):
  22. binman_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
  23. fname = fdt_util.EnsureCompiled(
  24. os.path.join(binman_dir,('test/005_simple.dts')))
  25. dtb = fdt.FdtScan(fname)
  26. return dtb.GetNode('/binman/u-boot')
  27. def _ReloadEntry(self):
  28. global entry
  29. if entry:
  30. importlib.reload(entry)
  31. else:
  32. from binman import entry
  33. def testEntryContents(self):
  34. """Test the Entry bass class"""
  35. from binman import entry
  36. base_entry = entry.Entry(None, None, None)
  37. self.assertEqual(True, base_entry.ObtainContents())
  38. def testUnknownEntry(self):
  39. """Test that unknown entry types are detected"""
  40. Node = collections.namedtuple('Node', ['name', 'path'])
  41. node = Node('invalid-name', 'invalid-path')
  42. with self.assertRaises(ValueError) as e:
  43. entry.Entry.Create(None, node, node.name)
  44. self.assertIn("Unknown entry type 'invalid-name' in node "
  45. "'invalid-path'", str(e.exception))
  46. def testUniqueName(self):
  47. """Test Entry.GetUniqueName"""
  48. Node = collections.namedtuple('Node', ['name', 'parent'])
  49. base_node = Node('root', None)
  50. base_entry = entry.Entry(None, None, base_node)
  51. self.assertEqual('root', base_entry.GetUniqueName())
  52. sub_node = Node('subnode', base_node)
  53. sub_entry = entry.Entry(None, None, sub_node)
  54. self.assertEqual('root.subnode', sub_entry.GetUniqueName())
  55. def testGetDefaultFilename(self):
  56. """Trivial test for this base class function"""
  57. base_entry = entry.Entry(None, None, None)
  58. self.assertIsNone(base_entry.GetDefaultFilename())
  59. def testBlobFdt(self):
  60. """Test the GetFdtEtype() method of the blob-dtb entries"""
  61. base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
  62. self.assertIsNone(base.GetFdtEtype())
  63. dtb = entry.Entry.Create(None, self.GetNode(), 'u-boot-dtb')
  64. self.assertEqual('u-boot-dtb', dtb.GetFdtEtype())
  65. def testWriteChildData(self):
  66. """Test the WriteChildData() method of the base class"""
  67. base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
  68. self.assertTrue(base.WriteChildData(base))
  69. def testReadChildData(self):
  70. """Test the ReadChildData() method of the base class"""
  71. base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
  72. self.assertIsNone(base.ReadChildData(base))
  73. def testExpandedEntry(self):
  74. """Test use of an expanded entry when available"""
  75. base = entry.Entry.Create(None, self.GetNode())
  76. self.assertEqual('u-boot', base.etype)
  77. expanded = entry.Entry.Create(None, self.GetNode(), expanded=True)
  78. self.assertEqual('u-boot-expanded', expanded.etype)
  79. with self.assertRaises(ValueError) as e:
  80. entry.Entry.Create(None, self.GetNode(), 'missing', expanded=True)
  81. self.assertIn("Unknown entry type 'missing' in node '/binman/u-boot'",
  82. str(e.exception))
  83. def testMissingEtype(self):
  84. """Test use of a blob etype when the requested one is not available"""
  85. ent = entry.Entry.Create(None, self.GetNode(), 'missing',
  86. missing_etype=True)
  87. self.assertTrue(isinstance(ent, Entry_blob))
  88. self.assertEquals('missing', ent.etype)
  89. def testDecompressData(self):
  90. """Test the DecompressData() method of the base class"""
  91. base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
  92. base.compress = 'lz4'
  93. bintools = {}
  94. base.comp_bintool = base.AddBintool(bintools, '_testing')
  95. self.assertEquals(tools.get_bytes(0, 1024), base.CompressData(b'abc'))
  96. self.assertEquals(tools.get_bytes(0, 1024), base.DecompressData(b'abc'))
  97. def testLookupOffset(self):
  98. """Test the lookup_offset() method of the base class"""
  99. def MyFindEntryByNode(node):
  100. return self.found
  101. base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
  102. base.FindEntryByNode = MyFindEntryByNode
  103. base.section = base
  104. self.found = None
  105. base.offset_from_elf = [self.GetNode(), 'start', 0]
  106. with self.assertRaises(ValueError) as e:
  107. base.lookup_offset()
  108. self.assertIn("Cannot find entry for node 'u-boot'", str(e.exception))
  109. self.found = base
  110. with self.assertRaises(ValueError) as e:
  111. base.lookup_offset()
  112. self.assertIn("Need elf-fname property 'u-boot'", str(e.exception))
  113. if __name__ == "__main__":
  114. unittest.main()