binman: Move to three-digit test-file numbers

We now have 99 tests. Before adding any more, rename everything to three
digits. This helps to preserve the ordering of tests and makes it easier
to find things.

Signed-off-by: Simon Glass <sjg@chromium.org>
lime2-spi
Simon Glass 6 years ago
parent 6e64ec1256
commit 741f2d620c
  1. 2
      tools/binman/entry_test.py
  2. 4
      tools/binman/fdt_test.py
  3. 224
      tools/binman/ftest.py
  4. 0
      tools/binman/test/001_invalid.dts
  5. 0
      tools/binman/test/002_missing_node.dts
  6. 0
      tools/binman/test/003_empty.dts
  7. 0
      tools/binman/test/004_invalid_entry.dts
  8. 0
      tools/binman/test/005_simple.dts
  9. 0
      tools/binman/test/006_dual_image.dts
  10. 0
      tools/binman/test/007_bad_align.dts
  11. 0
      tools/binman/test/008_pack.dts
  12. 0
      tools/binman/test/009_pack_extra.dts
  13. 0
      tools/binman/test/010_pack_align_power2.dts
  14. 0
      tools/binman/test/011_pack_align_size_power2.dts
  15. 0
      tools/binman/test/012_pack_inv_align.dts
  16. 0
      tools/binman/test/013_pack_inv_size_align.dts
  17. 0
      tools/binman/test/014_pack_overlap.dts
  18. 0
      tools/binman/test/015_pack_overflow.dts
  19. 0
      tools/binman/test/016_pack_image_overflow.dts
  20. 0
      tools/binman/test/017_pack_image_size.dts
  21. 0
      tools/binman/test/018_pack_image_align.dts
  22. 0
      tools/binman/test/019_pack_inv_image_align.dts
  23. 0
      tools/binman/test/020_pack_inv_image_align_power2.dts
  24. 0
      tools/binman/test/021_image_pad.dts
  25. 0
      tools/binman/test/022_image_name.dts
  26. 0
      tools/binman/test/023_blob.dts
  27. 0
      tools/binman/test/024_sorted.dts
  28. 0
      tools/binman/test/025_pack_zero_size.dts
  29. 0
      tools/binman/test/026_pack_u_boot_dtb.dts
  30. 0
      tools/binman/test/027_pack_4gb_no_size.dts
  31. 0
      tools/binman/test/028_pack_4gb_outside.dts
  32. 0
      tools/binman/test/029_x86-rom.dts
  33. 0
      tools/binman/test/030_x86-rom-me-no-desc.dts
  34. 0
      tools/binman/test/031_x86-rom-me.dts
  35. 0
      tools/binman/test/032_intel-vga.dts
  36. 0
      tools/binman/test/033_x86-start16.dts
  37. 0
      tools/binman/test/034_x86_ucode.dts
  38. 0
      tools/binman/test/035_x86_single_ucode.dts
  39. 0
      tools/binman/test/036_u_boot_img.dts
  40. 0
      tools/binman/test/037_x86_no_ucode.dts
  41. 0
      tools/binman/test/038_x86_ucode_missing_node.dts
  42. 0
      tools/binman/test/039_x86_ucode_missing_node2.dts
  43. 0
      tools/binman/test/040_x86_ucode_not_in_image.dts
  44. 0
      tools/binman/test/041_unknown_pos_size.dts
  45. 0
      tools/binman/test/042_intel-fsp.dts
  46. 0
      tools/binman/test/043_intel-cmc.dts
  47. 0
      tools/binman/test/044_x86_optional_ucode.dts
  48. 0
      tools/binman/test/045_prop_test.dts
  49. 0
      tools/binman/test/046_intel-vbt.dts
  50. 0
      tools/binman/test/047_spl_bss_pad.dts
  51. 0
      tools/binman/test/048_x86-start16-spl.dts
  52. 0
      tools/binman/test/049_x86_ucode_spl.dts
  53. 0
      tools/binman/test/050_intel_mrc.dts
  54. 0
      tools/binman/test/051_u_boot_spl_dtb.dts
  55. 0
      tools/binman/test/052_u_boot_spl_nodtb.dts
  56. 0
      tools/binman/test/053_symbols.dts
  57. 0
      tools/binman/test/054_unit_address.dts
  58. 0
      tools/binman/test/055_sections.dts
  59. 0
      tools/binman/test/056_name_prefix.dts
  60. 0
      tools/binman/test/057_unknown_contents.dts
  61. 0
      tools/binman/test/058_x86_ucode_spl_needs_retry.dts
  62. 0
      tools/binman/test/059_change_size.dts
  63. 0
      tools/binman/test/060_fdt_update.dts
  64. 0
      tools/binman/test/061_fdt_update_bad.dts
  65. 0
      tools/binman/test/062_entry_args.dts
  66. 0
      tools/binman/test/063_entry_args_missing.dts
  67. 0
      tools/binman/test/064_entry_args_required.dts
  68. 0
      tools/binman/test/065_entry_args_unknown_datatype.dts
  69. 0
      tools/binman/test/066_text.dts
  70. 0
      tools/binman/test/067_fmap.dts
  71. 0
      tools/binman/test/068_blob_named_by_arg.dts
  72. 0
      tools/binman/test/069_fill.dts
  73. 0
      tools/binman/test/070_fill_no_size.dts
  74. 0
      tools/binman/test/071_gbb.dts
  75. 0
      tools/binman/test/072_gbb_too_small.dts
  76. 0
      tools/binman/test/073_gbb_no_size.dts
  77. 0
      tools/binman/test/074_vblock.dts
  78. 0
      tools/binman/test/075_vblock_no_content.dts
  79. 0
      tools/binman/test/076_vblock_bad_phandle.dts
  80. 0
      tools/binman/test/077_vblock_bad_entry.dts
  81. 0
      tools/binman/test/078_u_boot_tpl.dts
  82. 0
      tools/binman/test/079_uses_pos.dts
  83. 0
      tools/binman/test/080_fill_empty.dts
  84. 0
      tools/binman/test/081_x86-start16-tpl.dts
  85. 0
      tools/binman/test/082_fdt_update_all.dts
  86. 0
      tools/binman/test/083_compress.dts
  87. 0
      tools/binman/test/084_files.dts
  88. 0
      tools/binman/test/085_files_compress.dts
  89. 0
      tools/binman/test/086_files_none.dts
  90. 0
      tools/binman/test/087_files_no_pattern.dts
  91. 0
      tools/binman/test/088_expand_size.dts
  92. 0
      tools/binman/test/089_expand_size_bad.dts
  93. 0
      tools/binman/test/090_hash.dts
  94. 0
      tools/binman/test/091_hash_no_algo.dts
  95. 0
      tools/binman/test/092_hash_bad_algo.dts
  96. 0
      tools/binman/test/093_x86_tpl_ucode.dts
  97. 0
      tools/binman/test/094_fmap_x86.dts
  98. 0
      tools/binman/test/095_fmap_x86_section.dts
  99. 0
      tools/binman/test/096_elf.dts
  100. 0
      tools/binman/test/097_elf_strip.dts
  101. Some files were not shown because too many files have changed in this diff Show More

@ -25,7 +25,7 @@ class TestEntry(unittest.TestCase):
def GetNode(self): def GetNode(self):
binman_dir = os.path.dirname(os.path.realpath(sys.argv[0])) binman_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
fname = fdt_util.EnsureCompiled( fname = fdt_util.EnsureCompiled(
os.path.join(binman_dir,('test/05_simple.dts'))) os.path.join(binman_dir,('test/005_simple.dts')))
dtb = fdt.FdtScan(fname) dtb = fdt.FdtScan(fname)
return dtb.GetNode('/binman/u-boot') return dtb.GetNode('/binman/u-boot')

@ -36,12 +36,12 @@ class TestFdt(unittest.TestCase):
node.DeleteProp('data') node.DeleteProp('data')
def testFdtNormal(self): def testFdtNormal(self):
fname = self.GetCompiled('34_x86_ucode.dts') fname = self.GetCompiled('034_x86_ucode.dts')
dt = FdtScan(fname) dt = FdtScan(fname)
self._DeleteProp(dt) self._DeleteProp(dt)
def testFdtNormalProp(self): def testFdtNormalProp(self):
fname = self.GetCompiled('45_prop_test.dts') fname = self.GetCompiled('045_prop_test.dts')
dt = FdtScan(fname) dt = FdtScan(fname)
node = dt.GetNode('/binman/intel-me') node = dt.GetNode('/binman/intel-me')
self.assertEquals('intel-me', node.name) self.assertEquals('intel-me', node.name)

