24 lines
1.4 KiB
Python
24 lines
1.4 KiB
Python
import pathlib,sys,tempfile,unittest
|
|
sys.path.insert(0,str(pathlib.Path(__file__).parents[1]/'plugins'))
|
|
import node_extract
|
|
|
|
def record(kind,address=0,data=b''):
|
|
raw=bytes([len(data)])+address.to_bytes(2,'big')+bytes([kind])+data
|
|
return ':'+(raw+bytes([-sum(raw)&255])).hex().upper()
|
|
class NodeTests(unittest.TestCase):
|
|
def parse(self,lines):
|
|
with tempfile.TemporaryDirectory() as d:
|
|
p=pathlib.Path(d)/'node.hex';p.write_text('\n'.join(lines));return node_extract.address_inventory(p)
|
|
def test_addresses_and_checksum(self):
|
|
lines=[record(4,data=b'\x00\x01'),record(0,16,b'ab'),record(1)]
|
|
self.assertEqual(self.parse(lines)['minimum_address'],65552)
|
|
with self.assertRaises(ValueError):self.parse([lines[0],lines[1][:-2]+'00',lines[2]])
|
|
def test_segment_and_entry_point_metadata(self):
|
|
result=self.parse([record(2,data=b'\x00\x10'),record(0,2,b'ab'),record(5,data=(258).to_bytes(4,'big')),record(1)])
|
|
self.assertEqual(result['minimum_address'],258)
|
|
self.assertEqual(result['entry_points'][0]['address'],258)
|
|
def test_truncated_overlap_and_address_bounds(self):
|
|
for lines in [[record(0,0,b'a')],[record(0,0,b'abc'),record(0,1,b'ab'),record(1)],[record(4,data=b'\xff\xff'),record(0,0,b'a'),record(1)],[record(0,0,b'a'),record(1),record(0,10,b'a')]]:
|
|
with self.assertRaises(ValueError):self.parse(lines)
|
|
if __name__=='__main__':unittest.main()
|