diff test/testbintools.py @ 336:d1ecc493384e

Added spiffy armtoken class for bit fiddeling. Added cool test that checks for build repeatability
author Windel Bouwman
date Wed, 19 Feb 2014 22:32:15 +0100
parents
children 86b02c98a717
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/testbintools.py	Wed Feb 19 22:32:15 2014 +0100
@@ -0,0 +1,86 @@
+import unittest
+import sys
+from target.arminstructions import ArmToken
+from ppci.linker import Linker
+from ppci.objectfile import ObjectFile
+from ppci import CompilerError
+
+
+class TokenTestCase(unittest.TestCase):
+    def testSetBits(self):
+        at = ArmToken()
+        at[2:4] = 0b11
+        self.assertEqual(0xc, at.bit_value)
+
+    def testSetBits(self):
+        at = ArmToken()
+        at[4:8] = 0b1100
+        self.assertEqual(0xc0, at.bit_value)
+
+
+class LinkerTestCase(unittest.TestCase):
+    def testUndefinedReference(self):
+        l = Linker()
+        o1 = ObjectFile()
+        o1.get_section('.text')
+        o1.add_relocation('undefined_sym', 0, 'rel8', '.text')
+        o2 = ObjectFile()
+        with self.assertRaises(CompilerError):
+            o3 = l.link([o1, o2])
+
+    def testDuplicateSymbol(self):
+        l = Linker()
+        o1 = ObjectFile()
+        o1.get_section('.text')
+        o1.add_symbol('a', 0, '.text')
+        o2 = ObjectFile()
+        o2.get_section('.text')
+        o2.add_symbol('a', 0, '.text')
+        with self.assertRaises(CompilerError):
+            o3 = l.link([o1, o2])
+
+    def testRel8Relocation(self):
+        l = Linker()
+        o1 = ObjectFile()
+        o1.get_section('.text').add_data(bytes([0]*100))
+        o1.add_relocation('a', 0, 'rel8', '.text')
+        o2 = ObjectFile()
+        o2.get_section('.text').add_data(bytes([0]*100))
+        o2.add_symbol('a', 24, '.text')
+        o3 = l.link([o1, o2])
+
+    def testSymbolValues(self):
+        l = Linker()
+        o1 = ObjectFile()
+        o1.get_section('.text').add_data(bytes([0]*108))
+        o1.add_symbol('b', 24, '.text')
+        o2 = ObjectFile()
+        o2.get_section('.text').add_data(bytes([0]*100))
+        o2.add_symbol('a', 2, '.text')
+        o3 = l.link([o1, o2])
+        self.assertEqual(110, o3.find_symbol('a').value)
+        self.assertEqual(24, o3.find_symbol('b').value)
+        self.assertEqual(208, o3.get_section('.text').Size)
+
+    def testMemoryLayout(self):
+        l = Linker()
+        memory_layout = {'.text': 0x08000000, '.data':0x20000000}
+        o1 = ObjectFile()
+        o1.get_section('.text').add_data(bytes([0]*108))
+        o1.add_symbol('b', 24, '.text')
+        o2 = ObjectFile()
+        o2.get_section('.text').add_data(bytes([0]*100))
+        o2.get_section('.data').add_data(bytes([0]*100))
+        o2.add_symbol('a', 2, '.data')
+        o2.add_symbol('c', 2, '.text')
+        o3 = l.link([o1, o2], layout=memory_layout)
+        self.assertEqual(0x20000000+2, o3.find_symbol('a').value)
+        self.assertEqual(0x08000000+24, o3.find_symbol('b').value)
+        self.assertEqual(0x08000000+110, o3.find_symbol('c').value)
+        self.assertEqual(208, o3.get_section('.text').Size)
+        self.assertEqual(100, o3.get_section('.data').Size)
+
+
+if __name__ == '__main__':
+    unittest.main()
+    sys.exit()