@ -189,7 +189,7 @@ class TestFunctional(unittest.TestCase):
"""Run binman with a given test file """Run binman with a given test file
Args: Args:
fname: Device-tree source filename to use (e.g. 05_simple.dts) fname: Device-tree source filename to use (e.g. 005_simple.dts)
debug: True to enable debugging output debug: True to enable debugging output
map: True to output map files for the images map: True to output map files for the images
update_dtb: Update the offset and size of each entry in the device update_dtb: Update the offset and size of each entry in the device
@ -266,7 +266,7 @@ class TestFunctional(unittest.TestCase):
Raises an assertion failure if binman returns a non-zero exit code. Raises an assertion failure if binman returns a non-zero exit code.
Args: Args:
fname: Device-tree source filename to use (e.g. 05_simple.dts) fname: Device-tree source filename to use (e.g. 005_simple.dts)
use_real_dtb: True to use the test file as the contents of use_real_dtb: True to use the test file as the contents of
the u-boot-dtb entry. Normally this is not needed and the the u-boot-dtb entry. Normally this is not needed and the
test contents (the U_BOOT_DTB_DATA string) can be used. test contents (the U_BOOT_DTB_DATA string) can be used.
@ -323,7 +323,7 @@ class TestFunctional(unittest.TestCase):
"""Helper function which discards the device-tree binary """Helper function which discards the device-tree binary
Args: Args:
fname: Device-tree source filename to use (e.g. 05_simple.dts) fname: Device-tree source filename to use (e.g. 005_simple.dts)
use_real_dtb: True to use the test file as the contents of use_real_dtb: True to use the test file as the contents of
the u-boot-dtb entry. Normally this is not needed and the the u-boot-dtb entry. Normally this is not needed and the
test contents (the U_BOOT_DTB_DATA string) can be used. test contents (the U_BOOT_DTB_DATA string) can be used.
@ -464,7 +464,7 @@ class TestFunctional(unittest.TestCase):
def testBoard(self): def testBoard(self):
"""Test that we can run it with a specific board""" """Test that we can run it with a specific board"""
self._SetupDtb('05_simple.dts', 'sandbox/u-boot.dtb') self._SetupDtb('005_simple.dts', 'sandbox/u-boot.dtb')
TestFunctional._MakeInputFile('sandbox/u-boot.bin', U_BOOT_DATA) TestFunctional._MakeInputFile('sandbox/u-boot.bin', U_BOOT_DATA)
result = self._DoBinman('-b', 'sandbox') result = self._DoBinman('-b', 'sandbox')
self.assertEqual(0, result) self.assertEqual(0, result)
@ -491,19 +491,19 @@ class TestFunctional(unittest.TestCase):
will come from the device-tree compiler (dtc). will come from the device-tree compiler (dtc).
""" """
with self.assertRaises(Exception) as e: with self.assertRaises(Exception) as e:
self._RunBinman('-d', self.TestFile('01_invalid.dts')) self._RunBinman('-d', self.TestFile('001_invalid.dts'))
self.assertIn("FATAL ERROR: Unable to parse input tree", self.assertIn("FATAL ERROR: Unable to parse input tree",
str(e.exception)) str(e.exception))
def testMissingNode(self): def testMissingNode(self):
"""Test that a device tree without a 'binman' node generates an error""" """Test that a device tree without a 'binman' node generates an error"""
with self.assertRaises(Exception) as e: with self.assertRaises(Exception) as e:
self._DoBinman('-d', self.TestFile('02_missing_node.dts')) self._DoBinman('-d', self.TestFile('002_missing_node.dts'))
self.assertIn("does not have a 'binman' node", str(e.exception)) self.assertIn("does not have a 'binman' node", str(e.exception))
def testEmpty(self): def testEmpty(self):
"""Test that an empty binman node works OK (i.e. does nothing)""" """Test that an empty binman node works OK (i.e. does nothing)"""
result = self._RunBinman('-d', self.TestFile('03_empty.dts')) result = self._RunBinman('-d', self.TestFile('003_empty.dts'))
self.assertEqual(0, len(result.stderr)) self.assertEqual(0, len(result.stderr))
self.assertEqual(0, result.return_code) self.assertEqual(0, result.return_code)
@ -511,25 +511,25 @@ class TestFunctional(unittest.TestCase):
"""Test that an invalid entry is flagged""" """Test that an invalid entry is flagged"""
with self.assertRaises(Exception) as e: with self.assertRaises(Exception) as e:
result = self._RunBinman('-d', result = self._RunBinman('-d',
self.TestFile('04_invalid_entry.dts')) self.TestFile('004_invalid_entry.dts'))
self.assertIn("Unknown entry type 'not-a-valid-type' in node " self.assertIn("Unknown entry type 'not-a-valid-type' in node "
"'/binman/not-a-valid-type'", str(e.exception)) "'/binman/not-a-valid-type'", str(e.exception))
def testSimple(self): def testSimple(self):
"""Test a simple binman with a single file""" """Test a simple binman with a single file"""
data = self._DoReadFile('05_simple.dts') data = self._DoReadFile('005_simple.dts')
self.assertEqual(U_BOOT_DATA, data) self.assertEqual(U_BOOT_DATA, data)
def testSimpleDebug(self): def testSimpleDebug(self):
"""Test a simple binman run with debugging enabled""" """Test a simple binman run with debugging enabled"""
data = self._DoTestFile('05_simple.dts', debug=True) data = self._DoTestFile('005_simple.dts', debug=True)
def testDual(self): def testDual(self):
"""Test that we can handle creating two images """Test that we can handle creating two images
This also tests image padding. This also tests image padding.
""" """
retcode = self._DoTestFile('06_dual_image.dts') retcode = self._DoTestFile('006_dual_image.dts')
self.assertEqual(0, retcode) self.assertEqual(0, retcode)
image = control.images['image1'] image = control.images['image1']
@ -553,13 +553,13 @@ class TestFunctional(unittest.TestCase):
def testBadAlign(self): def testBadAlign(self):
"""Test that an invalid alignment value is detected""" """Test that an invalid alignment value is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('07_bad_align.dts') self._DoTestFile('007_bad_align.dts')
self.assertIn("Node '/binman/u-boot': Alignment 23 must be a power " self.assertIn("Node '/binman/u-boot': Alignment 23 must be a power "
"of two", str(e.exception)) "of two", str(e.exception))
def testPackSimple(self): def testPackSimple(self):
"""Test that packing works as expected""" """Test that packing works as expected"""
retcode = self._DoTestFile('08_pack.dts') retcode = self._DoTestFile('008_pack.dts')
self.assertEqual(0, retcode) self.assertEqual(0, retcode)
self.assertIn('image', control.images) self.assertIn('image', control.images)
image = control.images['image'] image = control.images['image']
@ -601,7 +601,7 @@ class TestFunctional(unittest.TestCase):
def testPackExtra(self): def testPackExtra(self):
"""Test that extra packing feature works as expected""" """Test that extra packing feature works as expected"""
retcode = self._DoTestFile('09_pack_extra.dts') retcode = self._DoTestFile('009_pack_extra.dts')
self.assertEqual(0, retcode) self.assertEqual(0, retcode)
self.assertIn('image', control.images) self.assertIn('image', control.images)
@ -646,35 +646,35 @@ class TestFunctional(unittest.TestCase):
def testPackAlignPowerOf2(self): def testPackAlignPowerOf2(self):
"""Test that invalid entry alignment is detected""" """Test that invalid entry alignment is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('10_pack_align_power2.dts') self._DoTestFile('010_pack_align_power2.dts')
self.assertIn("Node '/binman/u-boot': Alignment 5 must be a power " self.assertIn("Node '/binman/u-boot': Alignment 5 must be a power "
"of two", str(e.exception)) "of two", str(e.exception))
def testPackAlignSizePowerOf2(self): def testPackAlignSizePowerOf2(self):
"""Test that invalid entry size alignment is detected""" """Test that invalid entry size alignment is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('11_pack_align_size_power2.dts') self._DoTestFile('011_pack_align_size_power2.dts')
self.assertIn("Node '/binman/u-boot': Alignment size 55 must be a " self.assertIn("Node '/binman/u-boot': Alignment size 55 must be a "
"power of two", str(e.exception)) "power of two", str(e.exception))
def testPackInvalidAlign(self): def testPackInvalidAlign(self):
"""Test detection of an offset that does not match its alignment""" """Test detection of an offset that does not match its alignment"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('12_pack_inv_align.dts') self._DoTestFile('012_pack_inv_align.dts')
self.assertIn("Node '/binman/u-boot': Offset 0x5 (5) does not match " self.assertIn("Node '/binman/u-boot': Offset 0x5 (5) does not match "
"align 0x4 (4)", str(e.exception)) "align 0x4 (4)", str(e.exception))
def testPackInvalidSizeAlign(self): def testPackInvalidSizeAlign(self):
"""Test that invalid entry size alignment is detected""" """Test that invalid entry size alignment is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('13_pack_inv_size_align.dts') self._DoTestFile('013_pack_inv_size_align.dts')
self.assertIn("Node '/binman/u-boot': Size 0x5 (5) does not match " self.assertIn("Node '/binman/u-boot': Size 0x5 (5) does not match "
"align-size 0x4 (4)", str(e.exception)) "align-size 0x4 (4)", str(e.exception))
def testPackOverlap(self): def testPackOverlap(self):
"""Test that overlapping regions are detected""" """Test that overlapping regions are detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('14_pack_overlap.dts') self._DoTestFile('014_pack_overlap.dts')
self.assertIn("Node '/binman/u-boot-align': Offset 0x3 (3) overlaps " self.assertIn("Node '/binman/u-boot-align': Offset 0x3 (3) overlaps "
"with previous entry '/binman/u-boot' ending at 0x4 (4)", "with previous entry '/binman/u-boot' ending at 0x4 (4)",
str(e.exception)) str(e.exception))
@ -682,20 +682,20 @@ class TestFunctional(unittest.TestCase):
def testPackEntryOverflow(self): def testPackEntryOverflow(self):
"""Test that entries that overflow their size are detected""" """Test that entries that overflow their size are detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('15_pack_overflow.dts') self._DoTestFile('015_pack_overflow.dts')
self.assertIn("Node '/binman/u-boot': Entry contents size is 0x4 (4) " self.assertIn("Node '/binman/u-boot': Entry contents size is 0x4 (4) "
"but entry size is 0x3 (3)", str(e.exception)) "but entry size is 0x3 (3)", str(e.exception))
def testPackImageOverflow(self): def testPackImageOverflow(self):
"""Test that entries which overflow the image size are detected""" """Test that entries which overflow the image size are detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('16_pack_image_overflow.dts') self._DoTestFile('016_pack_image_overflow.dts')
self.assertIn("Section '/binman': contents size 0x4 (4) exceeds section " self.assertIn("Section '/binman': contents size 0x4 (4) exceeds section "
"size 0x3 (3)", str(e.exception)) "size 0x3 (3)", str(e.exception))
def testPackImageSize(self): def testPackImageSize(self):
"""Test that the image size can be set""" """Test that the image size can be set"""
retcode = self._DoTestFile('17_pack_image_size.dts') retcode = self._DoTestFile('017_pack_image_size.dts')
self.assertEqual(0, retcode) self.assertEqual(0, retcode)
self.assertIn('image', control.images) self.assertIn('image', control.images)
image = control.images['image'] image = control.images['image']
@ -703,7 +703,7 @@ class TestFunctional(unittest.TestCase):
def testPackImageSizeAlign(self): def testPackImageSizeAlign(self):
"""Test that image size alignemnt works as expected""" """Test that image size alignemnt works as expected"""
retcode = self._DoTestFile('18_pack_image_align.dts') retcode = self._DoTestFile('018_pack_image_align.dts')
self.assertEqual(0, retcode) self.assertEqual(0, retcode)
self.assertIn('image', control.images) self.assertIn('image', control.images)
image = control.images['image'] image = control.images['image']
@ -712,26 +712,26 @@ class TestFunctional(unittest.TestCase):
def testPackInvalidImageAlign(self): def testPackInvalidImageAlign(self):
"""Test that invalid image alignment is detected""" """Test that invalid image alignment is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('19_pack_inv_image_align.dts') self._DoTestFile('019_pack_inv_image_align.dts')
self.assertIn("Section '/binman': Size 0x7 (7) does not match " self.assertIn("Section '/binman': Size 0x7 (7) does not match "
"align-size 0x8 (8)", str(e.exception)) "align-size 0x8 (8)", str(e.exception))
def testPackAlignPowerOf2(self): def testPackAlignPowerOf2(self):
"""Test that invalid image alignment is detected""" """Test that invalid image alignment is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('20_pack_inv_image_align_power2.dts') self._DoTestFile('020_pack_inv_image_align_power2.dts')
self.assertIn("Section '/binman': Alignment size 131 must be a power of " self.assertIn("Section '/binman': Alignment size 131 must be a power of "
"two", str(e.exception)) "two", str(e.exception))
def testImagePadByte(self): def testImagePadByte(self):
"""Test that the image pad byte can be specified""" """Test that the image pad byte can be specified"""
self._SetupSplElf() self._SetupSplElf()
data = self._DoReadFile('21_image_pad.dts') data = self._DoReadFile('021_image_pad.dts')
self.assertEqual(U_BOOT_SPL_DATA + (chr(0xff) * 1) + U_BOOT_DATA, data) self.assertEqual(U_BOOT_SPL_DATA + (chr(0xff) * 1) + U_BOOT_DATA, data)
def testImageName(self): def testImageName(self):
"""Test that image files can be named""" """Test that image files can be named"""
retcode = self._DoTestFile('22_image_name.dts') retcode = self._DoTestFile('022_image_name.dts')
self.assertEqual(0, retcode) self.assertEqual(0, retcode)
image = control.images['image1'] image = control.images['image1']
fname = tools.GetOutputFilename('test-name') fname = tools.GetOutputFilename('test-name')
@ -743,33 +743,33 @@ class TestFunctional(unittest.TestCase):
def testBlobFilename(self): def testBlobFilename(self):
"""Test that generic blobs can be provided by filename""" """Test that generic blobs can be provided by filename"""
data = self._DoReadFile('23_blob.dts') data = self._DoReadFile('023_blob.dts')
self.assertEqual(BLOB_DATA, data) self.assertEqual(BLOB_DATA, data)
def testPackSorted(self): def testPackSorted(self):
"""Test that entries can be sorted""" """Test that entries can be sorted"""
self._SetupSplElf() self._SetupSplElf()
data = self._DoReadFile('24_sorted.dts') data = self._DoReadFile('024_sorted.dts')
self.assertEqual(chr(0) * 1 + U_BOOT_SPL_DATA + chr(0) * 2 + self.assertEqual(chr(0) * 1 + U_BOOT_SPL_DATA + chr(0) * 2 +
U_BOOT_DATA, data) U_BOOT_DATA, data)
def testPackZeroOffset(self): def testPackZeroOffset(self):
"""Test that an entry at offset 0 is not given a new offset""" """Test that an entry at offset 0 is not given a new offset"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('25_pack_zero_size.dts') self._DoTestFile('025_pack_zero_size.dts')
self.assertIn("Node '/binman/u-boot-spl': Offset 0x0 (0) overlaps " self.assertIn("Node '/binman/u-boot-spl': Offset 0x0 (0) overlaps "
"with previous entry '/binman/u-boot' ending at 0x4 (4)", "with previous entry '/binman/u-boot' ending at 0x4 (4)",
str(e.exception)) str(e.exception))
def testPackUbootDtb(self): def testPackUbootDtb(self):
"""Test that a device tree can be added to U-Boot""" """Test that a device tree can be added to U-Boot"""
data = self._DoReadFile('26_pack_u_boot_dtb.dts') data = self._DoReadFile('026_pack_u_boot_dtb.dts')
self.assertEqual(U_BOOT_NODTB_DATA + U_BOOT_DTB_DATA, data) self.assertEqual(U_BOOT_NODTB_DATA + U_BOOT_DTB_DATA, data)
def testPackX86RomNoSize(self): def testPackX86RomNoSize(self):
"""Test that the end-at-4gb property requires a size property""" """Test that the end-at-4gb property requires a size property"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('27_pack_4gb_no_size.dts') self._DoTestFile('027_pack_4gb_no_size.dts')
self.assertIn("Section '/binman': Section size must be provided when " self.assertIn("Section '/binman': Section size must be provided when "
"using end-at-4gb", str(e.exception)) "using end-at-4gb", str(e.exception))
@ -784,7 +784,7 @@ class TestFunctional(unittest.TestCase):
def testPackX86RomOutside(self): def testPackX86RomOutside(self):
"""Test that the end-at-4gb property checks for offset boundaries""" """Test that the end-at-4gb property checks for offset boundaries"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('28_pack_4gb_outside.dts') self._DoTestFile('028_pack_4gb_outside.dts')
self.assertIn("Node '/binman/u-boot': Offset 0x0 (0) is outside " self.assertIn("Node '/binman/u-boot': Offset 0x0 (0) is outside "
"the section starting at 0xffffffe0 (4294967264)", "the section starting at 0xffffffe0 (4294967264)",
str(e.exception)) str(e.exception))
@ -792,7 +792,7 @@ class TestFunctional(unittest.TestCase):
def testPackX86Rom(self): def testPackX86Rom(self):
"""Test that a basic x86 ROM can be created""" """Test that a basic x86 ROM can be created"""
self._SetupSplElf() self._SetupSplElf()
data = self._DoReadFile('29_x86-rom.dts') data = self._DoReadFile('029_x86-rom.dts')
self.assertEqual(U_BOOT_DATA + chr(0) * 7 + U_BOOT_SPL_DATA + self.assertEqual(U_BOOT_DATA + chr(0) * 7 + U_BOOT_SPL_DATA +
chr(0) * 2, data) chr(0) * 2, data)
@ -800,31 +800,31 @@ class TestFunctional(unittest.TestCase):
"""Test that an invalid Intel descriptor entry is detected""" """Test that an invalid Intel descriptor entry is detected"""
TestFunctional._MakeInputFile('descriptor.bin', '') TestFunctional._MakeInputFile('descriptor.bin', '')
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('31_x86-rom-me.dts') self._DoTestFile('031_x86-rom-me.dts')
self.assertIn("Node '/binman/intel-descriptor': Cannot find FD " self.assertIn("Node '/binman/intel-descriptor': Cannot find FD "
"signature", str(e.exception)) "signature", str(e.exception))
def testPackX86RomBadDesc(self): def testPackX86RomBadDesc(self):
"""Test that the Intel requires a descriptor entry""" """Test that the Intel requires a descriptor entry"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('30_x86-rom-me-no-desc.dts') self._DoTestFile('030_x86-rom-me-no-desc.dts')
self.assertIn("Node '/binman/intel-me': No offset set with " self.assertIn("Node '/binman/intel-me': No offset set with "
"offset-unset: should another entry provide this correct " "offset-unset: should another entry provide this correct "
"offset?", str(e.exception)) "offset?", str(e.exception))
def testPackX86RomMe(self): def testPackX86RomMe(self):
"""Test that an x86 ROM with an ME region can be created""" """Test that an x86 ROM with an ME region can be created"""
data = self._DoReadFile('31_x86-rom-me.dts') data = self._DoReadFile('031_x86-rom-me.dts')
self.assertEqual(ME_DATA, data[0x1000:0x1000 + len(ME_DATA)]) self.assertEqual(ME_DATA, data[0x1000:0x1000 + len(ME_DATA)])
def testPackVga(self): def testPackVga(self):
"""Test that an image with a VGA binary can be created""" """Test that an image with a VGA binary can be created"""
data = self._DoReadFile('32_intel-vga.dts') data = self._DoReadFile('032_intel-vga.dts')
self.assertEqual(VGA_DATA, data[:len(VGA_DATA)]) self.assertEqual(VGA_DATA, data[:len(VGA_DATA)])
def testPackStart16(self): def testPackStart16(self):
"""Test that an image with an x86 start16 region can be created""" """Test that an image with an x86 start16 region can be created"""
data = self._DoReadFile('33_x86-start16.dts') data = self._DoReadFile('033_x86-start16.dts')
self.assertEqual(X86_START16_DATA, data[:len(X86_START16_DATA)]) self.assertEqual(X86_START16_DATA, data[:len(X86_START16_DATA)])
def testPackPowerpcMpc85xxBootpgResetvec(self): def testPackPowerpcMpc85xxBootpgResetvec(self):
@ -893,7 +893,7 @@ class TestFunctional(unittest.TestCase):
u-boot.dtb with the microcode removed u-boot.dtb with the microcode removed
the microcode the microcode
""" """
first, pos_and_size = self._RunMicrocodeTest('34_x86_ucode.dts', first, pos_and_size = self._RunMicrocodeTest('034_x86_ucode.dts',
U_BOOT_NODTB_DATA) U_BOOT_NODTB_DATA)
self.assertEqual('nodtb with microcode' + pos_and_size + self.assertEqual('nodtb with microcode' + pos_and_size +
' somewhere in here', first) ' somewhere in here', first)
@ -910,7 +910,7 @@ class TestFunctional(unittest.TestCase):
# We need the libfdt library to run this test since only that allows # We need the libfdt library to run this test since only that allows
# finding the offset of a property. This is required by # finding the offset of a property. This is required by
# Entry_u_boot_dtb_with_ucode.ObtainContents(). # Entry_u_boot_dtb_with_ucode.ObtainContents().
data = self._DoReadFile('35_x86_single_ucode.dts', True) data = self._DoReadFile('035_x86_single_ucode.dts', True)
second = data[len(U_BOOT_NODTB_DATA):] second = data[len(U_BOOT_NODTB_DATA):]
@ -937,27 +937,27 @@ class TestFunctional(unittest.TestCase):
def testUBootImg(self): def testUBootImg(self):
"""Test that u-boot.img can be put in a file""" """Test that u-boot.img can be put in a file"""
data = self._DoReadFile('36_u_boot_img.dts') data = self._DoReadFile('036_u_boot_img.dts')
self.assertEqual(U_BOOT_IMG_DATA, data) self.assertEqual(U_BOOT_IMG_DATA, data)
def testNoMicrocode(self): def testNoMicrocode(self):
"""Test that a missing microcode region is detected""" """Test that a missing microcode region is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('37_x86_no_ucode.dts', True) self._DoReadFile('037_x86_no_ucode.dts', True)
self.assertIn("Node '/binman/u-boot-dtb-with-ucode': No /microcode " self.assertIn("Node '/binman/u-boot-dtb-with-ucode': No /microcode "
"node found in ", str(e.exception)) "node found in ", str(e.exception))
def testMicrocodeWithoutNode(self): def testMicrocodeWithoutNode(self):
"""Test that a missing u-boot-dtb-with-ucode node is detected""" """Test that a missing u-boot-dtb-with-ucode node is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('38_x86_ucode_missing_node.dts', True) self._DoReadFile('038_x86_ucode_missing_node.dts', True)
self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Cannot find " self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Cannot find "
"microcode region u-boot-dtb-with-ucode", str(e.exception)) "microcode region u-boot-dtb-with-ucode", str(e.exception))
def testMicrocodeWithoutNode2(self): def testMicrocodeWithoutNode2(self):
"""Test that a missing u-boot-ucode node is detected""" """Test that a missing u-boot-ucode node is detected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('39_x86_ucode_missing_node2.dts', True) self._DoReadFile('039_x86_ucode_missing_node2.dts', True)
self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Cannot find " self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Cannot find "
"microcode region u-boot-ucode", str(e.exception)) "microcode region u-boot-ucode", str(e.exception))
@ -981,7 +981,7 @@ class TestFunctional(unittest.TestCase):
def testMicrocodeNotInImage(self): def testMicrocodeNotInImage(self):
"""Test that microcode must be placed within the image""" """Test that microcode must be placed within the image"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('40_x86_ucode_not_in_image.dts', True) self._DoReadFile('040_x86_ucode_not_in_image.dts', True)
self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Microcode " self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Microcode "
"pointer _dt_ucode_base_size at fffffe14 is outside the " "pointer _dt_ucode_base_size at fffffe14 is outside the "
"section ranging from 00000000 to 0000002e", str(e.exception)) "section ranging from 00000000 to 0000002e", str(e.exception))
@ -990,7 +990,7 @@ class TestFunctional(unittest.TestCase):
"""Test that we can cope with an image without microcode (e.g. qemu)""" """Test that we can cope with an image without microcode (e.g. qemu)"""
with open(self.TestFile('u_boot_no_ucode_ptr')) as fd: with open(self.TestFile('u_boot_no_ucode_ptr')) as fd:
TestFunctional._MakeInputFile('u-boot', fd.read()) TestFunctional._MakeInputFile('u-boot', fd.read())
data, dtb, _, _ = self._DoReadFileDtb('44_x86_optional_ucode.dts', True) data, dtb, _, _ = self._DoReadFileDtb('044_x86_optional_ucode.dts', True)
# Now check the device tree has no microcode # Now check the device tree has no microcode
self.assertEqual(U_BOOT_NODTB_DATA, data[:len(U_BOOT_NODTB_DATA)]) self.assertEqual(U_BOOT_NODTB_DATA, data[:len(U_BOOT_NODTB_DATA)])
@ -1006,43 +1006,43 @@ class TestFunctional(unittest.TestCase):
def testUnknownPosSize(self): def testUnknownPosSize(self):
"""Test that microcode must be placed within the image""" """Test that microcode must be placed within the image"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('41_unknown_pos_size.dts', True) self._DoReadFile('041_unknown_pos_size.dts', True)
self.assertIn("Section '/binman': Unable to set offset/size for unknown " self.assertIn("Section '/binman': Unable to set offset/size for unknown "
"entry 'invalid-entry'", str(e.exception)) "entry 'invalid-entry'", str(e.exception))
def testPackFsp(self): def testPackFsp(self):
"""Test that an image with a FSP binary can be created""" """Test that an image with a FSP binary can be created"""
data = self._DoReadFile('42_intel-fsp.dts') data = self._DoReadFile('042_intel-fsp.dts')
self.assertEqual(FSP_DATA, data[:len(FSP_DATA)]) self.assertEqual(FSP_DATA, data[:len(FSP_DATA)])
def testPackCmc(self): def testPackCmc(self):
"""Test that an image with a CMC binary can be created""" """Test that an image with a CMC binary can be created"""
data = self._DoReadFile('43_intel-cmc.dts') data = self._DoReadFile('043_intel-cmc.dts')
self.assertEqual(CMC_DATA, data[:len(CMC_DATA)]) self.assertEqual(CMC_DATA, data[:len(CMC_DATA)])
def testPackVbt(self): def testPackVbt(self):
"""Test that an image with a VBT binary can be created""" """Test that an image with a VBT binary can be created"""
data = self._DoReadFile('46_intel-vbt.dts') data = self._DoReadFile('046_intel-vbt.dts')
self.assertEqual(VBT_DATA, data[:len(VBT_DATA)]) self.assertEqual(VBT_DATA, data[:len(VBT_DATA)])
def testSplBssPad(self): def testSplBssPad(self):
"""Test that we can pad SPL's BSS with zeros""" """Test that we can pad SPL's BSS with zeros"""
# ELF file with a '__bss_size' symbol # ELF file with a '__bss_size' symbol
self._SetupSplElf() self._SetupSplElf()
data = self._DoReadFile('47_spl_bss_pad.dts') data = self._DoReadFile('047_spl_bss_pad.dts')
self.assertEqual(U_BOOT_SPL_DATA + (chr(0) * 10) + U_BOOT_DATA, data) self.assertEqual(U_BOOT_SPL_DATA + (chr(0) * 10) + U_BOOT_DATA, data)
def testSplBssPadMissing(self): def testSplBssPadMissing(self):
"""Test that a missing symbol is detected""" """Test that a missing symbol is detected"""
self._SetupSplElf('u_boot_ucode_ptr') self._SetupSplElf('u_boot_ucode_ptr')
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('47_spl_bss_pad.dts') self._DoReadFile('047_spl_bss_pad.dts')
self.assertIn('Expected __bss_size symbol in spl/u-boot-spl', self.assertIn('Expected __bss_size symbol in spl/u-boot-spl',
str(e.exception)) str(e.exception))
def testPackStart16Spl(self): def testPackStart16Spl(self):
"""Test that an image with an x86 start16 SPL region can be created""" """Test that an image with an x86 start16 SPL region can be created"""
data = self._DoReadFile('48_x86-start16-spl.dts') data = self._DoReadFile('048_x86-start16-spl.dts')
self.assertEqual(X86_START16_SPL_DATA, data[:len(X86_START16_SPL_DATA)]) self.assertEqual(X86_START16_SPL_DATA, data[:len(X86_START16_SPL_DATA)])
def _PackUbootSplMicrocode(self, dts, ucode_second=False): def _PackUbootSplMicrocode(self, dts, ucode_second=False):
@ -1067,7 +1067,7 @@ class TestFunctional(unittest.TestCase):
def testPackUbootSplMicrocode(self): def testPackUbootSplMicrocode(self):
"""Test that x86 microcode can be handled correctly in SPL""" """Test that x86 microcode can be handled correctly in SPL"""
self._PackUbootSplMicrocode('49_x86_ucode_spl.dts') self._PackUbootSplMicrocode('049_x86_ucode_spl.dts')
def testPackUbootSplMicrocodeReorder(self): def testPackUbootSplMicrocodeReorder(self):
"""Test that order doesn't matter for microcode entries """Test that order doesn't matter for microcode entries
@ -1076,22 +1076,22 @@ class TestFunctional(unittest.TestCase):
u-boot-ucode entry we have not yet seen the u-boot-dtb-with-ucode u-boot-ucode entry we have not yet seen the u-boot-dtb-with-ucode
entry, so we reply on binman to try later. entry, so we reply on binman to try later.
""" """
self._PackUbootSplMicrocode('58_x86_ucode_spl_needs_retry.dts', self._PackUbootSplMicrocode('058_x86_ucode_spl_needs_retry.dts',
ucode_second=True) ucode_second=True)
def testPackMrc(self): def testPackMrc(self):
"""Test that an image with an MRC binary can be created""" """Test that an image with an MRC binary can be created"""
data = self._DoReadFile('50_intel_mrc.dts') data = self._DoReadFile('050_intel_mrc.dts')
self.assertEqual(MRC_DATA, data[:len(MRC_DATA)]) self.assertEqual(MRC_DATA, data[:len(MRC_DATA)])
def testSplDtb(self): def testSplDtb(self):
"""Test that an image with spl/u-boot-spl.dtb can be created""" """Test that an image with spl/u-boot-spl.dtb can be created"""
data = self._DoReadFile('51_u_boot_spl_dtb.dts') data = self._DoReadFile('051_u_boot_spl_dtb.dts')
self.assertEqual(U_BOOT_SPL_DTB_DATA, data[:len(U_BOOT_SPL_DTB_DATA)]) self.assertEqual(U_BOOT_SPL_DTB_DATA, data[:len(U_BOOT_SPL_DTB_DATA)])
def testSplNoDtb(self): def testSplNoDtb(self):
"""Test that an image with spl/u-boot-spl-nodtb.bin can be created""" """Test that an image with spl/u-boot-spl-nodtb.bin can be created"""
data = self._DoReadFile('52_u_boot_spl_nodtb.dts') data = self._DoReadFile('052_u_boot_spl_nodtb.dts')
self.assertEqual(U_BOOT_SPL_NODTB_DATA, data[:len(U_BOOT_SPL_NODTB_DATA)]) self.assertEqual(U_BOOT_SPL_NODTB_DATA, data[:len(U_BOOT_SPL_NODTB_DATA)])
def testSymbols(self): def testSymbols(self):
@ -1102,7 +1102,7 @@ class TestFunctional(unittest.TestCase):
self.assertEqual(syms['_binman_u_boot_spl_prop_offset'].address, addr) self.assertEqual(syms['_binman_u_boot_spl_prop_offset'].address, addr)
self._SetupSplElf('u_boot_binman_syms') self._SetupSplElf('u_boot_binman_syms')
data = self._DoReadFile('53_symbols.dts') data = self._DoReadFile('053_symbols.dts')
sym_values = struct.pack('<LQL', 0x24 + 0, 0x24 + 24, 0x24 + 20) sym_values = struct.pack('<LQL', 0x24 + 0, 0x24 + 24, 0x24 + 20)
expected = (sym_values + U_BOOT_SPL_DATA[16:] + chr(0xff) + expected = (sym_values + U_BOOT_SPL_DATA[16:] + chr(0xff) +
U_BOOT_DATA + U_BOOT_DATA +
@ -1111,19 +1111,19 @@ class TestFunctional(unittest.TestCase):
def testPackUnitAddress(self): def testPackUnitAddress(self):
"""Test that we support multiple binaries with the same name""" """Test that we support multiple binaries with the same name"""
data = self._DoReadFile('54_unit_address.dts') data = self._DoReadFile('054_unit_address.dts')
self.assertEqual(U_BOOT_DATA + U_BOOT_DATA, data) self.assertEqual(U_BOOT_DATA + U_BOOT_DATA, data)
def testSections(self): def testSections(self):
"""Basic test of sections""" """Basic test of sections"""
data = self._DoReadFile('55_sections.dts') data = self._DoReadFile('055_sections.dts')
expected = (U_BOOT_DATA + '!' * 12 + U_BOOT_DATA + 'a' * 12 + expected = (U_BOOT_DATA + '!' * 12 + U_BOOT_DATA + 'a' * 12 +
U_BOOT_DATA + '&' * 4) U_BOOT_DATA + '&' * 4)
self.assertEqual(expected, data) self.assertEqual(expected, data)
def testMap(self): def testMap(self):
"""Tests outputting a map of the images""" """Tests outputting a map of the images"""
_, _, map_data, _ = self._DoReadFileDtb('55_sections.dts', map=True) _, _, map_data, _ = self._DoReadFileDtb('055_sections.dts', map=True)
self.assertEqual('''ImagePos Offset Size Name self.assertEqual('''ImagePos Offset Size Name
00000000 00000000 00000028 main-section 00000000 00000000 00000028 main-section
00000000 00000000 00000010 section@0 00000000 00000000 00000010 section@0
@ -1136,7 +1136,7 @@ class TestFunctional(unittest.TestCase):
def testNamePrefix(self): def testNamePrefix(self):
"""Tests that name prefixes are used""" """Tests that name prefixes are used"""
_, _, map_data, _ = self._DoReadFileDtb('56_name_prefix.dts', map=True) _, _, map_data, _ = self._DoReadFileDtb('056_name_prefix.dts', map=True)
self.assertEqual('''ImagePos Offset Size Name self.assertEqual('''ImagePos Offset Size Name
00000000 00000000 00000028 main-section 00000000 00000000 00000028 main-section
00000000 00000000 00000010 section@0 00000000 00000000 00000010 section@0
@ -1148,7 +1148,7 @@ class TestFunctional(unittest.TestCase):
def testUnknownContents(self): def testUnknownContents(self):
"""Test that obtaining the contents works as expected""" """Test that obtaining the contents works as expected"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('57_unknown_contents.dts', True) self._DoReadFile('057_unknown_contents.dts', True)
self.assertIn("Section '/binman': Internal error: Could not complete " self.assertIn("Section '/binman': Internal error: Could not complete "
"processing of contents: remaining [<_testing.Entry__testing ", "processing of contents: remaining [<_testing.Entry__testing ",
str(e.exception)) str(e.exception))
@ -1156,13 +1156,13 @@ class TestFunctional(unittest.TestCase):
def testBadChangeSize(self): def testBadChangeSize(self):
"""Test that trying to change the size of an entry fails""" """Test that trying to change the size of an entry fails"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('59_change_size.dts', True) self._DoReadFile('059_change_size.dts', True)
self.assertIn("Node '/binman/_testing': Cannot update entry size from " self.assertIn("Node '/binman/_testing': Cannot update entry size from "
'2 to 1', str(e.exception)) '2 to 1', str(e.exception))
def testUpdateFdt(self): def testUpdateFdt(self):
"""Test that we can update the device tree with offset/size info""" """Test that we can update the device tree with offset/size info"""
_, _, _, out_dtb_fname = self._DoReadFileDtb('60_fdt_update.dts', _, _, _, out_dtb_fname = self._DoReadFileDtb('060_fdt_update.dts',
update_dtb=True) update_dtb=True)
dtb = fdt.Fdt(out_dtb_fname) dtb = fdt.Fdt(out_dtb_fname)
dtb.Scan() dtb.Scan()
@ -1192,7 +1192,7 @@ class TestFunctional(unittest.TestCase):
def testUpdateFdtBad(self): def testUpdateFdtBad(self):
"""Test that we detect when ProcessFdt never completes""" """Test that we detect when ProcessFdt never completes"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('61_fdt_update_bad.dts', update_dtb=True) self._DoReadFileDtb('061_fdt_update_bad.dts', update_dtb=True)
self.assertIn('Could not complete processing of Fdt: remaining ' self.assertIn('Could not complete processing of Fdt: remaining '
'[<_testing.Entry__testing', str(e.exception)) '[<_testing.Entry__testing', str(e.exception))
@ -1202,7 +1202,7 @@ class TestFunctional(unittest.TestCase):
'test-str-arg': 'test1', 'test-str-arg': 'test1',
'test-int-arg': '456', 'test-int-arg': '456',
} }
self._DoReadFileDtb('62_entry_args.dts', entry_args=entry_args) self._DoReadFileDtb('062_entry_args.dts', entry_args=entry_args)
self.assertIn('image', control.images) self.assertIn('image', control.images)
entry = control.images['image'].GetEntries()['_testing'] entry = control.images['image'].GetEntries()['_testing']
self.assertEqual('test0', entry.test_str_fdt) self.assertEqual('test0', entry.test_str_fdt)
@ -1215,7 +1215,7 @@ class TestFunctional(unittest.TestCase):
entry_args = { entry_args = {
'test-int-arg': '456', 'test-int-arg': '456',
} }
self._DoReadFileDtb('63_entry_args_missing.dts', entry_args=entry_args) self._DoReadFileDtb('063_entry_args_missing.dts', entry_args=entry_args)
entry = control.images['image'].GetEntries()['_testing'] entry = control.images['image'].GetEntries()['_testing']
self.assertEqual('test0', entry.test_str_fdt) self.assertEqual('test0', entry.test_str_fdt)
self.assertEqual(None, entry.test_str_arg) self.assertEqual(None, entry.test_str_arg)
@ -1228,14 +1228,14 @@ class TestFunctional(unittest.TestCase):
'test-int-arg': '456', 'test-int-arg': '456',
} }
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('64_entry_args_required.dts') self._DoReadFileDtb('064_entry_args_required.dts')
self.assertIn("Node '/binman/_testing': Missing required " self.assertIn("Node '/binman/_testing': Missing required "
'properties/entry args: test-str-arg, test-int-fdt, test-int-arg', 'properties/entry args: test-str-arg, test-int-fdt, test-int-arg',
str(e.exception)) str(e.exception))
def testEntryArgsInvalidFormat(self): def testEntryArgsInvalidFormat(self):
"""Test that an invalid entry-argument format is detected""" """Test that an invalid entry-argument format is detected"""
args = ['-d', self.TestFile('64_entry_args_required.dts'), '-ano-value'] args = ['-d', self.TestFile('064_entry_args_required.dts'), '-ano-value']
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoBinman(*args) self._DoBinman(*args)
self.assertIn("Invalid entry arguemnt 'no-value'", str(e.exception)) self.assertIn("Invalid entry arguemnt 'no-value'", str(e.exception))
@ -1246,7 +1246,7 @@ class TestFunctional(unittest.TestCase):
'test-int-arg': 'abc', 'test-int-arg': 'abc',
} }
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('62_entry_args.dts', entry_args=entry_args) self._DoReadFileDtb('062_entry_args.dts', entry_args=entry_args)
self.assertIn("Node '/binman/_testing': Cannot convert entry arg " self.assertIn("Node '/binman/_testing': Cannot convert entry arg "
"'test-int-arg' (value 'abc') to integer", "'test-int-arg' (value 'abc') to integer",
str(e.exception)) str(e.exception))
@ -1262,7 +1262,7 @@ class TestFunctional(unittest.TestCase):
'test-bad-datatype-arg': '12', 'test-bad-datatype-arg': '12',
} }
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('65_entry_args_unknown_datatype.dts', self._DoReadFileDtb('065_entry_args_unknown_datatype.dts',
entry_args=entry_args) entry_args=entry_args)
self.assertIn('GetArg() internal error: Unknown data type ', self.assertIn('GetArg() internal error: Unknown data type ',
str(e.exception)) str(e.exception))
@ -1274,7 +1274,7 @@ class TestFunctional(unittest.TestCase):
'test-id2': TEXT_DATA2, 'test-id2': TEXT_DATA2,
'test-id3': TEXT_DATA3, 'test-id3': TEXT_DATA3,
} }
data, _, _, _ = self._DoReadFileDtb('66_text.dts', data, _, _, _ = self._DoReadFileDtb('066_text.dts',
entry_args=entry_args) entry_args=entry_args)
expected = (TEXT_DATA + chr(0) * (8 - len(TEXT_DATA)) + TEXT_DATA2 + expected = (TEXT_DATA + chr(0) * (8 - len(TEXT_DATA)) + TEXT_DATA2 +
TEXT_DATA3 + 'some text') TEXT_DATA3 + 'some text')
@ -1296,7 +1296,7 @@ class TestFunctional(unittest.TestCase):
def testFmap(self): def testFmap(self):
"""Basic test of generation of a flashrom fmap""" """Basic test of generation of a flashrom fmap"""
data = self._DoReadFile('67_fmap.dts') data = self._DoReadFile('067_fmap.dts')
fhdr, fentries = fmap_util.DecodeFmap(data[32:]) fhdr, fentries = fmap_util.DecodeFmap(data[32:])
expected = U_BOOT_DATA + '!' * 12 + U_BOOT_DATA + 'a' * 12 expected = U_BOOT_DATA + '!' * 12 + U_BOOT_DATA + 'a' * 12
self.assertEqual(expected, data[:32]) self.assertEqual(expected, data[:32])
@ -1330,19 +1330,19 @@ class TestFunctional(unittest.TestCase):
entry_args = { entry_args = {
'cros-ec-rw-path': 'ecrw.bin', 'cros-ec-rw-path': 'ecrw.bin',
} }
data, _, _, _ = self._DoReadFileDtb('68_blob_named_by_arg.dts', data, _, _, _ = self._DoReadFileDtb('068_blob_named_by_arg.dts',
entry_args=entry_args) entry_args=entry_args)
def testFill(self): def testFill(self):
"""Test for an fill entry type""" """Test for an fill entry type"""
data = self._DoReadFile('69_fill.dts') data = self._DoReadFile('069_fill.dts')
expected = 8 * chr(0xff) + 8 * chr(0) expected = 8 * chr(0xff) + 8 * chr(0)
self.assertEqual(expected, data) self.assertEqual(expected, data)
def testFillNoSize(self): def testFillNoSize(self):
"""Test for an fill entry type with no size""" """Test for an fill entry type with no size"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('70_fill_no_size.dts') self._DoReadFile('070_fill_no_size.dts')
self.assertIn("'fill' entry must have a size property", self.assertIn("'fill' entry must have a size property",
str(e.exception)) str(e.exception))
@ -1363,7 +1363,7 @@ class TestFunctional(unittest.TestCase):
'keydir': 'devkeys', 'keydir': 'devkeys',
'bmpblk': 'bmpblk.bin', 'bmpblk': 'bmpblk.bin',
} }
data, _, _, _ = self._DoReadFileDtb('71_gbb.dts', entry_args=entry_args) data, _, _, _ = self._DoReadFileDtb('071_gbb.dts', entry_args=entry_args)
# Since futility # Since futility
expected = GBB_DATA + GBB_DATA + 8 * chr(0) + (0x2180 - 16) * chr(0) expected = GBB_DATA + GBB_DATA + 8 * chr(0) + (0x2180 - 16) * chr(0)
@ -1372,14 +1372,14 @@ class TestFunctional(unittest.TestCase):
def testGbbTooSmall(self): def testGbbTooSmall(self):
"""Test for the Chromium OS Google Binary Block being large enough""" """Test for the Chromium OS Google Binary Block being large enough"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('72_gbb_too_small.dts') self._DoReadFileDtb('072_gbb_too_small.dts')
self.assertIn("Node '/binman/gbb': GBB is too small", self.assertIn("Node '/binman/gbb': GBB is too small",
str(e.exception)) str(e.exception))
def testGbbNoSize(self): def testGbbNoSize(self):
"""Test for the Chromium OS Google Binary Block having a size""" """Test for the Chromium OS Google Binary Block having a size"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('73_gbb_no_size.dts') self._DoReadFileDtb('073_gbb_no_size.dts')
self.assertIn("Node '/binman/gbb': GBB must have a fixed size", self.assertIn("Node '/binman/gbb': GBB must have a fixed size",
str(e.exception)) str(e.exception))
@ -1397,7 +1397,7 @@ class TestFunctional(unittest.TestCase):
entry_args = { entry_args = {
'keydir': 'devkeys', 'keydir': 'devkeys',
} }
data, _, _, _ = self._DoReadFileDtb('74_vblock.dts', data, _, _, _ = self._DoReadFileDtb('074_vblock.dts',
entry_args=entry_args) entry_args=entry_args)
expected = U_BOOT_DATA + VBLOCK_DATA + U_BOOT_DTB_DATA expected = U_BOOT_DATA + VBLOCK_DATA + U_BOOT_DTB_DATA
self.assertEqual(expected, data) self.assertEqual(expected, data)
@ -1405,21 +1405,21 @@ class TestFunctional(unittest.TestCase):
def testVblockNoContent(self): def testVblockNoContent(self):
"""Test we detect a vblock which has no content to sign""" """Test we detect a vblock which has no content to sign"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('75_vblock_no_content.dts') self._DoReadFile('075_vblock_no_content.dts')
self.assertIn("Node '/binman/vblock': Vblock must have a 'content' " self.assertIn("Node '/binman/vblock': Vblock must have a 'content' "
'property', str(e.exception)) 'property', str(e.exception))
def testVblockBadPhandle(self): def testVblockBadPhandle(self):
"""Test that we detect a vblock with an invalid phandle in contents""" """Test that we detect a vblock with an invalid phandle in contents"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('76_vblock_bad_phandle.dts') self._DoReadFile('076_vblock_bad_phandle.dts')
self.assertIn("Node '/binman/vblock': Cannot find node for phandle " self.assertIn("Node '/binman/vblock': Cannot find node for phandle "
'1000', str(e.exception)) '1000', str(e.exception))
def testVblockBadEntry(self): def testVblockBadEntry(self):
"""Test that we detect an entry that points to a non-entry""" """Test that we detect an entry that points to a non-entry"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFile('77_vblock_bad_entry.dts') self._DoReadFile('077_vblock_bad_entry.dts')
self.assertIn("Node '/binman/vblock': Cannot find entry for node " self.assertIn("Node '/binman/vblock': Cannot find entry for node "
"'other'", str(e.exception)) "'other'", str(e.exception))
@ -1428,37 +1428,37 @@ class TestFunctional(unittest.TestCase):
# ELF file with a '__bss_size' symbol # ELF file with a '__bss_size' symbol
with open(self.TestFile('bss_data')) as fd: with open(self.TestFile('bss_data')) as fd:
TestFunctional._MakeInputFile('tpl/u-boot-tpl', fd.read()) TestFunctional._MakeInputFile('tpl/u-boot-tpl', fd.read())
data = self._DoReadFile('78_u_boot_tpl.dts') data = self._DoReadFile('078_u_boot_tpl.dts')
self.assertEqual(U_BOOT_TPL_DATA + U_BOOT_TPL_DTB_DATA, data) self.assertEqual(U_BOOT_TPL_DATA + U_BOOT_TPL_DTB_DATA, data)
def testUsesPos(self): def testUsesPos(self):
"""Test that the 'pos' property cannot be used anymore""" """Test that the 'pos' property cannot be used anymore"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
data = self._DoReadFile('79_uses_pos.dts') data = self._DoReadFile('079_uses_pos.dts')
self.assertIn("Node '/binman/u-boot': Please use 'offset' instead of " self.assertIn("Node '/binman/u-boot': Please use 'offset' instead of "
"'pos'", str(e.exception)) "'pos'", str(e.exception))
def testFillZero(self): def testFillZero(self):
"""Test for an fill entry type with a size of 0""" """Test for an fill entry type with a size of 0"""
data = self._DoReadFile('80_fill_empty.dts') data = self._DoReadFile('080_fill_empty.dts')
self.assertEqual(chr(0) * 16, data) self.assertEqual(chr(0) * 16, data)
def testTextMissing(self): def testTextMissing(self):
"""Test for a text entry type where there is no text""" """Test for a text entry type where there is no text"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('66_text.dts',) self._DoReadFileDtb('066_text.dts',)
self.assertIn("Node '/binman/text': No value provided for text label " self.assertIn("Node '/binman/text': No value provided for text label "
"'test-id'", str(e.exception)) "'test-id'", str(e.exception))
def testPackStart16Tpl(self): def testPackStart16Tpl(self):
"""Test that an image with an x86 start16 TPL region can be created""" """Test that an image with an x86 start16 TPL region can be created"""
data = self._DoReadFile('81_x86-start16-tpl.dts') data = self._DoReadFile('081_x86-start16-tpl.dts')
self.assertEqual(X86_START16_TPL_DATA, data[:len(X86_START16_TPL_DATA)]) self.assertEqual(X86_START16_TPL_DATA, data[:len(X86_START16_TPL_DATA)])
def testSelectImage(self): def testSelectImage(self):
"""Test that we can select which images to build""" """Test that we can select which images to build"""
with test_util.capture_sys_output() as (stdout, stderr): with test_util.capture_sys_output() as (stdout, stderr):
retcode = self._DoTestFile('06_dual_image.dts', images=['image2']) retcode = self._DoTestFile('006_dual_image.dts', images=['image2'])
self.assertEqual(0, retcode) self.assertEqual(0, retcode)
self.assertIn('Skipping images: image1', stdout.getvalue()) self.assertIn('Skipping images: image1', stdout.getvalue())
@ -1467,7 +1467,7 @@ class TestFunctional(unittest.TestCase):
def testUpdateFdtAll(self): def testUpdateFdtAll(self):
"""Test that all device trees are updated with offset/size info""" """Test that all device trees are updated with offset/size info"""
data, _, _, _ = self._DoReadFileDtb('82_fdt_update_all.dts', data, _, _, _ = self._DoReadFileDtb('082_fdt_update_all.dts',
use_real_dtb=True, update_dtb=True) use_real_dtb=True, update_dtb=True)
base_expected = { base_expected = {
@ -1507,12 +1507,12 @@ class TestFunctional(unittest.TestCase):
def testUpdateFdtOutput(self): def testUpdateFdtOutput(self):
"""Test that output DTB files are updated""" """Test that output DTB files are updated"""
try: try:
data, dtb_data, _, _ = self._DoReadFileDtb('82_fdt_update_all.dts', data, dtb_data, _, _ = self._DoReadFileDtb('082_fdt_update_all.dts',
use_real_dtb=True, update_dtb=True, reset_dtbs=False) use_real_dtb=True, update_dtb=True, reset_dtbs=False)
# Unfortunately, compiling a source file always results in a file # Unfortunately, compiling a source file always results in a file
# called source.dtb (see fdt_util.EnsureCompiled()). The test # called source.dtb (see fdt_util.EnsureCompiled()). The test
# source file (e.g. test/75_fdt_update_all.dts) thus does not enter # source file (e.g. test/075_fdt_update_all.dts) thus does not enter
# binman as a file called u-boot.dtb. To fix this, copy the file # binman as a file called u-boot.dtb. To fix this, copy the file
# over to the expected place. # over to the expected place.
#tools.WriteFile(os.path.join(self._indir, 'u-boot.dtb'), #tools.WriteFile(os.path.join(self._indir, 'u-boot.dtb'),
@ -1553,7 +1553,7 @@ class TestFunctional(unittest.TestCase):
def testCompress(self): def testCompress(self):
"""Test compression of blobs""" """Test compression of blobs"""
data, _, _, out_dtb_fname = self._DoReadFileDtb('83_compress.dts', data, _, _, out_dtb_fname = self._DoReadFileDtb('083_compress.dts',
use_real_dtb=True, update_dtb=True) use_real_dtb=True, update_dtb=True)
dtb = fdt.Fdt(out_dtb_fname) dtb = fdt.Fdt(out_dtb_fname)
dtb.Scan() dtb.Scan()
@ -1569,12 +1569,12 @@ class TestFunctional(unittest.TestCase):
def testFiles(self): def testFiles(self):
"""Test bringing in multiple files""" """Test bringing in multiple files"""
data = self._DoReadFile('84_files.dts') data = self._DoReadFile('084_files.dts')
self.assertEqual(FILES_DATA, data) self.assertEqual(FILES_DATA, data)
def testFilesCompress(self): def testFilesCompress(self):
"""Test bringing in multiple files and compressing them""" """Test bringing in multiple files and compressing them"""
data = self._DoReadFile('85_files_compress.dts') data = self._DoReadFile('085_files_compress.dts')
image = control.images['image'] image = control.images['image']
entries = image.GetEntries() entries = image.GetEntries()
@ -1594,20 +1594,20 @@ class TestFunctional(unittest.TestCase):
def testFilesMissing(self): def testFilesMissing(self):
"""Test missing files""" """Test missing files"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
data = self._DoReadFile('86_files_none.dts') data = self._DoReadFile('086_files_none.dts')
self.assertIn("Node '/binman/files': Pattern \'files/*.none\' matched " self.assertIn("Node '/binman/files': Pattern \'files/*.none\' matched "
'no files', str(e.exception)) 'no files', str(e.exception))
def testFilesNoPattern(self): def testFilesNoPattern(self):
"""Test missing files""" """Test missing files"""
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
data = self._DoReadFile('87_files_no_pattern.dts') data = self._DoReadFile('087_files_no_pattern.dts')
self.assertIn("Node '/binman/files': Missing 'pattern' property", self.assertIn("Node '/binman/files': Missing 'pattern' property",
str(e.exception)) str(e.exception))
def testExpandSize(self): def testExpandSize(self):
"""Test an expanding entry""" """Test an expanding entry"""
data, _, map_data, _ = self._DoReadFileDtb('88_expand_size.dts', data, _, map_data, _ = self._DoReadFileDtb('088_expand_size.dts',
map=True) map=True)
expect = ('a' * 8 + U_BOOT_DATA + expect = ('a' * 8 + U_BOOT_DATA +
MRC_DATA + 'b' * 1 + U_BOOT_DATA + MRC_DATA + 'b' * 1 + U_BOOT_DATA +
@ -1631,13 +1631,13 @@ class TestFunctional(unittest.TestCase):
"""Test an expanding entry which fails to provide contents""" """Test an expanding entry which fails to provide contents"""
with test_util.capture_sys_output() as (stdout, stderr): with test_util.capture_sys_output() as (stdout, stderr):
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('89_expand_size_bad.dts', map=True) self._DoReadFileDtb('089_expand_size_bad.dts', map=True)
self.assertIn("Node '/binman/_testing': Cannot obtain contents when " self.assertIn("Node '/binman/_testing': Cannot obtain contents when "
'expanding entry', str(e.exception)) 'expanding entry', str(e.exception))
def testHash(self): def testHash(self):
"""Test hashing of the contents of an entry""" """Test hashing of the contents of an entry"""
_, _, _, out_dtb_fname = self._DoReadFileDtb('90_hash.dts', _, _, _, out_dtb_fname = self._DoReadFileDtb('090_hash.dts',
use_real_dtb=True, update_dtb=True) use_real_dtb=True, update_dtb=True)
dtb = fdt.Fdt(out_dtb_fname) dtb = fdt.Fdt(out_dtb_fname)
dtb.Scan() dtb.Scan()
@ -1648,19 +1648,19 @@ class TestFunctional(unittest.TestCase):
def testHashNoAlgo(self): def testHashNoAlgo(self):
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('91_hash_no_algo.dts', update_dtb=True) self._DoReadFileDtb('091_hash_no_algo.dts', update_dtb=True)
self.assertIn("Node \'/binman/u-boot\': Missing \'algo\' property for " self.assertIn("Node \'/binman/u-boot\': Missing \'algo\' property for "
'hash node', str(e.exception)) 'hash node', str(e.exception))
def testHashBadAlgo(self): def testHashBadAlgo(self):
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoReadFileDtb('92_hash_bad_algo.dts', update_dtb=True) self._DoReadFileDtb('092_hash_bad_algo.dts', update_dtb=True)
self.assertIn("Node '/binman/u-boot': Unknown hash algorithm", self.assertIn("Node '/binman/u-boot': Unknown hash algorithm",
str(e.exception)) str(e.exception))
def testHashSection(self): def testHashSection(self):
"""Test hashing of the contents of an entry""" """Test hashing of the contents of an entry"""
_, _, _, out_dtb_fname = self._DoReadFileDtb('99_hash_section.dts', _, _, _, out_dtb_fname = self._DoReadFileDtb('099_hash_section.dts',
use_real_dtb=True, update_dtb=True) use_real_dtb=True, update_dtb=True)
dtb = fdt.Fdt(out_dtb_fname) dtb = fdt.Fdt(out_dtb_fname)
dtb.Scan() dtb.Scan()
@ -1681,14 +1681,14 @@ class TestFunctional(unittest.TestCase):
""" """
with open(self.TestFile('u_boot_ucode_ptr')) as fd: with open(self.TestFile('u_boot_ucode_ptr')) as fd:
TestFunctional._MakeInputFile('tpl/u-boot-tpl', fd.read()) TestFunctional._MakeInputFile('tpl/u-boot-tpl', fd.read())
first, pos_and_size = self._RunMicrocodeTest('93_x86_tpl_ucode.dts', first, pos_and_size = self._RunMicrocodeTest('093_x86_tpl_ucode.dts',
U_BOOT_TPL_NODTB_DATA) U_BOOT_TPL_NODTB_DATA)
self.assertEqual('tplnodtb with microc' + pos_and_size + self.assertEqual('tplnodtb with microc' + pos_and_size +
'ter somewhere in here', first) 'ter somewhere in here', first)
def testFmapX86(self): def testFmapX86(self):
"""Basic test of generation of a flashrom fmap""" """Basic test of generation of a flashrom fmap"""
data = self._DoReadFile('94_fmap_x86.dts') data = self._DoReadFile('094_fmap_x86.dts')
fhdr, fentries = fmap_util.DecodeFmap(data[32:]) fhdr, fentries = fmap_util.DecodeFmap(data[32:])
expected = U_BOOT_DATA + MRC_DATA + 'a' * (32 - 7) expected = U_BOOT_DATA + MRC_DATA + 'a' * (32 - 7)
self.assertEqual(expected, data[:32]) self.assertEqual(expected, data[:32])
@ -1711,7 +1711,7 @@ class TestFunctional(unittest.TestCase):
def testFmapX86Section(self): def testFmapX86Section(self):
"""Basic test of generation of a flashrom fmap""" """Basic test of generation of a flashrom fmap"""
data = self._DoReadFile('95_fmap_x86_section.dts') data = self._DoReadFile('095_fmap_x86_section.dts')
expected = U_BOOT_DATA + MRC_DATA + 'b' * (32 - 7) expected = U_BOOT_DATA + MRC_DATA + 'b' * (32 - 7)
self.assertEqual(expected, data[:32]) self.assertEqual(expected, data[:32])
fhdr, fentries = fmap_util.DecodeFmap(data[36:]) fhdr, fentries = fmap_util.DecodeFmap(data[36:])
@ -1736,20 +1736,20 @@ class TestFunctional(unittest.TestCase):
self._SetupSplElf() self._SetupSplElf()
with open(self.TestFile('bss_data')) as fd: with open(self.TestFile('bss_data')) as fd:
TestFunctional._MakeInputFile('-boot', fd.read()) TestFunctional._MakeInputFile('-boot', fd.read())
data = self._DoReadFile('96_elf.dts') data = self._DoReadFile('096_elf.dts')
def testElfStripg(self): def testElfStripg(self):
"""Basic test of ELF entries""" """Basic test of ELF entries"""
self._SetupSplElf() self._SetupSplElf()
with open(self.TestFile('bss_data')) as fd: with open(self.TestFile('bss_data')) as fd:
TestFunctional._MakeInputFile('-boot', fd.read()) TestFunctional._MakeInputFile('-boot', fd.read())
data = self._DoReadFile('97_elf_strip.dts') data = self._DoReadFile('097_elf_strip.dts')
def testPackOverlapMap(self): def testPackOverlapMap(self):
"""Test that overlapping regions are detected""" """Test that overlapping regions are detected"""
with test_util.capture_sys_output() as (stdout, stderr): with test_util.capture_sys_output() as (stdout, stderr):
with self.assertRaises(ValueError) as e: with self.assertRaises(ValueError) as e:
self._DoTestFile('14_pack_overlap.dts', map=True) self._DoTestFile('014_pack_overlap.dts', map=True)
map_fname = tools.GetOutputFilename('image.map') map_fname = tools.GetOutputFilename('image.map')
self.assertEqual("Wrote map file '%s' to show errors\n" % map_fname, self.assertEqual("Wrote map file '%s' to show errors\n" % map_fname,
stdout.getvalue()) stdout.getvalue())

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save